in impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDODeserializer.java [171:264]
protected final EObject referent(String ref, NamespaceContext nameSpaces) {
int length = ref.length();
switch (length) {
case 0:
return null;
case 1: // #
return root;
}
EObject container;
int step;
if (ref.charAt(1) == '/') {
container = EcoreUtil.getRootContainer(root);
if (length == 2)
return container;
if (ref.charAt(2) == '/') {
for (Iterator iterator = container.eContents().iterator();/* true */;) {
if (!iterator.hasNext())
return null;
container = (EObject) iterator.next();
// if( container != null )
break;
}
/*#// is invalid
if (length == 3)
return container; */
step = 3;
} else
step = 2;
} else {
container = root;
step = 1;
}
String prefix = null;
for (int index = step; ++index != length;) {
switch (ref.charAt(index)) {
case '/':
container = step(ref, step, index, container, prefix, nameSpaces);
if (container == null)
return null;
break;
case ':':
prefix = ref.substring(step, index);
if (++index == length)
return container; // report error?
step = index;
default:
continue;
case '[':
name = ref.substring(step, index);
step = ref.indexOf(']', index + 2);
if (step == -1)
return container; // report error?
index = Integer.parseInt(ref.substring(++index, step));
EStructuralFeature feature;
Iterator iterator = container.eContents().iterator();
if (prefix == null)
do {
if (!iterator.hasNext())
return null;
EObject content = (EObject) iterator.next();
// if( content == null )continue;
feature = content.eContainmentFeature();
} while (!name.equals(extendedMetaData.getName(feature)));
else {
prefix = nameSpaces.getNamespaceURI(prefix);
do {
if (!iterator.hasNext())
return null;
EObject content = (EObject) iterator.next();
// if( content == null )continue;
feature = content.eContainmentFeature();
} while (!match(name, prefix, feature));
}
Object value = container.eGet(feature);
if (value instanceof List) {
List values = (List) value;
if (index > values.size())
return null;
container = (EObject) values.get(--index);
} else if (index == 1)
container = (EObject) value;
else
return null;
index = ref.indexOf('/', ++step);
if (index == -1)
return container;
}
if (++index == length)
return container;
step = index;
prefix = null;
}
return step(ref, step, length, container, prefix, nameSpaces);
}