protected final EObject referent()

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);
    }