in src/cas/xmideserializer_handler.cpp [420:492]
void XmiDeserializerHandler::readFS(icu::UnicodeString & nsUri, icu::UnicodeString & localName,
icu::UnicodeString & qualifiedName, const Attributes & attrs) {
icu::UnicodeString typeName = xmiElementName2uimaTypeName(nsUri, localName);
Type type = iv_cas->getTypeSystem().getType(typeName);
currentType=type;
if (!type.isValid()) {
if (typeName.compare(icu::UnicodeString("uima.cas.NULL"))==0) {
//cout << "readFS ignore " << typeName << endl;
return; //ignore
}
if (typeName.compare(icu::UnicodeString("uima.cas.View"))==0) {
//cout << "readFS " << typeName << endl;
icu::UnicodeString attrName;
int sofaXmiId=0;
icu::UnicodeString members;
for (size_t i = 0; i < attrs.getLength(); i++) {
attrName = attrs.getQName(i);
if (attrName.compare(CAS::FEATURE_BASE_NAME_SOFA) == 0) {
icu::UnicodeString ustr(attrs.getValue(i));
sofaXmiId = atoi( ((UnicodeStringRef)ustr).asUTF8().c_str());
} else if (attrName.compare("members") == 0) {
members = attrs.getValue(i);
}
}
processView(sofaXmiId, members);
return;
}
// type is not in our type system
if (!lenient) {
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(typeName);
errInfo.setMessage(msg);
errInfo.setSeverity(ErrorInfo::unrecoverable);
ExcIllFormedInputError exc(errInfo);
throw exc;
} else {
this->addToOutOfTypeSystemData(
new XmlElementName( ((UnicodeStringRef)nsUri).asUTF8(),
((UnicodeStringRef)localName).asUTF8(),
((UnicodeStringRef)qualifiedName).asUTF8()), attrs );
return;
}
} else if (iv_cas->getTypeSystem().isArrayType(internal::FSPromoter::demoteType(type)) ) {
icu::UnicodeString attrName;
int xmiId=0;
icu::UnicodeString elements;
for (size_t i = 0; i < attrs.getLength(); i++) {
attrName = attrs.getQName(i);
if (attrName.compare(XMI_ID_ATTR_NAME) == 0) {
icu::UnicodeString ustr(attrs.getValue(i));
currentArrayId = atoi( ((UnicodeStringRef)ustr).asUTF8().c_str());
} else if (attrName.compare("elements") == 0) {
currentArrayElements = attrs.getValue(i);
}
}
//cout << "xmiId " << currentArrayId << " type=" << typeName << " elements=" << currentArrayElements << endl;
if (internal::FSPromoter::demoteType(type) == internal::gs_tyByteArrayType) {
int addr = createByteArray(currentArrayElements, currentArrayId);
}
} else {
//cout << "readFS() create FS and read attributes " << typeName << endl;
uima::lowlevel::TyFS addr = uima::internal::FSPromoter::demoteFS(iv_cas->createFS(type));
readFS(addr, attrs, true);
}
}