public void parse()

in src/main/java/org/apache/sling/resourceresolver/impl/params/PathParser.java [73:160]


    public void parse(String path) {
        this.rawPath = path;
        this.parameters = Collections.emptyMap();

        if (path == null) {
            return;
        }

        // indexOf shortcut for the most common case
        final int si = path.indexOf(';');
        if (si == -1) {
            return;
        }

        final int di = path.indexOf('.');
        final char[] chars = path.toCharArray();
        final ParametersParser parametersParser = new ParametersParser();

        ParserState state = ParserState.INIT;
        int paramsStart = -1, paramsEnd = -1;

        int i = (di != -1) ? ((si != -1) ? Math.min(di, si) : di) : si;
        for (; i <= chars.length; i++) {
            final char c;
            if (i == chars.length) {
                c = 0;
            } else {
                c = chars[i];
            }

            switch (state) {
                case INIT:
                    if (c == '.') {
                        state = ParserState.V1_EXTENSION;
                    } else if (c == ';') {
                        paramsStart = i;
                        i = parametersParser.parseParameters(chars, i, false);
                        paramsEnd = i--;
                        state = parametersParser.isInvalid() ? ParserState.INVALID : ParserState.V2_PARAMS;
                    }
                    break;

                case V1_EXTENSION:
                    if (c == '/') {
                        state = ParserState.SUFFIX;
                    } else if (c == ';') {
                        paramsStart = i;
                        i = parametersParser.parseParameters(chars, i, true);
                        paramsEnd = i--;
                        state = parametersParser.isInvalid() ? ParserState.INVALID : ParserState.V1_PARAMS;
                    }
                    break;

                case V1_PARAMS:
                    if (c == '/') {
                        state = ParserState.SUFFIX;
                    } else if (c == '.') {
                        state = ParserState.INVALID; // no dots after params
                    }
                    break;

                case V2_PARAMS:
                    if (c == '/') {
                        state = ParserState.INVALID; // there was no extension, so no suffix is allowed
                    } else if (c == '.') {
                        state = ParserState.V2_EXTENSION;
                    }
                    break;

                case V2_EXTENSION:
                    if (c == '/') {
                        state = ParserState.SUFFIX;
                    }
                    break;

                case SUFFIX:
                case INVALID:
                    break;
            }
        }

        if (state == ParserState.INVALID) {
            paramsStart = paramsEnd = -1;
        } else {
            cutPath(path, paramsStart, paramsEnd);
            parameters = Collections.unmodifiableMap(parametersParser.getParameters());
        }
    }