/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.uima.fit.factory.testAes;

import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
import org.apache.uima.fit.util.TypeSystemUtil;
import org.apache.uima.jcas.JCas;

/**
 */

public class FlowAE3 extends JCasAnnotator_ImplBase {

  @Override
  public void process(JCas jCas) throws AnalysisEngineProcessException {
    String analyzedText = TypeSystemUtil.getAnalyzedText(jCas);
    String reverseText = reverse(analyzedText);
    org.apache.uima.fit.util.TypeSystemUtil.setAnalyzedText(jCas, reverseText);
  }

  public static String reverse(String string) {
    int stringLength = string.length();
    StringBuffer returnValue = new StringBuffer();

    for (int i = stringLength - 1; i >= 0; i--) {
      returnValue.append(string.charAt(i));
    }
    return returnValue.toString();
  }

}
