Camel apt improved html doc generation. And working on generating json schema as well.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ae8dc870 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ae8dc870 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ae8dc870 Branch: refs/heads/master Commit: ae8dc87006e069a9214ac1bd1797f6f2fa198cde Parents: 7bba465 Author: Claus Ibsen <davscl...@apache.org> Authored: Thu Nov 6 10:52:12 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Nov 7 13:25:18 2014 +0100 ---------------------------------------------------------------------- .../tools/apt/EndpointAnnotationProcessor.java | 45 +++++++++++---- .../camel/tools/apt/util/JsonSchemaHelper.java | 59 +++++++++----------- 2 files changed, 60 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/ae8dc870/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 a4bd197..548387e 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 @@ -25,9 +25,7 @@ import java.io.Writer; import java.net.URI; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.SortedMap; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Filer; import javax.annotation.processing.RoundEnvironment; @@ -35,6 +33,7 @@ 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.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; @@ -101,7 +100,6 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { return null; } }; -// packageName = "META-INF.services.org.apache.camel.schema"; processFile(packageName, scheme, fileName, handler); } } @@ -151,9 +149,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { String classDoc = processingEnv.getElementUtils().getDocComment(classElement); if (!Strings.isNullOrEmpty(classDoc)) { - // remove dodgy @version that we may have in class javadoc - classDoc = classDoc.replaceFirst("\\@version", ""); - classDoc = classDoc.trim(); + classDoc = JsonSchemaHelper.sanitizeDescription(classDoc); } // TODO: add some top details about component scheme name, and documentation @@ -170,14 +166,14 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { public String createParameterJsonSchema(Set<EndpointOption> options) { StringBuilder buffer = new StringBuilder("{\n \"properties\": {"); boolean first = true; - for (EndpointOption entry : options) { + for (EndpointOption entry : options) { if (first) { first = false; } else { buffer.append(","); } buffer.append("\n "); - buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getType(), entry.getDocumentation())); + buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getType(), entry.getDocumentation(), entry.isEnumType(), entry.getEnums())); } buffer.append("\n }\n}\n"); return buffer.toString(); @@ -267,7 +263,24 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { docComment = ""; } - EndpointOption option = new EndpointOption(name, fieldTypeName, docComment.trim()); + // gather enums + Set<String> 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<VariableElement> fields = ElementFilter.fieldsIn(enumClass.getEnclosedElements()); + for (VariableElement var : fields) { + if (var.getKind() == ElementKind.ENUM_CONSTANT) { + String val = var.toString(); + enums.add(val); + } + } + } + + // we could likely detect if the type is collection based? + + EndpointOption option = new EndpointOption(name, fieldTypeName, docComment.trim(), isEnum, enums); endpointOptions.add(option); } } @@ -368,11 +381,15 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { private String name; private String type; private String documentation; + private boolean enumType; + private Set<String> enums; - private EndpointOption(String name, String type, String documentation) { + private EndpointOption(String name, String type, String documentation, boolean enumType, Set<String> enums) { this.name = name; this.type = type; this.documentation = documentation; + this.enumType = enumType; + this.enums = enums; } public String getName() { @@ -387,6 +404,14 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { return documentation; } + public boolean isEnumType() { + return enumType; + } + + public Set<String> getEnums() { + return enums; + } + @Override public boolean equals(Object o) { if (this == o) { http://git-wip-us.apache.org/repos/asf/camel/blob/ae8dc870/tooling/apt/src/main/java/org/apache/camel/tools/apt/util/JsonSchemaHelper.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/util/JsonSchemaHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/util/JsonSchemaHelper.java index 9f8ad26..5d17118 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/util/JsonSchemaHelper.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/util/JsonSchemaHelper.java @@ -16,6 +16,8 @@ */ package org.apache.camel.tools.apt.util; +import java.util.Set; + import static org.apache.camel.tools.apt.util.Strings.doubleQuote; /** @@ -26,17 +28,30 @@ public final class JsonSchemaHelper { private JsonSchemaHelper() { } - public static String toJson(String name, String type, String description) { - String typeName = JsonSchemaHelper.getType(type); - - // TODO: add support for enum and array + public static String toJson(String name, String type, String description, boolean enumType, Set<String> enums) { + String typeName = JsonSchemaHelper.getType(type, enumType); StringBuilder sb = new StringBuilder(); sb.append(doubleQuote(name)); sb.append(": { \"type\":"); - sb.append(doubleQuote(typeName)); + + if ("enum".equals(typeName)) { + sb.append(doubleQuote("string")); + CollectionStringBuffer enumValues = new CollectionStringBuffer(); + for (Object value : enums) { + enumValues.append(doubleQuote(value.toString())); + } + sb.append(", \"enum\": [ "); + sb.append(enumValues.toString()); + sb.append(" ]"); + } else if ("array".equals(typeName)) { + sb.append(doubleQuote("array")); + } else { + sb.append(doubleQuote(typeName)); + } + if (!Strings.isNullOrEmpty(description)) { - sb.append(", \"description\":"); + sb.append(", \"description\": "); String text = sanitizeDescription(description); sb.append(doubleQuote(text)); } @@ -47,27 +62,6 @@ public final class JsonSchemaHelper { } sb.append(" }"); return sb.toString(); - -// if (type.isEnum()) { -// String typeName = "string"; -// CollectionStringBuffer sb = new CollectionStringBuffer(); -// for (Object value : parameterType.getEnumConstants()) { -// sb.append(doubleQuote(value.toString())); -// } -// return doubleQuote(name) + ": { \"type\": " + doubleQuote(type) + ", \"enum\": [ " + sb.toString() + " ] }"; -// } else if (parameterType.isArray()) { -// String typeName = "array"; -// return doubleQuote(name) + ": { \"type\": " + doubleQuote(type) + " }"; -// } else { -// if ("object".equals(typeName)) { -// for object then include the javaType as a description so we know that -// return doubleQuote(name) + ": { \"type\": " + doubleQuote(typeName) -// + ", \"properties\": { \"javaType\": { \"description\": \"" + type + "\", \"type\": \"string\" } } }"; -// } else { -// return doubleQuote(name) + ": { \"type\": " + doubleQuote(typeName) + " }"; -// } -// } - } /** @@ -76,13 +70,10 @@ public final class JsonSchemaHelper { * @param type the java type * @return the json schema type, is never null, but returns <tt>object</tt> as the generic type */ - public static String getType(String type) { - // TODO: -// if (type.isEnum()) { -// return "enum"; -// } else if (type.isArray()) { -// return "array"; -// } + public static String getType(String type, boolean enumType) { + if (enumType) { + return "enum"; + } String primitive = getPrimitiveType(type); if (primitive != null) {