use of org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression in project camel by apache.
the class CamelJavaParserHelper method findConfigureMethodInCreateRouteBuilder.
private static MethodSource<JavaClassSource> findConfigureMethodInCreateRouteBuilder(JavaClassSource clazz, MethodSource<JavaClassSource> method) {
// find configure inside the code
MethodDeclaration md = (MethodDeclaration) method.getInternal();
Block block = md.getBody();
if (block != null) {
List statements = block.statements();
for (int i = 0; i < statements.size(); i++) {
Statement stmt = (Statement) statements.get(i);
Expression exp = null;
if (stmt instanceof ReturnStatement) {
ReturnStatement rs = (ReturnStatement) stmt;
exp = rs.getExpression();
} else if (stmt instanceof ExpressionStatement) {
ExpressionStatement es = (ExpressionStatement) stmt;
exp = es.getExpression();
if (exp instanceof MethodInvocation) {
MethodInvocation mi = (MethodInvocation) exp;
for (Object arg : mi.arguments()) {
if (arg instanceof ClassInstanceCreation) {
exp = (Expression) arg;
break;
}
}
}
}
if (exp != null && exp instanceof ClassInstanceCreation) {
ClassInstanceCreation cic = (ClassInstanceCreation) exp;
boolean isRouteBuilder = false;
if (cic.getType() instanceof SimpleType) {
SimpleType st = (SimpleType) cic.getType();
isRouteBuilder = "RouteBuilder".equals(st.getName().toString());
}
if (isRouteBuilder && cic.getAnonymousClassDeclaration() != null) {
List body = cic.getAnonymousClassDeclaration().bodyDeclarations();
for (int j = 0; j < body.size(); j++) {
Object line = body.get(j);
if (line instanceof MethodDeclaration) {
MethodDeclaration amd = (MethodDeclaration) line;
if ("configure".equals(amd.getName().toString())) {
return new AnonymousMethodSource(clazz, amd);
}
}
}
}
}
}
}
return null;
}
use of org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression in project camel by apache.
the class RouteBuilderParser method parseRouteBuilderEndpoints.
/**
* Parses the java source class to discover Camel endpoints.
*
* @param clazz the java source class
* @param baseDir the base of the source code
* @param fullyQualifiedFileName the fully qualified source code file name
* @param endpoints list to add discovered and parsed endpoints
* @param unparsable list of unparsable nodes
* @param includeInlinedRouteBuilders whether to include inlined route builders in the parsing
*/
public static void parseRouteBuilderEndpoints(JavaClassSource clazz, String baseDir, String fullyQualifiedFileName, List<CamelEndpointDetails> endpoints, List<String> unparsable, boolean includeInlinedRouteBuilders) {
// look for fields which are not used in the route
for (FieldSource<JavaClassSource> field : clazz.getFields()) {
// is the field annotated with a Camel endpoint
String uri = null;
Expression exp = null;
for (Annotation ann : field.getAnnotations()) {
boolean valid = "org.apache.camel.EndpointInject".equals(ann.getQualifiedName()) || "org.apache.camel.cdi.Uri".equals(ann.getQualifiedName());
if (valid) {
exp = (Expression) ann.getInternal();
if (exp instanceof SingleMemberAnnotation) {
exp = ((SingleMemberAnnotation) exp).getValue();
} else if (exp instanceof NormalAnnotation) {
List values = ((NormalAnnotation) exp).values();
for (Object value : values) {
MemberValuePair pair = (MemberValuePair) value;
if ("uri".equals(pair.getName().toString())) {
exp = pair.getValue();
break;
}
}
}
uri = CamelJavaParserHelper.getLiteralValue(clazz, null, exp);
}
}
// we only want to add fields which are not used in the route
if (!Strings.isBlank(uri) && findEndpointByUri(endpoints, uri) == null) {
// we only want the relative dir name from the
String fileName = fullyQualifiedFileName;
if (fileName.startsWith(baseDir)) {
fileName = fileName.substring(baseDir.length() + 1);
}
String id = field.getName();
CamelEndpointDetails detail = new CamelEndpointDetails();
detail.setFileName(fileName);
detail.setClassName(clazz.getQualifiedName());
detail.setEndpointInstance(id);
detail.setEndpointUri(uri);
detail.setEndpointComponentName(endpointComponentName(uri));
// favor the position of the expression which had the actual uri
Object internal = exp != null ? exp : field.getInternal();
// find position of field/expression
if (internal instanceof ASTNode) {
int pos = ((ASTNode) internal).getStartPosition();
int line = findLineNumber(fullyQualifiedFileName, pos);
if (line > -1) {
detail.setLineNumber("" + line);
}
}
// we do not know if this field is used as consumer or producer only, but we try
// to find out by scanning the route in the configure method below
endpoints.add(detail);
}
}
// find all the configure methods
List<MethodSource<JavaClassSource>> methods = new ArrayList<>();
MethodSource<JavaClassSource> method = CamelJavaParserHelper.findConfigureMethod(clazz);
if (method != null) {
methods.add(method);
}
if (includeInlinedRouteBuilders) {
List<MethodSource<JavaClassSource>> inlinedMethods = CamelJavaParserHelper.findInlinedConfigureMethods(clazz);
if (!inlinedMethods.isEmpty()) {
methods.addAll(inlinedMethods);
}
}
// determine this to ensure when we edit the endpoint we should only the options accordingly
for (MethodSource<JavaClassSource> configureMethod : methods) {
// consumers only
List<ParserResult> uris = CamelJavaParserHelper.parseCamelConsumerUris(configureMethod, true, true);
for (ParserResult result : uris) {
if (!result.isParsed()) {
if (unparsable != null) {
unparsable.add(result.getElement());
}
} else {
CamelEndpointDetails detail = findEndpointByUri(endpoints, result.getElement());
if (detail != null) {
// its a consumer only
detail.setConsumerOnly(true);
} else {
String fileName = fullyQualifiedFileName;
if (fileName.startsWith(baseDir)) {
fileName = fileName.substring(baseDir.length() + 1);
}
detail = new CamelEndpointDetails();
detail.setFileName(fileName);
detail.setClassName(clazz.getQualifiedName());
detail.setMethodName(configureMethod.getName());
detail.setEndpointInstance(null);
detail.setEndpointUri(result.getElement());
int line = findLineNumber(fullyQualifiedFileName, result.getPosition());
if (line > -1) {
detail.setLineNumber("" + line);
}
detail.setEndpointComponentName(endpointComponentName(result.getElement()));
detail.setConsumerOnly(true);
detail.setProducerOnly(false);
endpoints.add(detail);
}
}
}
// producer only
uris = CamelJavaParserHelper.parseCamelProducerUris(configureMethod, true, true);
for (ParserResult result : uris) {
if (!result.isParsed()) {
if (unparsable != null) {
unparsable.add(result.getElement());
}
} else {
CamelEndpointDetails detail = findEndpointByUri(endpoints, result.getElement());
if (detail != null) {
if (detail.isConsumerOnly()) {
// its both a consumer and producer
detail.setConsumerOnly(false);
detail.setProducerOnly(false);
} else {
// its a producer only
detail.setProducerOnly(true);
}
}
// the same endpoint uri may be used in multiple places in the same route
// so we should maybe add all of them
String fileName = fullyQualifiedFileName;
if (fileName.startsWith(baseDir)) {
fileName = fileName.substring(baseDir.length() + 1);
}
detail = new CamelEndpointDetails();
detail.setFileName(fileName);
detail.setClassName(clazz.getQualifiedName());
detail.setMethodName(configureMethod.getName());
detail.setEndpointInstance(null);
detail.setEndpointUri(result.getElement());
int line = findLineNumber(fullyQualifiedFileName, result.getPosition());
if (line > -1) {
detail.setLineNumber("" + line);
}
detail.setEndpointComponentName(endpointComponentName(result.getElement()));
detail.setConsumerOnly(false);
detail.setProducerOnly(true);
endpoints.add(detail);
}
}
}
}
use of org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression in project camel by apache.
the class CamelJavaParserHelper method doParseCamelSimple.
private static void doParseCamelSimple(String node, JavaClassSource clazz, Block block, MethodInvocation mi, List<ParserResult> expressions) {
String name = mi.getName().getIdentifier();
if ("simple".equals(name)) {
List args = mi.arguments();
// the first argument is a string parameter for the simple expression
if (args != null && args.size() >= 1) {
// it is a String type
Object arg = args.get(0);
String simple = getLiteralValue(clazz, block, (Expression) arg);
if (!Strings.isBlank(simple)) {
// is this a simple expression that is called as a predicate or expression
boolean predicate = false;
Expression parent = mi.getExpression();
if (parent == null) {
// maybe its an argument
// simple maybe be passed in as an argument
List list = mi.arguments();
// must be a single argument
if (list != null && list.size() == 1) {
ASTNode o = (ASTNode) list.get(0);
ASTNode p = o.getParent();
if (p instanceof MethodInvocation) {
// this is simple
String pName = ((MethodInvocation) p).getName().getIdentifier();
if ("simple".equals(pName)) {
// okay find the parent of simple which is the method that uses simple
parent = (Expression) p.getParent();
}
}
}
}
if (parent != null && parent instanceof MethodInvocation) {
MethodInvocation emi = (MethodInvocation) parent;
String parentName = emi.getName().getIdentifier();
predicate = isSimplePredicate(parentName);
}
int position = ((Expression) arg).getStartPosition();
ParserResult result = new ParserResult(node, position, simple);
result.setPredicate(predicate);
expressions.add(result);
}
}
}
// simple maybe be passed in as an argument
List args = mi.arguments();
if (args != null) {
for (Object arg : args) {
if (arg instanceof MethodInvocation) {
MethodInvocation ami = (MethodInvocation) arg;
doParseCamelSimple(node, clazz, block, ami, expressions);
}
}
}
}
use of org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression in project camel by apache.
the class CamelJavaParserHelper method parseExpression.
private static void parseExpression(JavaClassSource clazz, Block block, Expression exp, List<ParserResult> uris, boolean consumers, boolean producers, boolean strings, boolean fields) {
if (exp == null) {
return;
}
if (exp instanceof MethodInvocation) {
MethodInvocation mi = (MethodInvocation) exp;
doParseCamelUris(clazz, block, mi, uris, consumers, producers, strings, fields);
// if the method was called on another method, then recursive
exp = mi.getExpression();
parseExpression(clazz, block, exp, uris, consumers, producers, strings, fields);
}
}
Aggregations