in core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java [940:1161]
private String doCreateCode(CamelContext camelContext, String expression) throws SimpleParserException {
String function = getText();
// return the function directly if we can create function without analyzing the prefix
String answer = createCodeDirectly(function);
if (answer != null) {
return answer;
}
// body, headers and exchange property first
answer = createCodeBody(function);
if (answer != null) {
return answer;
}
answer = createCodeHeader(function);
if (answer != null) {
return answer;
}
answer = createCodeExchangeProperty(function);
if (answer != null) {
return answer;
}
answer = createCodeVariables(function);
if (answer != null) {
return answer;
}
// camelContext OGNL
String remainder = ifStartsWithReturnRemainder("camelContext", function);
if (remainder != null) {
boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
if (invalid) {
throw new SimpleParserException("Valid syntax: ${camelContext.OGNL} was: " + function, token.getIndex());
}
return "context" + ognlCodeMethods(remainder, null);
}
// ExceptionAs OGNL
remainder = ifStartsWithReturnRemainder("exceptionAs(", function);
if (remainder != null) {
String type = StringHelper.before(remainder, ")");
remainder = StringHelper.after(remainder, ")");
type = appendClass(type);
type = type.replace('$', '.');
type = type.trim();
boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
if (type.isEmpty() || invalid) {
throw new SimpleParserException("Valid syntax: ${exceptionAs(type).OGNL} was: " + function, token.getIndex());
}
return "exceptionAs(exchange, " + type + ")" + ognlCodeMethods(remainder, type);
}
// Exception OGNL
remainder = ifStartsWithReturnRemainder("exception", function);
if (remainder != null) {
boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
if (invalid) {
throw new SimpleParserException("Valid syntax: ${exceptionAs(type).OGNL} was: " + function, token.getIndex());
}
return "exception(exchange)" + ognlCodeMethods(remainder, null);
}
// system property
remainder = ifStartsWithReturnRemainder("sys.", function);
if (remainder != null) {
return "sys(\"" + remainder + "\")";
}
remainder = ifStartsWithReturnRemainder("sysenv.", function);
if (remainder == null) {
remainder = ifStartsWithReturnRemainder("sysenv:", function);
}
if (remainder == null) {
remainder = ifStartsWithReturnRemainder("env.", function);
}
if (remainder == null) {
remainder = ifStartsWithReturnRemainder("env:", function);
}
if (remainder != null) {
return "sysenv(\"" + remainder + "\")";
}
// exchange OGNL
remainder = ifStartsWithReturnRemainder("exchange", function);
if (remainder != null) {
boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
if (invalid) {
throw new SimpleParserException("Valid syntax: ${exchange.OGNL} was: " + function, token.getIndex());
}
return "exchange" + ognlCodeMethods(remainder, null);
}
// file: prefix
remainder = ifStartsWithReturnRemainder("file:", function);
if (remainder != null) {
return createCodeFileExpression(remainder);
}
// date: prefix
remainder = ifStartsWithReturnRemainder("date:", function);
if (remainder != null) {
String[] parts = remainder.split(":", 2);
if (parts.length == 1) {
return "date(exchange, \"" + parts[0] + "\")";
} else if (parts.length == 2) {
return "date(exchange, \"" + parts[0] + "\", null, \"" + parts[1] + "\")";
}
}
// date-with-timezone: prefix
remainder = ifStartsWithReturnRemainder("date-with-timezone:", function);
if (remainder != null) {
String[] parts = remainder.split(":", 3);
if (parts.length < 3) {
throw new SimpleParserException(
"Valid syntax: ${date-with-timezone:command:timezone:pattern} was: " + function, token.getIndex());
}
return "date(exchange, \"" + parts[0] + "\", \"" + parts[1] + "\", \"" + parts[2] + "\")";
}
// bean: prefix
remainder = ifStartsWithReturnRemainder("bean:", function);
if (remainder != null) {
String ref = remainder;
Object method = null;
Object scope = null;
// we support different syntax for bean function
if (remainder.contains("?method=") || remainder.contains("?scope=")) {
ref = StringHelper.before(remainder, "?");
String query = StringHelper.after(remainder, "?");
try {
Map<String, Object> map = URISupport.parseQuery(query);
method = map.get("method");
scope = map.get("scope");
} catch (URISyntaxException e) {
throw RuntimeCamelException.wrapRuntimeException(e);
}
} else {
//first check case :: because of my.own.Bean::method
int doubleColonIndex = remainder.indexOf("::");
//need to check that not inside params
int beginOfParameterDeclaration = remainder.indexOf('(');
if (doubleColonIndex > 0 && (!remainder.contains("(") || doubleColonIndex < beginOfParameterDeclaration)) {
ref = remainder.substring(0, doubleColonIndex);
method = remainder.substring(doubleColonIndex + 2);
} else {
int idx = remainder.indexOf('.');
if (idx > 0) {
ref = remainder.substring(0, idx);
method = remainder.substring(idx + 1);
}
}
}
ref = ref.trim();
if (method != null && scope != null) {
return "bean(exchange, bean, \"" + ref + "\", \"" + method + "\", \"" + scope + "\")";
} else if (method != null) {
return "bean(exchange, bean, \"" + ref + "\", \"" + method + "\", null)";
} else {
return "bean(exchange, bean, \"" + ref + "\", null, null)";
}
}
// properties: prefix
remainder = ifStartsWithReturnRemainder("properties:", function);
if (remainder != null) {
String[] parts = remainder.split(":", 2);
if (parts.length > 2) {
throw new SimpleParserException("Valid syntax: ${properties:key[:default]} was: " + function, token.getIndex());
}
String defaultValue = null;
if (parts.length >= 2) {
defaultValue = parts[1];
}
String key = parts[0];
key = key.trim();
if (defaultValue != null) {
return "properties(exchange, \"" + key + "\", \"" + defaultValue.trim() + "\")";
} else {
return "properties(exchange, \"" + key + "\")";
}
}
// ref: prefix
remainder = ifStartsWithReturnRemainder("ref:", function);
if (remainder != null) {
return "ref(exchange, \"" + remainder + "\")";
}
// type: prefix
remainder = ifStartsWithReturnRemainder("type:", function);
if (remainder != null) {
int pos = remainder.lastIndexOf('.');
String type = pos != -1 ? remainder.substring(0, pos) : remainder;
String field = pos != -1 ? remainder.substring(pos + 1) : null;
if (!type.endsWith(".class")) {
type += ".class";
}
type = type.replace('$', '.');
if (field != null) {
return "type(exchange, " + type + ", \"" + field + "\")";
} else {
return "type(exchange, " + type + ")";
}
}
// miscellaneous functions
String misc = createCodeExpressionMisc(function);
if (misc != null) {
return misc;
}
// attachments
if ("attachments".equals(function) || ifStartsWithReturnRemainder("attachment", function) != null) {
String code = createCodeAttachments(camelContext, function);
if (code != null) {
return code;
}
}
throw new SimpleParserException("Unknown function: " + function, token.getIndex());
}