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 d38d9437d82a3f1fab38361c905cb6e6b184786a
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Feb 14 16:38:55 2024 +0100

    CAMEL-20419: Generate json metadata for @DataTypeTransformer
---
 .../maven/packaging/GenerateComponentMojo.java     |   2 +
 .../packaging/GenerateDataTypeTransformerMojo.java | 184 +++++++++++++++++++++
 .../packaging/GenerateInvokeOnHeaderMojo.java      |   2 +-
 .../apache/camel/maven/packaging/GenerateMojo.java |   2 +
 4 files changed, 189 insertions(+), 1 deletion(-)

diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java
index c5de00de8b4..39e69a47d0a 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java
@@ -48,6 +48,8 @@ public class GenerateComponentMojo extends 
AbstractGenerateMojo {
         invoke(GenerateEndpointUriFactoryMojo.class);
         // generate invoke-on-header
         invoke(GenerateInvokeOnHeaderMojo.class);
+        // generate data-type-transformer
+        invoke(GenerateDataTypeTransformerMojo.class);
         // prepare-components
         invoke(PrepareComponentMojo.class);
         // validate-components
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
new file mode 100644
index 00000000000..3c11ac2bc82
--- /dev/null
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDataTypeTransformerMojo.java
@@ -0,0 +1,184 @@
+/*
+ * 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.maven.packaging;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.camel.maven.packaging.generics.PackagePluginUtils;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.jboss.jandex.AnnotationInstance;
+import org.jboss.jandex.DotName;
+import org.jboss.jandex.Index;
+
+/**
+ * Factory for generating code for @DataTypeTransformer.
+ */
+@Mojo(name = "generate-data-type-transformer", threadSafe = true, defaultPhase 
= LifecyclePhase.PROCESS_CLASSES,
+      requiresDependencyCollection = ResolutionScope.COMPILE,
+      requiresDependencyResolution = ResolutionScope.COMPILE)
+public class GenerateDataTypeTransformerMojo extends AbstractGeneratorMojo {
+
+    public static final DotName DATA_TYPE_ANNOTATION = 
DotName.createSimple("org.apache.camel.spi.DataTypeTransformer");
+
+    /**
+     * The project build directory
+     */
+    @Parameter(defaultValue = "${project.build.directory}")
+    protected File buildDir;
+
+    @Parameter(defaultValue = "${project.basedir}/src/generated/resources")
+    protected File resourcesOutputDir;
+
+    private static class DataTypeTransformerModel {
+        private String className;
+        private String name;
+        private String from;
+        private String to;
+        private String description;
+
+        public String getClassName() {
+            return className;
+        }
+
+        public void setClassName(String className) {
+            this.className = className;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        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;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public void setDescription(String description) {
+            this.description = description;
+        }
+    }
+
+    public GenerateDataTypeTransformerMojo() {
+    }
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if ("pom".equals(project.getPackaging())) {
+            return;
+        }
+
+        buildDir = new File(project.getBuild().getDirectory());
+
+        if (resourcesOutputDir == null) {
+            resourcesOutputDir = new File(project.getBasedir(), 
"src/generated/resources");
+        }
+
+        Index index = PackagePluginUtils.readJandexIndexIgnoreMissing(project, 
getLog());
+        if (index == null) {
+            return;
+        }
+
+        List<DataTypeTransformerModel> models = new ArrayList<>();
+        List<AnnotationInstance> annotations = 
index.getAnnotations(DATA_TYPE_ANNOTATION);
+        annotations.forEach(a -> {
+            String currentClass = a.target().asClass().name().toString();
+            DataTypeTransformerModel model = new DataTypeTransformerModel();
+            model.setClassName(currentClass);
+            var name = a.value("name");
+            if (name != null) {
+                model.setName(name.value().toString());
+            }
+            var from = a.value("from");
+            if (from != null) {
+                model.setFrom(from.value().toString());
+            }
+            var to = a.value("to");
+            if (to != null) {
+                model.setFrom(to.value().toString());
+            }
+            models.add(model);
+        });
+        models.sort(Comparator.comparing(DataTypeTransformerModel::getName));
+
+        if (!models.isEmpty()) {
+            try {
+                JsonArray arr = new JsonArray();
+                for (var model : models) {
+                    JsonObject jo = asJsonObject(model);
+                    arr.add(jo);
+                }
+                String json = arr.toJson();
+                json = Jsoner.prettyPrint(json, 2);
+
+                // we need to store in META-INF to avoid confusing with 
component json
+                updateResource(resourcesOutputDir.toPath(),
+                        
"META-INF/services/org/apache/camel/transformer/transformers.json",
+                        json + NL);
+            } catch (Exception e) {
+                throw new MojoExecutionException(e);
+            }
+        }
+    }
+
+    private JsonObject asJsonObject(DataTypeTransformerModel model) {
+        JsonObject jo = new JsonObject();
+        jo.put("className", model.getClassName());
+        jo.put("name", model.getName());
+        if (model.getFrom() != null) {
+            jo.put("from", model.getFrom());
+        }
+        if (model.getTo() != null) {
+            jo.put("to", model.getTo());
+        }
+        return jo;
+    }
+
+    private String sanitizeFileName(String fileName) {
+        return fileName.replaceAll("[^A-Za-z0-9-]", "-");
+    }
+
+}
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
index e87432925f3..4e62bee08a0 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
@@ -42,7 +42,7 @@ import org.jboss.jandex.MethodInfo;
 import org.jboss.jandex.Type;
 
 /**
- * Abstract class for @InvokeOnHeader factory generator.
+ * Factory for generating code for @InvokeOnHeader.
  */
 @Mojo(name = "generate-invoke-on-header", threadSafe = true, defaultPhase = 
LifecyclePhase.PROCESS_CLASSES,
       requiresDependencyCollection = ResolutionScope.COMPILE,
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java
index bb4cc531bec..b93ce0826ce 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java
@@ -50,6 +50,8 @@ public class GenerateMojo extends AbstractGenerateMojo {
         invoke(GenerateConfigurerMojo.class);
         // generate invoke-on-header
         invoke(GenerateInvokeOnHeaderMojo.class);
+        // generate data-type-transformer
+        invoke(GenerateDataTypeTransformerMojo.class);
         // prepare-components
         invoke(PrepareComponentMojo.class);
         // prepare-main

Reply via email to