private Parameter parseFormatString()

in src/main/java/org/apache/sling/engine/impl/log/CustomLogFormat.java [149:305]


    private Parameter parseFormatString(CharacterIterator sr, int c) {

        // read all modifiers
        boolean required = true;
        int[] statCodes = null;
        while (c != CharacterIterator.DONE) {
            if (c == '!') {
                required = false;
            } else if (c >= '0' && c <= '9') {
                statCodes = this.parseStatusCodes(sr, c);
            } else if (c == '>' || c == '<') {
                // ignore first/last modifiers
            } else {
                break;
            }

            c = sr.next();
        }

        // read name
        String name;
        if (c == '{') {
            StringBuilder nameBuf = new StringBuilder();
            for (c = sr.next(); c != CharacterIterator.DONE && c != '}'; c = sr.next()) {
                nameBuf.append((char) c);
            }
            name = (nameBuf.length() > 0) ? nameBuf.toString() : null;

            // get the format indicator
            c = sr.next();
        } else {
            name = null;
        }

        Parameter param;
        switch (c) {
            case 'a':
                param = new RemoteIPParameter();
                break;

            case 'A':
                param = new LocalIPParameter();
                break;

            case 'b':
            case 'B':
                param = new ByteCountParameter();
                break;

            case 'C':
                param = (name == null) ? null : new CookieParameter(name, true);
                break;

            case 'D':
                param = new DurationParameter(false);
                break;

            case 'f':
                // we assume the path to the content the request resolved to
                param = new ContentPathParameter();
                break;

            case 'h':
                param = new RemoteHostParameter();
                break;

            case 'H':
                param = new ProtocolParameter();
                break;

            case 'i':
                param = (name == null) ? null : new HeaderParameter(name, true);
                break;

            case 'm':
                param = new MethodParameter();
                break;

            case 'M':
                param = new ParamParameter(name);
                break;

            case 'o':
                param = (name == null) ? null : new HeaderParameter(name, false);
                break;

            case 'p':
                param = new LocalPortParameter();
                break;

            case 'P':
                // %{format}P form is not currently supported
                param = new ThreadParameter(name);
                break;

            case 'q':
                param = new QueryParameter();
                break;

            case 'r':
                param = new FirstRequestLineParameter();
                break;

            case 'R':
                param = new IdParameter();
                break;

            case 's':
                param = new StatusParameter();
                break;

            case 't':
                // %{format}t form is not currently supported
                param = new TimeParameter(name);
                break;

            case 'T':
                param = new DurationParameter(true);
                break;

            case 'u':
                param = new UserParameter();
                break;

            case 'U':
                param = new RequestParameter();
                break;

            case 'v':
            case 'V':
                param = new ServerNameParameter();
                break;

            case 'y':
                param = new AuthTypeParameter();
                break;

            case 'X': // no supported fall through to default
            case 'I': // no supported fall through to default
            case 'O': // no supported fall through to default
            case 'n': // no supported fall through to default
            case 'l': // no supported fall through to default
            case 'e': // no supported fall through to default
            default:
                param = new NonImplementedParameter(name);
                break;
        }

        if (param instanceof BaseParameter) {
            BaseParameter baseParam = (BaseParameter) param;
            baseParam.setParName((char) c);
            baseParam.setRequired(required);
            baseParam.setStatusLimits(statCodes);
        }

        return param;
    }