This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch gen-trans in repository https://gitbox.apache.org/repos/asf/camel.git
commit 60ae70514aa8b8c6b64f725ca4d9fbe106f4fdbb Author: Claus Ibsen <[email protected]> AuthorDate: Thu Feb 15 10:50:06 2024 +0100 CAMEL-20419: Generate json metadata for @DataTypeTransformer --- .../org/apache/camel/catalog/CamelCatalog.java | 29 ++++++++++++++++++++++ .../catalog/CamelCatalogJSonSchemaResolver.java | 6 +++++ .../apache/camel/catalog/DefaultCamelCatalog.java | 27 ++++++++++++++++++++ .../camel/catalog/DefaultRuntimeProvider.java | 28 +++++++++++++++++++++ .../main/java/org/apache/camel/catalog/Kind.java | 1 + .../org/apache/camel/catalog/RuntimeProvider.java | 10 ++++++++ .../camel/catalog/CamelCatalogJsonSchemaTest.java | 19 ++++++++++++++ .../org/apache/camel/catalog/CamelCatalogTest.java | 24 +++++++++++++++++- .../java/org/apache/camel/CatalogCamelContext.java | 8 ++++++ .../apache/camel/catalog/JSonSchemaResolver.java | 8 ++++++ .../camel/impl/engine/AbstractCamelContext.java | 16 ++++++++++++ .../camel/catalog/impl/AbstractCamelCatalog.java | 10 ++++++++ .../impl/CamelContextJSonSchemaResolver.java | 10 ++++++++ .../catalog/impl/DefaultRuntimeCamelCatalog.java | 11 ++++++++ .../camel/yaml/io/ModelJSonSchemaResolver.java | 5 ++++ 15 files changed, 211 insertions(+), 1 deletion(-) diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java index 3b5fefe5ac3..ec167d2490e 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java @@ -31,6 +31,7 @@ import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; import org.apache.camel.tooling.model.ReleaseModel; +import org.apache.camel.tooling.model.TransformerModel; /** * Catalog of components, data formats, models (EIPs), languages, and more from this Apache Camel release. @@ -192,6 +193,11 @@ public interface CamelCatalog { */ List<String> findLanguageNames(); + /** + * Find all the transformer names from the Camel catalog + */ + List<String> findTransformerNames(); + /** * Find all the model names from the Camel catalog */ @@ -214,6 +220,8 @@ public interface CamelCatalog { return findDataFormatNames(); case language: return findLanguageNames(); + case transformer: + return findTransformerNames(); case other: return findOtherNames(); case eip: @@ -272,6 +280,14 @@ public interface CamelCatalog { */ String languageJSonSchema(String name); + /** + * Returns the transformer information as JSON format. + * + * @param name the transformer name + * @return transformer details in JSon + */ + String transformerJSonSchema(String name); + /** * Returns the other (miscellaneous) information as JSON format. * @@ -487,6 +503,11 @@ public interface CamelCatalog { */ String listLanguagesAsJson(); + /** + * Lists all the transformers summary details in JSon + */ + String listTransformersAsJson(); + /** * Lists all the models (EIPs) summary details in JSon */ @@ -520,6 +541,12 @@ public interface CamelCatalog { */ LanguageModel languageModel(String name); + /** + * @param name the transformer name to look up + * @return the requested transformer or {@code null} in case it is not available in this {@link CamelCatalog} + */ + TransformerModel transformerModel(String name); + /** * @param name the other name to look up * @return the requested other or {@code null} in case it is not available in this {@link CamelCatalog} @@ -552,6 +579,8 @@ public interface CamelCatalog { return dataFormatModel(name); case language: return languageModel(name); + case transformer: + return transformerModel(name); case other: return otherModel(name); case eip: diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java index b9c25c0c8f8..ca2d2994081 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java @@ -108,6 +108,12 @@ public class CamelCatalogJSonSchemaResolver implements JSonSchemaResolver { return loadResourceFromVersionManager(file); } + @Override + public String getTransformerJSonSchema(String name) { + final String file = camelCatalog.getRuntimeProvider().getTransformerJSonSchemaDirectory() + "/" + name + EXTENSION; + return loadResourceFromVersionManager(file); + } + @Override public String getModelJSonSchema(String name) { final String file = MODEL_DIR + "/" + name + EXTENSION; diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java index 81fea9dd310..4949f1c7e2f 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java @@ -44,6 +44,7 @@ import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; import org.apache.camel.tooling.model.ReleaseModel; +import org.apache.camel.tooling.model.TransformerModel; import org.apache.camel.util.json.JsonArray; import org.apache.camel.util.json.JsonObject; import org.apache.camel.util.json.Jsoner; @@ -62,7 +63,9 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa public static final String FIND_DATA_FORMAT_NAMES = "findDataFormatNames"; public static final String LIST_DATA_FORMATS_AS_JSON = "listDataFormatsAsJson"; public static final String FIND_LANGUAGE_NAMES = "findLanguageNames"; + public static final String FIND_TRANSFORMER_NAMES = "findTransformerNames"; public static final String LIST_LANGUAGES_AS_JSON = "listLanguagesAsJson"; + public static final String LIST_TRANSFORMERS_AS_JSON = "listTransformersAsJson"; private final VersionHelper version = new VersionHelper(); @@ -223,6 +226,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa return cache(FIND_LANGUAGE_NAMES, runtimeProvider::findLanguageNames); } + @Override + public List<String> findTransformerNames() { + return cache(FIND_TRANSFORMER_NAMES, runtimeProvider::findTransformerNames); + } + @Override public List<String> findModelNames() { return cache("findModelNames", () -> { @@ -328,11 +336,21 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa return cache("language-" + name, name, super::languageJSonSchema); } + @Override + public String transformerJSonSchema(String name) { + return cache("transformer-" + name, name, super::transformerJSonSchema); + } + @Override public LanguageModel languageModel(String name) { return cache("language-model-" + name, name, super::languageModel); } + @Override + public TransformerModel transformerModel(String name) { + return cache("transformer-model-" + name, name, super::transformerModel); + } + @Override public String otherJSonSchema(String name) { return cache("other-" + name, name, super::otherJSonSchema); @@ -429,6 +447,15 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa .toList())); } + @Override + public String listTransformersAsJson() { + return cache(LIST_TRANSFORMERS_AS_JSON, () -> JsonMapper.serialize(findTransformerNames().stream() + .map(this::transformerJSonSchema) + .map(JsonMapper::deserialize) + .map(o -> o.get("transformer")) + .toList())); + } + @Override public String listModelsAsJson() { return cache("listModelsAsJson", () -> JsonMapper.serialize(findModelNames().stream() diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java index c7c9ada2018..308b0de64f9 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java @@ -28,10 +28,12 @@ public class DefaultRuntimeProvider implements RuntimeProvider { private static final String COMPONENT_DIR = "org/apache/camel/catalog/components"; private static final String DATAFORMAT_DIR = "org/apache/camel/catalog/dataformats"; private static final String LANGUAGE_DIR = "org/apache/camel/catalog/languages"; + private static final String TRANSFORMER_DIR = "org/apache/camel/catalog/transformers"; private static final String OTHER_DIR = "org/apache/camel/catalog/others"; private static final String COMPONENTS_CATALOG = "org/apache/camel/catalog/components.properties"; private static final String DATA_FORMATS_CATALOG = "org/apache/camel/catalog/dataformats.properties"; private static final String LANGUAGE_CATALOG = "org/apache/camel/catalog/languages.properties"; + private static final String TRANSFORMER_CATALOG = "org/apache/camel/catalog/transformers.properties"; private static final String OTHER_CATALOG = "org/apache/camel/catalog/others.properties"; private CamelCatalog camelCatalog; @@ -83,6 +85,11 @@ public class DefaultRuntimeProvider implements RuntimeProvider { return LANGUAGE_DIR; } + @Override + public String getTransformerJSonSchemaDirectory() { + return TRANSFORMER_DIR; + } + @Override public String getOtherJSonSchemaDirectory() { return OTHER_DIR; @@ -100,6 +107,10 @@ public class DefaultRuntimeProvider implements RuntimeProvider { return LANGUAGE_CATALOG; } + protected String getTransformerCatalog() { + return TRANSFORMER_CATALOG; + } + protected String getOtherCatalog() { return OTHER_CATALOG; } @@ -155,6 +166,23 @@ public class DefaultRuntimeProvider implements RuntimeProvider { return names; } + @Override + public List<String> findTransformerNames() { + List<String> names = new ArrayList<>(); + try (InputStream is = getCamelCatalog().getVersionManager().getResourceAsStream(getTransformerCatalog())) { + if (is != null) { + try { + CatalogHelper.loadLines(is, names); + } catch (IOException e) { + // ignore + } + } + } catch (IOException e1) { + // ignore + } + return names; + } + @Override public List<String> findOtherNames() { List<String> names = new ArrayList<>(); diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java index 747d7b2c980..6ca4c43b5ad 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java @@ -23,6 +23,7 @@ public enum Kind { component, dataformat, language, + transformer, other, eip } diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java index 7cb20d0da26..2122773f5dc 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java @@ -65,6 +65,11 @@ public interface RuntimeProvider { */ String getLanguageJSonSchemaDirectory(); + /** + * Gets the directory where the transformer json files are stored in the catalog JAR file + */ + String getTransformerJSonSchemaDirectory(); + /** * Gets the directory where the other (miscellaneous) json files are stored in the catalog JAR file */ @@ -85,6 +90,11 @@ public interface RuntimeProvider { */ List<String> findLanguageNames(); + /** + * Find all the transfromer names from the Camel catalog supported by the provider + */ + List<String> findTransformerNames(); + /** * Find all the other (miscellaneous) names from the Camel catalog supported by the provider */ diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogJsonSchemaTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogJsonSchemaTest.java index 84e58818272..bcdc8f19fc8 100644 --- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogJsonSchemaTest.java +++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogJsonSchemaTest.java @@ -54,6 +54,10 @@ public class CamelCatalogJsonSchemaTest { return CATALOG.findLanguageNames().stream(); } + static Stream<String> transformers() { + return CATALOG.findTransformerNames().stream(); + } + static Stream<String> models() { return CATALOG.findModelNames().stream(); } @@ -154,6 +158,21 @@ public class CamelCatalogJsonSchemaTest { assertTrue(tree.has("properties"), name); } + @ParameterizedTest + @MethodSource("transformers") + public void testValidateJsonTransformers(String name) throws Exception { + String json = CATALOG.transformerJSonSchema(name); + LOG.info("Validating {} transformer", name); + LOG.debug("with JSon: {}", json); + + // validate we can parse the json + ObjectMapper mapper = new ObjectMapper(); + JsonNode tree = mapper.readTree(json); + assertNotNull(tree); + + assertTrue(tree.has("transformer"), name); + } + @ParameterizedTest @MethodSource("models") public void testValidateJsonModels(String name) throws Exception { diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java index f4725ca3afc..7a020b5721f 100644 --- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java +++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java @@ -84,7 +84,7 @@ public class CamelCatalogTest { assertTrue(names.contains("log")); assertTrue(names.contains("docker")); assertTrue(names.contains("jms")); - // TODO: camel4 assertTrue(names.contains("activemq")); + assertTrue(names.contains("activemq")); assertTrue(names.contains("zookeeper-master")); } @@ -127,6 +127,17 @@ public class CamelCatalogTest { assertTrue(names.contains("hl7terser")); } + @Test + public void testFindTransformerNames() { + List<String> names = catalog.findTransformerNames(); + + assertTrue(names.contains("application-cloudevents-json")); + assertTrue(names.contains("application-x-java-object")); + assertTrue(names.contains("aws-cloudtrail-application-cloudevents")); + assertTrue(names.contains("azure-storage-queue-application-cloudevents")); + assertTrue(names.contains("http-application-cloudevents")); + } + @Test public void testFindModelNames() { List<String> names = catalog.findModelNames(); @@ -868,6 +879,17 @@ public class CamelCatalogTest { assertNotNull(tree); } + @Test + public void testListTransformersAsJson() throws Exception { + String json = catalog.listTransformersAsJson(); + assertNotNull(json); + + // validate we can parse the json + ObjectMapper mapper = new ObjectMapper(); + JsonNode tree = mapper.readTree(json); + assertNotNull(tree); + } + @Test public void testListModelsAsJson() throws Exception { String json = catalog.listModelsAsJson(); diff --git a/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java index b388dd8fcca..a8bcc084e84 100644 --- a/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java @@ -47,6 +47,14 @@ public interface CatalogCamelContext extends CamelContext { */ String getLanguageParameterJsonSchema(String languageName) throws IOException; + /** + * Returns the JSON schema representation of the {@link org.apache.camel.spi.DataTypeTransformer} + * parameters for the given transformer name. + * + * @return the json or <tt>null</tt> if the transformer does not exist + */ + String getTransformerParameterJsonSchema(String transformerName) throws IOException; + /** * Returns the JSON schema representation of the EIP parameters for the given EIP name. * diff --git a/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java b/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java index d54364fdede..788fc9b96b6 100644 --- a/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java +++ b/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java @@ -50,6 +50,14 @@ public interface JSonSchemaResolver { */ String getLanguageJSonSchema(String name); + /** + * Returns the transformer information as JSON format. + * + * @param name the transformer name + * @return transformer details in JSon + */ + String getTransformerJSonSchema(String name); + /** * Returns the other (miscellaneous) information as JSON format. * diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index c1aed60c68a..118af831990 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -1463,8 +1463,24 @@ public abstract class AbstractCamelContext extends BaseService return null; } + @Override + public String getTransformerParameterJsonSchema(String transformerName) throws IOException { + String name = sanitizeFileName(transformerName) + ".json"; + String path = DefaultTransformerResolver.DATA_TYPE_TRANSFORMER_RESOURCE_PATH + name; + String inputStream = doLoadResource(transformerName, path, "transformer"); + if (inputStream != null) { + return inputStream; + } + return null; + } + // Helper methods // ----------------------------------------------------------------------- + + private String sanitizeFileName(String fileName) { + return fileName.replaceAll("[^A-Za-z0-9-]", "-"); + } + @Override public String getEipParameterJsonSchema(String eipName) throws IOException { // the eip json schema may be in some of the sub-packages so look until diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java index 84d998fa840..89255902142 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java @@ -53,6 +53,7 @@ import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.TransformerModel; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.ReflectionHelper; import org.apache.camel.util.StringHelper; @@ -112,6 +113,15 @@ public abstract class AbstractCamelCatalog { return json != null ? JsonMapper.generateLanguageModel(json) : null; } + public String transformerJSonSchema(String name) { + return getJSonSchemaResolver().getTransformerJSonSchema(name); + } + + public TransformerModel transformerModel(String name) { + String json = transformerJSonSchema(name); + return json != null ? JsonMapper.generateTransformerModel(json) : null; + } + public String otherJSonSchema(String name) { return getJSonSchemaResolver().getOtherJSonSchema(name); } diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java index dbda9bd0d35..bf427a042c4 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java @@ -72,6 +72,16 @@ public class CamelContextJSonSchemaResolver implements JSonSchemaResolver { return null; } + @Override + public String getTransformerJSonSchema(String name) { + try { + return camelContext.getTransformerParameterJsonSchema(name); + } catch (IOException e) { + // ignore + } + return null; + } + @Override public String getOtherJSonSchema(String name) { // not supported diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java index f88a7b1bf9b..0523b0d46fc 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java @@ -29,6 +29,7 @@ import org.apache.camel.tooling.model.EipModel; import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.TransformerModel; /** * Default {@link RuntimeCamelCatalog}. @@ -116,6 +117,16 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements return cache("language-model-" + name, name, super::languageModel); } + @Override + public String transformerJSonSchema(String name) { + return cache("transformer-" + name, name, super::transformerJSonSchema); + } + + @Override + public TransformerModel transformerModel(String name) { + return cache("transformer-model-" + name, name, super::transformerModel); + } + @Override public String otherJSonSchema(String name) { return cache("other-" + name, name, super::otherJSonSchema); diff --git a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java index d9c2e6c0bf4..300ec9535d0 100644 --- a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java +++ b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java @@ -49,6 +49,11 @@ class ModelJSonSchemaResolver implements JSonSchemaResolver { throw new UnsupportedOperationException("Only getModelJSonSchema is in use"); } + @Override + public String getTransformerJSonSchema(String name) { + throw new UnsupportedOperationException("Only getModelJSonSchema is in use"); + } + @Override public String getOtherJSonSchema(String name) { throw new UnsupportedOperationException("Only getModelJSonSchema is in use");
