CAMEL-9436: camel-catalog - Make it easy to include extra components
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a558dd68 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a558dd68 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a558dd68 Branch: refs/heads/master Commit: a558dd68c259d1b5d354f99dcec94f64cc960212 Parents: 1741937 Author: Claus Ibsen <[email protected]> Authored: Mon Dec 28 14:04:28 2015 +0100 Committer: Claus Ibsen <[email protected]> Committed: Mon Dec 28 14:04:28 2015 +0100 ---------------------------------------------------------------------- .../org/apache/camel/catalog/CamelCatalog.java | 8 +++++ .../camel/catalog/DefaultCamelCatalog.java | 36 +++++++++++++++++++- .../apache/camel/catalog/CamelCatalogTest.java | 17 +++++++++ .../resources/org/foo/camel/dummyformat.json | 21 ++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a558dd68/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 3844957..5fedead 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 @@ -49,6 +49,14 @@ public interface CamelCatalog { void addComponent(String name, String className); /** + * Adds a 3rd party data format to this catalog. + * + * @param name the data format name + * @param className the fully qualified class name for the data format class + */ + void addDataFormat(String name, String className); + + /** * The version of this Camel Catalog */ String getCatalogVersion(); http://git-wip-us.apache.org/repos/asf/camel/blob/a558dd68/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 e1a1622..dc23d3b 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 @@ -76,8 +76,9 @@ public class DefaultCamelCatalog implements CamelCatalog { private final VersionHelper version = new VersionHelper(); - // 3rd party components + // 3rd party components/data-formats private final Map<String, String> extraComponents = new HashMap<String, String>(); + private final Map<String, String> extraDataFormats = new HashMap<String, String>(); // cache of operation -> result private final Map<String, Object> cache = new HashMap<String, Object>(); @@ -120,6 +121,15 @@ public class DefaultCamelCatalog implements CamelCatalog { } @Override + public void addDataFormat(String name, String className) { + extraDataFormats.put(name, className); + // invalidate the cache + cache.remove("findDataFormatNames"); + cache.remove("findDataFormatLabels"); + cache.remove("listDataFormatsAsJson"); + } + + @Override public String getCatalogVersion() { return version.getVersion(); } @@ -175,6 +185,14 @@ public class DefaultCamelCatalog implements CamelCatalog { // ignore } } + + // include third party data formats + for (Map.Entry<String, String> entry : extraDataFormats.entrySet()) { + names.add(entry.getKey()); + } + // sort the names + Collections.sort(names); + if (caching) { cache.put("findDataFormatNames", names); } @@ -441,6 +459,22 @@ public class DefaultCamelCatalog implements CamelCatalog { } catch (IOException e) { // ignore } + } else { + // its maybe a third party so try load it + String className = extraDataFormats.get(name); + if (className != null) { + String packageName = className.substring(0, className.lastIndexOf('.')); + packageName = packageName.replace('.', '/'); + String path = packageName + "/" + name + ".json"; + is = DefaultCamelCatalog.class.getClassLoader().getResourceAsStream(path); + if (is != null) { + try { + answer = CatalogHelper.loadText(is); + } catch (IOException e) { + // ignore + } + } + } } if (caching) { cache.put(file, answer); http://git-wip-us.apache.org/repos/asf/camel/blob/a558dd68/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 43fc24d..a9bdeff 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 @@ -549,4 +549,21 @@ public class CamelCatalogTest { assertNotNull(tree); } + @Test + public void testAddDataFormat() throws Exception { + assertFalse(catalog.findDataFormatNames().contains("dummyformat")); + + catalog.addDataFormat("dummyformat", "org.foo.camel.DummyDataFormat"); + + assertTrue(catalog.findDataFormatNames().contains("dummyformat")); + + String json = catalog.dataFormatJSonSchema("dummyformat"); + assertNotNull(json); + + // validate we can parse the json + ObjectMapper mapper = new ObjectMapper(); + JsonNode tree = mapper.readTree(json); + assertNotNull(tree); + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/a558dd68/platforms/catalog/src/test/resources/org/foo/camel/dummyformat.json ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/test/resources/org/foo/camel/dummyformat.json b/platforms/catalog/src/test/resources/org/foo/camel/dummyformat.json new file mode 100644 index 0000000..b297f74 --- /dev/null +++ b/platforms/catalog/src/test/resources/org/foo/camel/dummyformat.json @@ -0,0 +1,21 @@ +{ + "dataformat": { + "name": "dummyformat", + "kind": "dataformat", + "modelName": "dummyformat", + "title": "DummyFormat", + "description": "Camel dummy data format support", + "label": "dataformat,transformation", + "javaType": "org.foo.camel.DummyDataFormat", + "groupId": "org.foo.camel", + "artifactId": "dummy", + "version": "1.0" + }, + "properties": { + "lineLength": { "kind": "attribute", "required": "false", "type": "integer", "javaType": "java.lang.Integer", "deprecated": "false", "defaultValue": "76", "description": "To specific a maximum line length for the encoded data. By default 76 is used." }, + "lineSeparator": { "kind": "attribute", "required": "false", "type": "string", "javaType": "java.lang.String", "deprecated": "false", "defaultValue": "\r\n", "description": "The line separators to use. By default \r\n is used." }, + "urlSafe": { "kind": "attribute", "required": "false", "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": "false", "defaultValue": "false", "description": "Instead of emitting '' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode operations. Decoding seamlessly handles both modes. Is by default false." }, + "id": { "kind": "attribute", "required": "false", "type": "string", "javaType": "java.lang.String", "deprecated": "false", "description": "Sets the value of the id property." } + } +} +
