All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.ctakes.drugner.ae.CopyDrugAnnotator Maven / Gradle / Ivy

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

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.ctakes.core.util.FSUtil;
import org.apache.ctakes.core.util.JCasUtil;
import org.apache.ctakes.core.util.ParamUtil;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.analysis_engine.ResultSpecification;
import org.apache.uima.analysis_engine.annotator.AnnotatorConfigurationException;
import org.apache.uima.analysis_engine.annotator.AnnotatorContext;
import org.apache.uima.analysis_engine.annotator.AnnotatorInitializationException;
import org.apache.uima.analysis_engine.annotator.AnnotatorProcessException;
import org.apache.uima.analysis_engine.annotator.JTextAnnotator_ImplBase;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.JFSIndexRepository;
import org.apache.uima.jcas.cas.TOP;
import org.apache.uima.resource.ResourceInitializationException;


/**
 * Utility annotator that copy's data from an existing JCas object into a new
 * JCas object.
 * 
 * @author duffp
 * 
 */
public class CopyDrugAnnotator extends JCasAnnotator_ImplBase
{
	private int iv_srcType;

	private int iv_segmentType=0;
	
	/**
	 * Value is "sectionOverrideSet".  This parameter specifies which segments to skip.  
	 * The resulting range of tokens will include the entire contents of the span within
	 * the section(s) specified in the sectionOverrideSet parameters of the SegmentLookupWindow
	 * annotator.  The parameter should be of type String, should be multi-valued and optional. 
	 */
	public static final String PARAM_SEGMENTS_TO_SKIP = "sectionOverrideSet";
	    

    private Set iv_skipSegmentsSet;
	
	// constructor used to create a new instance of the destination
	// JCas object
	private Constructor iv_destContr;

	// key = source getter method (java.lang.reflect.Method)
	// val = destination setter method (java.lang.reflect.Method)
	private Map iv_getSetMap;

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

		try
		{
			String className;
			className = (String) annotCtx.getConfigParameterValue("srcDrugObjClass");
			Class srcClass = Class.forName(className);
			iv_srcType = JCasUtil.getType(className);

			className = (String) annotCtx.getConfigParameterValue("destDrugObjClass");
			Class destClass = Class.forName(className);
			Class[] constrArgs = { JCas.class };
			iv_destContr = destClass.getConstructor(constrArgs);
			
			iv_skipSegmentsSet = ParamUtil.getStringParameterValuesSet(PARAM_SEGMENTS_TO_SKIP, annotCtx); 
			
			Map m = ParamUtil.getStringParameterValuesMap(
					"dataDrugBindMap",
					annotCtx,
					"|");
			iv_getSetMap = new HashMap();
			Iterator getterItr = m.keySet().iterator();
			while (getterItr.hasNext())
			{
				String getterMethName = (String) getterItr.next();
				String setterMethName = (String) m.get(getterMethName);

				Method getterMeth = srcClass.getMethod(getterMethName, (Class []) null);

				// get corresponding setter that has compatible args
				Class[] setterArgs = { getterMeth.getReturnType() };
				Method setterMeth = destClass.getMethod(
						setterMethName,
						setterArgs);

				iv_getSetMap.put(getterMeth, setterMeth);
			}
		}
		catch (Exception e)
		{
			throw new ResourceInitializationException(e);
		}
	}

	public void process(JCas jcas)
			throws AnalysisEngineProcessException
	{
		// iterate over source objects in JCas
		JFSIndexRepository indexes = jcas.getJFSIndexRepository();
		Iterator srcObjItr = indexes.getAnnotationIndex(org.apache.ctakes.typesystem.type.textspan.Segment.type).iterator();
		org.apache.ctakes.typesystem.type.textspan.Segment segment = null;
		
		while (srcObjItr.hasNext())
		{
			TOP srcObj = (TOP) srcObjItr.next();

			Object[] constrArgVals = { jcas };
			try
			{
				// create new destination object
				TOP destObj = (TOP) iv_destContr.newInstance(constrArgVals);
				
				// Find the segments that are to be handled as complete sections
                boolean okayToSkip = false;
                boolean segmentMissing = iv_skipSegmentsSet.isEmpty();
				if (!segmentMissing){
					Iterator getSkipSegs = iv_skipSegmentsSet.iterator();
					segment = (org.apache.ctakes.typesystem.type.textspan.Segment) srcObj;
					while (getSkipSegs.hasNext()  && !okayToSkip){
						if (getSkipSegs.next().equals(segment.getId())){

							okayToSkip = true;
						}
					}
					
				}
				// copy data from source to destination
				Iterator getterItr = iv_getSetMap.keySet().iterator();
				

				while (getterItr.hasNext() && (okayToSkip || segmentMissing))
				{
					Method getterMeth = (Method) getterItr.next();
					Method setterMeth = (Method) iv_getSetMap.get(getterMeth);

					Object val = getterMeth.invoke(srcObj, (Object []) null);
					Object[] setterArgs = { val };
					setterMeth.invoke(destObj, setterArgs);
					
				}
				// add new destination object to JCas
				if (okayToSkip) {
					destObj.addToIndexes();
				} else {
					Iterator lookupWindows = FSUtil.getAnnotationsInSpanIterator(jcas, org.apache.ctakes.typesystem.type.textspan.LookupWindowAnnotation.type, segment.getBegin(), segment.getEnd());
					while (lookupWindows.hasNext()){
						org.apache.ctakes.typesystem.type.textspan.LookupWindowAnnotation lookup = (org.apache.ctakes.typesystem.type.textspan.LookupWindowAnnotation) lookupWindows.next();
						org.apache.ctakes.typesystem.type.textspan.DrugLookupWindowAnnotation drugLookup = new org.apache.ctakes.typesystem.type.textspan.DrugLookupWindowAnnotation(jcas, lookup.getBegin(), lookup.getEnd()); //Reorganized paths in 3.0 SPM
						drugLookup.addToIndexes();
					}
				}
	
			}
			catch (Exception e)
			{
				throw new AnalysisEngineProcessException(e);
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy