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 2015/06/14 13:02:48 UTC

[3/5] camel git commit: Component docs

Component docs


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1e1e1f9f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1e1e1f9f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1e1e1f9f

Branch: refs/heads/master
Commit: 1e1e1f9f69269ed4fdaa40a153871c8780bda219
Parents: be75520
Author: Claus Ibsen <da...@apache.org>
Authored: Sun Jun 14 10:06:38 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Jun 14 13:08:07 2015 +0200

----------------------------------------------------------------------
 .../camel/tools/apt/DocumentationHelper.java    | 52 +++++++++++-
 .../tools/apt/EndpointAnnotationProcessor.java  |  2 +-
 .../camel/tools/apt/JsonSchemaHelper.java       | 89 ++++++++++++++++++++
 3 files changed, 141 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1e1e1f9f/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
index 93a7ae5..37e190b 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
@@ -17,17 +17,67 @@
 package org.apache.camel.tools.apt;
 
 import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.LineNumberReader;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.camel.tools.apt.JsonSchemaHelper.parseJsonSchema;
 
 /**
  * Helper to find documentation for inherited options when a component extends another.
  */
 public final class DocumentationHelper {
 
-    public static String findJavaDoc(String scheme, String fieldName) {
+    public static String findJavaDoc(String scheme, String extendsScheme, String fieldName) {
+        File file = jsonFile(scheme, extendsScheme);
+        if (file != null) {
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(file);
+                String json = loadText(fis);
+                List<Map<String, String>> rows = parseJsonSchema("properties", json, true);
+
+                for (Map<String, String> row : rows) {
+                    String name = row.get("name");
+                    String description = row.get("description");
+                    if (fieldName.equals(name)) {
+                        return description;
+                    }
+                }
+            } catch (Exception e) {
+                // ignore
+            } finally {
+                IOHelper.close(fis);
+            }
+        }
+
+        // not found
+        return null;
+    }
+
+    private static File jsonFile(String scheme, String extendsScheme) {
+        // TODO: scan components for each component and find component name from extendsScheme
+        // and then find the package name where the json file is
+
+        if ("file".equals(extendsScheme)) {
+            return new File("../../camel-core/target/classes/org/apache/camel/component/file/file.json");
+        } else if ("http".equals(extendsScheme)) {
+            return new File("../camel-http/target/classes/org/apache/camel/component/http/http.json");
+        } else if ("https".equals(extendsScheme)) {
+            return new File("../camel-http/target/classes/org/apache/camel/component/http/https.json");
+        } else if ("netty".equals(extendsScheme)) {
+            return new File("../camel-netty/target/classes/org/apache/camel/component/netty/netty.json");
+        } else if ("netty4".equals(extendsScheme)) {
+            return new File("../camel-netty4/target/classes/org/apache/camel/component/netty4/netty4.json");
+        } else if ("servlet".equals(extendsScheme)) {
+            return new File("../camel-servlet/target/classes/org/apache/camel/component/servlet/servlet.json");
+        }
+        // not found
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1e1e1f9f/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 6cb7973..7f895ed 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
@@ -286,7 +286,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
             String doc = entry.getDocumentationWithNotes();
 
             if (Strings.isNullOrEmpty(doc)) {
-                doc = DocumentationHelper.findJavaDoc(componentModel.getScheme(), entry.getName());
+                doc = DocumentationHelper.findJavaDoc(componentModel.getScheme(), componentModel.getExtendsScheme(), entry.getName());
             }
 
             doc = sanitizeDescription(doc, false);

http://git-wip-us.apache.org/repos/asf/camel/blob/1e1e1f9f/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 f53785b..a67e2ca 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
@@ -18,7 +18,13 @@ package org.apache.camel.tools.apt;
 
 import java.net.URI;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * A helper class for <a href="http://json-schema.org/">JSON schema</a>.
@@ -26,6 +32,8 @@ import java.util.Set;
 final class JsonSchemaHelper {
 
     private static final String VALID_CHARS = ".-='/\\!&():;";
+    private static final Pattern PATTERN = Pattern.compile("\"(.+?)\"|\\[(.+)\\]");
+    private static final String QUOT = "&quot;";
 
     private JsonSchemaHelper() {
     }
@@ -257,6 +265,87 @@ final class JsonSchemaHelper {
     }
 
     /**
+     * Parses the json schema to split it into a list or rows, where each row contains key value pairs with the metadata
+     *
+     * @param group the group to parse from such as <tt>component</tt>, <tt>componentProperties</tt>, or <tt>properties</tt>.
+     * @param json the json
+     * @return a list of all the rows, where each row is a set of key value pairs with metadata
+     */
+    public static List<Map<String, String>> parseJsonSchema(String group, String json, boolean parseProperties) {
+        List<Map<String, String>> answer = new ArrayList<Map<String, String>>();
+        if (json == null) {
+            return answer;
+        }
+
+        boolean found = false;
+
+        // parse line by line
+        String[] lines = json.split("\n");
+        for (String line : lines) {
+            // we need to find the group first
+            if (!found) {
+                String s = line.trim();
+                found = s.startsWith("\"" + group + "\":");
+                continue;
+            }
+
+            // we should stop when we end the group
+            if (line.equals("  },") || line.equals("  }")) {
+                break;
+            }
+
+            // need to safe encode \" so we can parse the line
+            line = line.replaceAll("\"\\\\\"\"", '"' + QUOT + '"');
+
+            Map<String, String> row = new LinkedHashMap<String, String>();
+            Matcher matcher = PATTERN.matcher(line);
+
+            String key;
+            if (parseProperties) {
+                // when parsing properties the first key is given as name, so the first parsed token is the value of the name
+                key = "name";
+            } else {
+                key = null;
+            }
+            while (matcher.find()) {
+                if (key == null) {
+                    key = matcher.group(1);
+                } else {
+                    String value = matcher.group(1);
+                    if (value == null) {
+                        value = matcher.group(2);
+                        // its an enum so strip out " and trim spaces after comma
+                        value = value.replaceAll("\"", "");
+                        value = value.replaceAll(", ", ",");
+                    }
+                    if (value != null) {
+                        value = value.trim();
+                        // decode
+                        value = value.replaceAll(QUOT, "\"");
+                        value = decodeJson(value);
+                    }
+                    row.put(key, value);
+                    // reset
+                    key = null;
+                }
+            }
+            if (!row.isEmpty()) {
+                answer.add(row);
+            }
+        }
+
+        return answer;
+    }
+
+    private static String decodeJson(String value) {
+        // json encodes a \ as \\ so we need to decode from \\ back to \
+        if ("\\\\".equals(value)) {
+            value = "\\";
+        }
+        return value;
+    }
+
+    /**
      * The default value may need to be escaped to be safe for json
      */
     private static String safeDefaultValue(String value) {