You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/06/15 12:51:12 UTC
[camel] 01/02: CAMEL-15190: Generate table of options for camel-main
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 8c445094268188a640444d7987adaa30f231911c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jun 15 14:43:09 2020 +0200
CAMEL-15190: Generate table of options for camel-main
---
core/camel-main/src/main/docs/main.adoc | 16 ++-
.../apache/camel/maven/packaging/GenerateMojo.java | 2 +
.../maven/packaging/PrepareCamelMainDocMojo.java | 132 +++++++++++++++++++++
.../maven/packaging/PrepareCamelMainMojo.java | 4 +-
.../src/main/resources/main-options.mvel | 7 ++
5 files changed, 158 insertions(+), 3 deletions(-)
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 90ec50c..e39644a 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -10,4 +10,18 @@
*Since Camel {since}*
-This module is used for running Camel standalone via a main class extended from `camel-main`.
\ No newline at end of file
+This module is used for running Camel standalone via a main class extended from `camel-main`.
+
+== Configuration options
+
+When running Camel via `camel-main` you can configure Camel in the `application.properties` file.
+
+The following table lists all the options:
+
+// main options: START
+// main options: END
+
+== Examples
+
+You can find a set of examples using `camel-main` in [Camel Examples](https://github.com/apache/camel-examples)
+which demonstrate running Camel in standalone with `camel-main`.
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 dba8ac7..e4d2c10 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
@@ -48,6 +48,8 @@ public class GenerateMojo extends AbstractGenerateMojo {
invoke(PrepareComponentMojo.class);
// prepare-main
invoke(PrepareCamelMainMojo.class);
+ // prepare-main-doc
+ invoke(PrepareCamelMainDocMojo.class);
// generate-xml-parser
invoke(ModelXmlParserGeneratorMojo.class);
// generate-legal
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainDocMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainDocMojo.java
new file mode 100644
index 0000000..2dde0a8
--- /dev/null
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainDocMojo.java
@@ -0,0 +1,132 @@
+/*
+ * 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.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+
+import org.apache.camel.tooling.model.JsonMapper;
+import org.apache.camel.tooling.model.MainModel;
+import org.apache.camel.tooling.util.PackageHelper;
+import org.apache.camel.tooling.util.Strings;
+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.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectHelper;
+import org.mvel2.templates.TemplateRuntime;
+import org.sonatype.plexus.build.incremental.BuildContext;
+
+/**
+ * Prepares camel-main by updating main documentation.
+ */
+@Mojo(name = "prepare-main", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE)
+public class PrepareCamelMainDocMojo extends AbstractGeneratorMojo {
+
+ /**
+ * The documentation directory
+ */
+ @Parameter(defaultValue = "${project.basedir}/src/main/docs")
+ protected File docDocDir;
+
+ /**
+ * The documentation directory
+ */
+ @Parameter(defaultValue = "${project.basedir}/src/generated/resources/META-INF/camel-main-configuration-metadata.json")
+ protected File mainJsonFile;
+
+ @Override
+ public void execute(MavenProject project, MavenProjectHelper projectHelper, BuildContext buildContext) throws MojoFailureException, MojoExecutionException {
+ super.execute(project, projectHelper, buildContext);
+ }
+
+ @Override
+ public void execute() throws MojoExecutionException, MojoFailureException {
+ if (!mainJsonFile.exists()) {
+ throw new MojoExecutionException("Main json file does not exist: " + mainJsonFile);
+ }
+
+ File file = new File(docDocDir, "main.adoc");
+ boolean exists = file.exists();
+ boolean updated;
+ try {
+ String json = PackageHelper.loadText(mainJsonFile);
+ MainModel model = JsonMapper.generateMainModel(json);
+ String options = evaluateTemplate("main-options.mvel", model);
+ updated = updateOptionsIn(file, "main", options);
+ } catch (IOException e) {
+ throw new MojoExecutionException("Error preparing main docs", e);
+ }
+
+ if (updated) {
+ getLog().info("Updated doc file: " + file);
+ } else if (exists) {
+ getLog().debug("No changes to doc file: " + file);
+ } else {
+ getLog().warn("No main doc file: " + file);
+ }
+ }
+
+ private static String evaluateTemplate(final String templateName, final Object model) throws MojoExecutionException {
+ try (InputStream templateStream = UpdateReadmeMojo.class.getClassLoader().getResourceAsStream(templateName)) {
+ String template = PackageHelper.loadText(templateStream);
+ return (String) TemplateRuntime.eval(template, model, Collections.singletonMap("util", MvelHelper.INSTANCE));
+ } catch (IOException e) {
+ throw new MojoExecutionException("Error processing mvel template `" + templateName + "`", e);
+ }
+ }
+
+ private boolean updateOptionsIn(final File file, final String kind, final String changed) throws MojoExecutionException {
+ if (!file.exists()) {
+ return false;
+ }
+
+ final String updated = changed.trim();
+ try {
+ String text = PackageHelper.loadText(file);
+
+ String existing = Strings.between(text, "// " + kind + " options: START", "// " + kind + " options: END");
+ if (existing != null) {
+ // remove leading line breaks etc
+ existing = existing.trim();
+ if (existing.equals(updated)) {
+ return false;
+ }
+
+ String before = Strings.before(text, "// " + kind + " options: START");
+ String after = Strings.after(text, "// " + kind + " options: END");
+ text = before + "// " + kind + " options: START\n" + updated + "\n// " + kind + " options: END" + after;
+ PackageHelper.writeText(file, text);
+ return true;
+ }
+
+ getLog().warn("Cannot find markers in file " + file);
+ getLog().warn("Add the following markers");
+ getLog().warn("\t// " + kind + " options: START");
+ getLog().warn("\t// " + kind + " options: END");
+ return false;
+ } catch (IOException e) {
+ throw new MojoExecutionException("Error reading file " + file + " Reason: " + e, e);
+ }
+ }
+
+}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
index 2909e51..9091913 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
@@ -46,13 +46,13 @@ import org.sonatype.plexus.build.incremental.BuildContext;
* Prepares camel-main by generating Camel Main configuration metadata for
* tooling support.
*/
-@Mojo(name = "prepare-main", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE)
+@Mojo(name = "prepare-main-doc", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE)
public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
/**
* The output directory for generated spring boot tooling file
*/
- @Parameter(defaultValue = "${project.basedir}/src/generated/resources")
+ @Parameter(defaultValue = "${project.basedir}/src/main/doc")
protected File outFolder;
/**
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/resources/main-options.mvel b/tooling/maven/camel-package-maven-plugin/src/main/resources/main-options.mvel
new file mode 100644
index 0000000..7c95c10
--- /dev/null
+++ b/tooling/maven/camel-package-maven-plugin/src/main/resources/main-options.mvel
@@ -0,0 +1,7 @@
+@if{!options.isEmpty()}
+[width="100%",cols="2,5,^1,2",options="header"]
+|===@comment{ Render table cells. If description contains newline, prefix cell with `a`, so the content is rendered with formatting. }
+| Name | Description | Default | Type
+@foreach{row : options}| *@{row.getShortName(30)}* (@{row.shortGroup}) @{row.description.?contains("\n") ? "a" : ""}| @{util.escape(row.description)} | @{row.getShortDefaultValue(20)} | @{row.getShortJavaType()}
+@end{}|===
+@end{}