This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch catalog in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 442ff6d3a64cf681efec90beb45077712c9dd70a Author: Claus Ibsen <[email protected]> AuthorDate: Tue Oct 8 12:24:10 2019 +0200 #75: Adding camel-quarkus-catalog (work in progress) --- extensions/reactive-executor/pom.xml | 1 + extensions/reactive-executor/runtime/pom.xml | 5 + tooling/maven/package-maven-plugin/pom.xml | 7 + .../apache/camel/quarkus/maven/PackageHelper.java | 29 ++++ .../quarkus/maven/PrepareCatalogQuarkusMojo.java | 146 ++++++++++++++++++++- .../src/main/resources/other-template.mvel | 14 ++ 6 files changed, 195 insertions(+), 7 deletions(-) diff --git a/extensions/reactive-executor/pom.xml b/extensions/reactive-executor/pom.xml index 8236bbe..d668925 100644 --- a/extensions/reactive-executor/pom.xml +++ b/extensions/reactive-executor/pom.xml @@ -31,6 +31,7 @@ <artifactId>camel-quarkus-reactive-executor-parent</artifactId> <name>Camel Quarkus :: Core :: Reactive Executor</name> <packaging>pom</packaging> + <modules> <module>deployment</module> <module>runtime</module> diff --git a/extensions/reactive-executor/runtime/pom.xml b/extensions/reactive-executor/runtime/pom.xml index 9751130..d44377e 100644 --- a/extensions/reactive-executor/runtime/pom.xml +++ b/extensions/reactive-executor/runtime/pom.xml @@ -28,6 +28,11 @@ <artifactId>camel-quarkus-reactive-executor</artifactId> <name>Camel Quarkus :: Core :: Reactive Executor :: Runtime</name> + <description>To use Quarkus reactive executor with Camel</description> + + <properties> + <firstVersion>0.2.1</firstVersion> + </properties> <dependencyManagement> <dependencies> diff --git a/tooling/maven/package-maven-plugin/pom.xml b/tooling/maven/package-maven-plugin/pom.xml index db07ee0..3e4af4d 100644 --- a/tooling/maven/package-maven-plugin/pom.xml +++ b/tooling/maven/package-maven-plugin/pom.xml @@ -84,6 +84,13 @@ <groupId>org.sonatype.plexus</groupId> <artifactId>plexus-build-api</artifactId> </dependency> + + <dependency> + <groupId>org.mvel</groupId> + <artifactId>mvel2</artifactId> + <version>2.4.4.Final</version> + </dependency> + </dependencies> <build> diff --git a/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PackageHelper.java b/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PackageHelper.java index 098c99c..f84cdf6 100644 --- a/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PackageHelper.java +++ b/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PackageHelper.java @@ -67,6 +67,35 @@ public final class PackageHelper { } } + /** + * Converts the value to use title style instead of dash cased + */ + public static String camelDashToTitle(String value) { + StringBuilder sb = new StringBuilder(value.length()); + boolean dash = false; + + for (char c : value.toCharArray()) { + if ('-' == c) { + dash = true; + continue; + } + + if (dash) { + sb.append(' '); + sb.append(Character.toUpperCase(c)); + } else { + // upper case first + if (sb.length() == 0) { + sb.append(Character.toUpperCase(c)); + } else { + sb.append(c); + } + } + dash = false; + } + return sb.toString(); + } + public static void writeText(File file, String text) throws IOException { FileOutputStream fos = new FileOutputStream(file, false); try { diff --git a/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java b/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java index 4609c78..1a1abaf 100644 --- a/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java +++ b/tooling/maven/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java @@ -23,11 +23,15 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.regex.Pattern; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -37,7 +41,13 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; +import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.project.ProjectBuildingException; +import org.apache.maven.project.ProjectBuildingResult; +import org.apache.maven.repository.RepositorySystem; +import org.mvel2.templates.TemplateRuntime; +import static org.apache.camel.quarkus.maven.PackageHelper.camelDashToTitle; import static org.apache.camel.quarkus.maven.PackageHelper.loadText; /** @@ -46,6 +56,10 @@ import static org.apache.camel.quarkus.maven.PackageHelper.loadText; @Mojo(name = "prepare-catalog-quarkus", threadSafe = true, requiresDependencyCollection = ResolutionScope.COMPILE_PLUS_RUNTIME) public class PrepareCatalogQuarkusMojo extends AbstractMojo { + private static final String[] EXCLUDE_EXTENSIONS = { + "http-common", "jetty-common", "support", "xml-common", "xstream-common" + }; + private static final Pattern GROUP_PATTERN = Pattern.compile("\"groupId\": \"(org.apache.camel)\""); private static final Pattern ARTIFACT_PATTERN = Pattern.compile("\"artifactId\": \"camel-(.*)\""); private static final Pattern VERSION_PATTERN = Pattern.compile("\"version\": \"(.*)\""); @@ -56,7 +70,20 @@ public class PrepareCatalogQuarkusMojo extends AbstractMojo { @Parameter(property = "project", required = true, readonly = true) protected MavenProject project; + @Component + private RepositorySystem repositorySystem; + + @Component + private ProjectBuilder mavenProjectBuilder; + + @Parameter(defaultValue = "${session}", readonly = true) + private MavenSession session; + + @Component + private MavenProjectHelper projectHelper; + /** + * * The output directory for components catalog */ @Parameter(defaultValue = "${project.build.directory}/classes/org/apache/camel/catalog/quarkus/components") @@ -87,12 +114,6 @@ public class PrepareCatalogQuarkusMojo extends AbstractMojo { protected File extensionsDir; /** - * Maven ProjectHelper. - */ - @Component - private MavenProjectHelper projectHelper; - - /** * Execute goal. * * @throws MojoExecutionException execution of the main class or one of the @@ -105,6 +126,7 @@ public class PrepareCatalogQuarkusMojo extends AbstractMojo { executeComponents(extensions); executeLanguages(extensions); executeDataFormats(extensions); + executeOthers(extensions); } protected void executeComponents(Set<String> extensions) throws MojoExecutionException, MojoFailureException { @@ -325,6 +347,103 @@ public class PrepareCatalogQuarkusMojo extends AbstractMojo { } } + protected void executeOthers(Set<String> extensions) throws MojoExecutionException, MojoFailureException { + // make sure to create out dir + othersOutDir.mkdirs(); + + + for (String extension : extensions) { + // skip if the extension is already one of the following + boolean component = new File(componentsOutDir, extension + ".json").exists(); + boolean language = new File(languagesOutDir, extension + ".json").exists(); + boolean dataFormat = new File(dataFormatsOutDir, extension + ".json").exists(); + if (component || language || dataFormat) { + continue; + } + + try { + MavenProject extPom = getMavenProject("org.apache.camel.quarkus", "camel-quarkus-" + extension, project.getVersion()); + + Map<String, Object> model = new HashMap<>(); + model.put("name", extension); + String title = extPom.getProperties().getProperty("title"); + if (title == null) { + title = camelDashToTitle(extension); + } + model.put("title", title); + model.put("description", extPom.getDescription()); + if (extPom.getName() != null && extPom.getName().contains("(deprecated)")) { + model.put("deprecated", "true"); + } else { + model.put("deprecated", "false"); + } + model.put("firstVersion", extPom.getProperties().getOrDefault("firstVersion", "1.0.0")); + model.put("label", extPom.getProperties().getOrDefault("label", "quarkus")); + model.put("groupId", "org.apache.camel.quarkus"); + model.put("artifactId", "camel-quarkus-" + extension); + model.put("version", project.getVersion()); + + String text = templateOther(model); + + // write new json file + File to = new File(othersOutDir, extension + ".json"); + FileOutputStream fos = new FileOutputStream(to, false); + + fos.write(text.getBytes()); + + fos.close(); + + } catch (IOException e) { + throw new MojoFailureException("Cannot write json file " + extension, e); + } catch (ProjectBuildingException e) { + throw new MojoFailureException("Error loading pom.xml from extension " + extension, e); + } + } + + File all = new File(othersOutDir, "../others.properties"); + try { + FileOutputStream fos = new FileOutputStream(all, false); + + String[] names = othersOutDir.list(); + List<String> others = new ArrayList<>(); + // sort the names + for (String name : names) { + if (name.endsWith(".json")) { + // strip out .json from the name + String otherName = name.substring(0, name.length() - 5); + others.add(otherName); + } + } + + Collections.sort(others); + for (String name : others) { + fos.write(name.getBytes()); + fos.write("\n".getBytes()); + } + + fos.close(); + + } catch (IOException e) { + throw new MojoFailureException("Error writing to file " + all); + } + } + + private MavenProject getMavenProject(String groupId, String artifactId, String version) throws ProjectBuildingException { + Artifact pomArtifact = repositorySystem.createProjectArtifact(groupId, artifactId, version); + ProjectBuildingResult build = mavenProjectBuilder.build(pomArtifact, session.getProjectBuildingRequest()); + return build.getProject(); + } + + private String templateOther(Map model) throws MojoExecutionException { + try { + String template = loadText(getClass().getClassLoader().getResourceAsStream("other-template.mvel")); + String out = (String) TemplateRuntime.eval(template, model); + return out; + } catch (Exception e) { + throw new MojoExecutionException("Error processing mvel template. Reason: " + e, e); + } + } + private static boolean isCamelComponent(List<String> components, String name) { return components.stream().anyMatch(c -> c.equals(name)); } @@ -344,7 +463,11 @@ public class PrepareCatalogQuarkusMojo extends AbstractMojo { if (names != null) { for (File name : names) { if (name.isDirectory()) { - answer.add(name.getName()); + boolean excluded = isExcludedExtension(name.getName()); + boolean active = new File(name, "pom.xml").exists(); + if (!excluded && active) { + answer.add(name.getName()); + } } } } @@ -354,4 +477,13 @@ public class PrepareCatalogQuarkusMojo extends AbstractMojo { return answer; } + private static boolean isExcludedExtension(String name) { + for (String exclude : EXCLUDE_EXTENSIONS) { + if (exclude.equals(name)) { + return true; + } + } + return false; + } + } diff --git a/tooling/maven/package-maven-plugin/src/main/resources/other-template.mvel b/tooling/maven/package-maven-plugin/src/main/resources/other-template.mvel new file mode 100644 index 0000000..1d57f31 --- /dev/null +++ b/tooling/maven/package-maven-plugin/src/main/resources/other-template.mvel @@ -0,0 +1,14 @@ +{ + "other": { + "name": "@{name}", + "kind": "other", + "title": "@{title}", + "description": "@{description}", + "deprecated": @{deprecated}, + "firstVersion": "@{firstVersion}", + "label": "@{label}", + "groupId": "@{groupId}", + "artifactId": "@{artifactId}", + "version": "@{version}" + } +} \ No newline at end of file
