//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima.utils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.CommonArrayFS;
import org.apache.uima.cas.Feature;
import org.apache.uima.jcas.tcas.Annotation;
import org.slf4j.LoggerFactory;
/**
* Some commonly used functions to handle CAS Features
*
*
*/
public class FeatureUtils {
private FeatureUtils() {
// Singleton
}
/**
* Convert a UIMA feature to a Java object of the correct type
*
* @param f UIMA CAS Feature
* @param a UIMA CAS Annotation
* @return Java object, or null if unable to convert
*/
public static Object featureToObject(Feature f, Annotation a){
Object ret = null;
switch(f.getRange().getName()){
case CAS.TYPE_NAME_STRING:
ret = StringToObject.convertStringToObject(a.getStringValue(f));
break;
case CAS.TYPE_NAME_INTEGER:
ret = a.getIntValue(f);
break;
case CAS.TYPE_NAME_FLOAT:
ret = a.getFloatValue(f);
break;
case CAS.TYPE_NAME_BOOLEAN:
ret = a.getBooleanValue(f);
break;
case CAS.TYPE_NAME_BYTE:
ret = a.getByteValue(f);
break;
case CAS.TYPE_NAME_SHORT:
ret = a.getShortValue(f);
break;
case CAS.TYPE_NAME_LONG:
ret = a.getLongValue(f);
break;
case CAS.TYPE_NAME_DOUBLE:
ret = a.getDoubleValue(f);
break;
default:
ret = null;
}
return ret;
}
/**
* Convert a UIMA feature array to an array of Java objects of the correct type, parsing Strings to objects where possible
*
* @param f UIMA CAS Feature
* @param a UIMA CAS Annotation
* @return Array of Java objects, or null if unable to convert
*/
public static Object[] featureToArray(Feature f, Annotation a){
Object[] ret;
if(a.getFeatureValue(f) == null){
ret = new Object[0];
}else{
ret = toArray(f, a);
}
return ret;
}
/**
* Convert a UIMA feature array to a List of Java objects of the correct type, parsing Strings to objects where possible
*
* @param f UIMA CAS Feature
* @param a UIMA CAS Annotation
* @return List of Java objects, or empty if unable to convert
*/
public static List<Object> featureToList(Feature f, Annotation a){
if(a.getFeatureValue(f) == null){
return Collections.emptyList();
}
return Arrays.asList(toArray(f, a));
}
private static Object[] toArray(Feature f, Annotation a){
Object[] ret;
try{
CommonArrayFS array = (CommonArrayFS) a.getFeatureValue(f);
ret = new Object[array.size()];
int index = 0;
for(String s : array.toStringArray()){
ret[index] = StringToObject.convertStringToObject(s);
index++;
}
return ret;
}catch(ClassCastException cce){
LoggerFactory.getLogger(FeatureUtils.class).debug("Couldn't cast feature value to array", cce);
return new Object[0];
}
}
}