package edu.isistan.uima.unified.analysisengines.domain;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.text.AnnotationIndex;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;
import org.apache.uima.resource.ResourceInitializationException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.uimafit.component.JCasAnnotator_ImplBase;
import org.uimafit.descriptor.ExternalResource;
import edu.isistan.uima.unified.sharedresources.ProgressMonitorResource;
import edu.isistan.uima.unified.typesystems.domain.DomainNumber;
import edu.isistan.uima.unified.typesystems.nlp.Sentence;
public class DomainNumberExclusionAnnotator extends JCasAnnotator_ImplBase {
@ExternalResource(key="monitor")
private ProgressMonitorResource monitorResource;
private IProgressMonitor subMonitor;
@Override
public void initialize(UimaContext context) throws ResourceInitializationException {
super.initialize(context);
}
@Override
public void process(JCas aJCas) throws AnalysisEngineProcessException {
//
subMonitor = new SubProgressMonitor(monitorResource.getMonitor(), 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
subMonitor.subTask("Excluding domain numbers from sentences annotations");
//
AnnotationIndex<Annotation> sAnnotations = aJCas.getAnnotationIndex(Sentence.type);
AnnotationIndex<Annotation> dnAnnotations = aJCas.getAnnotationIndex(DomainNumber.type);
//
subMonitor.beginTask(this.getClass().getSimpleName(), sAnnotations.size());
//
List<Sentence> sentencesToRemove = new ArrayList<Sentence>();
for(Annotation sAnnotation : sAnnotations) {
Sentence sentenceAnnotation = (Sentence) sAnnotation;
Iterator<Annotation> domainNumberIterator = dnAnnotations.subiterator(sAnnotation);
while(domainNumberIterator.hasNext()) {
DomainNumber domainNumberAnnotation = (DomainNumber) domainNumberIterator.next();
if(domainNumberAnnotation.getBegin() == sentenceAnnotation.getBegin())
if(domainNumberAnnotation.getEnd() != sentenceAnnotation.getEnd())
sentenceAnnotation.setBegin(domainNumberAnnotation.getEnd());
else
sentencesToRemove.add(sentenceAnnotation);
}
//
subMonitor.worked(1);
}
while(!sentencesToRemove.isEmpty()) {
Sentence sentenceAnnotation = sentencesToRemove.get(0);
sentencesToRemove.remove(0);
sentenceAnnotation.removeFromIndexes();
}
//
subMonitor.done();
}
@Override
public void destroy() {
super.destroy();
}
}