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