Repository: camel
Updated Branches:
  refs/heads/master 904a49b68 -> 200c1fb25


Allow to use CamelCatalog in cache mode


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

Branch: refs/heads/master
Commit: 200c1fb25369793198a8922e15100d6af8a2d5ac
Parents: 904a49b
Author: Claus Ibsen <davscl...@apache.org>
Authored: Fri Dec 18 10:41:33 2015 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri Dec 18 10:43:45 2015 +0100

----------------------------------------------------------------------
 .../org/apache/camel/catalog/CamelCatalog.java  |   7 +
 .../camel/catalog/DefaultCamelCatalog.java      | 616 +++++++++++++------
 .../camel/catalog/CamelCatalogCacheTest.java    |  28 +
 .../apache/camel/catalog/CamelCatalogTest.java  |   9 +-
 4 files changed, 459 insertions(+), 201 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/200c1fb2/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
index bf34b0a..7dc67a0 100644
--- a/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
+++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
@@ -29,6 +29,13 @@ import javax.management.MXBean;
 public interface CamelCatalog {
 
     /**
+     * Enables caching of the resources which makes the catalog faster, but 
keeps data in memory during caching.
+     * <p/>
+     * The catalog does not cache by default.
+     */
+    void enableCache();
+
+    /**
      * The version of this Camel Catalog
      */
     String getCatalogVersion();

http://git-wip-us.apache.org/repos/asf/camel/blob/200c1fb2/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index faace83..870bc0f 100644
--- 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -67,66 +67,123 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
     private final VersionHelper version = new VersionHelper();
 
+    // cache of operation -> result
+    private final Map<String, Object> cache = new HashMap<String, Object>();
+
+    private boolean caching;
+
+    public DefaultCamelCatalog() {
+    }
+
+    public DefaultCamelCatalog(boolean caching) {
+        this.caching = caching;
+    }
+
+    @Override
+    public void enableCache() {
+        caching = true;
+    }
+
     @Override
     public String getCatalogVersion() {
         return version.getVersion();
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findComponentNames() {
-        List<String> names = new ArrayList<String>();
+        List<String> names = null;
+        if (caching) {
+            names = (List<String>) cache.get("findComponentNames");
+        }
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(COMPONENTS_CATALOG);
-        if (is != null) {
-            try {
-                CatalogHelper.loadLines(is, names);
-            } catch (IOException e) {
-                // ignore
+        if (names == null) {
+            names = new ArrayList<String>();
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(COMPONENTS_CATALOG);
+            if (is != null) {
+                try {
+                    CatalogHelper.loadLines(is, names);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put("findComponentNames", names);
             }
         }
         return names;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findDataFormatNames() {
-        List<String> names = new ArrayList<String>();
+        List<String> names = null;
+        if (caching) {
+            names = (List<String>) cache.get("findDataFormatNames");
+        }
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(DATA_FORMATS_CATALOG);
-        if (is != null) {
-            try {
-                CatalogHelper.loadLines(is, names);
-            } catch (IOException e) {
-                // ignore
+        if (names == null) {
+            names = new ArrayList<String>();
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(DATA_FORMATS_CATALOG);
+            if (is != null) {
+                try {
+                    CatalogHelper.loadLines(is, names);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put("findDataFormatNames", names);
             }
         }
         return names;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findLanguageNames() {
-        List<String> names = new ArrayList<String>();
+        List<String> names = null;
+        if (caching) {
+            names = (List<String>) cache.get("findLanguageNames");
+        }
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(LANGUAGE_CATALOG);
-        if (is != null) {
-            try {
-                CatalogHelper.loadLines(is, names);
-            } catch (IOException e) {
-                // ignore
+        if (names == null) {
+            names = new ArrayList<String>();
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(LANGUAGE_CATALOG);
+            if (is != null) {
+                try {
+                    CatalogHelper.loadLines(is, names);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put("findLanguageNames", names);
             }
         }
         return names;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findModelNames() {
-        List<String> names = new ArrayList<String>();
+        List<String> names = null;
+        if (caching) {
+            names = (List<String>) cache.get("findModelNames");
+        }
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(MODELS_CATALOG);
-        if (is != null) {
-            try {
-                CatalogHelper.loadLines(is, names);
-            } catch (IOException e) {
-                // ignore
+        if (names == null) {
+            names = new ArrayList<String>();
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(MODELS_CATALOG);
+            if (is != null) {
+                try {
+                    CatalogHelper.loadLines(is, names);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put("findModelNames", names);
             }
         }
         return names;
@@ -134,6 +191,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
     @Override
     public List<String> findModelNames(String filter) {
+        // should not cache when filter parameter can by any kind of value
         List<String> answer = new ArrayList<String>();
 
         List<String> names = findModelNames();
@@ -164,6 +222,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
     @Override
     public List<String> findComponentNames(String filter) {
+        // should not cache when filter parameter can by any kind of value
         List<String> answer = new ArrayList<String>();
 
         List<String> names = findComponentNames();
@@ -194,6 +253,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
     @Override
     public List<String> findDataFormatNames(String filter) {
+        // should not cache when filter parameter can by any kind of value
         List<String> answer = new ArrayList<String>();
 
         List<String> names = findDataFormatNames();
@@ -224,6 +284,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
     @Override
     public List<String> findLanguageNames(String filter) {
+        // should not cache when filter parameter can by any kind of value
         List<String> answer = new ArrayList<String>();
 
         List<String> names = findLanguageNames();
@@ -256,157 +317,237 @@ public class DefaultCamelCatalog implements 
CamelCatalog {
     public String modelJSonSchema(String name) {
         String file = MODEL_JSON + "/" + name + ".json";
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
     public String componentJSonSchema(String name) {
         String file = COMPONENTS_JSON + "/" + name + ".json";
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
     public String dataFormatJSonSchema(String name) {
         String file = DATA_FORMATS_JSON + "/" + name + ".json";
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
     public String languageJSonSchema(String name) {
         String file = LANGUAGE_JSON + "/" + name + ".json";
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public Set<String> findModelLabels() {
-        SortedSet<String> answer = new TreeSet<String>();
+        SortedSet<String> answer = null;
+        if (caching) {
+            answer = (TreeSet<String>) cache.get("findModelLabels");
+        }
 
-        List<String> names = findModelNames();
-        for (String name : names) {
-            String json = modelJSonSchema(name);
-            if (json != null) {
-                List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("model", json, false);
-                for (Map<String, String> row : rows) {
-                    if (row.containsKey("label")) {
-                        String label = row.get("label");
-                        String[] parts = label.split(",");
-                        for (String part : parts) {
-                            answer.add(part);
+        if (answer == null) {
+            answer = new TreeSet<String>();
+            List<String> names = findModelNames();
+            for (String name : names) {
+                String json = modelJSonSchema(name);
+                if (json != null) {
+                    List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("model", json, false);
+                    for (Map<String, String> row : rows) {
+                        if (row.containsKey("label")) {
+                            String label = row.get("label");
+                            String[] parts = label.split(",");
+                            for (String part : parts) {
+                                answer.add(part);
+                            }
                         }
                     }
                 }
             }
+            if (caching) {
+                cache.put("findModelLabels", answer);
+            }
         }
 
         return answer;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public Set<String> findComponentLabels() {
-        SortedSet<String> answer = new TreeSet<String>();
+        SortedSet<String> answer = null;
+        if (caching) {
+            answer = (TreeSet<String>) cache.get("findComponentLabels");
+        }
 
-        List<String> names = findComponentNames();
-        for (String name : names) {
-            String json = componentJSonSchema(name);
-            if (json != null) {
-                List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("component", json, false);
-                for (Map<String, String> row : rows) {
-                    if (row.containsKey("label")) {
-                        String label = row.get("label");
-                        String[] parts = label.split(",");
-                        for (String part : parts) {
-                            answer.add(part);
+        if (answer == null) {
+            answer = new TreeSet<String>();
+            List<String> names = findComponentNames();
+            for (String name : names) {
+                String json = componentJSonSchema(name);
+                if (json != null) {
+                    List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("component", json, false);
+                    for (Map<String, String> row : rows) {
+                        if (row.containsKey("label")) {
+                            String label = row.get("label");
+                            String[] parts = label.split(",");
+                            for (String part : parts) {
+                                answer.add(part);
+                            }
                         }
                     }
                 }
             }
+            if (caching) {
+                cache.put("findComponentLabels", answer);
+            }
         }
 
         return answer;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public Set<String> findDataFormatLabels() {
-        SortedSet<String> answer = new TreeSet<String>();
+        SortedSet<String> answer = null;
+        if (caching) {
+            answer = (TreeSet<String>) cache.get("findDataFormatLabels");
+        }
 
-        List<String> names = findDataFormatNames();
-        for (String name : names) {
-            String json = dataFormatJSonSchema(name);
-            if (json != null) {
-                List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
-                for (Map<String, String> row : rows) {
-                    if (row.containsKey("label")) {
-                        String label = row.get("label");
-                        String[] parts = label.split(",");
-                        for (String part : parts) {
-                            answer.add(part);
+        if (answer == null) {
+            answer = new TreeSet<String>();
+            List<String> names = findDataFormatNames();
+            for (String name : names) {
+                String json = dataFormatJSonSchema(name);
+                if (json != null) {
+                    List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
+                    for (Map<String, String> row : rows) {
+                        if (row.containsKey("label")) {
+                            String label = row.get("label");
+                            String[] parts = label.split(",");
+                            for (String part : parts) {
+                                answer.add(part);
+                            }
                         }
                     }
                 }
             }
+            if (caching) {
+                cache.put("findDataFormatLabels", answer);
+            }
         }
 
         return answer;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public Set<String> findLanguageLabels() {
-        SortedSet<String> answer = new TreeSet<String>();
+        SortedSet<String> answer = null;
+        if (caching) {
+            answer = (TreeSet<String>) cache.get("findLanguageLabels");
+        }
 
-        List<String> names = findLanguageNames();
-        for (String name : names) {
-            String json = languageJSonSchema(name);
-            if (json != null) {
-                List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("language", json, false);
-                for (Map<String, String> row : rows) {
-                    if (row.containsKey("label")) {
-                        String label = row.get("label");
-                        String[] parts = label.split(",");
-                        for (String part : parts) {
-                            answer.add(part);
+        if (answer == null) {
+            answer = new TreeSet<String>();
+            List<String> names = findLanguageNames();
+            for (String name : names) {
+                String json = languageJSonSchema(name);
+                if (json != null) {
+                    List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("language", json, false);
+                    for (Map<String, String> row : rows) {
+                        if (row.containsKey("label")) {
+                            String label = row.get("label");
+                            String[] parts = label.split(",");
+                            for (String part : parts) {
+                                answer.add(part);
+                            }
                         }
                     }
                 }
             }
+            if (caching) {
+                cache.put("findLanguageLabels", answer);
+            }
         }
 
         return answer;
@@ -416,48 +557,78 @@ public class DefaultCamelCatalog implements CamelCatalog {
     public String archetypeCatalogAsXml() {
         String file = ARCHETYPES_CATALOG;
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
     public String springSchemaAsXml() {
         String file = SCHEMAS_XML + "/camel-spring.xsd";
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
     public String blueprintSchemaAsXml() {
         String file = SCHEMAS_XML + "/camel-blueprint.xsd";
 
-        InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
-        if (is != null) {
-            try {
-                return CatalogHelper.loadText(is);
-            } catch (IOException e) {
-                // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get(file);
+        }
+
+        if (answer == null) {
+            InputStream is = 
DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(file);
+            if (is != null) {
+                try {
+                    answer = CatalogHelper.loadText(is);
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (caching) {
+                cache.put(file, answer);
             }
         }
 
-        return null;
+        return answer;
     }
 
     @Override
@@ -713,7 +884,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
         for (Map.Entry<String, String> entry : properties.entrySet()) {
             String key = entry.getKey();
             String value = entry.getValue() != null ? entry.getValue() : "";
-            if (syntax.contains(key)) {
+            if (syntax != null && syntax.contains(key)) {
                 syntax = syntax.replace(key, value);
             } else {
                 copy.put(key, value);
@@ -835,7 +1006,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
             String json = componentJSonSchema(scheme);
             // skip first line
             json = CatalogHelper.between(json, "\"component\": {", 
"\"componentProperties\": {");
-            json = json.trim();
+            json = json != null ? json.trim() : "";
             // skip last comma if not the last
             if (i == names.size() - 1) {
                 json = json.substring(0, json.length() - 1);
@@ -852,101 +1023,146 @@ public class DefaultCamelCatalog implements 
CamelCatalog {
 
     @Override
     public String listDataFormatsAsJson() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("[");
-        List<String> names = findDataFormatNames();
-        for (int i = 0; i < names.size(); i++) {
-            String scheme = names.get(i);
-            String json = dataFormatJSonSchema(scheme);
-            // skip first line
-            json = CatalogHelper.between(json, "\"dataformat\": {", 
"\"properties\": {");
-            json = json.trim();
-            // skip last comma if not the last
-            if (i == names.size() - 1) {
-                json = json.substring(0, json.length() - 1);
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get("listDataFormatsAsJson");
+        }
+
+        if (answer == null) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("[");
+            List<String> names = findDataFormatNames();
+            for (int i = 0; i < names.size(); i++) {
+                String scheme = names.get(i);
+                String json = dataFormatJSonSchema(scheme);
+                // skip first line
+                json = CatalogHelper.between(json, "\"dataformat\": {", 
"\"properties\": {");
+                json = json != null ? json.trim() : "";
+                // skip last comma if not the last
+                if (i == names.size() - 1) {
+                    json = json.substring(0, json.length() - 1);
+                }
+                sb.append("\n");
+                sb.append("  {\n");
+                sb.append("    ");
+                sb.append(json);
+            }
+            sb.append("\n]");
+            answer = sb.toString();
+            if (caching) {
+                cache.put("listDataFormatsAsJson", answer);
             }
-            sb.append("\n");
-            sb.append("  {\n");
-            sb.append("    ");
-            sb.append(json);
         }
 
-        sb.append("\n]");
-        return sb.toString();
+        return answer;
     }
 
     @Override
     public String listLanguagesAsJson() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("[");
-        List<String> names = findLanguageNames();
-        for (int i = 0; i < names.size(); i++) {
-            String scheme = names.get(i);
-            String json = languageJSonSchema(scheme);
-            // skip first line
-            json = CatalogHelper.between(json, "\"language\": {", 
"\"properties\": {");
-            json = json.trim();
-            // skip last comma if not the last
-            if (i == names.size() - 1) {
-                json = json.substring(0, json.length() - 1);
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get("listLanguagesAsJson");
+        }
+
+        if (answer == null) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("[");
+            List<String> names = findLanguageNames();
+            for (int i = 0; i < names.size(); i++) {
+                String scheme = names.get(i);
+                String json = languageJSonSchema(scheme);
+                // skip first line
+                json = CatalogHelper.between(json, "\"language\": {", 
"\"properties\": {");
+                json = json != null ? json.trim() : "";
+                // skip last comma if not the last
+                if (i == names.size() - 1) {
+                    json = json.substring(0, json.length() - 1);
+                }
+                sb.append("\n");
+                sb.append("  {\n");
+                sb.append("    ");
+                sb.append(json);
+            }
+            sb.append("\n]");
+            answer = sb.toString();
+            if (caching) {
+                cache.put("listLanguagesAsJson", answer);
             }
-            sb.append("\n");
-            sb.append("  {\n");
-            sb.append("    ");
-            sb.append(json);
         }
 
-        sb.append("\n]");
-        return sb.toString();
+        return answer;
     }
 
     @Override
     public String listModelsAsJson() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("[");
-        List<String> names = findModelNames();
-        for (int i = 0; i < names.size(); i++) {
-            String scheme = names.get(i);
-            String json = modelJSonSchema(scheme);
-            // skip first line
-            json = CatalogHelper.between(json, "\"model\": {", 
"\"properties\": {");
-            json = json.trim();
-            // skip last comma if not the last
-            if (i == names.size() - 1) {
-                json = json.substring(0, json.length() - 1);
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get("listModelsAsJson");
+        }
+
+        if (answer == null) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("[");
+            List<String> names = findModelNames();
+            for (int i = 0; i < names.size(); i++) {
+                String scheme = names.get(i);
+                String json = modelJSonSchema(scheme);
+                // skip first line
+                json = CatalogHelper.between(json, "\"model\": {", 
"\"properties\": {");
+                json = json != null ? json.trim() : "";
+                // skip last comma if not the last
+                if (i == names.size() - 1) {
+                    json = json.substring(0, json.length() - 1);
+                }
+                sb.append("\n");
+                sb.append("  {\n");
+                sb.append("    ");
+                sb.append(json);
+            }
+            sb.append("\n]");
+            answer = sb.toString();
+            if (caching) {
+                cache.put("listModelsAsJson", answer);
             }
-            sb.append("\n");
-            sb.append("  {\n");
-            sb.append("    ");
-            sb.append(json);
         }
 
-        sb.append("\n]");
-        return sb.toString();
+        return answer;
     }
 
     @Override
     public String summaryAsJson() {
-        int archetypes = 0;
-        try {
-            String xml = archetypeCatalogAsXml();
-            Document dom = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new 
ByteArrayInputStream(xml.getBytes()));
-            Object val = 
XPathFactory.newInstance().newXPath().evaluate("count(/archetype-catalog/archetypes/archetype)",
 dom, XPathConstants.NUMBER);
-            double num = (double) val;
-            archetypes = (int) num;
-        } catch (Exception e) {
-            // ignore
+        String answer = null;
+        if (caching) {
+            answer = (String) cache.get("summaryAsJson");
         }
 
-        StringBuilder sb = new StringBuilder();
-        sb.append("{\n");
-        sb.append("  \"version\": \"" + getCatalogVersion() + "\",\n");
-        sb.append("  \"eips\": " + findModelNames().size() + ",\n");
-        sb.append("  \"components\": " + findComponentNames().size() + ",\n");
-        sb.append("  \"dataformats\": " + findDataFormatNames().size() + 
",\n");
-        sb.append("  \"languages\": " + findLanguageNames().size() + ",\n");
-        sb.append("  \"archetypes\": " + archetypes + "\n");
-        sb.append("}");
-        return sb.toString();
+        if (answer == null) {
+            int archetypes = 0;
+            try {
+                String xml = archetypeCatalogAsXml();
+                Document dom = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new 
ByteArrayInputStream(xml.getBytes()));
+                Object val = 
XPathFactory.newInstance().newXPath().evaluate("count(/archetype-catalog/archetypes/archetype)",
 dom, XPathConstants.NUMBER);
+                double num = (double) val;
+                archetypes = (int) num;
+            } catch (Exception e) {
+                // ignore
+            }
+
+            StringBuilder sb = new StringBuilder();
+            sb.append("{\n");
+            sb.append("  \"version\": 
\"").append(getCatalogVersion()).append("\",\n");
+            sb.append("  \"eips\": 
").append(findModelNames().size()).append(",\n");
+            sb.append("  \"components\": 
").append(findComponentNames().size()).append(",\n");
+            sb.append("  \"dataformats\": 
").append(findDataFormatNames().size()).append(",\n");
+            sb.append("  \"languages\": 
").append(findLanguageNames().size()).append(",\n");
+            sb.append("  \"archetypes\": ").append(archetypes).append("\n");
+            sb.append("}");
+            answer = sb.toString();
+            if (caching) {
+                cache.put("summaryAsJson", answer);
+            }
+        }
+
+        return answer;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/200c1fb2/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogCacheTest.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogCacheTest.java
 
b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogCacheTest.java
new file mode 100644
index 0000000..22fa39d
--- /dev/null
+++ 
b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogCacheTest.java
@@ -0,0 +1,28 @@
+/**
+ * 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.catalog;
+
+import org.junit.BeforeClass;
+
+public class CamelCatalogCacheTest extends CamelCatalogTest {
+
+    @BeforeClass
+    public static void createCamelCatalog() {
+        catalog = new DefaultCamelCatalog(true);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/200c1fb2/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
 
b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index b427678..324362f 100644
--- 
a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ 
b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -22,6 +22,8 @@ import java.util.Map;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import static org.apache.camel.catalog.CatalogHelper.loadText;
@@ -31,7 +33,12 @@ import static org.junit.Assert.assertTrue;
 
 public class CamelCatalogTest {
 
-    private CamelCatalog catalog = new DefaultCamelCatalog();
+    static CamelCatalog catalog;
+
+    @BeforeClass
+    public static void createCamelCatalog() {
+        catalog = new DefaultCamelCatalog();
+    }
 
     @Test
     public void testGetVersion() throws Exception {

Reply via email to