in src/cas/xmideserializer_handler.cpp [790:965]
void XmiDeserializerHandler::handleFeature(Type & type,
lowlevel::TyFS addr,
lowlevel::TyFSFeature featCode,
icu::UnicodeString & featVal,
bool lenient) {
FeatureStructure fs = uima::internal::FSPromoter::promoteFS(addr, *iv_cas);
if (!fs.isValid() ) {
cerr << "handle feature of Invalid FS " << type.getName() << endl;
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("Invalid FeatureStructure");
msg.addParam(type.getName());
errInfo.setMessage(msg);
errInfo.setSeverity(ErrorInfo::unrecoverable);
ExcIllFormedInputError exc(errInfo);
throw exc;
}
///Feature feat = type.getFeatureByBaseName(featName);
Feature feat = internal::FSPromoter::promoteFeature(featCode, *iv_typesystem);
Type rtype;
feat.getRangeType(rtype);
lowlevel::TyFSType rangeType = uima::internal::FSPromoter::demoteType(rtype);
switch (rangeType) {
case internal::gs_tyIntegerType: {
if (featVal.length()>0) {
if (featCode == internal::gs_tySofaRefFeature) {
// special handling for "sofa" feature of annotation. Need to change
// it from a sofa reference into a sofa number
int sofaXmiId = atoi(UnicodeStringRef(featVal).asUTF8().c_str());
//cout << __LINE__ << " calling getFsAddrForXmiId " << sofaXmiId << endl;
int sofaAddr = getFsAddrForXmiId(sofaXmiId);
int sofaNum = iv_cas->getHeap()->getFSValue(sofaAddr, internal::gs_tySofaNumFeature);
iv_cas->getHeap()->setFSValue(addr,featCode,sofaNum);
} else {
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 || val.compare("true") == 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;
}
case internal::gs_tyBooleanArrayType:
case internal::gs_tyByteArrayType:
case internal::gs_tyIntArrayType:
case internal::gs_tyFloatArrayType:
case internal::gs_tyStringArrayType:
case internal::gs_tyLongArrayType:
case internal::gs_tyShortArrayType:
case internal::gs_tyDoubleArrayType:
case internal::gs_tyFSArrayType: {
//cout << "handleFeature " << feat.getName() << " " << featVal << endl;
if (feat.isMultipleReferencesAllowed()) {
// do the usual FS deserialization
//cout << " multiplerefsallowed " << endl;
if (featVal.length() > 0) {
int val = atoi(UnicodeStringRef(featVal).asUTF8().c_str());
//cout << " setting fsvalue " << "fsaddr " << addr << " value "<< val << endl;
iv_cas->getHeap()->setFeatureInternal(addr,featCode,val);
}
} else {
// Do the multivalued property deserialization.
// However, byte arrays have a special serialization (as hex digits)
//cout << " not multiplerefsallowed " << endl;
if (rangeType == internal::gs_tyByteArrayType) {
int arrayAddr = createByteArray(featVal, -1);
iv_cas->getHeap()->setFSValue(addr,featCode,arrayAddr);
} else {
//cout << "tokenizing array values " << endl;
vector<string> stringList;
tokenize(featVal, stringList);
handleFeature(addr, featCode, rangeType, stringList);
}
}
break;
}
case internal::gs_tyFloatListType:
case internal::gs_tyIntListType:
case internal::gs_tyStringListType:
case internal::gs_tyFSListType: {
//cout << "GOT A LIST FEATURE " << endl;
if (feat.isMultipleReferencesAllowed()) {
// do the usual FS deserialization
if (featVal.length() > 0) {
int val = atoi(UnicodeStringRef(featVal).asUTF8().c_str());
iv_cas->getHeap()->setFeatureInternal(addr,featCode,val);
}
} else {
// Do the multivalued property deserialization.
////handleFeature(addr,featCode,featVal);
vector<string> stringList;
tokenize(featVal, stringList);
handleFeature(addr, featCode, rangeType, stringList);
}
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;
}
}
}