in src/cas/xmiwriter.cpp [779:862]
void XmiWriter::findReferencedFSs(FeatureStructure const & fs, bool check) {
if (! fs.isValid() ) {
return;
}
if (check) {
if (! enqueueUnindexed(fs)) {
// already been processed
return;
}
}
Type t = fs.getType();
//cout << "findReferencedFSs() " << t.getName() << endl;
int tcode = internal::FSPromoter::demoteType(t);
bool insideListNode=fs.getCAS().getTypeSystem().isListType(tcode);
assert( t.isValid() );
size_t i;
if ( iv_arrayType.subsumes(t) ) {
if ( t == iv_cas.getTypeSystem().getType(uima::CAS::TYPE_NAME_FS_ARRAY) ) {
ArrayFS array(fs);
for (i=0; i<array.size(); ++i) {
findReferencedFSs(array.get(i));
}
}
}
else {
vector<Feature> features;
fs.getType().getAppropriateFeatures(features);
for (i=0; i<features.size(); ++i) {
uima::Feature const & f = features[i];
Type range;
f.getRangeType(range);
if (isReferenceType(range)) {
//cout << __LINE__ << "a referenced feature " <<
// f.getName() << endl;
int typecode = internal::FSPromoter::demoteType(range);
switch (typecode) {
case internal::gs_tyFSArrayType: {
findReferencedFSs(fs.getFSValue(f));
break;
}
case internal::gs_tyFSListType: {
// we only enqueue lists as first-class objects if the feature has
// multipleReferencesAllowed = true
// OR if we're already inside a list node (this handles the tail feature correctly)
if (f.isMultipleReferencesAllowed() || insideListNode) {
findReferencedFSs(fs.getFSValue(f));
} else {
// enqueue any FSs reachable from an FSList
enqueueFSListElements(fs.getFSValue(f));
}
break;
}
case internal::gs_tyBooleanArrayType:
case internal::gs_tyByteArrayType:
case internal::gs_tyIntArrayType:
case internal::gs_tyFloatArrayType:
case internal::gs_tyStringArrayType:
case internal::gs_tyShortArrayType:
case internal::gs_tyLongArrayType:
case internal::gs_tyDoubleArrayType: {
if (f.isMultipleReferencesAllowed ()) {
findReferencedFSs(fs.getFSValue(f));
}
break;
}
case internal::gs_tyIntListType:
case internal::gs_tyFloatListType:
case internal::gs_tyStringListType: {
if (f.isMultipleReferencesAllowed () || insideListNode) {
findReferencedFSs(fs.getFSValue(f));
}
break;
}
default: { //FS Ref
findReferencedFSs(fs.getFSValue(f));
}
}
}
}
}
}