You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/12/31 08:59:32 UTC
[2/2] camel git commit: CAMEL-7999: apt compiler to generate json
schema documentation for the model,
whcih we later use to enrich the xml xsd to include documentation. Work in
progress.
CAMEL-7999: apt compiler to generate json schema documentation for the model, whcih we later use to enrich the xml xsd to include documentation. Work in progress.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/92a351e3
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/92a351e3
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/92a351e3
Branch: refs/heads/master
Commit: 92a351e34ab1759aa012449b5487b9a3b2ffaefa
Parents: e5bdc17
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Dec 31 08:58:23 2014 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Dec 31 08:58:23 2014 +0100
----------------------------------------------------------------------
.../apache/camel/model/MarshalDefinition.java | 9 +-
.../apache/camel/model/UnmarshalDefinition.java | 9 +-
.../camel/tools/apt/EipAnnotationProcessor.java | 244 +++++++++++--------
3 files changed, 157 insertions(+), 105 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/92a351e3/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java b/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java
index ac317d2..b520d92 100644
--- a/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java
@@ -71,11 +71,8 @@ import org.apache.camel.spi.RouteContext;
@XmlAccessorType(XmlAccessType.FIELD)
public class MarshalDefinition extends NoOutputDefinition<MarshalDefinition> {
- // TODO: Camel 3.0, ref attribute should be removed as RefDataFormat is to be used instead
+ // TODO: Camel 3.0, ref attribute should be removed as CustomDataFormat is to be used instead
- @XmlAttribute
- @Deprecated
- private String ref;
// cannot use @XmlElementRef as it doesn't allow optional properties
@XmlElements({
@XmlElement(required = false, name = "avro", type = AvroDataFormat.class),
@@ -113,6 +110,10 @@ public class MarshalDefinition extends NoOutputDefinition<MarshalDefinition> {
)
private DataFormatDefinition dataFormatType;
+ @XmlAttribute
+ @Deprecated
+ private String ref;
+
public MarshalDefinition() {
}
http://git-wip-us.apache.org/repos/asf/camel/blob/92a351e3/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java b/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java
index 2d2a7b3..a4a91e5 100644
--- a/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java
@@ -71,11 +71,8 @@ import org.apache.camel.spi.RouteContext;
@XmlAccessorType(XmlAccessType.FIELD)
public class UnmarshalDefinition extends NoOutputDefinition<UnmarshalDefinition> {
- // TODO: Camel 3.0, ref attribute should be removed as RefDataFormat is to be used instead
+ // TODO: Camel 3.0, ref attribute should be removed as UnmarshalDataFormat is to be used instead
- @XmlAttribute
- @Deprecated
- private String ref;
// cannot use @XmlElementRef as it doesn't allow optional properties
@XmlElements({
@XmlElement(required = false, name = "avro", type = AvroDataFormat.class),
@@ -113,6 +110,10 @@ public class UnmarshalDefinition extends NoOutputDefinition<UnmarshalDefinition>
)
private DataFormatDefinition dataFormatType;
+ @XmlAttribute
+ @Deprecated
+ private String ref;
+
public UnmarshalDefinition() {
}
http://git-wip-us.apache.org/repos/asf/camel/blob/92a351e3/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
index 8805c1b..a4aa927 100644
--- 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
@@ -36,6 +36,7 @@ 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;
@@ -48,12 +49,7 @@ import static org.apache.camel.tools.apt.Strings.safeNull;
// TODO: figure out a way to specify default value in the model classes which this APT can read
-// TODO: add support for @XmlElements which a few EIPs uses such as resequence
-//@XmlElements({
-// @XmlElement(name = "batch-config", type = BatchResequencerConfig.class),
-// @XmlElement(name = "stream-config", type = StreamResequencerConfig.class)}
-//)
-
+// TODO: add support for @deprecated
/**
* Process all camel-core's model classes (EIPs and DSL) and generate json schema documentation
@@ -217,113 +213,32 @@ public class EipAnnotationProcessor extends AbstractAnnotationProcessor {
protected void findClassProperties(PrintWriter writer, RoundEnvironment roundEnv, Set<EipOption> eipOptions,
TypeElement originalClassType, TypeElement classElement, String prefix) {
- Elements elementUtils = processingEnv.getElementUtils();
while (true) {
List<VariableElement> fieldElements = ElementFilter.fieldsIn(classElement.getEnclosedElements());
for (VariableElement fieldElement : fieldElements) {
- XmlAttribute attribute = fieldElement.getAnnotation(XmlAttribute.class);
String fieldName = fieldElement.getSimpleName().toString();
- if (attribute != null) {
- 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)) {
- continue;
- }
- }
-
- name = prefix + name;
- TypeMirror fieldType = fieldElement.asType();
- String fieldTypeName = fieldType.toString();
- TypeElement fieldTypeElement = findTypeElement(roundEnv, fieldTypeName);
-
- String docComment = findJavaDoc(elementUtils, fieldElement, fieldName, classElement, true);
- boolean required = attribute.required();
-
- // gather enums
- Set<String> enums = new TreeSet<String>();
- 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<VariableElement> fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements());
- for (VariableElement var : fields) {
- if (var.getKind() == ElementKind.ENUM_CONSTANT) {
- String val = var.toString();
- enums.add(val);
- }
- }
+ XmlAttribute attribute = fieldElement.getAnnotation(XmlAttribute.class);
+ if (attribute != null) {
+ boolean skip = processAttribute(roundEnv, originalClassType, classElement, fieldElement, fieldName, attribute, eipOptions, prefix);
+ if (skip) {
+ continue;
}
+ }
- EipOption ep = new EipOption(name, "attribute", fieldTypeName, required, "", docComment, isEnum, enums, false, null);
- eipOptions.add(ep);
+ XmlElements elements = fieldElement.getAnnotation(XmlElements.class);
+ if (elements != null) {
+ processElements(roundEnv, classElement, elements, fieldElement, eipOptions, prefix);
}
XmlElement element = fieldElement.getAnnotation(XmlElement.class);
- 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 docComment = findJavaDoc(elementUtils, fieldElement, fieldName, classElement, true);
- boolean required = element.required();
-
- // gather enums
- Set<String> enums = new LinkedHashSet<String>();
- 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<VariableElement> 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<String> oneOfTypes = new TreeSet<String>();
- boolean isOneOf = ONE_OF_TYPE_NAME.equals(fieldTypeName);
- if (isOneOf) {
- TypeElement languages = findTypeElement(roundEnv, ONE_OF_LANGUAGES);
- String superClassName = canonicalClassName(languages.toString());
- // find all classes that has that superClassName
- Set<TypeElement> children = new LinkedHashSet<TypeElement>();
- 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);
- }
- }
- }
- }
-
- EipOption ep = new EipOption(name, kind, fieldTypeName, required, "", docComment, isEnum, enums, isOneOf, oneOfTypes);
- eipOptions.add(ep);
+ processElement(roundEnv, classElement, element, fieldElement, eipOptions, prefix);
}
// special for eips which has outputs or requires an expressions
XmlElementRef elementRef = fieldElement.getAnnotation(XmlElementRef.class);
- fieldName = fieldElement.getSimpleName().toString();
if (elementRef != null) {
// special for outputs
@@ -356,6 +271,141 @@ public class EipAnnotationProcessor extends AbstractAnnotationProcessor {
}
}
+ private boolean processAttribute(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement, VariableElement fieldElement, String fieldName, XmlAttribute attribute, Set<EipOption> eipOptions, String prefix) {
+ 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 docComment = findJavaDoc(elementUtils, fieldElement, fieldName, classElement, true);
+ boolean required = attribute.required();
+
+ // gather enums
+ Set<String> enums = new TreeSet<String>();
+ 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<VariableElement> fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements());
+ for (VariableElement var : fields) {
+ if (var.getKind() == ElementKind.ENUM_CONSTANT) {
+ String val = var.toString();
+ enums.add(val);
+ }
+ }
+ }
+
+ EipOption ep = new EipOption(name, "attribute", fieldTypeName, required, "", docComment, isEnum, enums, false, null);
+ eipOptions.add(ep);
+
+ return false;
+ }
+
+ private void processElement(RoundEnvironment roundEnv, TypeElement classElement, XmlElement element, VariableElement fieldElement,
+ Set<EipOption> 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 docComment = findJavaDoc(elementUtils, fieldElement, fieldName, classElement, true);
+ boolean required = element.required();
+
+ // gather enums
+ Set<String> enums = new LinkedHashSet<String>();
+ 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<VariableElement> 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<String> oneOfTypes = new TreeSet<String>();
+ boolean isOneOf = ONE_OF_TYPE_NAME.equals(fieldTypeName);
+ if (isOneOf) {
+ TypeElement languages = findTypeElement(roundEnv, ONE_OF_LANGUAGES);
+ String superClassName = canonicalClassName(languages.toString());
+ // find all classes that has that superClassName
+ Set<TypeElement> children = new LinkedHashSet<TypeElement>();
+ 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);
+ }
+ }
+ }
+ }
+
+ EipOption ep = new EipOption(name, kind, fieldTypeName, required, "", docComment, isEnum, enums, isOneOf, oneOfTypes);
+ eipOptions.add(ep);
+ }
+ }
+
+ private void processElements(RoundEnvironment roundEnv, TypeElement classElement, XmlElements elements, VariableElement fieldElement,
+ Set<EipOption> 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 docComment = findJavaDoc(elementUtils, fieldElement, fieldName, classElement, true);
+ boolean required = true;
+
+ // gather oneOf of the elements
+ Set<String> oneOfTypes = new TreeSet<String>();
+ for (XmlElement element : elements.value()) {
+ String child = element.name();
+ oneOfTypes.add(child);
+ }
+
+ EipOption ep = new EipOption(name, kind, fieldTypeName, required, "", docComment, false, null, true, oneOfTypes);
+ eipOptions.add(ep);
+ }
+ }
+
private void processRoute(RoundEnvironment roundEnv, TypeElement originalClassType, TypeElement classElement,
Set<EipOption> eipOptions, String prefix) {