Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 38355200BCF for ; Mon, 5 Dec 2016 14:12:40 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 36EED160AF9; Mon, 5 Dec 2016 13:12:40 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C57A6160B33 for ; Mon, 5 Dec 2016 14:12:37 +0100 (CET) Received: (qmail 20352 invoked by uid 500); 5 Dec 2016 13:12:36 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 19429 invoked by uid 99); 5 Dec 2016 13:12:35 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 05 Dec 2016 13:12:35 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7B747E962C; Mon, 5 Dec 2016 13:12:35 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: davsclaus@apache.org To: commits@camel.apache.org Date: Mon, 05 Dec 2016 13:12:52 -0000 Message-Id: <9f83dcc89b6147049c60cd2bbfc1fb7d@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [19/25] camel git commit: CAMEL-10559: route parser for java and xml to parse source code. Donated from fabric8 project. archived-at: Mon, 05 Dec 2016 13:12:40 -0000 http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java deleted file mode 100644 index 36fc443..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java +++ /dev/null @@ -1,310 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.List; - -import org.apache.camel.parser.helper.CamelJavaParserHelper; -import org.apache.camel.parser.model.CamelEndpointDetails; -import org.apache.camel.parser.model.CamelSimpleExpressionDetails; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ASTNode; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.MemberValuePair; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.NormalAnnotation; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.jboss.forge.roaster.model.Annotation; -import org.jboss.forge.roaster.model.source.FieldSource; -import org.jboss.forge.roaster.model.source.JavaClassSource; -import org.jboss.forge.roaster.model.source.MethodSource; -import org.jboss.forge.roaster.model.util.Strings; - -/** - * A Camel RouteBuilder parser that parses Camel Java routes source code. - *

- * This implementation is higher level details, and uses the lower level parser {@link CamelJavaParserHelper}. - */ -public final class RouteBuilderParser { - - private RouteBuilderParser() { - } - - /** - * 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 - */ - public static void parseRouteBuilderEndpoints(JavaClassSource clazz, String baseDir, String fullyQualifiedFileName, - List endpoints) { - parseRouteBuilderEndpoints(clazz, baseDir, fullyQualifiedFileName, endpoints, null, false); - } - - /** - * 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 endpoints, List unparsable, boolean includeInlinedRouteBuilders) { - - // look for fields which are not used in the route - for (FieldSource 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> methods = new ArrayList<>(); - MethodSource method = CamelJavaParserHelper.findConfigureMethod(clazz); - if (method != null) { - methods.add(method); - } - if (includeInlinedRouteBuilders) { - List> inlinedMethods = CamelJavaParserHelper.findInlinedConfigureMethods(clazz); - if (!inlinedMethods.isEmpty()) { - methods.addAll(inlinedMethods); - } - } - - // look if any of these fields are used in the route only as consumer or producer, as then we can - // determine this to ensure when we edit the endpoint we should only the options accordingly - for (MethodSource configureMethod : methods) { - // consumers only - List 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); - } - } - } - } - - /** - * Parses the java source class to discover Camel simple expressions. - * - * @param clazz the java source class - * @param baseDir the base of the source code - * @param fullyQualifiedFileName the fully qualified source code file name - * @param simpleExpressions list to add discovered and parsed simple expressions - */ - public static void parseRouteBuilderSimpleExpressions(JavaClassSource clazz, String baseDir, String fullyQualifiedFileName, - List simpleExpressions) { - - MethodSource method = CamelJavaParserHelper.findConfigureMethod(clazz); - if (method != null) { - List expressions = CamelJavaParserHelper.parseCamelSimpleExpressions(method); - for (ParserResult result : expressions) { - if (result.isParsed()) { - String fileName = fullyQualifiedFileName; - if (fileName.startsWith(baseDir)) { - fileName = fileName.substring(baseDir.length() + 1); - } - - CamelSimpleExpressionDetails details = new CamelSimpleExpressionDetails(); - details.setFileName(fileName); - details.setClassName(clazz.getQualifiedName()); - details.setMethodName("configure"); - int line = findLineNumber(fullyQualifiedFileName, result.getPosition()); - if (line > -1) { - details.setLineNumber("" + line); - } - details.setSimple(result.getElement()); - - simpleExpressions.add(details); - } - } - } - } - - private static CamelEndpointDetails findEndpointByUri(List endpoints, String uri) { - for (CamelEndpointDetails detail : endpoints) { - if (uri.equals(detail.getEndpointUri())) { - return detail; - } - } - return null; - } - - private static int findLineNumber(String fullyQualifiedFileName, int position) { - int lines = 0; - - try { - int current = 0; - try (BufferedReader br = new BufferedReader(new FileReader(new File(fullyQualifiedFileName)))) { - String line; - while ((line = br.readLine()) != null) { - lines++; - current += line.length() + 1; // add 1 for line feed - if (current >= position) { - return lines; - } - } - } - } catch (Exception e) { - // ignore - return -1; - } - - return lines; - } - - private static String endpointComponentName(String uri) { - if (uri != null) { - int idx = uri.indexOf(":"); - if (idx > 0) { - return uri.substring(0, idx); - } - } - return null; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java deleted file mode 100644 index 2cca9df..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser; - -import java.io.InputStream; -import java.util.List; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -import org.apache.camel.parser.helper.CamelJavaParserHelper; -import org.apache.camel.parser.helper.CamelXmlHelper; -import org.apache.camel.parser.helper.XmlLineNumberParser; - -import org.apache.camel.parser.model.CamelEndpointDetails; -import org.apache.camel.parser.model.CamelSimpleExpressionDetails; -import org.jboss.forge.roaster.model.util.Strings; - -import static org.apache.camel.parser.helper.CamelXmlHelper.getSafeAttribute; - -/** - * A Camel XML parser that parses Camel XML routes source code. - *

- * This implementation is higher level details, and uses the lower level parser {@link CamelJavaParserHelper}. - */ -public final class XmlRouteParser { - - private XmlRouteParser() { - } - - /** - * Parses the XML source to discover Camel endpoints. - * - * @param xml the xml file as input stream - * @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 - */ - public static void parseXmlRouteEndpoints(InputStream xml, String baseDir, String fullyQualifiedFileName, - List endpoints) throws Exception { - - // find all the endpoints (currently only and within ) - // try parse it as dom - Document dom = null; - try { - dom = XmlLineNumberParser.parseXml(xml); - } catch (Exception e) { - // ignore as the xml file may not be valid at this point - } - if (dom != null) { - List nodes = CamelXmlHelper.findAllEndpoints(dom); - for (Node node : nodes) { - String uri = getSafeAttribute(node, "uri"); - if (uri != null) { - // trim and remove whitespace noise - uri = trimEndpointUri(uri); - } - if (!Strings.isBlank(uri)) { - String id = getSafeAttribute(node, "id"); - String lineNumber = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER); - String lineNumberEnd = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER_END); - - // we only want the relative dir name from the resource directory, eg META-INF/spring/foo.xml - String fileName = fullyQualifiedFileName; - if (fileName.startsWith(baseDir)) { - fileName = fileName.substring(baseDir.length() + 1); - } - - boolean consumerOnly = false; - boolean producerOnly = false; - String nodeName = node.getNodeName(); - if ("from".equals(nodeName) || "pollEnrich".equals(nodeName)) { - consumerOnly = true; - } else if ("to".equals(nodeName) || "enrich".equals(nodeName) || "wireTap".equals(nodeName)) { - producerOnly = true; - } - - CamelEndpointDetails detail = new CamelEndpointDetails(); - detail.setFileName(fileName); - detail.setLineNumber(lineNumber); - detail.setLineNumberEnd(lineNumberEnd); - detail.setEndpointInstance(id); - detail.setEndpointUri(uri); - detail.setEndpointComponentName(endpointComponentName(uri)); - detail.setConsumerOnly(consumerOnly); - detail.setProducerOnly(producerOnly); - endpoints.add(detail); - } - } - } - } - - /** - * Parses the XML source to discover Camel endpoints. - * - * @param xml the xml file as input stream - * @param baseDir the base of the source code - * @param fullyQualifiedFileName the fully qualified source code file name - * @param simpleExpressions list to add discovered and parsed simple expressions - */ - public static void parseXmlRouteSimpleExpressions(InputStream xml, String baseDir, String fullyQualifiedFileName, - List simpleExpressions) throws Exception { - - // find all the simple expressions - // try parse it as dom - Document dom = null; - try { - dom = XmlLineNumberParser.parseXml(xml); - } catch (Exception e) { - // ignore as the xml file may not be valid at this point - } - if (dom != null) { - List nodes = CamelXmlHelper.findAllSimpleExpressions(dom); - for (Node node : nodes) { - String simple = node.getTextContent(); - String lineNumber = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER); - String lineNumberEnd = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER_END); - - // we only want the relative dir name from the resource directory, eg META-INF/spring/foo.xml - String fileName = fullyQualifiedFileName; - if (fileName.startsWith(baseDir)) { - fileName = fileName.substring(baseDir.length() + 1); - } - - CamelSimpleExpressionDetails detail = new CamelSimpleExpressionDetails(); - detail.setFileName(fileName); - detail.setLineNumber(lineNumber); - detail.setLineNumberEnd(lineNumberEnd); - detail.setSimple(simple); - simpleExpressions.add(detail); - } - } - } - - private static String endpointComponentName(String uri) { - if (uri != null) { - int idx = uri.indexOf(":"); - if (idx > 0) { - return uri.substring(0, idx); - } - } - return null; - } - - - private static String trimEndpointUri(String uri) { - uri = uri.trim(); - // if the uri is using new-lines then remove whitespace noise before & and ? separator - uri = uri.replaceAll("(\\s+)(\\&)", "$2"); - uri = uri.replaceAll("(\\&)(\\s+)", "$1"); - uri = uri.replaceAll("(\\?)(\\s+)", "$1"); - return uri; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java deleted file mode 100644 index 6df709a..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java +++ /dev/null @@ -1,638 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser.helper; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.camel.parser.ParserResult; -import org.apache.camel.parser.RouteBuilderParser; -import org.apache.camel.parser.roaster.AnonymousMethodSource; -import org.apache.camel.parser.roaster.StatementFieldSource; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ASTNode; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.AnonymousClassDeclaration; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Block; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.BooleanLiteral; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ExpressionStatement; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.FieldDeclaration; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.InfixExpression; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.MemberValuePair; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.MethodDeclaration; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.MethodInvocation; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.NormalAnnotation; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.NumberLiteral; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ParenthesizedExpression; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.QualifiedName; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ReturnStatement; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.SimpleName; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.SimpleType; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Statement; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.StringLiteral; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Type; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.VariableDeclaration; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.VariableDeclarationStatement; -import org.jboss.forge.roaster.model.Annotation; -import org.jboss.forge.roaster.model.source.AnnotationSource; -import org.jboss.forge.roaster.model.source.FieldSource; -import org.jboss.forge.roaster.model.source.JavaClassSource; -import org.jboss.forge.roaster.model.source.MethodSource; -import org.jboss.forge.roaster.model.util.Strings; - -/** - * A Camel Java parser that only depends on the Roaster API. - *

- * This implementation is lower level details. For a higher level parser see {@link RouteBuilderParser}. - */ -public final class CamelJavaParserHelper { - - private CamelJavaParserHelper() { - // utility class - } - - public static MethodSource findConfigureMethod(JavaClassSource clazz) { - MethodSource method = clazz.getMethod("configure"); - // must be public void configure() - if (method != null && method.isPublic() && method.getParameters().isEmpty() && method.getReturnType().isType("void")) { - return method; - } - - // maybe the route builder is from unit testing with camel-test as an anonymous inner class - // there is a bit of code to dig out this using the eclipse jdt api - method = findCreateRouteBuilderMethod(clazz); - if (method != null) { - return findConfigureMethodInCreateRouteBuilder(clazz, method); - } - - return null; - } - - public static List> findInlinedConfigureMethods(JavaClassSource clazz) { - List> answer = new ArrayList<>(); - - List> methods = clazz.getMethods(); - if (methods != null) { - for (MethodSource method : methods) { - if (method.isPublic() - && (method.getParameters() == null || method.getParameters().isEmpty()) - && (method.getReturnType() == null || method.getReturnType().isType("void"))) { - // maybe the method contains an inlined createRouteBuilder usually from an unit test method - MethodSource builder = findConfigureMethodInCreateRouteBuilder(clazz, method); - if (builder != null) { - answer.add(builder); - } - } - } - } - - return answer; - } - - private static MethodSource findCreateRouteBuilderMethod(JavaClassSource clazz) { - MethodSource method = clazz.getMethod("createRouteBuilder"); - if (method != null && (method.isPublic() || method.isProtected()) && method.getParameters().isEmpty()) { - return method; - } - return null; - } - - private static MethodSource findConfigureMethodInCreateRouteBuilder(JavaClassSource clazz, MethodSource 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; - } - - public static List parseCamelConsumerUris(MethodSource method, boolean strings, boolean fields) { - return doParseCamelUris(method, true, false, strings, fields); - } - - public static List parseCamelProducerUris(MethodSource method, boolean strings, boolean fields) { - return doParseCamelUris(method, false, true, strings, fields); - } - - private static List doParseCamelUris(MethodSource method, boolean consumers, boolean producers, - boolean strings, boolean fields) { - - List answer = new ArrayList(); - - if (method != null) { - MethodDeclaration md = (MethodDeclaration) method.getInternal(); - Block block = md.getBody(); - if (block != null) { - for (Object statement : md.getBody().statements()) { - // must be a method call expression - if (statement instanceof ExpressionStatement) { - ExpressionStatement es = (ExpressionStatement) statement; - Expression exp = es.getExpression(); - - List uris = new ArrayList(); - parseExpression(method.getOrigin(), block, exp, uris, consumers, producers, strings, fields); - if (!uris.isEmpty()) { - // reverse the order as we will grab them from last->first - Collections.reverse(uris); - answer.addAll(uris); - } - } - } - } - } - - return answer; - } - - private static void parseExpression(JavaClassSource clazz, Block block, Expression exp, List 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); - } - } - - private static void doParseCamelUris(JavaClassSource clazz, Block block, MethodInvocation mi, List uris, - boolean consumers, boolean producers, boolean strings, boolean fields) { - String name = mi.getName().getIdentifier(); - - if (consumers) { - if ("from".equals(name)) { - List args = mi.arguments(); - if (args != null) { - for (Object arg : args) { - if (isValidArgument(name, arg)) { - extractEndpointUriFromArgument(name, clazz, block, uris, arg, strings, fields); - } - } - } - } - if ("fromF".equals(name)) { - List args = mi.arguments(); - // the first argument is where the uri is - if (args != null && args.size() >= 1) { - Object arg = args.get(0); - if (isValidArgument(name, arg)) { - extractEndpointUriFromArgument(name, clazz, block, uris, arg, strings, fields); - } - } - } - if ("pollEnrich".equals(name)) { - List args = mi.arguments(); - // the first argument is where the uri is - if (args != null && args.size() >= 1) { - Object arg = args.get(0); - if (isValidArgument(name, arg)) { - extractEndpointUriFromArgument(name, clazz, block, uris, arg, strings, fields); - } - } - } - } - - if (producers) { - if ("to".equals(name) || "toD".equals(name)) { - List args = mi.arguments(); - if (args != null) { - for (Object arg : args) { - // skip if the arg is a boolean, ExchangePattern or Iterateable, type - if (isValidArgument(name, arg)) { - extractEndpointUriFromArgument(name, clazz, block, uris, arg, strings, fields); - } - } - } - } - if ("toF".equals(name)) { - List args = mi.arguments(); - // the first argument is where the uri is - if (args != null && args.size() >= 1) { - Object arg = args.get(0); - if (isValidArgument(name, arg)) { - extractEndpointUriFromArgument(name, clazz, block, uris, arg, strings, fields); - } - } - } - if ("enrich".equals(name) || "wireTap".equals(name)) { - List args = mi.arguments(); - // the first argument is where the uri is - if (args != null && args.size() >= 1) { - Object arg = args.get(0); - if (isValidArgument(name, arg)) { - extractEndpointUriFromArgument(name, clazz, block, uris, arg, strings, fields); - } - } - } - } - } - - private static boolean isValidArgument(String node, Object arg) { - // skip boolean argument, as toD can accept a boolean value - if (arg instanceof BooleanLiteral) { - return false; - } - // skip ExchangePattern argument - if (arg instanceof QualifiedName) { - QualifiedName qn = (QualifiedName) arg; - String name = qn.getFullyQualifiedName(); - if (name.startsWith("ExchangePattern")) { - return false; - } - } - return true; - } - - private static void extractEndpointUriFromArgument(String node, JavaClassSource clazz, Block block, List uris, Object arg, boolean strings, boolean fields) { - if (strings) { - String uri = getLiteralValue(clazz, block, (Expression) arg); - if (!Strings.isBlank(uri)) { - int position = ((Expression) arg).getStartPosition(); - - // if the node is fromF or toF, then replace all %s with {{%s}} as we cannot parse that value - if ("fromF".equals(node) || "toF".equals(node)) { - uri = uri.replaceAll("\\%s", "\\{\\{\\%s\\}\\}"); - } - - uris.add(new ParserResult(node, position, uri)); - return; - } - } - if (fields && arg instanceof SimpleName) { - FieldSource field = getField(clazz, block, (SimpleName) arg); - if (field != null) { - // find the endpoint uri from the annotation - AnnotationSource annotation = field.getAnnotation("org.apache.camel.cdi.Uri"); - if (annotation == null) { - annotation = field.getAnnotation("org.apache.camel.EndpointInject"); - } - if (annotation != null) { - Expression exp = (Expression) annotation.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; - } - } - } - String uri = CamelJavaParserHelper.getLiteralValue(clazz, block, exp); - if (!Strings.isBlank(uri)) { - int position = ((SimpleName) arg).getStartPosition(); - uris.add(new ParserResult(node, position, uri)); - } - } else { - // the field may be initialized using variables, so we need to evaluate those expressions - Object fi = field.getInternal(); - if (fi instanceof VariableDeclaration) { - Expression exp = ((VariableDeclaration) fi).getInitializer(); - String uri = CamelJavaParserHelper.getLiteralValue(clazz, block, exp); - if (!Strings.isBlank(uri)) { - // we want the position of the field, and not in the route - int position = ((VariableDeclaration) fi).getStartPosition(); - uris.add(new ParserResult(node, position, uri)); - } - } - } - } - } - - // cannot parse it so add a failure - uris.add(new ParserResult(node, -1, arg.toString(), false)); - } - - public static List parseCamelSimpleExpressions(MethodSource method) { - List answer = new ArrayList(); - - MethodDeclaration md = (MethodDeclaration) method.getInternal(); - Block block = md.getBody(); - if (block != null) { - for (Object statement : block.statements()) { - // must be a method call expression - if (statement instanceof ExpressionStatement) { - ExpressionStatement es = (ExpressionStatement) statement; - Expression exp = es.getExpression(); - - List expressions = new ArrayList(); - parseExpression(null, method.getOrigin(), block, exp, expressions); - if (!expressions.isEmpty()) { - // reverse the order as we will grab them from last->first - Collections.reverse(expressions); - answer.addAll(expressions); - } - } - } - } - - return answer; - } - - private static void parseExpression(String node, JavaClassSource clazz, Block block, Expression exp, List expressions) { - if (exp == null) { - return; - } - if (exp instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) exp; - doParseCamelSimple(node, clazz, block, mi, expressions); - // if the method was called on another method, then recursive - exp = mi.getExpression(); - parseExpression(node, clazz, block, exp, expressions); - } - } - - private static void doParseCamelSimple(String node, JavaClassSource clazz, Block block, MethodInvocation mi, List 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)) { - int position = ((Expression) arg).getStartPosition(); - expressions.add(new ParserResult(node, position, simple)); - } - } - } - - // 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); - } - } - } - } - - @SuppressWarnings("unchecked") - private static FieldSource getField(JavaClassSource clazz, Block block, SimpleName ref) { - String fieldName = ref.getIdentifier(); - if (fieldName != null) { - // find field in class - FieldSource field = clazz != null ? clazz.getField(fieldName) : null; - if (field == null) { - field = findFieldInBlock(clazz, block, fieldName); - } - return field; - } - return null; - } - - @SuppressWarnings("unchecked") - private static FieldSource findFieldInBlock(JavaClassSource clazz, Block block, String fieldName) { - for (Object statement : block.statements()) { - // try local statements first in the block - if (statement instanceof VariableDeclarationStatement) { - final Type type = ((VariableDeclarationStatement) statement).getType(); - for (Object obj : ((VariableDeclarationStatement) statement).fragments()) { - if (obj instanceof VariableDeclarationFragment) { - VariableDeclarationFragment fragment = (VariableDeclarationFragment) obj; - SimpleName name = fragment.getName(); - if (name != null && fieldName.equals(name.getIdentifier())) { - return new StatementFieldSource(clazz, fragment, type); - } - } - } - } - - // okay the field may be burried inside an anonymous inner class as a field declaration - // outside the configure method, so lets go back to the parent and see what we can find - ASTNode node = block.getParent(); - if (node instanceof MethodDeclaration) { - node = node.getParent(); - } - if (node instanceof AnonymousClassDeclaration) { - List declarations = ((AnonymousClassDeclaration) node).bodyDeclarations(); - for (Object dec : declarations) { - if (dec instanceof FieldDeclaration) { - FieldDeclaration fd = (FieldDeclaration) dec; - final Type type = fd.getType(); - for (Object obj : fd.fragments()) { - if (obj instanceof VariableDeclarationFragment) { - VariableDeclarationFragment fragment = (VariableDeclarationFragment) obj; - SimpleName name = fragment.getName(); - if (name != null && fieldName.equals(name.getIdentifier())) { - return new StatementFieldSource(clazz, fragment, type); - } - } - } - } - } - } - } - return null; - } - - public static String getLiteralValue(JavaClassSource clazz, Block block, Expression expression) { - // unwrap parenthesis - if (expression instanceof ParenthesizedExpression) { - expression = ((ParenthesizedExpression) expression).getExpression(); - } - - if (expression instanceof StringLiteral) { - return ((StringLiteral) expression).getLiteralValue(); - } else if (expression instanceof BooleanLiteral) { - return "" + ((BooleanLiteral) expression).booleanValue(); - } else if (expression instanceof NumberLiteral) { - return ((NumberLiteral) expression).getToken(); - } - - // if it a method invocation then add a dummy value assuming the method invocation will return a valid response - if (expression instanceof MethodInvocation) { - String name = ((MethodInvocation) expression).getName().getIdentifier(); - return "{{" + name + "}}"; - } - - // if its a qualified name (usually a constant field in another class) - // then add a dummy value as we cannot find the field value in other classes and maybe even outside the - // source code we have access to - if (expression instanceof QualifiedName) { - QualifiedName qn = (QualifiedName) expression; - String name = qn.getFullyQualifiedName(); - return "{{" + name + "}}"; - } - - if (expression instanceof SimpleName) { - FieldSource field = getField(clazz, block, (SimpleName) expression); - if (field != null) { - // is the field annotated with a Camel endpoint - if (field.getAnnotations() != 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) { - Expression 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; - } - } - } - if (exp != null) { - return getLiteralValue(clazz, block, exp); - } - } - } - } - // is the field an org.apache.camel.Endpoint type? - if ("Endpoint".equals(field.getType().getSimpleName())) { - // then grab the uri from the first argument - VariableDeclarationFragment vdf = (VariableDeclarationFragment) field.getInternal(); - expression = vdf.getInitializer(); - if (expression instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) expression; - List args = mi.arguments(); - if (args != null && args.size() > 0) { - // the first argument has the endpoint uri - expression = (Expression) args.get(0); - return getLiteralValue(clazz, block, expression); - } - } - } else { - // no annotations so try its initializer - VariableDeclarationFragment vdf = (VariableDeclarationFragment) field.getInternal(); - expression = vdf.getInitializer(); - if (expression == null) { - // its a field which has no initializer, then add a dummy value assuming the field will be initialized at runtime - return "{{" + field.getName() + "}}"; - } else { - return getLiteralValue(clazz, block, expression); - } - } - } else { - // we could not find the field in this class/method, so its maybe from some other super class, so insert a dummy value - final String fieldName = ((SimpleName) expression).getIdentifier(); - return "{{" + fieldName + "}}"; - } - } else if (expression instanceof InfixExpression) { - String answer = null; - // is it a string that is concat together? - InfixExpression ie = (InfixExpression) expression; - if (InfixExpression.Operator.PLUS.equals(ie.getOperator())) { - - String val1 = getLiteralValue(clazz, block, ie.getLeftOperand()); - String val2 = getLiteralValue(clazz, block, ie.getRightOperand()); - - // if numeric then we plus the values, otherwise we string concat - boolean numeric = isNumericOperator(clazz, block, ie.getLeftOperand()) && isNumericOperator(clazz, block, ie.getRightOperand()); - if (numeric) { - Long num1 = val1 != null ? Long.valueOf(val1) : 0; - Long num2 = val2 != null ? Long.valueOf(val2) : 0; - answer = "" + (num1 + num2); - } else { - answer = (val1 != null ? val1 : "") + (val2 != null ? val2 : ""); - } - - if (!answer.isEmpty()) { - // include extended when we concat on 2 or more lines - List extended = ie.extendedOperands(); - if (extended != null) { - for (Object ext : extended) { - String val3 = getLiteralValue(clazz, block, (Expression) ext); - if (numeric) { - Long num3 = val3 != null ? Long.valueOf(val3) : 0; - Long num = Long.valueOf(answer); - answer = "" + (num + num3); - } else { - answer += val3 != null ? val3 : ""; - } - } - } - } - } - return answer; - } - - return null; - } - - private static boolean isNumericOperator(JavaClassSource clazz, Block block, Expression expression) { - if (expression instanceof NumberLiteral) { - return true; - } else if (expression instanceof SimpleName) { - FieldSource field = getField(clazz, block, (SimpleName) expression); - if (field != null) { - return field.getType().isType("int") || field.getType().isType("long") - || field.getType().isType("Integer") || field.getType().isType("Long"); - } - } - return false; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java deleted file mode 100644 index 53d4783..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java +++ /dev/null @@ -1,268 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser.helper; - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import org.jboss.forge.roaster.model.util.Strings; - -/** - * Various XML helper methods used for parsing XML routes. - */ -public final class CamelXmlHelper { - - private CamelXmlHelper() { - // utility class - } - - public static String getSafeAttribute(Node node, String key) { - if (node != null) { - Node attr = node.getAttributes().getNamedItem(key); - if (attr != null) { - return attr.getNodeValue(); - } - } - return null; - } - - public static List findAllEndpoints(Document dom) { - List nodes = new ArrayList<>(); - - NodeList list = dom.getElementsByTagName("endpoint"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - if ("endpoint".equals(child.getNodeName())) { - // it may not be a camel namespace, so skip those - String ns = child.getNamespaceURI(); - if (ns == null) { - NamedNodeMap attrs = child.getAttributes(); - if (attrs != null) { - Node node = attrs.getNamedItem("xmlns"); - if (node != null) { - ns = node.getNodeValue(); - } - } - } - // assume no namespace its for camel - if (ns == null || ns.contains("camel")) { - nodes.add(child); - } - } - } - - list = dom.getElementsByTagName("onException"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - findAllUrisRecursive(child, nodes); - } - list = dom.getElementsByTagName("onCompletion"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - findAllUrisRecursive(child, nodes); - } - list = dom.getElementsByTagName("intercept"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - findAllUrisRecursive(child, nodes); - } - list = dom.getElementsByTagName("interceptFrom"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - findAllUrisRecursive(child, nodes); - } - list = dom.getElementsByTagName("interceptSendToEndpoint"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - findAllUrisRecursive(child, nodes); - } - list = dom.getElementsByTagName("rest"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - if ("route".equals(child.getNodeName()) || "to".equals(child.getNodeName())) { - findAllUrisRecursive(child, nodes); - } - } - list = dom.getElementsByTagName("route"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - if ("route".equals(child.getNodeName())) { - findAllUrisRecursive(child, nodes); - } - } - - return nodes; - } - - private static void findAllUrisRecursive(Node node, List nodes) { - // okay its a route so grab all uri attributes we can find - String url = getSafeAttribute(node, "uri"); - if (url != null) { - nodes.add(node); - } - - NodeList children = node.getChildNodes(); - if (children != null) { - for (int i = 0; i < children.getLength(); i++) { - Node child = children.item(i); - if (child.getNodeType() == Node.ELEMENT_NODE) { - findAllUrisRecursive(child, nodes); - } - } - } - } - - public static List findAllSimpleExpressions(Document dom) { - List nodes = new ArrayList<>(); - - NodeList list = dom.getElementsByTagName("route"); - for (int i = 0; i < list.getLength(); i++) { - Node child = list.item(i); - if ("route".equals(child.getNodeName())) { - findAllSimpleExpressionsRecursive(child, nodes); - } - } - - return nodes; - } - - private static void findAllSimpleExpressionsRecursive(Node node, List nodes) { - // okay its a route so grab if its - if ("simple".equals(node.getNodeName())) { - nodes.add(node); - } - - NodeList children = node.getChildNodes(); - if (children != null) { - for (int i = 0; i < children.getLength(); i++) { - Node child = children.item(i); - if (child.getNodeType() == Node.ELEMENT_NODE) { - findAllSimpleExpressionsRecursive(child, nodes); - } - } - } - } - - public static Element getSelectedCamelElementNode(String key, InputStream resourceInputStream) throws Exception { - Document root = loadCamelXmlFileAsDom(resourceInputStream); - Element selectedElement = null; - if (root != null) { - Node selectedNode = findCamelNodeInDocument(root, key); - if (selectedNode instanceof Element) { - selectedElement = (Element) selectedNode; - } - } - return selectedElement; - } - - private static Document loadCamelXmlFileAsDom(InputStream resourceInputStream) throws Exception { - // must enforce the namespace to be http://camel.apache.org/schema/spring which is what the camel-core JAXB model uses - Document root = XmlLineNumberParser.parseXml(resourceInputStream, "camelContext,routes,rests", "http://camel.apache.org/schema/spring"); - return root; - } - - private static Node findCamelNodeInDocument(Document root, String key) { - Node selectedNode = null; - if (root != null && !Strings.isBlank(key)) { - String[] paths = key.split("/"); - NodeList camels = getCamelContextElements(root); - if (camels != null) { - Map rootNodeCounts = new HashMap<>(); - for (int i = 0, size = camels.getLength(); i < size; i++) { - Node node = camels.item(i); - boolean first = true; - for (String path : paths) { - if (first) { - first = false; - String actual = getIdOrIndex(node, rootNodeCounts); - if (!equal(actual, path)) { - node = null; - } - } else { - node = findCamelNodeForPath(node, path); - } - if (node == null) { - break; - } - } - if (node != null) { - return node; - } - } - } - } - return selectedNode; - } - - private static Node findCamelNodeForPath(Node node, String path) { - NodeList childNodes = node.getChildNodes(); - if (childNodes != null) { - Map nodeCounts = new HashMap<>(); - for (int i = 0, size = childNodes.getLength(); i < size; i++) { - Node child = childNodes.item(i); - if (child instanceof Element) { - String actual = getIdOrIndex(child, nodeCounts); - if (equal(actual, path)) { - return child; - } - } - } - } - return null; - } - - private static String getIdOrIndex(Node node, Map nodeCounts) { - String answer = null; - if (node instanceof Element) { - Element element = (Element) node; - String elementName = element.getTagName(); - if ("routes".equals(elementName)) { - elementName = "camelContext"; - } - Integer countObject = nodeCounts.get(elementName); - int count = countObject != null ? countObject.intValue() : 0; - nodeCounts.put(elementName, ++count); - answer = element.getAttribute("id"); - if (Strings.isBlank(answer)) { - answer = "_" + elementName + count; - } - } - return answer; - } - - private static NodeList getCamelContextElements(Document dom) { - NodeList camels = dom.getElementsByTagName("camelContext"); - if (camels == null || camels.getLength() == 0) { - camels = dom.getElementsByTagName("routes"); - } - return camels; - } - - private static boolean equal(Object a, Object b) { - return a == b ? true : a != null && b != null && a.equals(b); - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java deleted file mode 100644 index b214b1e..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser.helper; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.util.Stack; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -/** - * An XML parser that uses SAX to include line and column number for each XML element in the parsed Document. - *

- * The line number and column number can be obtained from a Node/Element using - *

- *   String lineNumber = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER);
- *   String lineNumberEnd = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER_END);
- *   String columnNumber = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER);
- *   String columnNumberEnd = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER_END);
- * 
- */ -public final class XmlLineNumberParser { - - public static final String LINE_NUMBER = "lineNumber"; - public static final String COLUMN_NUMBER = "colNumber"; - public static final String LINE_NUMBER_END = "lineNumberEnd"; - public static final String COLUMN_NUMBER_END = "colNumberEnd"; - - private XmlLineNumberParser() { - } - - /** - * Parses the XML. - * - * @param is the XML content as an input stream - * @return the DOM model - * @throws Exception is thrown if error parsing - */ - public static Document parseXml(final InputStream is) throws Exception { - return parseXml(is, null, null); - } - - /** - * Parses the XML. - * - * @param is the XML content as an input stream - * @param rootNames one or more root names that is used as baseline for beginning the parsing, for example camelContext to start parsing - * when Camel is discovered. Multiple names can be defined separated by comma - * @param forceNamespace an optional namespace to force assign to each node. This may be needed for JAXB unmarshalling from XML -> POJO. - * @return the DOM model - * @throws Exception is thrown if error parsing - */ - public static Document parseXml(final InputStream is, final String rootNames, final String forceNamespace) throws Exception { - final Document doc; - SAXParser parser; - final SAXParserFactory factory = SAXParserFactory.newInstance(); - parser = factory.newSAXParser(); - final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - // turn off validator and loading external dtd - dbf.setValidating(false); - dbf.setNamespaceAware(true); - dbf.setFeature("http://xml.org/sax/features/namespaces", false); - dbf.setFeature("http://xml.org/sax/features/validation", false); - dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); - dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); - dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - final DocumentBuilder docBuilder = dbf.newDocumentBuilder(); - doc = docBuilder.newDocument(); - - final Stack elementStack = new Stack(); - final StringBuilder textBuffer = new StringBuilder(); - final DefaultHandler handler = new DefaultHandler() { - private Locator locator; - private boolean found; - - @Override - public void setDocumentLocator(final Locator locator) { - this.locator = locator; // Save the locator, so that it can be used later for line tracking when traversing nodes. - this.found = rootNames == null; - } - - private boolean isRootName(String qName) { - for (String root : rootNames.split(",")) { - if (qName.equals(root)) { - return true; - } - } - return false; - } - - @Override - public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException { - addTextIfNeeded(); - - if (rootNames != null && !found) { - if (isRootName(qName)) { - found = true; - } - } - - if (found) { - Element el; - if (forceNamespace != null) { - el = doc.createElementNS(forceNamespace, qName); - } else { - el = doc.createElement(qName); - } - - for (int i = 0; i < attributes.getLength(); i++) { - el.setAttribute(attributes.getQName(i), attributes.getValue(i)); - } - - el.setUserData(LINE_NUMBER, String.valueOf(this.locator.getLineNumber()), null); - el.setUserData(COLUMN_NUMBER, String.valueOf(this.locator.getColumnNumber()), null); - elementStack.push(el); - } - } - - @Override - public void endElement(final String uri, final String localName, final String qName) { - if (!found) { - return; - } - - addTextIfNeeded(); - - final Element closedEl = elementStack.isEmpty() ? null : elementStack.pop(); - if (closedEl != null) { - if (elementStack.isEmpty()) { - // Is this the root element? - doc.appendChild(closedEl); - } else { - final Element parentEl = elementStack.peek(); - parentEl.appendChild(closedEl); - } - - closedEl.setUserData(LINE_NUMBER_END, String.valueOf(this.locator.getLineNumber()), null); - closedEl.setUserData(COLUMN_NUMBER_END, String.valueOf(this.locator.getColumnNumber()), null); - } - } - - @Override - public void characters(final char ch[], final int start, final int length) throws SAXException { - textBuffer.append(ch, start, length); - } - - @Override - public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException { - // do not resolve external dtd - return new InputSource(new StringReader("")); - } - - // Outputs text accumulated under the current node - private void addTextIfNeeded() { - if (textBuffer.length() > 0) { - final Element el = elementStack.isEmpty() ? null : elementStack.peek(); - if (el != null) { - final Node textNode = doc.createTextNode(textBuffer.toString()); - el.appendChild(textNode); - textBuffer.delete(0, textBuffer.length()); - } - } - } - }; - parser.parse(is, handler); - - return doc; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java deleted file mode 100644 index 3b112a4..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser.model; - -/** - * Details about a parsed and discovered Camel endpoint. - */ -public class CamelEndpointDetails { - - private String fileName; - private String lineNumber; - private String lineNumberEnd; - private String className; - private String methodName; - private String endpointComponentName; - private String endpointInstance; - private String endpointUri; - private boolean consumerOnly; - private boolean producerOnly; - - public String getFileName() { - return fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public String getLineNumber() { - return lineNumber; - } - - public void setLineNumber(String lineNumber) { - this.lineNumber = lineNumber; - } - - public String getLineNumberEnd() { - return lineNumberEnd; - } - - public void setLineNumberEnd(String lineNumberEnd) { - this.lineNumberEnd = lineNumberEnd; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public String getMethodName() { - return methodName; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public String getEndpointComponentName() { - return endpointComponentName; - } - - public void setEndpointComponentName(String endpointComponentName) { - this.endpointComponentName = endpointComponentName; - } - - public String getEndpointInstance() { - return endpointInstance; - } - - public void setEndpointInstance(String endpointInstance) { - this.endpointInstance = endpointInstance; - } - - public String getEndpointUri() { - return endpointUri; - } - - public void setEndpointUri(String endpointUri) { - this.endpointUri = endpointUri; - } - - public boolean isConsumerOnly() { - return consumerOnly; - } - - public void setConsumerOnly(boolean consumerOnly) { - this.consumerOnly = consumerOnly; - } - - public boolean isProducerOnly() { - return producerOnly; - } - - public void setProducerOnly(boolean producerOnly) { - this.producerOnly = producerOnly; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - CamelEndpointDetails that = (CamelEndpointDetails) o; - - if (!fileName.equals(that.fileName)) { - return false; - } - if (lineNumber != null ? !lineNumber.equals(that.lineNumber) : that.lineNumber != null) { - return false; - } - if (lineNumberEnd != null ? !lineNumberEnd.equals(that.lineNumberEnd) : that.lineNumberEnd != null) { - return false; - } - if (!className.equals(that.className)) { - return false; - } - if (methodName != null ? !methodName.equals(that.methodName) : that.methodName != null) { - return false; - } - if (endpointInstance != null ? !endpointInstance.equals(that.endpointInstance) : that.endpointInstance != null) { - return false; - } - return endpointUri.equals(that.endpointUri); - - } - - @Override - public int hashCode() { - int result = fileName.hashCode(); - result = 31 * result + (lineNumber != null ? lineNumber.hashCode() : 0); - result = 31 * result + (lineNumberEnd != null ? lineNumberEnd.hashCode() : 0); - result = 31 * result + className.hashCode(); - result = 31 * result + (methodName != null ? methodName.hashCode() : 0); - result = 31 * result + (endpointInstance != null ? endpointInstance.hashCode() : 0); - result = 31 * result + endpointUri.hashCode(); - return result; - } - - @Override - public String toString() { - return "CamelEndpointDetails[" - + "fileName='" + fileName + '\'' - + ", lineNumber='" + lineNumber + '\'' - + ", lineNumberEnd='" + lineNumberEnd + '\'' - + ", className='" + className + '\'' - + ", methodName='" + methodName + '\'' - + ", endpointComponentName='" + endpointComponentName + '\'' - + ", endpointInstance='" + endpointInstance + '\'' - + ", endpointUri='" + endpointUri + '\'' - + ", consumerOnly=" + consumerOnly - + ", producerOnly=" + producerOnly - + ']'; - } -} http://git-wip-us.apache.org/repos/asf/camel/blob/88ba9063/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java ---------------------------------------------------------------------- diff --git a/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java b/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java deleted file mode 100644 index 9d6db11..0000000 --- a/tooling/route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.parser.model; - -/** - * Details about a parsed and discovered Camel simple expression. - */ -public class CamelSimpleExpressionDetails { - - private String fileName; - private String lineNumber; - private String lineNumberEnd; - private String className; - private String methodName; - private String simple; - private boolean predicate; - private boolean expression; - - public String getFileName() { - return fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public String getLineNumber() { - return lineNumber; - } - - public void setLineNumber(String lineNumber) { - this.lineNumber = lineNumber; - } - - public String getLineNumberEnd() { - return lineNumberEnd; - } - - public void setLineNumberEnd(String lineNumberEnd) { - this.lineNumberEnd = lineNumberEnd; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public String getMethodName() { - return methodName; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public String getSimple() { - return simple; - } - - public void setSimple(String simple) { - this.simple = simple; - } - - public boolean isPredicate() { - return predicate; - } - - public void setPredicate(boolean predicate) { - this.predicate = predicate; - } - - public boolean isExpression() { - return expression; - } - - public void setExpression(boolean expression) { - this.expression = expression; - } - - @Override - public String toString() { - return simple; - } -}