/*
 * 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.ae.noop;

import java.io.FileNotFoundException;

import org.apache.uima.UIMAFramework;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_component.CasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.TypeSystem;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.util.Level;
import org.apache.uima.util.Logger;

public class NoOpAnnotator extends CasAnnotator_ImplBase {
  private long counter = 0;

  private long countDown = 0;

  int errorFrequency = 0;

  int processDelay = 0;

  int finalCount = 0;

  int cpcDelay = 0;

  public void initialize(UimaContext aContext) throws ResourceInitializationException {
    super.initialize(aContext);

    if (getContext().getConfigParameterValue("FailDuringInitialization") != null) {
      throw new ResourceInitializationException(new FileNotFoundException("Simulated Exception"));
    }

    if (getContext().getConfigParameterValue("ErrorFrequency") != null) {
      errorFrequency = ((Integer) getContext().getConfigParameterValue("ErrorFrequency"))
              .intValue();
      countDown = errorFrequency;
    }

    if (getContext().getConfigParameterValue("CpCDelay") != null) {
      cpcDelay = ((Integer) getContext().getConfigParameterValue("CpCDelay")).intValue();
      System.out.println("NoOpAnnotator.initialize() Initializing With CpC Delay of " + cpcDelay
              + " millis");
    }
    if (getContext().getConfigParameterValue("ProcessDelay") != null) {
      processDelay = ((Integer) getContext().getConfigParameterValue("ProcessDelay")).intValue();
      System.out.println("NoOpAnnotator.initialize() Initializing With Process Delay of "
              + processDelay + " millis");

    }
    if (getContext().getConfigParameterValue("FinalCount") != null) {
      finalCount = ((Integer) getContext().getConfigParameterValue("FinalCount")).intValue();
    }

    // write log messages
    Logger logger = getContext().getLogger();
    logger.log(Level.CONFIG, "NAnnotator initialized");
  }

  public void typeSystemInit(TypeSystem aTypeSystem) throws AnalysisEngineProcessException {
  }

  public void collectionProcessComplete() throws AnalysisEngineProcessException {
    System.out
            .println("NoOpAnnotator.collectionProcessComplete() Called -------------------------------------");

    if (cpcDelay > 0) {
      try {
        System.out.println("NoOpAnnotator.collectionProcessComplete() Delaying CpC Reply For "
                + cpcDelay + " millis");
        synchronized (this) {
          this.wait(cpcDelay);
        }
      } catch (InterruptedException e) {

      }
    }
    if (finalCount > 0 && finalCount != counter) {
      String msg = "NoOpAnnotator expected " + finalCount + " CASes but was given " + counter;
      System.out.println(msg);
      throw new AnalysisEngineProcessException(new Exception(msg));
    }
    counter = 0;
  }

  public void process(CAS aCAS) throws AnalysisEngineProcessException {
    ++counter;
    try {
      if (processDelay == 0) {
        if (UIMAFramework.getLogger().isLoggable(Level.FINE))
          System.out.println("NoOpAnnotator.process() called for the " + counter
                  + "th time. Hashcode:" + hashCode());
      } else {
        // if ( UIMAFramework.getLogger().isLoggable(Level.FINE))
        System.out.println("NoOpAnnotator.process() called for the " + counter
                + "th time, delaying Response For:" + processDelay + " millis");
        synchronized (this) {
          try {
            wait(processDelay);
          } catch (InterruptedException e) {
          }
        }
      }

      // If creating exceptions, reduce interval between them each time.
      if (errorFrequency > 0) {
        if (--countDown == 0) {
          System.out.println("Generating OutOfBoundsException on " + counter + "th call.");
          if (errorFrequency > 1) {
            --errorFrequency;
          }
          countDown = errorFrequency;
          throw new IndexOutOfBoundsException();
        }
      }
    } catch (Exception e) {
      throw new AnalysisEngineProcessException(e);
    }
  }

}
