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 50a099fcdc6df4aa0409bc505c726a4df69012b1 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Feb 15 10:06:25 2024 +0100 CAMEL-20419: Generate json metadata for @DataTypeTransformer --- .../org/apache/camel/tooling/model/JsonMapper.java | 17 ++++++ .../camel/tooling/model/TransformerModel.java | 48 +++++++++++++++ .../packaging/GenerateDataTypeTransformerMojo.java | 12 ++++ .../camel/maven/packaging/PrepareCatalogMojo.java | 70 +++++++++++++++++++++- 4 files changed, 146 insertions(+), 1 deletion(-) diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java index caeda324f43..81f129e8d7c 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java @@ -64,6 +64,8 @@ public final class JsonMapper { return generateLanguageModel(obj); } else if (obj.containsKey("dataformat")) { return generateDataFormatModel(obj); + } else if (obj.containsKey("transformer")) { + return generateTransformerModel(obj); } else if (obj.containsKey("other")) { return generateOtherModel(obj); } else if (obj.containsKey("model")) { @@ -359,6 +361,21 @@ public final class JsonMapper { return wrapper; } + public static TransformerModel generateTransformerModel(String json) { + JsonObject obj = deserialize(json); + return generateTransformerModel(obj); + } + + public static TransformerModel generateTransformerModel(JsonObject obj) { + JsonObject mobj = (JsonObject) obj.get("transformer"); + TransformerModel model = new TransformerModel(); + parseModel(mobj, model); + model.setFrom(mobj.getString("from")); + model.setTo(mobj.getString("to")); + parseArtifact(mobj, model); + return model; + } + public static OtherModel generateOtherModel(String json) { JsonObject obj = deserialize(json); return generateOtherModel(obj); diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java new file mode 100644 index 00000000000..3e6db9254ca --- /dev/null +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java @@ -0,0 +1,48 @@ +/* + * 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.tooling.model; + +public class TransformerModel extends ArtifactModel<BaseOptionModel> { + + protected String from; + protected String to; + + public TransformerModel() { + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + @Override + public String getKind() { + return "transformer"; + } + +} diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDataTypeTransformerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDataTypeTransformerMojo.java index e203a8e9459..4ca2ab422b2 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDataTypeTransformerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDataTypeTransformerMojo.java @@ -20,6 +20,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.StringJoiner; import org.apache.camel.maven.packaging.generics.PackagePluginUtils; import org.apache.camel.tooling.util.Strings; @@ -163,7 +164,10 @@ public class GenerateDataTypeTransformerMojo extends AbstractGeneratorMojo { if (!models.isEmpty()) { try { + StringJoiner names = new StringJoiner(" "); for (var model : models) { + names.add(model.getName()); + JsonObject jo = asJsonObject(model); String json = jo.toJson(); json = Jsoner.prettyPrint(json, 2); @@ -175,6 +179,14 @@ public class GenerateDataTypeTransformerMojo extends AbstractGeneratorMojo { getLog().info("Updated transformer json: " + model.getName()); } } + + // generate marker file + File camelMetaDir = new File(resourcesOutputDir, "META-INF/services/org/apache/camel/"); + int count = models.size(); + String properties = createProperties(project, "transformers", names.toString()); + updateResource(camelMetaDir.toPath(), "language.properties", properties); + getLog().info("Generated transformer.properties containing " + count + " Camel " + + (count > 1 ? "transformers: " : "transformer: ") + names); } catch (Exception e) { throw new MojoExecutionException(e); } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java index 162e0a467c9..240332d0908 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java @@ -48,6 +48,7 @@ import org.apache.camel.tooling.model.EipModel; import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.TransformerModel; import org.apache.camel.tooling.util.FileUtil; import org.apache.camel.tooling.util.PackageHelper; import org.apache.camel.tooling.util.Strings; @@ -111,6 +112,12 @@ public class PrepareCatalogMojo extends AbstractMojo { @Parameter(defaultValue = "${project.basedir}/src/generated/resources/org/apache/camel/catalog/languages") protected File languagesOutDir; + /** + * The output directory for transformers catalog + */ + @Parameter(defaultValue = "${project.basedir}/src/generated/resources/org/apache/camel/catalog/transformers") + protected File transformersOutDir; + /** * The output directory for others catalog */ @@ -314,7 +321,8 @@ public class PrepareCatalogMojo extends AbstractMojo { if (f.endsWith(PackageHelper.JSON_SUFIX)) { allJsonFiles.add(p); } else if (f.equals("component.properties") || f.equals("dataformat.properties") - || f.equals("language.properties") || f.equals("other.properties")) { + || f.equals("language.properties") || f.equals("other.properties") + || f.equals("transformer.properties")) { allPropertiesFiles.add(p); } }); @@ -365,6 +373,7 @@ public class PrepareCatalogMojo extends AbstractMojo { Set<String> components = executeComponents(); Set<String> dataformats = executeDataFormats(); Set<String> languages = executeLanguages(); + Set<String> transformers = executeTransformers(); Set<String> others = executeOthers(); executeDocuments(components, dataformats, languages, others); executeXmlSchemas(); @@ -712,6 +721,48 @@ public class PrepareCatalogMojo extends AbstractMojo { return languagesNames; } + protected Set<String> executeTransformers() throws Exception { + Path transformersOutDir = this.transformersOutDir.toPath(); + + getLog().info("Copying all Camel transformer json descriptors"); + + // lets use sorted set/maps + Set<Path> jsonFiles; + Set<Path> duplicateJsonFiles; + Set<Path> transformerFiles; + + // find all transformers from the components directory + transformerFiles = allPropertiesFiles.stream().filter(p -> p.endsWith("transformer.properties")) + .collect(Collectors.toCollection(TreeSet::new)); + jsonFiles = allJsonFiles.stream().filter(p -> allModels.get(p) instanceof TransformerModel) + .collect(Collectors.toCollection(TreeSet::new)); + + getLog().info("Found " + transformerFiles.size() + " transformer.properties files"); + getLog().info("Found " + jsonFiles.size() + " transformer json files"); + + // make sure to create out dir + Files.createDirectories(transformersOutDir); + + // Check duplicates + duplicateJsonFiles = getDuplicates(jsonFiles); + + // Copy all descriptors + Map<Path, Path> newJsons = map(jsonFiles, p -> p, p -> transformersOutDir.resolve(p.getFileName())); + try (Stream<Path> stream = list(transformersOutDir).filter(p -> !newJsons.containsValue(p))) { + stream.forEach(this::delete); + } + newJsons.forEach(this::copy); + + Path all = transformersOutDir.resolve("../transformers.properties"); + Set<String> transformerNames + = jsonFiles.stream().map(PrepareCatalogMojo::asComponentName).collect(Collectors.toCollection(TreeSet::new)); + FileUtil.updateFile(all, String.join("\n", transformerNames) + "\n"); + + printTransformersReport(jsonFiles, duplicateJsonFiles); + + return transformerNames; + } + private Set<String> executeOthers() throws Exception { Path othersOutDir = this.othersOutDir.toPath(); @@ -1154,6 +1205,23 @@ public class PrepareCatalogMojo extends AbstractMojo { getLog().info(SEPARATOR); } + private void printTransformersReport( + Set<Path> json, Set<Path> duplicate) { + getLog().info(SEPARATOR); + getLog().info(""); + getLog().info("Camel transformer catalog report"); + getLog().info(""); + getLog().info("\tTransformers found: " + json.size()); + printComponentDebug(json); + if (!duplicate.isEmpty()) { + getLog().info(""); + getLog().warn("\tDuplicate transformer detected: " + duplicate.size()); + printComponentWarning(duplicate); + } + getLog().info(""); + getLog().info(SEPARATOR); + } + private void printOthersReport( Set<Path> json, Set<Path> duplicate, Map<String, Set<String>> usedLabels, Set<Path> missingFirstVersions) { getLog().info(SEPARATOR);
