in src/cas/xmiwriter.cpp [1059:1190]
string XmiWriter::listToString(FeatureStructure const & fs, char const * tag) {
stringstream str;
map<int,int> visited;
if (!fs.isValid()) {
return str.str();
}
int typecode = internal::FSPromoter::demoteType(fs.getType());
//cout << __LINE__ << " listToString() " << fs.getType().getName() << endl;
switch (typecode) {
case internal::gs_tyNEIntListType: {
IntListFS curNode(fs);
while (!curNode.isEmpty()) {
int head = curNode.getHead();
str << head;
curNode = curNode.getTail();
int addr = internal::FSPromoter::demoteFS(curNode);
if (visited[addr] == addr) {
cerr << "Found Cycle truncating " << endl;
ResourceManager::getInstance().getLogger().logWarning("Found cycle in Intlist. Truncating.");
break;
}
visited[addr] = addr;
if ( !curNode.isEmpty() ) {
str << " " ;
}
}
//cout << "intList contents " << str.str() << endl;
break;
}
case internal::gs_tyNEFloatListType: {
FloatListFS curNode(fs);
while (!curNode.isEmpty()) {
str << curNode.getHead();
curNode = curNode.getTail();
int addr = internal::FSPromoter::demoteFS(curNode);
if (visited[addr] == addr) {
cerr << "Found Cycle truncating " << endl;
ResourceManager::getInstance().getLogger().logWarning("Found cycle in FloatListFS. Truncating.");
break;
}
visited[addr] = addr;
if ( !curNode.isEmpty() ) {
str << " " ;
}
}
break;
}
case internal::gs_tyEListType: {
//cout << "listToString() Empty FSList SKIP" << endl;
break;
}
case internal::gs_tyFSListType: {
//cout << "listToString() FSList SKIP" << endl;
break;
}
case internal::gs_tyNEListType: {
//cout << "listToString() NonEmpty FSList" << endl;
ListFS curNode(fs);
while (!curNode.isEmpty()) {
int head = internal::FSPromoter::demoteFS(curNode.getHead());
if (head == 0) {
//null value in list. Represent with "0".
// this may be null because the element was originally a reference to an
// out-of-typesystem FS, so chck the XmiSerializationSharedData
if (sharedData != NULL) {
int addr = internal::FSPromoter::demoteFS(curNode);
OotsElementData * oed = sharedData->getOutOfTypeSystemFeatures(addr);
if (oed != NULL) {
assert(oed->attributes.size() == 1); //only the head feature can possibly be here
XmlAttribute * attr = oed->attributes.at(0);
assert(attr->name.compare(CAS::FEATURE_BASE_NAME_HEAD)==0);
str << attr->value;
}
} else {
str << head;
}
} else {
int addr = internal::FSPromoter::demoteFS(curNode);
if (visited[addr] == addr) {
cerr << "Found Cycle truncating " << endl;
ResourceManager::getInstance().getLogger().logWarning("Found cycle in NEListFS. Truncating.");
break;
}
visited[addr] = addr;
str << getXmiId(head);
}
curNode = curNode.getTail();
if ( !curNode.isEmpty() ) {
str << " " ;
}
}
//cout << "FSListType content " << str.str() << endl;
break;
}
case internal::gs_tyNEStringListType: {
StringListFS curNode(fs);
icu::UnicodeString ustr;
while (!curNode.isEmpty()) {
///string head = curNode.getHead().asUTF8();
ustr.setTo("");
normalize(curNode.getHead(), ustr);
str << "<" << tag << ">" << ustr << "</" << tag << ">";
curNode = curNode.getTail();
int addr = internal::FSPromoter::demoteFS(curNode);
if (visited[addr] == addr) {
cerr << "Found Cycle truncating " << endl;
ResourceManager::getInstance().getLogger().logWarning("Found cycle in StringListFS. Truncating.");
break;
}
visited[addr] = addr;
if ( !curNode.isEmpty() ) {
str << " " ;
}
}
break;
}
default: {
cerr << "listToString() Invalid type " << fs.getType().getName() << endl;
ErrorInfo errInfo;
errInfo.setErrorId((TyErrorId)UIMA_ERR_RESOURCE_CORRUPTED);
ErrorMessage msg(UIMA_MSG_ID_EXC_XML_SAXPARSE_FATALERROR);
msg.addParam("listToString Invalid List type.");
msg.addParam(tag);
errInfo.setMessage(msg);
errInfo.setSeverity(ErrorInfo::unrecoverable);
ExcIllFormedInputError exc(errInfo);
throw exc;
}
}
return str.str();
}