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 C633D200B72 for ; Thu, 11 Aug 2016 10:07:10 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id C4B58160A85; Thu, 11 Aug 2016 08:07:10 +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 BFD16160A94 for ; Thu, 11 Aug 2016 10:07:08 +0200 (CEST) Received: (qmail 78167 invoked by uid 500); 11 Aug 2016 08:07:07 -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 78056 invoked by uid 99); 11 Aug 2016 08:07:07 -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; Thu, 11 Aug 2016 08:07:07 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id A5B9BE0FC4; Thu, 11 Aug 2016 08:07:07 +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: Thu, 11 Aug 2016 08:07:08 -0000 Message-Id: In-Reply-To: <0808aabdcf824c4096ac234595ebdf98@git.apache.org> References: <0808aabdcf824c4096ac234595ebdf98@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/4] camel git commit: CAMEL-9482: Adjust the apt to make camel-core compile again, seems like we need to merge the core/spring into a single apt as the compiler cannot do both on camel-core for some odd reason. archived-at: Thu, 11 Aug 2016 08:07:10 -0000 http://git-wip-us.apache.org/repos/asf/camel/blob/8a18e284/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java deleted file mode 100644 index 253e37f..0000000 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java +++ /dev/null @@ -1,1148 +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.tools.apt; - -import java.io.PrintWriter; -import java.util.Comparator; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; -import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedAnnotationTypes; -import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.util.ElementFilter; -import javax.lang.model.util.Elements; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementRef; -import javax.xml.bind.annotation.XmlElements; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; - -import org.apache.camel.spi.Metadata; -import org.apache.camel.tools.apt.helper.JsonSchemaHelper; -import org.apache.camel.tools.apt.helper.Strings; - -import static org.apache.camel.tools.apt.helper.JsonSchemaHelper.sanitizeDescription; -import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName; -import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty; -import static org.apache.camel.tools.apt.helper.Strings.safeNull; - -/** - * Process all camel-core's model classes (EIPs and DSL) and generate json schema documentation - */ -@SupportedAnnotationTypes({"javax.xml.bind.annotation.*", "org.apache.camel.spi.Label"}) -@SupportedSourceVersion(SourceVersion.RELEASE_8) -public class EipAnnotationProcessor extends AbstractAnnotationProcessor { - - // special when using expression/predicates in the model - private static final String ONE_OF_TYPE_NAME = "org.apache.camel.model.ExpressionSubElementDefinition"; - private static final String[] ONE_OF_LANGUAGES = new String[]{ - "org.apache.camel.model.language.ExpressionDefinition", - "org.apache.camel.model.language.NamespaceAwareExpression" - }; - // special for inputs (these classes have sub classes, so we use this to find all classes) - private static final String[] ONE_OF_INPUTS = new String[]{ - "org.apache.camel.model.ProcessorDefinition", - "org.apache.camel.model.VerbDefinition" - }; - // special for outputs (these classes have sub classes, so we use this to find all classes) - private static final String[] ONE_OF_OUTPUTS = new String[]{ - "org.apache.camel.model.ProcessorDefinition", - "org.apache.camel.model.NoOutputDefinition", - "org.apache.camel.model.OutputDefinition", - "org.apache.camel.model.ExpressionNode", - "org.apache.camel.model.NoOutputExpressionNode", - "org.apache.camel.model.SendDefinition", - "org.apache.camel.model.InterceptDefinition", - "org.apache.camel.model.WhenDefinition", - "org.apache.camel.model.ToDynamicDefinition" - }; - // special for verbs (these classes have sub classes, so we use this to find all classes) - private static final String[] ONE_OF_VERBS = new String[]{ - "org.apache.camel.model.rest.VerbDefinition" - }; - - private boolean skipUnwanted = true; - - @Override - public boolean process(Set annotations, RoundEnvironment roundEnv) { - try { - if (roundEnv.processingOver()) { - return true; - } - - Set elements = roundEnv.getElementsAnnotatedWith(XmlRootElement.class); - for (Element element : elements) { - if (element instanceof TypeElement) { - processModelClass(roundEnv, (TypeElement) element); - } - } - } catch (Throwable e) { - dumpExceptionToErrorFile("camel-apt-error.log", "Error processing EIP model", e); - } - return true; - } - - protected void processModelClass(final RoundEnvironment roundEnv, final TypeElement classElement) { - // must be from org.apache.camel.model - final String javaTypeName = canonicalClassName(classElement.getQualifiedName().toString()); - String packageName = javaTypeName.substring(0, javaTypeName.lastIndexOf(".")); - if (!javaTypeName.startsWith("org.apache.camel.model")) { - return; - } - - // skip abstract classes - if (classElement.getModifiers().contains(Modifier.ABSTRACT)) { - return; - } - - // skip unwanted classes which are "abstract" holders - if (skipUnwanted) { - if (classElement.getQualifiedName().toString().equals(ONE_OF_TYPE_NAME)) { - return; - } - } - - final XmlRootElement rootElement = classElement.getAnnotation(XmlRootElement.class); - if (rootElement == null) { - return; - } - - String aName = rootElement.name(); - if (isNullOrEmpty(aName) || "##default".equals(aName)) { - XmlType typeElement = classElement.getAnnotation(XmlType.class); - aName = typeElement.name(); - } - final String name = aName; - - // lets use the xsd name as the file name - String fileName; - if (isNullOrEmpty(name) || "##default".equals(name)) { - fileName = classElement.getSimpleName().toString() + ".json"; - } else { - fileName = name + ".json"; - } - - // write json schema - Func1 handler = new Func1() { - @Override - public Void call(PrintWriter writer) { - writeJSonSchemeDocumentation(writer, roundEnv, classElement, rootElement, javaTypeName, name); - return null; - } - }; - processFile(packageName, fileName, handler); - } - - protected void writeJSonSchemeDocumentation(PrintWriter writer, RoundEnvironment roundEnv, TypeElement classElement, XmlRootElement rootElement, - String javaTypeName, String modelName) { - // gather eip information - EipModel eipModel = findEipModelProperties(roundEnv, classElement, javaTypeName, modelName); - - // get endpoint information which is divided into paths and options (though there should really only be one path) - Set eipOptions = new TreeSet(new EipOptionComparator(eipModel)); - findClassProperties(writer, roundEnv, eipOptions, classElement, classElement, "", modelName); - - // after we have found all the options then figure out if the model accepts input/output - eipModel.setInput(hasInput(roundEnv, classElement)); - eipModel.setOutput(hasOutput(eipModel, eipOptions)); - - String json = createParameterJsonSchema(eipModel, eipOptions); - writer.println(json); - } - - public String createParameterJsonSchema(EipModel eipModel, Set options) { - StringBuilder buffer = new StringBuilder("{"); - // eip model - buffer.append("\n \"model\": {"); - buffer.append("\n \"kind\": \"").append("model").append("\","); - buffer.append("\n \"name\": \"").append(eipModel.getName()).append("\","); - if (eipModel.getTitle() != null) { - buffer.append("\n \"title\": \"").append(eipModel.getTitle()).append("\","); - } else { - // fallback and use name as title - buffer.append("\n \"title\": \"").append(asTitle(eipModel.getName())).append("\","); - } - buffer.append("\n \"description\": \"").append(safeNull(eipModel.getDescription())).append("\","); - buffer.append("\n \"javaType\": \"").append(eipModel.getJavaType()).append("\","); - buffer.append("\n \"label\": \"").append(safeNull(eipModel.getLabel())).append("\","); - buffer.append("\n \"input\": \"").append(eipModel.getInput()).append("\","); - buffer.append("\n \"output\": \"").append(eipModel.getOutput()).append("\""); - buffer.append("\n },"); - - buffer.append("\n \"properties\": {"); - boolean first = true; - for (EipOption entry : options) { - if (first) { - first = false; - } else { - buffer.append(","); - } - buffer.append("\n "); - // as its json we need to sanitize the docs - String doc = entry.getDocumentation(); - doc = sanitizeDescription(doc, false); - buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc, - entry.isDeprecated(), false, null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(), entry.getOneOfTypes(), null, null, false)); - } - buffer.append("\n }"); - - buffer.append("\n}\n"); - return buffer.toString(); - } - - protected EipModel findEipModelProperties(RoundEnvironment roundEnv, TypeElement classElement, String javaTypeName, String name) { - EipModel model = new EipModel(); - model.setJavaType(javaTypeName); - model.setName(name); - - Metadata metadata = classElement.getAnnotation(Metadata.class); - if (metadata != null) { - if (!Strings.isNullOrEmpty(metadata.label())) { - model.setLabel(metadata.label()); - } - if (!Strings.isNullOrEmpty(metadata.title())) { - model.setTitle(metadata.title()); - } - } - - // favor to use class javadoc of component as description - if (model.getJavaType() != null) { - Elements elementUtils = processingEnv.getElementUtils(); - TypeElement typeElement = findTypeElement(roundEnv, model.getJavaType()); - if (typeElement != null) { - String doc = elementUtils.getDocComment(typeElement); - if (doc != null) { - // need to sanitize the description first (we only want a summary) - doc = sanitizeDescription(doc, true); - // the javadoc may actually be empty, so only change the doc if we got something - if (!Strings.isNullOrEmpty(doc)) { - model.setDescription(doc); - } - } - } - } - - return model; - } - - protected void findClassProperties(PrintWriter writer, RoundEnvironment roundEnv, Set eipOptions, - TypeElement originalClassType, TypeElement classElement, String prefix, String modelName) { - while (true) { - List fieldElements = ElementFilter.fieldsIn(classElement.getEnclosedElements()); - for (VariableElement fieldElement : fieldElements) { - - String fieldName = fieldElement.getSimpleName().toString(); - - XmlAttribute attribute = fieldElement.getAnnotation(XmlAttribute.class); - if (attribute != null) { - boolean skip = processAttribute(roundEnv, originalClassType, classElement, fieldElement, fieldName, attribute, eipOptions, prefix, modelName); - if (skip) { - continue; - } - } - - XmlValue value = fieldElement.getAnnotation(XmlValue.class); - if (value != null) { - processValue(roundEnv, originalClassType, classElement, fieldElement, fieldName, value, eipOptions, prefix, modelName); - } - - XmlElements elements = fieldElement.getAnnotation(XmlElements.class); - if (elements != null) { - processElements(roundEnv, classElement, elements, fieldElement, eipOptions, prefix); - } - - XmlElement element = fieldElement.getAnnotation(XmlElement.class); - if (element != null) { - processElement(roundEnv, classElement, element, fieldElement, eipOptions, prefix); - } - - // special for eips which has outputs or requires an expressions - XmlElementRef elementRef = fieldElement.getAnnotation(XmlElementRef.class); - if (elementRef != null) { - - // special for routes - processRoutes(roundEnv, originalClassType, elementRef, fieldElement, fieldName, eipOptions, prefix); - - // special for outputs - processOutputs(roundEnv, originalClassType, elementRef, fieldElement, fieldName, eipOptions, prefix); - - // special for when clauses (choice eip) - processRefWhenClauses(roundEnv, originalClassType, elementRef, fieldElement, fieldName, eipOptions, prefix); - - // special for rests (rest-dsl) - processRests(roundEnv, originalClassType, elementRef, fieldElement, fieldName, eipOptions, prefix); - - // special for verbs (rest-dsl) - processVerbs(roundEnv, originalClassType, elementRef, fieldElement, fieldName, eipOptions, prefix); - - // special for expression - processRefExpression(roundEnv, originalClassType, classElement, elementRef, fieldElement, fieldName, eipOptions, prefix); - - } - } - - // special when we process these nodes as they do not use JAXB annotations on fields, but on methods - if ("OptionalIdentifiedDefinition".equals(classElement.getSimpleName().toString())) { - processIdentified(roundEnv, originalClassType, classElement, eipOptions, prefix); - } else if ("RouteDefinition".equals(classElement.getSimpleName().toString())) { - processRoute(roundEnv, originalClassType, classElement, eipOptions, prefix); - } - - // check super classes which may also have fields - TypeElement baseTypeElement = null; - TypeMirror superclass = classElement.getSuperclass(); - if (superclass != null) { - String superClassName = canonicalClassName(superclass.toString()); - baseTypeElement = findTypeElement(roundEnv, superClassName); - } - if (baseTypeElement != null) { - classElement = baseTypeElement; - } else { - break; - } - } - } - - private boolean processAttribute(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement, VariableElement fieldElement, - String fieldName, XmlAttribute attribute, Set eipOptions, String prefix, String modelName) { - Elements elementUtils = processingEnv.getElementUtils(); - - String name = attribute.name(); - if (isNullOrEmpty(name) || "##default".equals(name)) { - name = fieldName; - } - - // lets skip some unwanted attributes - if (skipUnwanted) { - // we want to skip inheritErrorHandler which is only applicable for the load-balancer - boolean loadBalancer = "LoadBalanceDefinition".equals(originalClassType.getSimpleName().toString()); - if (!loadBalancer && "inheritErrorHandler".equals(name)) { - return true; - } - } - - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - TypeElement fieldTypeElement = findTypeElement(roundEnv, fieldTypeName); - - String defaultValue = findDefaultValue(fieldElement, fieldTypeName); - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, classElement, true); - boolean required = attribute.required(); - // metadata may overrule element required - required = findRequired(fieldElement, required); - - // gather enums - Set enums = new TreeSet(); - boolean isEnum = fieldTypeElement != null && fieldTypeElement.getKind() == ElementKind.ENUM; - if (isEnum) { - TypeElement enumClass = findTypeElement(roundEnv, fieldTypeElement.asType().toString()); - // find all the enum constants which has the possible enum value that can be used - List fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements()); - for (VariableElement var : fields) { - if (var.getKind() == ElementKind.ENUM_CONSTANT) { - String val = var.toString(); - enums.add(val); - } - } - } - - boolean deprecated = fieldElement.getAnnotation(Deprecated.class) != null; - - EipOption ep = new EipOption(name, "attribute", fieldTypeName, required, defaultValue, docComment, deprecated, isEnum, enums, false, null); - eipOptions.add(ep); - - return false; - } - - private void processValue(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement, VariableElement fieldElement, String fieldName, XmlValue value, - Set eipOptions, String prefix, String modelName) { - Elements elementUtils = processingEnv.getElementUtils(); - - // XmlValue has no name attribute - String name = fieldName; - - if ("method".equals(modelName) || "tokenize".equals(modelName) || "xtokenize".equals(modelName)) { - // skip expression attribute on these three languages as they are solely configured using attributes - if ("expression".equals(name)) { - return; - } - } - - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - String defaultValue = findDefaultValue(fieldElement, fieldTypeName); - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, classElement, true); - boolean required = true; - // metadata may overrule element required - required = findRequired(fieldElement, required); - - boolean deprecated = fieldElement.getAnnotation(Deprecated.class) != null; - - EipOption ep = new EipOption(name, "value", fieldTypeName, required, defaultValue, docComment, deprecated, false, null, false, null); - eipOptions.add(ep); - } - - private void processElement(RoundEnvironment roundEnv, TypeElement classElement, XmlElement element, VariableElement fieldElement, - Set eipOptions, String prefix) { - Elements elementUtils = processingEnv.getElementUtils(); - - String fieldName; - fieldName = fieldElement.getSimpleName().toString(); - if (element != null) { - - String kind = "element"; - String name = element.name(); - if (isNullOrEmpty(name) || "##default".equals(name)) { - name = fieldName; - } - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - TypeElement fieldTypeElement = findTypeElement(roundEnv, fieldTypeName); - - String defaultValue = findDefaultValue(fieldElement, fieldTypeName); - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, classElement, true); - boolean required = element.required(); - // metadata may overrule element required - required = findRequired(fieldElement, required); - - // gather enums - Set enums = new LinkedHashSet(); - boolean isEnum = fieldTypeElement != null && fieldTypeElement.getKind() == ElementKind.ENUM; - if (isEnum) { - TypeElement enumClass = findTypeElement(roundEnv, fieldTypeElement.asType().toString()); - // find all the enum constants which has the possible enum value that can be used - List fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements()); - for (VariableElement var : fields) { - if (var.getKind() == ElementKind.ENUM_CONSTANT) { - String val = var.toString(); - enums.add(val); - } - } - } - - // gather oneOf expression/predicates which uses language - Set oneOfTypes = new TreeSet(); - boolean isOneOf = ONE_OF_TYPE_NAME.equals(fieldTypeName); - if (isOneOf) { - // okay its actually an language expression, so favor using that in the eip option - kind = "expression"; - for (String language : ONE_OF_LANGUAGES) { - fieldTypeName = language; - TypeElement languages = findTypeElement(roundEnv, language); - String superClassName = canonicalClassName(languages.toString()); - // find all classes that has that superClassName - Set children = new LinkedHashSet(); - findTypeElementChildren(roundEnv, children, superClassName); - for (TypeElement child : children) { - XmlRootElement rootElement = child.getAnnotation(XmlRootElement.class); - if (rootElement != null) { - String childName = rootElement.name(); - if (childName != null) { - oneOfTypes.add(childName); - } - } - } - } - } - // special for otherwise as we want to indicate that the element is - if ("otherwise".equals(name)) { - isOneOf = true; - oneOfTypes.add("otherwise"); - } - - boolean deprecated = fieldElement.getAnnotation(Deprecated.class) != null; - - EipOption ep = new EipOption(name, kind, fieldTypeName, required, defaultValue, docComment, deprecated, isEnum, enums, isOneOf, oneOfTypes); - eipOptions.add(ep); - } - } - - private void processElements(RoundEnvironment roundEnv, TypeElement classElement, XmlElements elements, VariableElement fieldElement, - Set eipOptions, String prefix) { - Elements elementUtils = processingEnv.getElementUtils(); - - String fieldName; - fieldName = fieldElement.getSimpleName().toString(); - if (elements != null) { - String kind = "element"; - String name = fieldName; - name = prefix + name; - - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - String defaultValue = findDefaultValue(fieldElement, fieldTypeName); - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, classElement, true); - - boolean required = true; - required = findRequired(fieldElement, required); - - // gather oneOf of the elements - Set oneOfTypes = new TreeSet(); - for (XmlElement element : elements.value()) { - String child = element.name(); - oneOfTypes.add(child); - } - - EipOption ep = new EipOption(name, kind, fieldTypeName, required, defaultValue, docComment, false, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - private void processRoute(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement, - Set eipOptions, String prefix) { - - Elements elementUtils = processingEnv.getElementUtils(); - - // group - String docComment = findJavaDoc(elementUtils, null, "group", null, classElement, true); - EipOption ep = new EipOption("group", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // group - docComment = findJavaDoc(elementUtils, null, "streamCache", null, classElement, true); - ep = new EipOption("streamCache", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // trace - docComment = findJavaDoc(elementUtils, null, "trace", null, classElement, true); - ep = new EipOption("trace", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // trace - docComment = findJavaDoc(elementUtils, null, "messageHistory", null, classElement, true); - ep = new EipOption("messageHistory", "attribute", "java.lang.String", false, "true", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // trace - docComment = findJavaDoc(elementUtils, null, "handleFault", null, classElement, true); - ep = new EipOption("handleFault", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // delayer - docComment = findJavaDoc(elementUtils, null, "delayer", null, classElement, true); - ep = new EipOption("delayer", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // autoStartup - docComment = findJavaDoc(elementUtils, null, "autoStartup", null, classElement, true); - ep = new EipOption("autoStartup", "attribute", "java.lang.String", false, "true", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // startupOrder - docComment = findJavaDoc(elementUtils, null, "startupOrder", null, classElement, true); - ep = new EipOption("startupOrder", "attribute", "java.lang.Integer", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // errorHandlerRef - docComment = findJavaDoc(elementUtils, null, "errorHandlerRef", null, classElement, true); - ep = new EipOption("errorHandlerRef", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // routePolicyRef - docComment = findJavaDoc(elementUtils, null, "routePolicyRef", null, classElement, true); - ep = new EipOption("routePolicyRef", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // shutdownRoute - Set enums = new LinkedHashSet(); - enums.add("Default"); - enums.add("Defer"); - docComment = findJavaDoc(elementUtils, null, "shutdownRoute", "Default", classElement, true); - ep = new EipOption("shutdownRoute", "attribute", "org.apache.camel.ShutdownRoute", false, "", docComment, false, true, enums, false, null); - eipOptions.add(ep); - - // shutdownRunningTask - enums = new LinkedHashSet(); - enums.add("CompleteCurrentTaskOnly"); - enums.add("CompleteAllTasks"); - docComment = findJavaDoc(elementUtils, null, "shutdownRunningTask", "CompleteCurrentTaskOnly", classElement, true); - ep = new EipOption("shutdownRunningTask", "attribute", "org.apache.camel.ShutdownRunningTask", false, "", docComment, false, true, enums, false, null); - eipOptions.add(ep); - - // inputs - Set oneOfTypes = new TreeSet(); - oneOfTypes.add("from"); - docComment = findJavaDoc(elementUtils, null, "inputs", null, classElement, true); - ep = new EipOption("inputs", "element", "java.util.List", true, "", docComment, false, false, null, true, oneOfTypes); - eipOptions.add(ep); - - // outputs - // gather oneOf which extends any of the output base classes - oneOfTypes = new TreeSet(); - // find all classes that has that superClassName - Set children = new LinkedHashSet(); - for (String superclass : ONE_OF_OUTPUTS) { - findTypeElementChildren(roundEnv, children, superclass); - } - for (TypeElement child : children) { - XmlRootElement rootElement = child.getAnnotation(XmlRootElement.class); - if (rootElement != null) { - String childName = rootElement.name(); - if (childName != null) { - oneOfTypes.add(childName); - } - } - } - - // remove some types which are not intended as an output in eips - oneOfTypes.remove("route"); - - docComment = findJavaDoc(elementUtils, null, "outputs", null, classElement, true); - ep = new EipOption("outputs", "element", "java.util.List>", true, "", docComment, false, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - - /** - * Special for process the OptionalIdentifiedDefinition - */ - private void processIdentified(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement, - Set eipOptions, String prefix) { - - Elements elementUtils = processingEnv.getElementUtils(); - - // id - String docComment = findJavaDoc(elementUtils, null, "id", null, classElement, true); - EipOption ep = new EipOption("id", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // description - docComment = findJavaDoc(elementUtils, null, "description", null, classElement, true); - ep = new EipOption("description", "element", "org.apache.camel.model.DescriptionDefinition", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - - // lets skip custom id as it has no value for end users to configure - if (!skipUnwanted) { - // custom id - docComment = findJavaDoc(elementUtils, null, "customId", null, classElement, true); - ep = new EipOption("customId", "attribute", "java.lang.String", false, "", docComment, false, false, null, false, null); - eipOptions.add(ep); - } - } - - /** - * Special for processing an @XmlElementRef routes field - */ - private void processRoutes(RoundEnvironment roundEnv, TypeElement originalClassType, XmlElementRef elementRef, - VariableElement fieldElement, String fieldName, Set eipOptions, String prefix) { - if ("routes".equals(fieldName)) { - - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - Set oneOfTypes = new TreeSet(); - oneOfTypes.add("route"); - - EipOption ep = new EipOption("routes", "element", fieldTypeName, false, "", "Contains the Camel routes", false, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - /** - * Special for processing an @XmlElementRef rests field - */ - private void processRests(RoundEnvironment roundEnv, TypeElement originalClassType, XmlElementRef elementRef, - VariableElement fieldElement, String fieldName, Set eipOptions, String prefix) { - if ("rests".equals(fieldName)) { - - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - Set oneOfTypes = new TreeSet(); - oneOfTypes.add("rest"); - - EipOption ep = new EipOption("rests", "element", fieldTypeName, false, "", "Contains the rest services defined using the rest-dsl", false, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - /** - * Special for processing an @XmlElementRef outputs field - */ - private void processOutputs(RoundEnvironment roundEnv, TypeElement originalClassType, XmlElementRef elementRef, - VariableElement fieldElement, String fieldName, Set eipOptions, String prefix) { - if ("outputs".equals(fieldName) && supportOutputs(originalClassType)) { - String kind = "element"; - String name = elementRef.name(); - if (isNullOrEmpty(name) || "##default".equals(name)) { - name = fieldName; - } - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - // gather oneOf which extends any of the output base classes - Set oneOfTypes = new TreeSet(); - // find all classes that has that superClassName - Set children = new LinkedHashSet(); - for (String superclass : ONE_OF_OUTPUTS) { - findTypeElementChildren(roundEnv, children, superclass); - } - for (TypeElement child : children) { - XmlRootElement rootElement = child.getAnnotation(XmlRootElement.class); - if (rootElement != null) { - String childName = rootElement.name(); - if (childName != null) { - oneOfTypes.add(childName); - } - } - } - - // remove some types which are not intended as an output in eips - oneOfTypes.remove("route"); - - EipOption ep = new EipOption(name, kind, fieldTypeName, true, "", "", false, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - /** - * Special for processing an @XmlElementRef verbs field (rest-dsl) - */ - private void processVerbs(RoundEnvironment roundEnv, TypeElement originalClassType, XmlElementRef elementRef, - VariableElement fieldElement, String fieldName, Set eipOptions, String prefix) { - - Elements elementUtils = processingEnv.getElementUtils(); - - if ("verbs".equals(fieldName) && supportOutputs(originalClassType)) { - String kind = "element"; - String name = elementRef.name(); - if (isNullOrEmpty(name) || "##default".equals(name)) { - name = fieldName; - } - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, originalClassType, true); - - // gather oneOf which extends any of the output base classes - Set oneOfTypes = new TreeSet(); - // find all classes that has that superClassName - Set children = new LinkedHashSet(); - for (String superclass : ONE_OF_VERBS) { - findTypeElementChildren(roundEnv, children, superclass); - } - for (TypeElement child : children) { - XmlRootElement rootElement = child.getAnnotation(XmlRootElement.class); - if (rootElement != null) { - String childName = rootElement.name(); - if (childName != null) { - oneOfTypes.add(childName); - } - } - } - - EipOption ep = new EipOption(name, kind, fieldTypeName, true, "", docComment, false, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - /** - * Special for processing an @XmlElementRef expression field - */ - private void processRefExpression(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement, - XmlElementRef elementRef, VariableElement fieldElement, - String fieldName, Set eipOptions, String prefix) { - Elements elementUtils = processingEnv.getElementUtils(); - - if ("expression".equals(fieldName)) { - String kind = "expression"; - String name = elementRef.name(); - if (isNullOrEmpty(name) || "##default".equals(name)) { - name = fieldName; - } - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - // find javadoc from original class as it will override the setExpression method where we can provide the javadoc for the given EIP - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, originalClassType, true); - - // gather oneOf expression/predicates which uses language - Set oneOfTypes = new TreeSet(); - for (String language : ONE_OF_LANGUAGES) { - TypeElement languages = findTypeElement(roundEnv, language); - String superClassName = canonicalClassName(languages.toString()); - // find all classes that has that superClassName - Set children = new LinkedHashSet(); - findTypeElementChildren(roundEnv, children, superClassName); - for (TypeElement child : children) { - XmlRootElement rootElement = child.getAnnotation(XmlRootElement.class); - if (rootElement != null) { - String childName = rootElement.name(); - if (childName != null) { - oneOfTypes.add(childName); - } - } - } - } - - boolean deprecated = fieldElement.getAnnotation(Deprecated.class) != null; - - EipOption ep = new EipOption(name, kind, fieldTypeName, true, "", docComment, deprecated, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - /** - * Special for processing an @XmlElementRef when field - */ - private void processRefWhenClauses(RoundEnvironment roundEnv, TypeElement originalClassType, XmlElementRef elementRef, - VariableElement fieldElement, String fieldName, Set eipOptions, String prefix) { - Elements elementUtils = processingEnv.getElementUtils(); - - if ("whenClauses".equals(fieldName)) { - String kind = "element"; - String name = elementRef.name(); - if (isNullOrEmpty(name) || "##default".equals(name)) { - name = fieldName; - } - name = prefix + name; - TypeMirror fieldType = fieldElement.asType(); - String fieldTypeName = fieldType.toString(); - - // find javadoc from original class as it will override the setExpression method where we can provide the javadoc for the given EIP - String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, originalClassType, true); - boolean deprecated = fieldElement.getAnnotation(Deprecated.class) != null; - - // indicate that this element is one of when - Set oneOfTypes = new HashSet(); - oneOfTypes.add("when"); - - EipOption ep = new EipOption(name, kind, fieldTypeName, false, "", docComment, deprecated, false, null, true, oneOfTypes); - eipOptions.add(ep); - } - } - - /** - * Whether the class supports outputs. - *

