in uimaj-core/src/main/java/org/apache/uima/util/CasToInlineXml.java [273:374]
private Attributes getFeatureAttributes(FeatureStructure aFS, CAS aCAS) {
AttributesImpl attrs = new AttributesImpl();
for (Feature feat : aFS.getType().getFeatures()) {
String featName = feat.getShortName();
// how we get feature value depends on feature's range type)
String rangeTypeName = feat.getRange().getName();
if (feat.getRange().isPrimitive()) {
String str = aFS.getFeatureValueAsString(feat);
if (str == null) {
attrs.addAttribute("", featName, featName, "CDATA", "null");
} else {
if (str.length() > 64) {
str = str.substring(0, 64) + "...";
}
attrs.addAttribute("", featName, featName, "CDATA", str);
}
} else if (feat.getRange().isArray() && feat.getRange().getComponentType().isPrimitive()) {
// TODO: there should be a better way to get any array value as a string array
String[] vals = null;
if (CAS.TYPE_NAME_STRING_ARRAY.equals(rangeTypeName)) {
StringArrayFS arrayFS = (StringArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toArray();
}
} else if (CAS.TYPE_NAME_INTEGER_ARRAY.equals(rangeTypeName)) {
IntArrayFS arrayFS = (IntArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
} else if (CAS.TYPE_NAME_FLOAT_ARRAY.equals(rangeTypeName)) {
FloatArrayFS arrayFS = (FloatArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
} else if (CAS.TYPE_NAME_BOOLEAN_ARRAY.equals(rangeTypeName)) {
BooleanArrayFS arrayFS = (BooleanArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
} else if (CAS.TYPE_NAME_BYTE_ARRAY.equals(rangeTypeName)) {
ByteArrayFS arrayFS = (ByteArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
} else if (CAS.TYPE_NAME_SHORT_ARRAY.equals(rangeTypeName)) {
ShortArrayFS arrayFS = (ShortArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
} else if (CAS.TYPE_NAME_LONG_ARRAY.equals(rangeTypeName)) {
LongArrayFS arrayFS = (LongArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
} else if (CAS.TYPE_NAME_DOUBLE_ARRAY.equals(rangeTypeName)) {
DoubleArrayFS arrayFS = (DoubleArrayFS) aFS.getFeatureValue(feat);
if (arrayFS != null) {
vals = arrayFS.toStringArray();
}
}
String attrVal;
if (vals == null) {
attrVal = "null";
} else {
StringBuffer buf = new StringBuffer();
buf.append('[');
for (int i = 0; i < vals.length - 1; i++) {
buf.append(vals[i]);
buf.append(',');
}
if (vals.length > 0) {
buf.append(vals[vals.length - 1]);
}
buf.append(']');
attrVal = buf.toString();
}
attrs.addAttribute("", featName, featName, "CDATA", attrVal);
} else {
// get value as FeatureStructure
FeatureStructure fsVal = aFS.getFeatureValue(feat);
if (fsVal == null) {
attrs.addAttribute("", featName, featName, "CDATA", "null");
} else {
// record type name as value, and covered text if it's an annotation
StringBuffer buf = new StringBuffer();
buf.append(fsVal.getType().getShortName());
if (fsVal instanceof AnnotationFS) {
buf.append(" [");
String str = ((AnnotationFS) fsVal).getCoveredText();
if (str.length() > 64) {
str = str.substring(0, 64) + "...";
}
buf.append(str);
buf.append(']');
}
attrs.addAttribute("", featName, featName, "CDATA", buf.toString());
}
}
}
return attrs;
}