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
