in src/cas/xcasdeserializer_handler.cpp [705:832]
void XCASDeserializerHandler::handleFeature(Type & type, lowlevel::TyFS addr, icu::UnicodeString & featName, icu::UnicodeString & featVal,
bool lenient) {
char charFeatVal[10];
// handle v1.x format annotations, mapping int to ref values
lowlevel::TyFSType fstype = iv_casimpl.getHeap().getType(addr);
if (0==featName.compare("sofa") &&
iv_typesystem->subsumes(internal::gs_tyAnnotationBaseType, fstype)) {
int ifeatval = atoi(UnicodeStringRef(featVal).asUTF8().c_str());
sprintf(charFeatVal, "%d", sofaRefMap[ifeatval]);
featVal.setTo(icu::UnicodeString(charFeatVal));
}
// handle v1.x sofanum values, remapping so that _InitialView always == 1
if (0==featName.compare(CAS::FEATURE_BASE_NAME_SOFAID)
&& sofaTypeCode == fstype) {
int sofaNum = iv_casimpl.getHeap().getIntValue(addr, internal::gs_tySofaNumFeature);
iv_casimpl.getHeap().setIntValue(addr, internal::gs_tySofaNumFeature, indexMap[sofaNum]);
}
icu::UnicodeString prefix(REF_PREFIX);
if (featName.startsWith(REF_PREFIX)) {
featName.remove(0,prefix.length()); // Delete prefix
}
FeatureStructure fs = uima::internal::FSPromoter::promoteFS(addr, *iv_cas);
Feature feat = type.getFeatureByBaseName(featName);
// System.out.println("DEBUG - Feature map result: " + featName + " = " + feat.getName());
if (!feat.isValid()) { //feature does not exist in typesystem;
//Out of typesystem data not supported.
//we skip this feature
/**ErrorInfo errInfo;
errInfo.setErrorId((TyErrorId)UIMA_ERR_RESOURCE_CORRUPTED);
ErrorMessage msg(UIMA_MSG_ID_EXC_XML_SAXPARSE_FATALERROR);
assertWithMsg(sizeof(XMLCh) == sizeof(UChar), "Port required");
msg.addParam(type.getName());
msg.addParam(featName);
errInfo.setMessage(msg);
errInfo.setSeverity(ErrorInfo::unrecoverable);
ExcIllFormedInputError exc(errInfo);
throw exc; **/
} else {
Type rtype;
feat.getRangeType(rtype);
lowlevel::TyFSType rangeType = uima::internal::FSPromoter::demoteType(rtype);
switch (rangeType) {
case internal::gs_tyIntegerType: {
if (featVal.length()>0) {
fs.setIntValue(feat, atoi(UnicodeStringRef(featVal).asUTF8().c_str()));
}
break;
}
case internal::gs_tyFloatType: {
if ( featVal.length() > 0) {
fs.setFloatValue(feat, atof(UnicodeStringRef(featVal).asUTF8().c_str()));
}
break;
}
case internal::gs_tyStringType: {
if (featVal.length() > 0) {
fs.setStringValue(feat, featVal);
}
break;
}
case internal::gs_tyByteType: {
if (featVal.length() > 0) {
string val = UnicodeStringRef(featVal).asUTF8();
short intval = atoi(val.c_str());
char charval[2];
sprintf(charval,"%c",intval);
fs.setByteValue(feat, charval[0] );
}
break;
}
case internal::gs_tyBooleanType: {
if (featVal.length() > 0) {
string val = UnicodeStringRef(featVal).asUTF8();
if (val.compare("1")==0)
fs.setBooleanValue(feat, true );
else fs.setBooleanValue(feat, false);
}
break;
}
case internal::gs_tyShortType: {
if (featVal.length() > 0) {
string strval = UnicodeStringRef(featVal).asUTF8();
short shortval;
stringstream s;
s << strval.c_str();
s >> shortval;
fs.setShortValue(feat, shortval);
}
break;
}
case internal::gs_tyLongType: {
if (featVal.length() > 0) {
string strval = UnicodeStringRef(featVal).asUTF8();
INT64 longval;
stringstream s;
s << strval.c_str();
s >> longval;
fs.setLongValue(feat, longval);
}
break;
}
case internal::gs_tyDoubleType: {
if (featVal.length() > 0) {
string strval = UnicodeStringRef(featVal).asUTF8();
long double doubleval;
stringstream s;
s << strval.c_str();
s >> doubleval;
fs.setDoubleValue(feat, doubleval );
}
break;
}
default: {
if (rtype.isStringSubType()) {
if (featVal.length() > 0)
fs.setStringValue(feat, featVal);
} else if (featVal.length() > 0) {
lowlevel::TyFS val = (lowlevel::TyFS) atoi(UnicodeStringRef(featVal).asUTF8().c_str());
iv_casimpl.getHeap().setFeatureInternal(addr, uima::internal::FSPromoter::demoteFeature(feat), val);
}
break;
}
}
}
}