Repository: camel Updated Branches: refs/heads/master 25cfae1f3 -> 950b1fc7a
CAMEL-7999: apt plugin include enums from other JARs in the options when extending other components in other JARs. Added kind attribute to the options so we know if its from url path or query parameter. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/dd856841 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/dd856841 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/dd856841 Branch: refs/heads/master Commit: dd856841c79f743bf7a2ce3d2a3a6ef1a9a46a51 Parents: 25cfae1 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Nov 12 14:17:17 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Nov 12 14:17:17 2014 +0100 ---------------------------------------------------------------------- .../management/mbean/CamelOpenMBeanTypes.java | 8 +- .../apache/camel/impl/DefaultCamelContext.java | 22 +++-- .../camel/management/mbean/ManagedEndpoint.java | 7 +- .../camel/karaf/commands/EndpointExplain.java | 9 ++- .../camel/karaf/commands/EndpointList.java | 15 +++- .../tools/apt/EndpointAnnotationProcessor.java | 84 ++++++++++---------- .../camel/tools/apt/JsonSchemaHelper.java | 6 +- 7 files changed, 88 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java index 239e690..5e3160c 100644 --- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java +++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java @@ -66,13 +66,13 @@ public final class CamelOpenMBeanTypes { public static TabularType explainEndpointTabularType() throws OpenDataException { CompositeType ct = explainEndpointsCompositeType(); - return new TabularType("explainEndpoint", "Explain how this endpoint is configured", ct, new String[]{"option", "type", "java type", "value", "default value", "description"}); + return new TabularType("explainEndpoint", "Explain how this endpoint is configured", ct, new String[]{"option", "kind", "type", "java type", "value", "default value", "description"}); } public static CompositeType explainEndpointsCompositeType() throws OpenDataException { - return new CompositeType("endpoint", "Explain Endpoint", new String[]{"option", "type", "java type", "value", "default value", "description"}, - new String[]{"Option", "Type", "Java Type", "Value", "Default Value", "Description"}, - new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}); + return new CompositeType("endpoint", "Explain Endpoint", new String[]{"option", "kind", "type", "java type", "value", "default value", "description"}, + new String[]{"Option", "Kind", "Type", "Java Type", "Value", "Default Value", "Description"}, + new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}); } public static TabularType listComponentsTabularType() throws OpenDataException { http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java index 4d48355..138d69d 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java @@ -1085,6 +1085,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon public String resolveComponentDefaultName(String javaType) { // special for some components + // TODO: ActiveMQ 5.11 will include this out of the box, so not needed when its released if ("org.apache.activemq.camel.component.ActiveMQComponent".equals(javaType)) { return "jms"; } @@ -1210,12 +1211,14 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon // find type and description from the json schema String type = null; + String kind = null; String javaType = null; String defaultValue = null; String description = null; for (Map<String, String> row : rows) { if (name.equals(row.get("name"))) { type = row.get("type"); + kind = row.get("kind"); javaType = row.get("javaType"); defaultValue = row.get("defaultValue"); description = row.get("description"); @@ -1224,13 +1227,14 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon } // add as selected row - selected.put(name, new String[]{name, type, javaType, value, defaultValue, description}); + selected.put(name, new String[]{name, kind, type, javaType, value, defaultValue, description}); } if (includeAllOptions) { // include other rows for (Map<String, String> row : rows) { String name = row.get("name"); + String kind = row.get("kind"); String value = row.get("value"); String defaultValue = row.get("defaultValue"); String type = row.get("type"); @@ -1240,7 +1244,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon // add as selected row if (!selected.containsKey(name)) { - selected.put(name, new String[]{name, type, javaType, value, defaultValue, description}); + selected.put(name, new String[]{name, kind, type, javaType, value, defaultValue, description}); } } } @@ -1257,15 +1261,19 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon buffer.append("\n "); String name = row[0]; - String type = row[1]; - String javaType = row[2]; - String value = row[3]; - String defaultValue = row[4]; - String description = row[5]; + String kind = row[1]; + String type = row[2]; + String javaType = row[3]; + String value = row[4]; + String defaultValue = row[5]; + String description = row[6]; // add json of the option buffer.append(doubleQuote(name) + ": { "); CollectionStringBuffer csb = new CollectionStringBuffer(); + if (kind != null) { + csb.append("\"kind\": \"" + kind + "\""); + } if (type != null) { csb.append("\"type\": \"" + type + "\""); } http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java index 2f2d281..4871206 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java @@ -92,7 +92,8 @@ public class ManagedEndpoint implements ManagedInstance, ManagedEndpointMBean { TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.explainEndpointTabularType()); for (Map<String, String> row : rows) { - String option = row.get("name"); + String name = row.get("name"); + String kind = row.get("kind"); String type = row.get("type"); String javaType = row.get("javaType"); String value = row.get("value") != null ? row.get("value") : ""; @@ -101,8 +102,8 @@ public class ManagedEndpoint implements ManagedInstance, ManagedEndpointMBean { CompositeType ct = CamelOpenMBeanTypes.explainEndpointsCompositeType(); CompositeData data = new CompositeDataSupport(ct, - new String[]{"option", "type", "java type", "value", "default value", "description"}, - new Object[]{option, type, javaType, value, defaultValue, description}); + new String[]{"option", "kind", "type", "java type", "value", "default value", "description"}, + new Object[]{name, kind, type, javaType, value, defaultValue, description}); answer.put(data); } http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java ---------------------------------------------------------------------- diff --git a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java index 02725d0..93bed6b 100644 --- a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java +++ b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointExplain.java @@ -89,13 +89,20 @@ public class EndpointExplain extends CamelCommandSupport { Collections.sort(options, new Comparator<Map<String, String>>() { @Override public int compare(Map<String, String> o1, Map<String, String> o2) { - return o1.get("name").compareTo(o2.get("name")); + // sort by kind first, then name + int answer = o1.get("kind").compareTo(o2.get("kind")); + if (answer == 0) { + answer = o1.get("name").compareTo(o2.get("name")); + } + return answer; } }); for (Map<String, String> option : options) { out.print("Option:\t\t"); out.println(option.get("name")); + out.print("Kind:\t\t"); + out.println(option.get("kind")); String type = option.get("type"); if (type != null) { out.print("Type:\t\t"); http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java ---------------------------------------------------------------------- diff --git a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java index 89017e6..6777df1 100644 --- a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java +++ b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/EndpointList.java @@ -102,12 +102,18 @@ public class EndpointList extends CamelCommandSupport { Collections.sort(options, new Comparator<Map<String, String>>() { @Override public int compare(Map<String, String> o1, Map<String, String> o2) { - return o1.get("name").compareTo(o2.get("name")); + // sort by kind first, then name + int answer = o1.get("kind").compareTo(o2.get("kind")); + if (answer == 0) { + answer = o1.get("name").compareTo(o2.get("name")); + } + return answer; } }); for (Map<String, String> option : options) { String key = option.get("name"); + String kind = option.get("kind"); String type = option.get("type"); String javaType = option.get("javaType"); String value = option.get("value"); @@ -120,7 +126,12 @@ public class EndpointList extends CamelCommandSupport { out.println(); first = false; } - String line = "\t" + key + "=" + value; + String line; + if ("path".equals(kind)) { + line = "\t" + key + " (endpoint path) = " + value; + } else { + line = "\t" + key + " = " + value; + } out.println(String.format(rowFormat, "", line, "")); if (type != null) { http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/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 222e913..0e26f42 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 @@ -180,9 +180,9 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { buffer.append("\n \"componentProperties\": {"); buffer.append("\n },"); - // endpoint paths - buffer.append("\n \"endpointPaths\": {"); + buffer.append("\n \"properties\": {"); boolean first = true; + // include paths in the top for (EndpointPath path : paths) { if (first) { first = false; @@ -190,13 +190,10 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { buffer.append(","); } buffer.append("\n "); - buffer.append(JsonSchemaHelper.toJson(path.getName(), path.getType(), "", path.getDocumentation(), false, null)); + buffer.append(JsonSchemaHelper.toJson(path.getName(), "path", path.getType(), "", path.getDocumentation(), false, null)); } - buffer.append("\n },"); - // endpoint properties was named properties at first, and hence we stick with that naming to be compatible - buffer.append("\n \"properties\": {"); - first = true; + // and then regular parameter options for (EndpointOption entry : options) { if (first) { first = false; @@ -207,7 +204,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { // as its json we need to sanitize the docs String doc = entry.getDocumentationWithNotes(); doc = sanitizeDescription(doc, false); - buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getType(), entry.getDefaultValue(), doc, entry.isEnumType(), entry.getEnums())); + buffer.append(JsonSchemaHelper.toJson(entry.getName(), "parameter", entry.getType(), entry.getDefaultValue(), doc, entry.isEnumType(), entry.getEnums())); } buffer.append("\n }"); @@ -227,28 +224,33 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { Set<EndpointPath> endpointPaths = new LinkedHashSet<>(); Set<EndpointOption> endpointOptions = new LinkedHashSet<>(); findClassProperties(writer, roundEnv, endpointPaths, endpointOptions, classElement, prefix); + if (!endpointOptions.isEmpty() || !endpointPaths.isEmpty()) { writer.println("<table class='table'>"); writer.println(" <tr>"); writer.println(" <th>Name</th>"); + writer.println(" <th>Kind</th>"); writer.println(" <th>Type</th>"); writer.println(" <th>Default Value</th>"); writer.println(" <th>Enum Values</th>"); writer.println(" <th>Description</th>"); writer.println(" </tr>"); + // include paths in the top for (EndpointPath path : endpointPaths) { writer.println(" <tr>"); - writer.println(" <td>" + path.getName() + " (<i>endpoint path</i>) " + "</td>"); + writer.println(" <td>" + path.getName() + "</td>"); writer.println(" <td>" + path.getType() + "</td>"); - writer.println(" <td>" + "</td>"); + writer.println(" <td>" + "path" + "</td>"); writer.println(" <td>" + "</td>"); writer.println(" <td>" + path.getDocumentation() + "</td>"); writer.println(" </tr>"); } + // and then regular parameter options for (EndpointOption option : endpointOptions) { writer.println(" <tr>"); writer.println(" <td>" + option.getName() + "</td>"); writer.println(" <td>" + option.getType() + "</td>"); + writer.println(" <td>" + "parameter" + "</td>"); writer.println(" <td>" + option.getDefaultValue() + "</td>"); writer.println(" <td>" + option.getEnumValuesAsHtml() + "</td>"); writer.println(" <td>" + option.getDocumentationWithNotes() + "</td>"); @@ -436,21 +438,7 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { TypeMirror superclass = classElement.getSuperclass(); if (superclass != null) { String superClassName = canonicalClassName(superclass.toString()); - // check the rounding env first baseTypeElement = findTypeElement(roundEnv, superClassName); - if (baseTypeElement == null) { - // okay not found in rounding env, that means this component extends another component from another JAR - // so we need to find it using the package name instead of in the rounding environment - int idx = superClassName.lastIndexOf('.'); - String name = superClassName.substring(0, idx); - // skip java.lang package - if (!"java.lang".equals(name)) { - PackageElement pe = elementUtils.getPackageElement(name); - if (pe != null) { - baseTypeElement = findTypeElement(pe, superClassName); - } - } - } } if (baseTypeElement != null) { classElement = baseTypeElement; @@ -461,34 +449,42 @@ public class EndpointAnnotationProcessor extends AbstractProcessor { } protected TypeElement findTypeElement(RoundEnvironment roundEnv, String className) { - if (!isNullOrEmpty(className) && !"java.lang.Object".equals(className)) { - Set<? extends Element> rootElements = roundEnv.getRootElements(); - for (Element rootElement : rootElements) { - if (rootElement instanceof TypeElement) { - TypeElement typeElement = (TypeElement) rootElement; - String aRootName = canonicalClassName(typeElement.getQualifiedName().toString()); - if (className.equals(aRootName)) { - return typeElement; - } + if (isNullOrEmpty(className) || "java.lang.Object".equals(className)) { + return null; + } + + Set<? extends Element> rootElements = roundEnv.getRootElements(); + for (Element rootElement : rootElements) { + if (rootElement instanceof TypeElement) { + TypeElement typeElement = (TypeElement) rootElement; + String aRootName = canonicalClassName(typeElement.getQualifiedName().toString()); + if (className.equals(aRootName)) { + return typeElement; } } } - return null; - } - protected TypeElement findTypeElement(PackageElement element, String className) { - if (!isNullOrEmpty(className) && !"java.lang.Object".equals(className)) { - List<? extends Element> rootElements = element.getEnclosedElements(); - for (Element rootElement : rootElements) { - if (rootElement instanceof TypeElement) { - TypeElement typeElement = (TypeElement) rootElement; - String aRootName = canonicalClassName(typeElement.getQualifiedName().toString()); - if (className.equals(aRootName)) { - return typeElement; + // fallback using package name + Elements elementUtils = processingEnv.getElementUtils(); + + int idx = className.lastIndexOf('.'); + if (idx > 0) { + String packageName = className.substring(0, idx); + PackageElement pe = elementUtils.getPackageElement(packageName); + if (pe != null) { + List<? extends Element> enclosedElements = pe.getEnclosedElements(); + for (Element rootElement : enclosedElements) { + if (rootElement instanceof TypeElement) { + TypeElement typeElement = (TypeElement) rootElement; + String aRootName = canonicalClassName(typeElement.getQualifiedName().toString()); + if (className.equals(aRootName)) { + return typeElement; + } } } } } + return null; } http://git-wip-us.apache.org/repos/asf/camel/blob/dd856841/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java ---------------------------------------------------------------------- diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java index 96d029e..e4b9f7c 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/JsonSchemaHelper.java @@ -30,13 +30,15 @@ final class JsonSchemaHelper { private JsonSchemaHelper() { } - public static String toJson(String name, String type, String defaultValue, String description, boolean enumType, Set<String> enums) { + public static String toJson(String name, String kind, String type, String defaultValue, String description, boolean enumType, Set<String> enums) { String typeName = JsonSchemaHelper.getType(type, enumType); StringBuilder sb = new StringBuilder(); sb.append(Strings.doubleQuote(name)); - sb.append(": { \"type\": "); + sb.append(": { \"kind\": "); + sb.append(Strings.doubleQuote(kind)); + sb.append(", \"type\": "); if ("enum".equals(typeName)) { sb.append(Strings.doubleQuote("string")); sb.append(", \"javaType\": \"" + type + "\"");