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);

Reply via email to