static ElementPointerPart parseFromString()

in src/main/java/org/apache/maven/xinclude/stax/ElementPointerPart.java [167:220]


    static ElementPointerPart parseFromString(final String schemeData) throws InvalidXPointerException {
        List<Integer> childSequence;
        String elementID = null;
        int startChar;
        int endChar;

        // Find an NCName if it exists?
        startChar = schemeData.indexOf("/");
        // -1 Only an NCName. 0 No NCName. > 1 An NCName.

        switch (startChar) {
            case -1: // Only an NCName.
                elementID = schemeData;
                if (!NCName.isValid(elementID)) {
                    throw new InvalidXPointerException("Invalid NCName in the XPointer", schemeData);
                }
                return new ElementPointerPart(elementID);
            case 0: // No NCName.
                break;
            default: // An NCName.
                elementID = schemeData.substring(0, startChar);
                if (!NCName.isValid(elementID)) {
                    throw new InvalidXPointerException("Invalid NCName in the XPointer", schemeData, 0, startChar);
                }
                break;
        }

        // Find remaining child sequence.
        childSequence = new ArrayList<>();

        endChar = schemeData.indexOf("/", startChar + 1);
        // -1 Only single child sequence element. > 0 A childSequence.

        if (endChar < 0) { // Only single child sequence element.
            childSequence.add(parseIntegerFromChildSequence(schemeData, startChar + 1, schemeData.length()));
        } else { // Multiple child sequence elements.
            while (true) {
                if (endChar < 0) { // Last integer.
                    childSequence.add(parseIntegerFromChildSequence(schemeData, startChar + 1, schemeData.length()));
                    break;
                } else { // Inner sequence integer.
                    childSequence.add(parseIntegerFromChildSequence(schemeData, startChar + 1, endChar));
                    startChar = endChar;
                    endChar = schemeData.indexOf("/", startChar + 1);
                }
            }
        }

        if (elementID == null) { // Only a childSequence
            return new ElementPointerPart(childSequence);
        } else { // Both NCName and childSequence
            return new ElementPointerPart(elementID, childSequence);
        }
    }