CAMEL-9541: Keep user guide TOC up to date with components from the Camel Catalog.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/38941053 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/38941053 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/38941053 Branch: refs/heads/master Commit: 38941053b7fdbbc0f84d6dbe35c95c70b7fcaeb6 Parents: 3791e12 Author: Claus Ibsen <davscl...@apache.org> Authored: Thu Aug 18 11:27:31 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Aug 18 11:27:31 2016 +0200 ---------------------------------------------------------------------- docs/user-manual/en/SUMMARY.md | 108 +++++--- .../maven/packaging/PrepareUserGuideMojo.java | 252 ++++++++++++++++++- .../maven/packaging/ReadmeComponentMojo.java | 2 + 3 files changed, 329 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/38941053/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index f595706..749cfc9 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -303,37 +303,87 @@ +<!-- dataformats: START --> +* Data Formats + * [Avro](avro-dataformat.adoc) + * [Barcode](barcode-dataformat.adoc) + * [Base64](base64-dataformat.adoc) + * [BeanIO](beanio-dataformat.adoc) + * [Bindy CSV](bindy-csv-dataformat.adoc) + * [Bindy Fixed Length](bindy-fixed-dataformat.adoc) + * [Bindy Key Value Pair](bindy-kvp-dataformat.adoc) + * [Boon](boon-dataformat.adoc) + * [CSV](csv-dataformat.adoc) + * [Castor](castor-dataformat.adoc) + * [Crypto (Java Cryptographic Extension)](crypto-dataformat.adoc) + * [Flatpack](flatpack-dataformat.adoc) + * [GZip](gzip-dataformat.adoc) + * [HL7](hl7-dataformat.adoc) + * [Hessian](hessian-dataformat.adoc) + * [JAXB](jaxb-dataformat.adoc) + * [JSon GSon](json-gson-dataformat.adoc) + * [JSon Jackson](json-jackson-dataformat.adoc) + * [JSon Johnzon](json-johnzon-dataformat.adoc) + * [JSon XStream](json-xstream-dataformat.adoc) + * [JacksonXML](jacksonxml-dataformat.adoc) + * [Java Object Serialization](serialization-dataformat.adoc) + * [JiBX](jibx-dataformat.adoc) + * [LZF Deflate Compression](lzf-dataformat.adoc) + * [MIME Multipart](mime-multipart-dataformat.adoc) + * [PGP](pgp-dataformat.adoc) + * [Protobuf](protobuf-dataformat.adoc) + * [RSS](rss-dataformat.adoc) + * [SOAP](soapjaxb-dataformat.adoc) + * [String Encoding](string-dataformat.adoc) + * [Syslog](syslog-dataformat.adoc) + * [Tar File](tarfile-dataformat.adoc) + * [TidyMarkup](tidyMarkup-dataformat.adoc) + * [XML Beans](xmlBeans-dataformat.adoc) + * [XML JSon](xmljson-dataformat.adoc) + * [XML RPC](xmlrpc-dataformat.adoc) + * [XML Security](secureXML-dataformat.adoc) + * [XStream](xstream-dataformat.adoc) + * [YAML SnakeYAML](yaml-snakeyaml-dataformat.adoc) + * [Zip Deflate Compression](zip-dataformat.adoc) + * [Zip File](zipfile-dataformat.adoc) + * [iCal](ical-dataformat.adoc) + * [uniVocity CSV](univocity-csv-dataformat.adoc) + * [uniVocity Fixed Length](univocity-fixed-dataformat.adoc) + * [uniVocity TSV](univocity-tsv-dataformat.adoc) +<!-- dataformats: END --> + + + + +<!-- languages: START --> +* Expression Languages + * [Bean method](bean-language.adoc) + * [Constant](constant-language.adoc) + * [EL](el-language.adoc) + * [ExchangeProperty](exchangeProperty-language.adoc) + * [File](file-language.adoc) + * [Groovy](groovy-language.adoc) + * [HL7 Terser](terser-language.adoc) + * [Header](header-language.adoc) + * [JSonPath](jsonpath-language.adoc) + * [JXPath](jxpath-language.adoc) + * [JavaScript](javaScript-language.adoc) + * [MVEL](mvel-language.adoc) + * [OGNL](ognl-language.adoc) + * [PHP](php-language.adoc) + * [Python](python-language.adoc) + * [Ref](ref-language.adoc) + * [Ruby](ruby-language.adoc) + * [SQL](sql-language.adoc) + * [Simple](simple-language.adoc) + * [SpEL](spel-language.adoc) + * [Tokenize](tokenize-language.adoc) + * [XML Tokenize](xtokenize-language.adoc) + * [XPath](xpath-language.adoc) + * [XQuery](xquery-language.adoc) +<!-- languages: END --> -* [Expression Languages](languages.adoc) - * [Bean Language](bean-language.adoc) - * [Constant](constant.adoc) - * [EL](juel.adoc) - * [Jsonpath](jsonpath.adoc) - * [JXPath](jxpath.adoc) - * [Ognl](ognl.adoc) - * [Ruby](ruby.adoc) - * [SQL](josql.adoc) - * [Scripting languages](scripting-languages.adoc) -* Data Formats - * [BeanIO](beanio-dataformat.adoc) - * [Flatpack](flatpack-dataformat-dataformat.adoc) - * [Ical](ical-dataformat.adoc) - * [Jackson XML](jackson-xml-dataformat.adoc) - * [Jaxb](jaxb-dataformat.adoc) - * [Jibx](jibx-dataformat.adoc) - * [Johnzon](johnzon-dataformat.adoc) - * [Lzf](lzf-dataformat.adoc) - * [Syslog](syslog-dataformat.adoc) - * [SOAP](soap-dataformat.adoc) - * [Tagsoup](tagsoup-dataformat.adoc) - * [Univocity Parsers](univocity-parsers-dataformat.adoc) - * [XML Beans](xmlbeans-dataformat.adoc) - * [XML JSON](xmljson-dataformat.adoc) - * [XML Rpc](xmlrpc-dataformat.adoc) - * [XStream](xstream-dataformat.adoc) - * [YAML](yaml-dataformat.adoc) - * [Zipfile](zipfile-dataformat.adoc) * Example * [BAM Example](bam-example.adoc) http://git-wip-us.apache.org/repos/asf/camel/blob/38941053/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java index 1b27084..98dd7be 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java @@ -27,14 +27,21 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; +import javax.xml.crypto.Data; + import edu.emory.mathcs.backport.java.util.Collections; import org.apache.camel.maven.packaging.model.ComponentModel; +import org.apache.camel.maven.packaging.model.DataFormatModel; +import org.apache.camel.maven.packaging.model.DataFormatOptionModel; +import org.apache.camel.maven.packaging.model.LanguageModel; +import org.apache.camel.maven.packaging.model.LanguageOptionModel; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; +import static org.apache.camel.maven.packaging.JSonSchemaHelper.getSafeValue; import static org.apache.camel.maven.packaging.PackageHelper.loadText; import static org.apache.camel.maven.packaging.PackageHelper.writeText; @@ -62,6 +69,20 @@ public class PrepareUserGuideMojo extends AbstractMojo { protected File componentsDir; /** + * The directory for data formats catalog + * + * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/dataformats" + */ + protected File dataFormatsDir; + + /** + * The directory for languages catalog + * + * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/languages" + */ + protected File languagesDir; + + /** * The directory for the user guide * * @parameter default-value="${project.directory}/../../../docs/user-manual/en" @@ -85,10 +106,12 @@ public class PrepareUserGuideMojo extends AbstractMojo { */ public void execute() throws MojoExecutionException, MojoFailureException { executeComponents(); + executeDataFormats(); + executeLanguages(); } protected void executeComponents() throws MojoExecutionException, MojoFailureException { - Set<File> componentFiles = new TreeSet<File>(); + Set<File> componentFiles = new TreeSet<>(); if (componentsDir != null && componentsDir.isDirectory()) { File[] files = componentsDir.listFiles(); @@ -99,8 +122,8 @@ public class PrepareUserGuideMojo extends AbstractMojo { try { List<ComponentModel> models = new ArrayList<>(); - for (File core : componentFiles) { - String json = loadText(new FileInputStream(core)); + for (File file : componentFiles) { + String json = loadText(new FileInputStream(file)); ComponentModel model = generateComponentModel(json); // filter out alternative schemas which reuses documentation @@ -155,6 +178,96 @@ public class PrepareUserGuideMojo extends AbstractMojo { } } + protected void executeDataFormats() throws MojoExecutionException, MojoFailureException { + Set<File> dataFormatFiles = new TreeSet<>(); + + if (dataFormatsDir != null && dataFormatsDir.isDirectory()) { + File[] files = dataFormatsDir.listFiles(); + if (files != null) { + dataFormatFiles.addAll(Arrays.asList(files)); + } + } + + try { + List<DataFormatModel> models = new ArrayList<>(); + for (File file : dataFormatFiles) { + String json = loadText(new FileInputStream(file)); + DataFormatModel model = generateDataFormatModel(json); + models.add(model); + } + + // sor the models + Collections.sort(models, new DataFormatComparator()); + + // the summary file has the TOC + File file = new File(userGuideDir, "SUMMARY.md"); + + // TODO: some dataformats reuse docs, such as bindy etc. + + // update data formats + StringBuilder dataFormats = new StringBuilder(); + dataFormats.append("* Data Formats\n"); + for (DataFormatModel model : models) { + String line = "\t* " + link(model) + "\n"; + dataFormats.append(line); + } + boolean updated = updateDataFormats(file, dataFormats.toString()); + + if (updated) { + getLog().info("Updated user guide file: " + file); + } else { + getLog().debug("No changes to user guide file: " + file); + } + + } catch (IOException e) { + throw new MojoFailureException("Error due " + e.getMessage(), e); + } + } + + protected void executeLanguages() throws MojoExecutionException, MojoFailureException { + Set<File> languageFiles = new TreeSet<>(); + + if (languagesDir != null && languagesDir.isDirectory()) { + File[] files = languagesDir.listFiles(); + if (files != null) { + languageFiles.addAll(Arrays.asList(files)); + } + } + + try { + List<LanguageModel> models = new ArrayList<>(); + for (File file : languageFiles) { + String json = loadText(new FileInputStream(file)); + LanguageModel model = generateLanguageModel(json); + models.add(model); + } + + // sor the models + Collections.sort(models, new LanguageComparator()); + + // the summary file has the TOC + File file = new File(userGuideDir, "SUMMARY.md"); + + // update languages + StringBuilder languages = new StringBuilder(); + languages.append("* Expression Languages\n"); + for (LanguageModel model : models) { + String line = "\t* " + link(model) + "\n"; + languages.append(line); + } + boolean updated = updateLanguages(file, languages.toString()); + + if (updated) { + getLog().info("Updated user guide file: " + file); + } else { + getLog().debug("No changes to user guide file: " + file); + } + + } catch (IOException e) { + throw new MojoFailureException("Error due " + e.getMessage(), e); + } + } + private boolean updateCoreComponents(File file, String changed) throws MojoExecutionException { if (!file.exists()) { return false; @@ -223,15 +336,109 @@ public class PrepareUserGuideMojo extends AbstractMojo { } } + private boolean updateDataFormats(File file, String changed) throws MojoExecutionException { + if (!file.exists()) { + return false; + } + + try { + String text = loadText(new FileInputStream(file)); + + String existing = StringHelper.between(text, "<!-- dataformats: START -->" , "<!-- dataformats: END -->"); + if (existing != null) { + // remove leading line breaks etc + existing = existing.trim(); + changed = changed.trim(); + if (existing.equals(changed)) { + return false; + } else { + String before = StringHelper.before(text, "<!-- dataformats: START -->"); + String after = StringHelper.after(text, "<!-- dataformats: END -->"); + text = before + "\n<!-- dataformats: START -->\n" + changed + "\n<!-- dataformats: END -->\n" + after; + writeText(file, text); + return true; + } + } else { + getLog().warn("Cannot find markers in file " + file); + getLog().warn("Add the following markers"); + getLog().warn("\t<!-- dataformats: START -->"); + getLog().warn("\t<!-- dataformats: END -->"); + return false; + } + } catch (Exception e) { + throw new MojoExecutionException("Error reading file " + file + " Reason: " + e, e); + } + } + + private boolean updateLanguages(File file, String changed) throws MojoExecutionException { + if (!file.exists()) { + return false; + } + + try { + String text = loadText(new FileInputStream(file)); + + String existing = StringHelper.between(text, "<!-- languages: START -->" , "<!-- languages: END -->"); + if (existing != null) { + // remove leading line breaks etc + existing = existing.trim(); + changed = changed.trim(); + if (existing.equals(changed)) { + return false; + } else { + String before = StringHelper.before(text, "<!-- languages: START -->"); + String after = StringHelper.after(text, "<!-- languages: END -->"); + text = before + "\n<!-- languages: START -->\n" + changed + "\n<!-- languages: END -->\n" + after; + writeText(file, text); + return true; + } + } else { + getLog().warn("Cannot find markers in file " + file); + getLog().warn("Add the following markers"); + getLog().warn("\t<!-- languages: START -->"); + getLog().warn("\t<!-- languages: END -->"); + return false; + } + } catch (Exception e) { + throw new MojoExecutionException("Error reading file " + file + " Reason: " + e, e); + } + } + private static String link(ComponentModel model) { return "[" + model.getTitle() + "](" + model.getScheme() + "-component.adoc)"; } + private static String link(DataFormatModel model) { + return "[" + model.getTitle() + "](" + model.getName() + "-dataformat.adoc)"; + } + + private static String link(LanguageModel model) { + return "[" + model.getTitle() + "](" + model.getName() + "-language.adoc)"; + } + private static class ComponentComparator implements Comparator<ComponentModel> { @Override public int compare(ComponentModel o1, ComponentModel o2) { - // lets sory by title + // lets sort by title + return o1.getTitle().compareTo(o2.getTitle()); + } + } + + private static class DataFormatComparator implements Comparator<DataFormatModel> { + + @Override + public int compare(DataFormatModel o1, DataFormatModel o2) { + // lets sort by title + return o1.getTitle().compareTo(o2.getTitle()); + } + } + + private static class LanguageComparator implements Comparator<LanguageModel> { + + @Override + public int compare(LanguageModel o1, LanguageModel o2) { + // lets sort by title return o1.getTitle().compareTo(o2.getTitle()); } } @@ -258,4 +465,41 @@ public class PrepareUserGuideMojo extends AbstractMojo { return component; } + private DataFormatModel generateDataFormatModel(String json) { + List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false); + + DataFormatModel dataFormat = new DataFormatModel(); + dataFormat.setName(JSonSchemaHelper.getSafeValue("name", rows)); + dataFormat.setTitle(JSonSchemaHelper.getSafeValue("title", rows)); + dataFormat.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows)); + dataFormat.setDescription(JSonSchemaHelper.getSafeValue("description", rows)); + dataFormat.setLabel(JSonSchemaHelper.getSafeValue("label", rows)); + dataFormat.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows)); + dataFormat.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows)); + dataFormat.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows)); + dataFormat.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows)); + dataFormat.setVersion(JSonSchemaHelper.getSafeValue("version", rows)); + + return dataFormat; + } + + private LanguageModel generateLanguageModel(String json) { + List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false); + + LanguageModel language = new LanguageModel(); + language.setTitle(JSonSchemaHelper.getSafeValue("title", rows)); + language.setName(JSonSchemaHelper.getSafeValue("name", rows)); + language.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows)); + language.setDescription(JSonSchemaHelper.getSafeValue("description", rows)); + language.setLabel(JSonSchemaHelper.getSafeValue("label", rows)); + language.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows)); + language.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows)); + language.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows)); + language.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows)); + language.setVersion(JSonSchemaHelper.getSafeValue("version", rows)); + + return language; + } + + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/38941053/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ReadmeComponentMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ReadmeComponentMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ReadmeComponentMojo.java index b94ba77..5881522 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ReadmeComponentMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ReadmeComponentMojo.java @@ -460,6 +460,7 @@ public class ReadmeComponentMojo extends AbstractMojo { DataFormatModel dataFormat = new DataFormatModel(); dataFormat.setTitle(JSonSchemaHelper.getSafeValue("title", rows)); dataFormat.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows)); + dataFormat.setName(JSonSchemaHelper.getSafeValue("name", rows)); dataFormat.setDescription(JSonSchemaHelper.getSafeValue("description", rows)); dataFormat.setLabel(JSonSchemaHelper.getSafeValue("label", rows)); dataFormat.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows)); @@ -497,6 +498,7 @@ public class ReadmeComponentMojo extends AbstractMojo { LanguageModel language = new LanguageModel(); language.setTitle(JSonSchemaHelper.getSafeValue("title", rows)); language.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows)); + language.setName(JSonSchemaHelper.getSafeValue("name", rows)); language.setDescription(JSonSchemaHelper.getSafeValue("description", rows)); language.setLabel(JSonSchemaHelper.getSafeValue("label", rows)); language.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));