You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2013/04/23 09:53:38 UTC
svn commit: r1470838 - in
/camel/trunk/tooling/maven/camel-package-maven-plugin: pom.xml
src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java
src/main/resources/camel-package-maven-plugin.properties
Author: jstrachan
Date: Tue Apr 23 07:53:38 2013
New Revision: 1470838
URL: http://svn.apache.org/r1470838
Log:
added a maven report plugin for endpoint documentation, generated from the @UriEndpoint / @UriParam / @UriParams annotations and javadoc. See CAMEL-6304
Added:
camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java (with props)
camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties (contents, props changed)
- copied, changed from r1467765, camel/trunk/tooling/maven/camel-maven-plugin/src/main/resources/camel-maven-plugin.properties
Modified:
camel/trunk/tooling/maven/camel-package-maven-plugin/pom.xml
Modified: camel/trunk/tooling/maven/camel-package-maven-plugin/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/tooling/maven/camel-package-maven-plugin/pom.xml?rev=1470838&r1=1470837&r2=1470838&view=diff
==============================================================================
--- camel/trunk/tooling/maven/camel-package-maven-plugin/pom.xml (original)
+++ camel/trunk/tooling/maven/camel-package-maven-plugin/pom.xml Tue Apr 23 07:53:38 2013
@@ -58,6 +58,14 @@
<scope>provided</scope>
<version>2.2.1</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.maven.reporting</groupId>
+ <artifactId>maven-reporting-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.reporting</groupId>
+ <artifactId>maven-reporting-impl</artifactId>
+ </dependency>
<!-- add some logging to the classpath -->
Added: camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java
URL: http://svn.apache.org/viewvc/camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java?rev=1470838&view=auto
==============================================================================
--- camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java (added)
+++ camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java Tue Apr 23 07:53:38 2013
@@ -0,0 +1,472 @@
+/**
+ *
+ * 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.FileInputStream;
+import java.io.FilenameFilter;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.reporting.AbstractMavenReport;
+import org.apache.maven.reporting.MavenReportException;
+import org.codehaus.plexus.util.IOUtil;
+
+/**
+ * Generates a HTML report for all the Camel endpoints and their configuration parameters
+ *
+ * @goal endpoints
+ * @phase site
+ */
+public class EndpointMojo extends AbstractMavenReport {
+
+ /**
+ * Reference to Maven Project.
+ *
+ * @parameter property="project"
+ * @required
+ * @readonly
+ */
+ private MavenProject project;
+
+ /**
+ * @component
+ * @required
+ * @readonly
+ */
+ private Renderer renderer;
+
+ /**
+ * Base output directory for reports.
+ *
+ * @parameter default-value="${project.build.directory}/site"
+ * @required
+ */
+ private File outputDirectory;
+
+
+ protected void executeReport(final Locale locale) throws MavenReportException {
+ try {
+ File dir = new File(project.getBuild().getOutputDirectory(), "org/apache/camel/component");
+ getLog().info("Looking into directory " + dir.getAbsolutePath());
+ if (dir.exists() && dir.isDirectory()) {
+ File[] files = dir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().endsWith(".html");
+ }
+ });
+ if (files != null && files.length > 0) {
+ boolean showIndex = files.length > 1;
+ Sink sink = getSink();
+ if (sink != null) {
+ StringBuilder buffer = new StringBuilder();
+ sink.head();
+ sink.title();
+ sink.text("Camel Endpoints");
+ sink.title_();
+ sink.rawText("<style>\n" +
+ "th, td {\n" +
+ " text-align:left;\n\n" +
+ "}\n" +
+ "</style>\n");
+ sink.head_();
+
+ sink.body();
+ sink.section1();
+ sink.sectionTitle1();
+ sink.text("Camel Endpoints");
+ sink.sectionTitle1_();
+
+ if (showIndex) {
+ sink.list();
+ }
+ for (File file : files) {
+ getLog().info("found " + file.getAbsolutePath());
+
+ String linkName = file.getName();
+ if (linkName.endsWith(".html")) {
+ linkName = linkName.substring(0, linkName.length() - 5);
+ }
+ String endpointHtml = IOUtil.toString(new FileInputStream(file));
+ endpointHtml = extractBodyContents(endpointHtml);
+
+ if (showIndex) {
+ sink.listItem();
+ sink.link("#" + linkName);
+ sink.text(linkName);
+ sink.link_();
+ sink.listItem_();
+
+ buffer.append("<a name='" + linkName + "'>\n");
+ buffer.append(endpointHtml);
+ buffer.append("</a>\n");
+ } else {
+ sink.section1_();
+
+ sink.section2();
+ sink.rawText(endpointHtml);
+ sink.section2_();
+ }
+ }
+ if (showIndex) {
+ sink.list_();
+ sink.section1_();
+
+ sink.section2();
+ sink.rawText(buffer.toString());
+ sink.section2_();
+ }
+ sink.body_();
+ sink.flush();
+ sink.close();
+ }
+ }
+ }
+ } catch (Exception e) {
+ final MavenReportException ex = new MavenReportException(e.getMessage());
+ ex.initCause(e.getCause());
+ throw ex;
+ }
+ }
+
+ /**
+ * Extracts the content between <body> and </body>
+ */
+ protected String extractBodyContents(String html) {
+ String body = "<body>";
+ int idx = html.indexOf(body);
+ if (idx > 0) {
+ html = html.substring(idx + body.length());
+ }
+ idx = html.lastIndexOf("</body>");
+ if (idx > 0) {
+ html = html.substring(0, idx);
+ }
+ return html;
+ }
+
+
+/*
+ public void execute() throws MojoExecutionException {
+ this.execute(this.buildDirectory, Locale.getDefault());
+ try {
+ writeIndexHtmlFile(outputDirectory, "index.html", indexHtmlContent);
+ } catch (IOException e) {
+ throw new MojoExecutionException("Failed: " + e, e);
+ }
+ }
+
+ */
+/**
+ * Executes DOT generator.
+ *
+ * @param outputDir report output directory.
+ * @param locale report locale.
+ * @throws org.apache.maven.plugin.MojoExecutionException if there were any execution errors.
+ *//*
+
+ protected void execute(final File outputDir, final Locale locale) throws MojoExecutionException {
+ outputDir.mkdirs();
+
+ List<File> files = new ArrayList<File>();
+ appendFiles(files, outputDirectory);
+
+ try {
+ Set<String> contextNames = new HashSet<String>();
+ for (File file : files) {
+ String contextName = file.getParentFile().getName();
+ contextNames.add(contextName);
+ }
+
+ boolean multipleCamelContexts = contextNames.size() > 1;
+ int size = files.size();
+ for (int i = 0; i < size; i++) {
+ File file = files.get(i);
+ String contextName = null;
+ if (multipleCamelContexts) {
+ contextName = file.getParentFile().getName();
+ }
+
+ getLog().info("Generating contextName: " + contextName + " file: " + file + "");
+
+ generate(i, file, contextName);
+ }
+
+ if (multipleCamelContexts) {
+ // lets generate an index page which lists each indiviual
+ // CamelContext file
+ StringWriter buffer = new StringWriter();
+ PrintWriter out = new PrintWriter(buffer);
+
+ out.println("<h1>Camel Contexts</h1>");
+ out.println();
+
+ out.println("<ul>");
+ for (String contextName : contextNames) {
+ out.print(" <li><a href='");
+ out.print(contextName);
+ out.print("/routes.html'>");
+ out.print(contextName);
+ out.println("</a></li>");
+ }
+ out.println("</ul>");
+ indexHtmlContent = buffer.toString();
+ }
+ } catch (CommandLineException e) {
+ throw new MojoExecutionException("Failed: " + e, e);
+ } catch (IOException e) {
+ throw new MojoExecutionException("Failed: " + e, e);
+ }
+ }
+
+ private void generate(int index, File file, String contextName) throws CommandLineException,
+ MojoExecutionException, IOException {
+
+ StringWriter buffer = new StringWriter();
+ PrintWriter out = new PrintWriter(buffer);
+ printHtmlHeader(out, contextName);
+ printHtmlFileHeader(out, file);
+ for (String format : graphvizOutputTypes) {
+ String generated = convertFile(file, format);
+
+ if (format.equals("cmapx") && generated != null) {
+ // lets include the generated file inside the html
+ addFileToBuffer(out, new File(generated));
+ }
+ }
+ printHtmlFileFooter(out, file);
+ printHtmlFooter(out);
+
+ String content = buffer.toString();
+ String name = file.getName();
+ if (name.equalsIgnoreCase("routes.dot") || index == 0) {
+ indexHtmlContent = content;
+ }
+ int idx = name.lastIndexOf(".");
+ if (idx >= 0) {
+ name = name.substring(0, idx);
+ name += ".html";
+ }
+ writeIndexHtmlFile(file.getParentFile(), name, content);
+ }
+
+ protected void writeIndexHtmlFile(File dir, String fileName, String content) throws IOException {
+ // File dir = outputDirectory;
+ dir.mkdirs();
+ File html = new File(dir, fileName);
+ PrintWriter out = null;
+ try {
+ out = new PrintWriter(new FileWriter(html));
+ out.println("<html>");
+ out.println("<head>");
+ out.println("</head>");
+ out.println("<body>");
+ out.println();
+ if (content == null) {
+ out.write("<p>No EIP diagrams available</p>");
+ } else {
+ out.write(content);
+ }
+ out.println("</body>");
+ out.println("</html>");
+ } finally {
+ String description = "Failed to close html output file";
+ close(out, description);
+ }
+ }
+
+ protected void printHtmlHeader(PrintWriter out, String contextName) {
+ if (contextName != null) {
+ out.println("<h1>EIP Patterns for CamelContext: " + contextName + "</h1>");
+ } else {
+ out.println("<h1>Camel EIP Patterns</h1>");
+ }
+ out.println();
+ }
+
+ protected void printHtmlFileHeader(PrintWriter out, File file) {
+ out.println("<p>");
+ out.println(" <img src='" + removeFileExtension(file.getName()) + ".png' usemap='#CamelRoutes'>");
+ }
+
+ protected void printHtmlFileFooter(PrintWriter out, File file) {
+ out.println(" </img>");
+ out.println("</p>");
+ out.println();
+ }
+
+ protected void printHtmlFooter(PrintWriter out) {
+ out.println();
+ }
+
+ protected void close(Closeable closeable, String description) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (IOException e) {
+ getLog().warn(description + ": " + e);
+ }
+ }
+ }
+
+ protected String convertFile(File file, String format) throws CommandLineException {
+ Log log = getLog();
+ if (!useDot) {
+ log.info("DOT generation disabled.");
+ return null;
+ } else {
+ if (dotHelpExitCode() != 0) {
+ log.info("'dot -?' execution failed so DOT generation disabled.");
+ return null;
+ }
+ }
+ if (this.executable == null || this.executable.length() == 0) {
+ log.warn("Parameter <executable/> was not set in the pom.xml. Skipping conversion.");
+ return null;
+ }
+
+ String generatedFileName = removeFileExtension(file.getAbsolutePath()) + "." + format;
+ Commandline cl = new Commandline();
+ cl.setExecutable(executable);
+ cl.createArg().setValue("-T" + format);
+ cl.createArg().setValue("-o");
+ cl.createArg().setValue(generatedFileName);
+ cl.createArg().setValue(file.getAbsolutePath());
+
+ log.debug("executing: " + cl.toString());
+
+ CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+ CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+ CommandLineUtils.executeCommandLine(cl, stdout, stderr);
+
+ String output = stdout.getOutput();
+ if (output.length() > 0) {
+ log.debug(output);
+ }
+ String errOutput = stderr.getOutput();
+ if (errOutput.length() > 0) {
+ log.warn(errOutput);
+ }
+ return generatedFileName;
+ }
+
+ private int dotHelpExitCode() throws CommandLineException {
+ Commandline cl = new Commandline();
+ cl.setExecutable(executable);
+ cl.createArg().setValue("-?");
+
+ CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+ CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+ return CommandLineUtils.executeCommandLine(cl, stdout, stderr);
+ }
+
+ protected String removeFileExtension(String name) {
+ int idx = name.lastIndexOf(".");
+ if (idx > 0) {
+ return name.substring(0, idx);
+ } else {
+ return name;
+ }
+ }
+
+ private void appendFiles(List<File> output, File file) {
+ if (file.isDirectory()) {
+ appendDirectory(output, file);
+ } else {
+ if (isValid(file)) {
+ output.add(file);
+ }
+ }
+ }
+
+ private void appendDirectory(List<File> output, File dir) {
+ File[] files = dir.listFiles();
+ for (File file : files) {
+ appendFiles(output, file);
+ }
+ }
+
+ private boolean isValid(File file) {
+ String name = file.getName().toLowerCase();
+ return name.endsWith(".dot");
+ }
+
+ private void addFileToBuffer(PrintWriter out, File file) throws MojoExecutionException {
+ BufferedReader reader = null;
+ try {
+ reader = IOHelper.buffered(new FileReader(file));
+ while (true) {
+ String line = reader.readLine();
+ if (line == null) {
+ break;
+ } else {
+ out.println(line);
+ }
+ }
+ } catch (IOException e) {
+ throw new MojoExecutionException("Failed: " + e, e);
+ } finally {
+ close(reader, "cmapx file");
+ }
+ }
+*/
+
+ /**
+ * Gets resource bundle for given locale.
+ *
+ * @param locale locale
+ * @return resource bundle
+ */
+ protected ResourceBundle getBundle(final Locale locale) {
+ return ResourceBundle
+ .getBundle("camel-package-maven-plugin", locale, this.getClass().getClassLoader());
+ }
+
+ protected Renderer getSiteRenderer() {
+ return this.renderer;
+ }
+
+ protected String getOutputDirectory() {
+ return this.outputDirectory.getAbsolutePath();
+ }
+
+ protected MavenProject getProject() {
+ return this.project;
+ }
+
+ public String getDescription(final Locale locale) {
+ return getBundle(locale).getString("report.endpoint.description");
+ }
+
+ /**
+ * @see org.apache.maven.reporting.MavenReport#getName(java.util.Locale)
+ */
+ public String getName(final Locale locale) {
+ return getBundle(locale).getString("report.endpoint.name");
+ }
+
+ public String getOutputName() {
+ return "camelEndpoints";
+ }
+}
Propchange: camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointMojo.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied: camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties (from r1467765, camel/trunk/tooling/maven/camel-maven-plugin/src/main/resources/camel-maven-plugin.properties)
URL: http://svn.apache.org/viewvc/camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties?p2=camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties&p1=camel/trunk/tooling/maven/camel-maven-plugin/src/main/resources/camel-maven-plugin.properties&r1=1467765&r2=1470838&rev=1470838&view=diff
==============================================================================
--- camel/trunk/tooling/maven/camel-maven-plugin/src/main/resources/camel-maven-plugin.properties (original)
+++ camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties Tue Apr 23 07:53:38 2013
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-report.dot.name = Camel EIP Diagram
-report.dot.description = This report generates a graphical diagram of all the Enterprise Integration Patterns in this project
-report.dot.header=Dot Report
+report.endpoint.name = Camel Endpoints
+report.endpoint.description = The reference documentation for the Camel Endpoints
+report.endpoint.header = Camel Endpoints
Propchange: camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: camel/trunk/tooling/maven/camel-package-maven-plugin/src/main/resources/camel-package-maven-plugin.properties
------------------------------------------------------------------------------
svn:mime-type = text/plain