This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 4a0a49768fbfcd339800a356e239e669ee6fc5b3 Author: Peter Palaga <ppal...@redhat.com> AuthorDate: Tue Mar 31 15:45:12 2020 +0200 CAMEL-14816 Introduce supportLevel and compileTarget in the Catalog --- .../java/org/apache/camel/spi/Metadata.java | 6 ++++ .../org/apache/camel/tooling/model/BaseModel.java | 18 +++++++++++ .../camel/tooling/model/CompilationTarget.java | 33 ++++++++++++++++++++ .../org/apache/camel/tooling/model/JsonMapper.java | 32 ++++++++++++++++++++ .../apache/camel/tooling/model/SupportLevel.java | 35 ++++++++++++++++++++++ .../maven/packaging/AbstractGeneratorMojo.java | 32 ++++++++++++++++++++ .../camel/maven/packaging/EndpointDslMojo.java | 30 ------------------- .../packaging/EndpointSchemaGeneratorMojo.java | 28 +++++------------ .../maven/packaging/PackageDataFormatMojo.java | 35 +++++++--------------- .../camel/maven/packaging/PackageLanguageMojo.java | 14 +++++++-- .../camel/maven/packaging/PackageOtherMojo.java | 5 ++++ .../camel/maven/packaging/SchemaGeneratorMojo.java | 21 ------------- .../camel/maven/packaging/SpiGeneratorMojo.java | 20 +------------ .../camel/maven/packaging/generics/ClassUtil.java | 23 +++++++++++--- 14 files changed, 211 insertions(+), 121 deletions(-) diff --git a/core/camel-api/src/generated/java/org/apache/camel/spi/Metadata.java b/core/camel-api/src/generated/java/org/apache/camel/spi/Metadata.java index fbc64e7..0656e0e 100644 --- a/core/camel-api/src/generated/java/org/apache/camel/spi/Metadata.java +++ b/core/camel-api/src/generated/java/org/apache/camel/spi/Metadata.java @@ -121,4 +121,10 @@ public @interface Metadata { */ String includeProperties() default ""; + /** + * The highest compilation target supported by this entity. + */ + CompilationTarget[] compilationTarget() default CompilationTarget.JVM; + enum CompilationTarget {JVM, Native} + } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java index 6051963..7c5ae34 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java @@ -31,6 +31,8 @@ public abstract class BaseModel<O extends BaseOptionModel> { protected boolean deprecated; protected String deprecationNote; protected final List<O> options = new ArrayList<>(); + protected SupportLevel supportLevel; + protected CompilationTarget compilationTarget; public static Comparator<BaseModel<?>> compareTitle() { return (m1, m2) -> m1.getTitle().compareToIgnoreCase(m2.getTitle()); @@ -118,4 +120,20 @@ public abstract class BaseModel<O extends BaseOptionModel> { return !Strings.isNullOrEmpty(firstVersion) ? Strings.cutLastZeroDigit(firstVersion) : ""; } + public SupportLevel getSupportLevel() { + return supportLevel; + } + + public void setSupportLevel(SupportLevel supportLevel) { + this.supportLevel = supportLevel; + } + + public CompilationTarget getCompilationTarget() { + return compilationTarget; + } + + public void setCompilationTarget(CompilationTarget compilationTarget) { + this.compilationTarget = compilationTarget; + } + } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/CompilationTarget.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/CompilationTarget.java new file mode 100644 index 0000000..943f2c5 --- /dev/null +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/CompilationTarget.java @@ -0,0 +1,33 @@ +/* + * 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; + +/** + * A compilation target supported by some Camel entity, such as component, language, data format, etc. + */ +public enum CompilationTarget { + /** The default compilation target */ + JVM, + /** Native compilation target; implies {@link #JVM} */ + Native; + + public static CompilationTarget DEFAULT = JVM; + + public static CompilationTarget safeValueOf(String string) { + return string == null ? DEFAULT : valueOf(string); + } +} 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 7a8dfdc..3f4ac18 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 @@ -146,6 +146,12 @@ public final class JsonMapper { obj.put("groupId", model.getGroupId()); obj.put("artifactId", model.getArtifactId()); obj.put("version", model.getVersion()); + if (model.getSupportLevel() != null) { + obj.put("supportLevel", model.getSupportLevel().name()); + } + if (model.getCompilationTarget() != null) { + obj.put("compilationTarget", model.getCompilationTarget().name()); + } obj.entrySet().removeIf(e -> e.getValue() == null); JsonObject wrapper = new JsonObject(); wrapper.put("component", obj); @@ -199,6 +205,12 @@ public final class JsonMapper { obj.put("groupId", model.getGroupId()); obj.put("artifactId", model.getArtifactId()); obj.put("version", model.getVersion()); + if (model.getSupportLevel() != null) { + obj.put("supportLevel", model.getSupportLevel().name()); + } + if (model.getCompilationTarget() != null) { + obj.put("compilationTarget", model.getCompilationTarget().name()); + } obj.entrySet().removeIf(e -> e.getValue() == null); JsonObject wrapper = new JsonObject(); wrapper.put("dataformat", obj); @@ -245,6 +257,12 @@ public final class JsonMapper { obj.put("deprecationNote", model.getDeprecationNote()); obj.put("input", model.isInput()); obj.put("output", model.isOutput()); + if (model.getSupportLevel() != null) { + obj.put("supportLevel", model.getSupportLevel().name()); + } + if (model.getCompilationTarget() != null) { + obj.put("compilationTarget", model.getCompilationTarget().name()); + } obj.entrySet().removeIf(e -> e.getValue() == null); JsonObject wrapper = new JsonObject(); wrapper.put("model", obj); @@ -297,6 +315,12 @@ public final class JsonMapper { obj.put("groupId", model.getGroupId()); obj.put("artifactId", model.getArtifactId()); obj.put("version", model.getVersion()); + if (model.getSupportLevel() != null) { + obj.put("supportLevel", model.getSupportLevel().name()); + } + if (model.getCompilationTarget() != null) { + obj.put("compilationTarget", model.getCompilationTarget().name()); + } obj.entrySet().removeIf(e -> e.getValue() == null); JsonObject wrapper = new JsonObject(); wrapper.put("language", obj); @@ -337,6 +361,12 @@ public final class JsonMapper { obj.put("groupId", model.getGroupId()); obj.put("artifactId", model.getArtifactId()); obj.put("version", model.getVersion()); + if (model.getSupportLevel() != null) { + obj.put("supportLevel", model.getSupportLevel().name()); + } + if (model.getCompilationTarget() != null) { + obj.put("compilationTarget", model.getCompilationTarget().name()); + } obj.entrySet().removeIf(e -> e.getValue() == null); JsonObject wrapper = new JsonObject(); wrapper.put("other", obj); @@ -352,6 +382,8 @@ public final class JsonMapper { model.setDeprecated(mobj.getBooleanOrDefault("deprecated", false)); model.setDeprecationNote(mobj.getString("label")); model.setJavaType(mobj.getString("javaType")); + model.setCompilationTarget(CompilationTarget.safeValueOf(mobj.getString("compilationTarget"))); + model.setSupportLevel(SupportLevel.safeValueOf(mobj.getString("supportLevel"))); } private static void parseOption(JsonObject mp, BaseOptionModel option, String name) { diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/SupportLevel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/SupportLevel.java new file mode 100644 index 0000000..baf2773 --- /dev/null +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/SupportLevel.java @@ -0,0 +1,35 @@ +/* + * 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; + +/** + * A level of support for some Camel entity, such as component, language, data format, etc. + */ +public enum SupportLevel { + /** An experimental entity that may change or be removed in minor release */ + Preview, + + /** A stable entity */ + Stable; + + public static SupportLevel DEFAULT = Stable; + + public static SupportLevel safeValueOf(String string) { + return string == null ? DEFAULT : valueOf(string); + } + +} diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java index 5f7e9ec..a307cb8 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.function.Supplier; import org.apache.camel.tooling.util.FileUtil; +import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -60,6 +61,8 @@ public abstract class AbstractGeneratorMojo extends AbstractMojo { @Component protected BuildContext buildContext; + private DynamicClassLoader projectClassLoader; + public void execute(MavenProject project, MavenProjectHelper projectHelper, BuildContext buildContext) throws MojoFailureException, MojoExecutionException { @@ -158,4 +161,33 @@ public abstract class AbstractGeneratorMojo extends AbstractMojo { }; } + protected Class<?> loadClass(String loadClassName) { + Class<?> optionClass; + String org = loadClassName; + while (true) { + try { + optionClass = getProjectClassLoader().loadClass(loadClassName); + break; + } catch (ClassNotFoundException e) { + int dotIndex = loadClassName.lastIndexOf('.'); + if (dotIndex == -1) { + throw new IllegalArgumentException(org); + } else { + loadClassName = loadClassName.substring(0, dotIndex) + "$" + loadClassName.substring(dotIndex + 1); + } + } + } + return optionClass; + } + + protected final DynamicClassLoader getProjectClassLoader() { + if (projectClassLoader == null) { + try { + projectClassLoader = DynamicClassLoader.createDynamicClassLoader(project.getCompileClasspathElements()); + } catch (DependencyResolutionRequiredException e) { + throw new RuntimeException("Unable to create project classloader", e); + } + } + return projectClassLoader; + } } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java index 6cfc51a..322ab9b 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java @@ -143,8 +143,6 @@ public class EndpointDslMojo extends AbstractGeneratorMojo { @Parameter protected File outputResourcesDir; - DynamicClassLoader projectClassLoader; - @Override public void execute(MavenProject project, MavenProjectHelper projectHelper, BuildContext buildContext) throws MojoFailureException, MojoExecutionException { buildDir = new File(project.getBuild().getDirectory()); @@ -158,11 +156,6 @@ public class EndpointDslMojo extends AbstractGeneratorMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { - try { - projectClassLoader = DynamicClassLoader.createDynamicClassLoader(project.getTestClasspathElements()); - } catch (org.apache.maven.artifact.DependencyResolutionRequiredException e) { - throw new RuntimeException(e.getMessage(), e); - } Path root = findCamelDirectory(baseDir, "core/camel-endpointdsl").toPath(); if (sourcesOutputDir == null) { @@ -755,25 +748,6 @@ public class EndpointDslMojo extends AbstractGeneratorMojo { return PRIMITIVEMAP.containsKey(type); } - private Class<?> loadClass(String loadClassName) { - Class<?> optionClass; - String org = loadClassName; - while (true) { - try { - optionClass = getProjectClassLoader().loadClass(loadClassName); - break; - } catch (ClassNotFoundException e) { - int dotIndex = loadClassName.lastIndexOf('.'); - if (dotIndex == -1) { - throw new IllegalArgumentException(org); - } else { - loadClassName = loadClassName.substring(0, dotIndex) + "$" + loadClassName.substring(dotIndex + 1); - } - } - } - return optionClass; - } - private GenericType getType(JavaClass javaClass, Map<String, JavaClass> enumClasses, List<String> enums, String type) { type = type.trim(); // Check if this is an array @@ -880,10 +854,6 @@ public class EndpointDslMojo extends AbstractGeneratorMojo { return getProjectClassLoader().generateDummyClass(clazzName); } - private DynamicClassLoader getProjectClassLoader() { - return projectClassLoader; - } - private static String loadComponentJson(Map<File, Supplier<String>> jsonFiles, String componentName) { return loadJsonOfType(jsonFiles, componentName, "component"); } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java index 74b2671..d575a27 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java @@ -47,6 +47,7 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.camel.maven.packaging.generics.ClassUtil; import org.apache.camel.maven.packaging.generics.GenericsUtil; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; @@ -55,10 +56,12 @@ import org.apache.camel.spi.UriParams; import org.apache.camel.spi.UriPath; import org.apache.camel.spi.annotations.Component; import org.apache.camel.tooling.model.BaseOptionModel; +import org.apache.camel.tooling.model.CompilationTarget; import org.apache.camel.tooling.model.ComponentModel; import org.apache.camel.tooling.model.ComponentModel.ComponentOptionModel; import org.apache.camel.tooling.model.ComponentModel.EndpointOptionModel; import org.apache.camel.tooling.model.JsonMapper; +import org.apache.camel.tooling.model.SupportLevel; import org.apache.camel.tooling.util.JavadocHelper; import org.apache.camel.tooling.util.PackageHelper; import org.apache.camel.tooling.util.Strings; @@ -100,7 +103,6 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { @Parameter(defaultValue = "${project.basedir}/src/generated/resources") protected File resourcesOutputDir; - protected ClassLoader projectClassLoader; protected IndexView indexView; protected Map<String, String> resources = new HashMap<>(); protected List<Path> sourceRoots; @@ -460,6 +462,11 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { if (!Strings.isNullOrEmpty(firstVersion)) { model.setFirstVersion(firstVersion); } + model.setSupportLevel( + ClassUtil.hasAnnotation("org.apache.camel.Experimental", endpointClassElement) + ? SupportLevel.Preview + : SupportLevel.Stable); + model.setCompilationTarget(CompilationTarget.JVM); // get the java type class name via the @Component annotation from its // component class @@ -1028,25 +1035,6 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { } } - private Class<?> loadClass(String name) { - try { - return getProjectClassLoader().loadClass(name); - } catch (ClassNotFoundException e) { - throw (NoClassDefFoundError) new NoClassDefFoundError(name).initCause(e); - } - } - - private ClassLoader getProjectClassLoader() { - if (projectClassLoader == null) { - try { - projectClassLoader = DynamicClassLoader.createDynamicClassLoader(project.getCompileClasspathElements()); - } catch (DependencyResolutionRequiredException e) { - throw new RuntimeException("Unable to create project classloader", e); - } - } - return projectClassLoader; - } - private IndexView getIndex() { if (indexView == null) { Path output = Paths.get(project.getBuild().getOutputDirectory()); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java index 27cc67f..ca2070e 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java @@ -31,16 +31,17 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.camel.maven.packaging.generics.ClassUtil; import org.apache.camel.spi.Metadata; -import org.apache.camel.spi.UriEndpoint; +import org.apache.camel.tooling.model.CompilationTarget; import org.apache.camel.tooling.model.DataFormatModel; import org.apache.camel.tooling.model.DataFormatModel.DataFormatOptionModel; import org.apache.camel.tooling.model.EipModel; import org.apache.camel.tooling.model.EipModel.EipOptionModel; import org.apache.camel.tooling.model.JsonMapper; +import org.apache.camel.tooling.model.SupportLevel; import org.apache.camel.tooling.util.PackageHelper; import org.apache.camel.tooling.util.Strings; -import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; @@ -184,7 +185,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo { excluded = metadata.excludeProperties(); } - DataFormatModel dataFormatModel = extractDataFormatModel(project, json, name, javaType, included, excluded); + DataFormatModel dataFormatModel = extractDataFormatModel(project, json, name, clazz, included, excluded); if (log.isDebugEnabled()) { log.debug("Model: " + dataFormatModel); } @@ -241,26 +242,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo { return count; } - private Class<?> loadClass(String name) { - try { - return getProjectClassLoader().loadClass(name); - } catch (ClassNotFoundException e) { - throw (NoClassDefFoundError) new NoClassDefFoundError(name).initCause(e); - } - } - - private ClassLoader getProjectClassLoader() { - if (projectClassLoader == null) { - try { - projectClassLoader = DynamicClassLoader.createDynamicClassLoader(project.getCompileClasspathElements()); - } catch (DependencyResolutionRequiredException e) { - throw new RuntimeException("Unable to create project classloader", e); - } - } - return projectClassLoader; - } - - private static DataFormatModel extractDataFormatModel(MavenProject project, String json, String name, String javaType, + private static DataFormatModel extractDataFormatModel(MavenProject project, String json, String name, Class<?> javaType, String includedProperties, String excludedProperties) { EipModel def = JsonMapper.generateEipModel(json); DataFormatModel model = new DataFormatModel(); @@ -271,12 +253,17 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo { model.setLabel(def.getLabel()); model.setDeprecated(def.isDeprecated()); model.setDeprecationNote(def.getDeprecationNote()); - model.setJavaType(javaType); + model.setJavaType(javaType.getCanonicalName()); model.setModelName(def.getName()); model.setModelJavaType(def.getJavaType()); model.setGroupId(project.getGroupId()); model.setArtifactId(project.getArtifactId()); model.setVersion(project.getVersion()); + model.setSupportLevel( + ClassUtil.hasAnnotation("org.apache.camel.Experimental", javaType) + ? SupportLevel.Preview + : SupportLevel.Stable); + model.setCompilationTarget(CompilationTarget.JVM); for (EipOptionModel opt : def.getOptions()) { DataFormatOptionModel option = new DataFormatOptionModel(); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java index 9d7fb78..1b7a9d4 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java @@ -25,10 +25,13 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.camel.maven.packaging.generics.ClassUtil; +import org.apache.camel.tooling.model.CompilationTarget; import org.apache.camel.tooling.model.EipModel; import org.apache.camel.tooling.model.EipModel.EipOptionModel; import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.model.LanguageModel; +import org.apache.camel.tooling.model.SupportLevel; import org.apache.camel.tooling.model.LanguageModel.LanguageOptionModel; import org.apache.camel.tooling.util.PackageHelper; import org.apache.maven.plugin.MojoExecutionException; @@ -145,7 +148,7 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo { if (core != null) { for (Map.Entry<String, String> entry : javaTypes.entrySet()) { String name = entry.getKey(); - String javaType = entry.getValue(); + Class<?> javaType = loadClass(entry.getValue()); String modelName = asModelName(name); String json = PackageHelper.loadText(new File(core, "src/generated/resources/org/apache/camel/model/language/" + modelName + PackageHelper.JSON_SUFIX)); @@ -192,7 +195,7 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo { return count; } - protected static LanguageModel extractLanguageModel(MavenProject project, String json, String name, String javaType) { + protected static LanguageModel extractLanguageModel(MavenProject project, String json, String name, Class<?> javaType) { EipModel def = JsonMapper.generateEipModel(json); LanguageModel model = new LanguageModel(); model.setName(name); @@ -202,12 +205,17 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo { model.setLabel(def.getLabel()); model.setDeprecated(def.isDeprecated()); model.setDeprecationNote(def.getDeprecationNote()); - model.setJavaType(javaType); + model.setJavaType(javaType.getCanonicalName()); model.setModelName(def.getName()); model.setModelJavaType(def.getJavaType()); model.setGroupId(project.getGroupId()); model.setArtifactId(project.getArtifactId()); model.setVersion(project.getVersion()); + model.setSupportLevel( + ClassUtil.hasAnnotation("org.apache.camel.Experimental", javaType) + ? SupportLevel.Preview + : SupportLevel.Stable); + model.setCompilationTarget(CompilationTarget.JVM); for (EipOptionModel opt : def.getOptions()) { LanguageOptionModel option = new LanguageOptionModel(); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java index 8eb2de0..6ea4963 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java @@ -19,8 +19,10 @@ package org.apache.camel.maven.packaging; import java.io.File; import java.util.Collections; +import org.apache.camel.tooling.model.CompilationTarget; import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.SupportLevel; import org.apache.camel.tooling.util.PackageHelper; import org.apache.camel.tooling.util.Strings; import org.apache.maven.plugin.MojoExecutionException; @@ -122,6 +124,9 @@ public class PackageOtherMojo extends AbstractGeneratorMojo { title = Strings.camelDashToTitle(name); } otherModel.setTitle(title); + final SupportLevel supportLevel = SupportLevel.safeValueOf(project.getProperties().getProperty("supportLevel")); + otherModel.setSupportLevel(supportLevel); + otherModel.setCompilationTarget(CompilationTarget.JVM); if (log.isDebugEnabled()) { log.debug("Model: " + otherModel); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java index c9d2db8..4e21a63 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java @@ -56,7 +56,6 @@ import org.apache.camel.tooling.util.JavadocHelper; import org.apache.camel.tooling.util.PackageHelper; import org.apache.camel.tooling.util.Strings; import org.apache.camel.tooling.util.srcgen.GenericType; -import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -104,7 +103,6 @@ public class SchemaGeneratorMojo extends AbstractGeneratorMojo { @Parameter(defaultValue = "${project.basedir}/src/generated/resources") protected File resourcesOutputDir; - private ClassLoader projectClassLoader; private IndexView indexView; private final Map<String, JavaClassSource> sources = new HashMap<>(); @@ -228,25 +226,6 @@ public class SchemaGeneratorMojo extends AbstractGeneratorMojo { } - private Class<?> loadClass(String name) { - try { - return getProjectClassLoader().loadClass(name); - } catch (ClassNotFoundException e) { - throw (NoClassDefFoundError) new NoClassDefFoundError(name).initCause(e); - } - } - - private ClassLoader getProjectClassLoader() { - if (projectClassLoader == null) { - try { - projectClassLoader = DynamicClassLoader.createDynamicClassLoader(project.getCompileClasspathElements()); - } catch (DependencyResolutionRequiredException e) { - throw new RuntimeException("Unable to create project classloader", e); - } - } - return projectClassLoader; - } - private IndexView getIndex() { if (indexView == null) { Path output = Paths.get(project.getBuild().getOutputDirectory()); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpiGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpiGeneratorMojo.java index 4da6d7e..de40309 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpiGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpiGeneratorMojo.java @@ -34,7 +34,6 @@ import java.util.stream.Collectors; import org.apache.camel.spi.annotations.ConstantProvider; import org.apache.camel.spi.annotations.ServiceFactory; import org.apache.camel.spi.annotations.SubServiceFactory; -import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -64,8 +63,6 @@ public class SpiGeneratorMojo extends AbstractGeneratorMojo { @Parameter(defaultValue = "${project.basedir}/src/generated/resources") protected File resourcesOutputDir; - private ClassLoader projectClassLoader; - @Override public void execute() throws MojoExecutionException, MojoFailureException { if (classesDirectory == null) { @@ -168,21 +165,6 @@ public class SpiGeneratorMojo extends AbstractGeneratorMojo { return Files.isRegularFile(file); } - private ClassLoader getProjectClassLoader() throws MojoExecutionException { - if (projectClassLoader == null) { - projectClassLoader = createProjectClassLoader(); - } - return projectClassLoader; - } - - private DynamicClassLoader createProjectClassLoader() throws MojoExecutionException { - try { - return DynamicClassLoader.createDynamicClassLoader(project.getCompileClasspathElements()); - } catch (DependencyResolutionRequiredException e) { - throw new MojoExecutionException("Unable to create project classloader", e); - } - } - private IndexView getIndex() throws MojoExecutionException { try { List<IndexView> indices = new ArrayList<>(); @@ -223,7 +205,7 @@ public class SpiGeneratorMojo extends AbstractGeneratorMojo { String pn = fqn.substring(0, fqn.lastIndexOf('.')); String cn = fqn.substring(fqn.lastIndexOf('.') + 1); - StringBuilder w = new StringBuilder(); + StringBuilder w = new StringBuilder(); w.append("/* " + GENERATED_MSG + " */\n"); w.append("package ").append(pn).append(";\n"); w.append("\n"); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/generics/ClassUtil.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/generics/ClassUtil.java index 072b239..ab2ee49 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/generics/ClassUtil.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/generics/ClassUtil.java @@ -25,6 +25,7 @@ import java.lang.reflect.WildcardType; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.stream.Stream; /** * Utility classes with respect to the class operations. @@ -80,7 +81,7 @@ public final class ClassUtil { * {@link ParameterizedType}, it returns the raw type otherwise it return * the casted {@link Class} of the type argument. * </p> - * + * * @param type class or parametrized type * @return */ @@ -91,7 +92,7 @@ public final class ClassUtil { /** * Returns true if type is an instance of <code>ParameterizedType</code> * else otherwise. - * + * * @param type type of the artifact * @return true if type is an instance of <code>ParameterizedType</code> */ @@ -102,7 +103,7 @@ public final class ClassUtil { /** * Returns true if type is an instance of <code>WildcardType</code> else * otherwise. - * + * * @param type type of the artifact * @return true if type is an instance of <code>WildcardType</code> */ @@ -112,7 +113,7 @@ public final class ClassUtil { /** * Returns true if rhs is assignable type to the lhs, false otherwise. - * + * * @param lhs left hand side class * @param rhs right hand side class * @return true if rhs is assignable to lhs @@ -201,4 +202,18 @@ public final class ClassUtil { return null; } + + /** + * @param fqAnnotationName a fully qualified runtime annotation name whose presence on the given class is to be + * checked + * @param cl the class to check + * @return {@code true} if the given {@link Class} is annotated with the given <strong>runtime</strong> annotation; + * {@code false} otherwise + */ + public static boolean hasAnnotation(String fqAnnotationName, Class<?> cl) { + return Stream.of(cl.getAnnotations()) + .map(annotation -> annotation.annotationType().getName()) + .filter(className -> fqAnnotationName.equals(className)) + .findFirst().isPresent(); + } }