- * There are some classes which does not support outputs, even though they have a outputs element. - */ - private boolean supportOutputs(TypeElement classElement) { - String superclass = canonicalClassName(classElement.getSuperclass().toString()); - return !"org.apache.camel.model.NoOutputExpressionNode".equals(superclass); - } - - private String findDefaultValue(VariableElement fieldElement, String fieldTypeName) { - String defaultValue = null; - Metadata metadata = fieldElement.getAnnotation(Metadata.class); - if (metadata != null) { - if (!Strings.isNullOrEmpty(metadata.defaultValue())) { - defaultValue = metadata.defaultValue(); - } - } - if (defaultValue == null) { - // if its a boolean type, then we use false as the default - if ("boolean".equals(fieldTypeName) || "java.lang.Boolean".equals(fieldTypeName)) { - defaultValue = "false"; - } - } - - return defaultValue; - } - - private boolean findRequired(VariableElement fieldElement, boolean defaultValue) { - Metadata metadata = fieldElement.getAnnotation(Metadata.class); - if (metadata != null) { - if (!Strings.isNullOrEmpty(metadata.required())) { - defaultValue = "true".equals(metadata.required()); - } - } - return defaultValue; - } - - /** - * Capitializes the name as a title - * - * @param name the name - * @return as a title - */ - private static String asTitle(String name) { - StringBuilder sb = new StringBuilder(); - for (char c : name.toCharArray()) { - boolean upper = Character.isUpperCase(c); - boolean first = sb.length() == 0; - if (first) { - sb.append(Character.toUpperCase(c)); - } else if (upper) { - sb.append(' '); - sb.append(c); - } else { - sb.append(Character.toLowerCase(c)); - } - } - return sb.toString().trim(); - } - - private boolean hasInput(RoundEnvironment roundEnv, TypeElement classElement) { - for (String name : ONE_OF_INPUTS) { - if (hasSuperClass(roundEnv, classElement, name)) { - return true; - } - } - return false; - } - - private boolean hasOutput(EipModel model, Set options) { - // if we are route/rest then we accept output - if ("route".equals(model.getName()) || "rest".equals(model.getName())) { - return true; - } - - for (EipOption option : options) { - if ("outputs".equals(option.getName())) { - return true; - } - } - return false; - } - - private static final class EipModel { - - private String name; - private String title; - private String javaType; - private String label; - private String description; - private boolean input; - private boolean output; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getJavaType() { - return javaType; - } - - public void setJavaType(String javaType) { - this.javaType = javaType; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public boolean isInput() { - return input; - } - - public void setInput(boolean input) { - this.input = input; - } - - public String getInput() { - return input ? "true" : "false"; - } - - public boolean isOutput() { - return output; - } - - public void setOutput(boolean output) { - this.output = output; - } - - public String getOutput() { - return output ? "true" : "false"; - } - - } - - private static final class EipOption { - - private String name; - private String kind; - private String type; - private boolean required; - private String defaultValue; - private String documentation; - private boolean deprecated; - private boolean enumType; - private Set enums; - private boolean oneOf; - private Set oneOfTypes; - - private EipOption(String name, String kind, String type, boolean required, String defaultValue, String documentation, boolean deprecated, - boolean enumType, Set enums, boolean oneOf, Set oneOfTypes) { - this.name = name; - this.kind = kind; - this.type = type; - this.required = required; - this.defaultValue = defaultValue; - this.documentation = documentation; - this.deprecated = deprecated; - this.enumType = enumType; - this.enums = enums; - this.oneOf = oneOf; - this.oneOfTypes = oneOfTypes; - } - - public String getName() { - return name; - } - - public String getKind() { - return kind; - } - - public String getType() { - return type; - } - - public boolean isRequired() { - return required; - } - - public String getDefaultValue() { - return defaultValue; - } - - public String getDocumentation() { - return documentation; - } - - public boolean isDeprecated() { - return deprecated; - } - - public boolean isEnumType() { - return enumType; - } - - public Set getEnums() { - return enums; - } - - public boolean isOneOf() { - return oneOf; - } - - public Set getOneOfTypes() { - return oneOfTypes; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - EipOption that = (EipOption) o; - - if (!name.equals(that.name)) { - return false; - } - - return true; - } - - @Override - public int hashCode() { - return name.hashCode(); - } - } - - private static final class EipOptionComparator implements Comparator { - - private final EipModel model; - - private EipOptionComparator(EipModel model) { - this.model = model; - } - - @Override - public int compare(EipOption o1, EipOption o2) { - int weigth = weigth(o1); - int weigth2 = weigth(o2); - - if (weigth == weigth2) { - // keep the current order - return 1; - } else { - // sort according to weight - return weigth2 - weigth; - } - } - - private int weigth(EipOption o) { - String name = o.getName(); - - // these should be first - if ("expression".equals(name)) { - return 10; - } - - // these should be last - if ("description".equals(name)) { - return -10; - } else if ("id".equals(name)) { - return -9; - } else if ("pattern".equals(name) && "to".equals(model.getName())) { - // and pattern only for the to model - return -8; - } - return 0; - } - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/8a18e284/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java index 79bf935..ffeb73b 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java @@ -24,6 +24,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; @@ -52,6 +53,14 @@ import org.apache.camel.tools.apt.model.ComponentOption; import org.apache.camel.tools.apt.model.EndpointOption; import org.apache.camel.tools.apt.model.EndpointPath; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findFieldElement; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findJavaDoc; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findTypeElement; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.implementsInterface; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.loadResource; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.processFile; +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.warning; import static org.apache.camel.tools.apt.helper.JsonSchemaHelper.sanitizeDescription; import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName; import static org.apache.camel.tools.apt.helper.Strings.getOrElse; @@ -63,7 +72,7 @@ import static org.apache.camel.tools.apt.helper.Strings.safeNull; */ @SupportedAnnotationTypes({"org.apache.camel.spi.*"}) @SupportedSourceVersion(SourceVersion.RELEASE_8) -public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { +public class EndpointAnnotationProcessor extends AbstractProcessor { // CHECKSTYLE:OFF @@ -114,7 +123,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { return null; } }; - processFile(packageName, fileName, handler); + processFile(processingEnv, packageName, fileName, handler); // write json schema fileName = alias + ".json"; @@ -125,7 +134,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { return null; } }; - processFile(packageName, fileName, handler); + processFile(processingEnv, packageName, fileName, handler); } } } @@ -177,7 +186,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { String consumerPrefix = getOrElse(uriEndpoint.consumerPrefix(), ""); if (consumerType != null) { consumerClassName = consumerType.toString(); - TypeElement consumerElement = findTypeElement(roundEnv, consumerClassName); + TypeElement consumerElement = findTypeElement(processingEnv, roundEnv, consumerClassName); if (consumerElement != null) { writer.println("

" + scheme + " consumer" + "

"); writeHtmlDocumentationAndFieldInjections(writer, roundEnv, componentModel, consumerElement, consumerPrefix, uriEndpoint.excludeProperties()); @@ -185,7 +194,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { } } if (!found && consumerClassName != null) { - warning("APT could not find consumer class " + consumerClassName); + warning(processingEnv, "APT could not find consumer class " + consumerClassName); } writer.println(""); writer.println(""); @@ -201,7 +210,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { Set endpointOptions = new LinkedHashSet(); Set componentOptions = new LinkedHashSet(); - TypeElement componentClassElement = findTypeElement(roundEnv, componentModel.getJavaType()); + TypeElement componentClassElement = findTypeElement(processingEnv, roundEnv, componentModel.getJavaType()); if (componentClassElement != null) { findComponentClassProperties(writer, roundEnv, componentModel, componentOptions, componentClassElement, ""); } @@ -462,15 +471,15 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { model.setConsumerOnly(uriEndpoint.consumerOnly()); model.setProducerOnly(uriEndpoint.producerOnly()); model.setLenientProperties(uriEndpoint.lenientProperties()); - model.setAsync(implementsInterface(roundEnv, endpointClassElement, "org.apache.camel.AsyncEndpoint")); + model.setAsync(implementsInterface(processingEnv, roundEnv, endpointClassElement, "org.apache.camel.AsyncEndpoint")); - String data = loadResource("META-INF/services/org/apache/camel/component", scheme); + String data = loadResource(processingEnv, "META-INF/services/org/apache/camel/component", scheme); if (data != null) { Map map = parseAsMap(data); model.setJavaType(map.get("class")); } - data = loadResource("META-INF/services/org/apache/camel", "component.properties"); + data = loadResource(processingEnv, "META-INF/services/org/apache/camel", "component.properties"); if (data != null) { Map map = parseAsMap(data); // now we have a lot more data, so we need to load it as key/value @@ -510,7 +519,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { // favor to use endpoint class javadoc as description Elements elementUtils = processingEnv.getElementUtils(); - TypeElement typeElement = findTypeElement(roundEnv, endpointClassElement.getQualifiedName().toString()); + TypeElement typeElement = findTypeElement(processingEnv, roundEnv, endpointClassElement.getQualifiedName().toString()); if (typeElement != null) { String doc = elementUtils.getDocComment(typeElement); if (doc != null) { @@ -571,7 +580,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { name = prefix + name; TypeMirror fieldType = setter.getParameters().get(0).asType(); String fieldTypeName = fieldType.toString(); - TypeElement fieldTypeElement = findTypeElement(roundEnv, fieldTypeName); + TypeElement fieldTypeElement = findTypeElement(processingEnv, roundEnv, fieldTypeName); String docComment = findJavaDoc(elementUtils, method, fieldName, name, classElement, false); if (isNullOrEmpty(docComment)) { @@ -590,7 +599,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { Set enums = new LinkedHashSet(); boolean isEnum = fieldTypeElement != null && fieldTypeElement.getKind() == ElementKind.ENUM; if (isEnum) { - TypeElement enumClass = findTypeElement(roundEnv, fieldTypeElement.asType().toString()); + TypeElement enumClass = findTypeElement(processingEnv, roundEnv, fieldTypeElement.asType().toString()); // find all the enum constants which has the possible enum value that can be used List fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements()); for (VariableElement var : fields) { @@ -612,7 +621,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { TypeMirror superclass = classElement.getSuperclass(); if (superclass != null) { String superClassName = canonicalClassName(superclass.toString()); - baseTypeElement = findTypeElement(roundEnv, superClassName); + baseTypeElement = findTypeElement(processingEnv, roundEnv, superClassName); } if (baseTypeElement != null) { classElement = baseTypeElement; @@ -661,7 +670,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { TypeMirror fieldType = fieldElement.asType(); String fieldTypeName = fieldType.toString(); - TypeElement fieldTypeElement = findTypeElement(roundEnv, fieldTypeName); + TypeElement fieldTypeElement = findTypeElement(processingEnv, roundEnv, fieldTypeName); String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, name, classElement, false); if (isNullOrEmpty(docComment)) { @@ -681,7 +690,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { } else { isEnum = fieldTypeElement != null && fieldTypeElement.getKind() == ElementKind.ENUM; if (isEnum) { - TypeElement enumClass = findTypeElement(roundEnv, fieldTypeElement.asType().toString()); + TypeElement enumClass = findTypeElement(processingEnv, roundEnv, fieldTypeElement.asType().toString()); // find all the enum constants which has the possible enum value that can be used List fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements()); for (VariableElement var : fields) { @@ -735,7 +744,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { // if the field type is a nested parameter then iterate through its fields TypeMirror fieldType = fieldElement.asType(); String fieldTypeName = fieldType.toString(); - TypeElement fieldTypeElement = findTypeElement(roundEnv, fieldTypeName); + TypeElement fieldTypeElement = findTypeElement(processingEnv, roundEnv, fieldTypeName); UriParams fieldParams = null; if (fieldTypeElement != null) { fieldParams = fieldTypeElement.getAnnotation(UriParams.class); @@ -769,7 +778,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { } else { isEnum = fieldTypeElement != null && fieldTypeElement.getKind() == ElementKind.ENUM; if (isEnum) { - TypeElement enumClass = findTypeElement(roundEnv, fieldTypeElement.asType().toString()); + TypeElement enumClass = findTypeElement(processingEnv, roundEnv, fieldTypeElement.asType().toString()); // find all the enum constants which has the possible enum value that can be used List fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements()); for (VariableElement var : fields) { @@ -800,7 +809,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor { TypeMirror superclass = classElement.getSuperclass(); if (superclass != null) { String superClassName = canonicalClassName(superclass.toString()); - baseTypeElement = findTypeElement(roundEnv, superClassName); + baseTypeElement = findTypeElement(processingEnv, roundEnv, superClassName); } if (baseTypeElement != null) { classElement = baseTypeElement; http://git-wip-us.apache.org/repos/asf/camel/blob/8a18e284/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java new file mode 100644 index 0000000..c56fafc --- /dev/null +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java @@ -0,0 +1,71 @@ +/** + * 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.tools.apt; + +import java.util.Set; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.xml.bind.annotation.XmlRootElement; + +import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile; +import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName; + +/** + * APT compiler plugin to generate JSon Schema for all EIP models and camel-spring's types. + */ +@SupportedAnnotationTypes({"javax.xml.bind.annotation.*", "org.apache.camel.spi.Label"}) +@SupportedSourceVersion(SourceVersion.RELEASE_8) +public class ModelAnnotationProcessor extends AbstractProcessor { + + CoreEipAnnotationProcessor coreProcessor = new CoreEipAnnotationProcessor(); + SpringAnnotationProcessor springProcessor = new SpringAnnotationProcessor(); + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + try { + if (roundEnv.processingOver()) { + return true; + } + + Set elements = roundEnv.getElementsAnnotatedWith(XmlRootElement.class); + for (Element element : elements) { + if (element instanceof TypeElement) { + TypeElement classElement = (TypeElement) element; + + final String javaTypeName = canonicalClassName(classElement.getQualifiedName().toString()); + boolean core = javaTypeName.startsWith("org.apache.camel.model"); + boolean spring = javaTypeName.startsWith("org.apache.camel.spring") || javaTypeName.startsWith("org.apache.camel.core.xml"); + if (core) { + coreProcessor.processModelClass(processingEnv, roundEnv, classElement); + } else if (spring) { + springProcessor.processModelClass(processingEnv, roundEnv, classElement); + } + } + } + } catch (Throwable e) { + dumpExceptionToErrorFile("camel-apt-error.log", "Error processing", e); + } + + return true; + } + +} \ No newline at end of file