Repository: camel Updated Branches: refs/heads/master 9bbdb5b50 -> 38941053b
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/3791e125 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3791e125 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3791e125 Branch: refs/heads/master Commit: 3791e1250a8e0d392c945330faf6b40dd75adbf7 Parents: 9bbdb5b Author: Claus Ibsen <davscl...@apache.org> Authored: Thu Aug 18 11:12:25 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Aug 18 11:12:25 2016 +0200 ---------------------------------------------------------------------- docs/user-manual/en/SUMMARY.md | 456 +++++++++---------- platforms/catalog/pom.xml | 2 + .../maven/packaging/PrepareUserGuideMojo.java | 261 +++++++++++ 3 files changed, 481 insertions(+), 238 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/3791e125/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index 687f548..f595706 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -82,247 +82,227 @@ * Using Camel questions * [How do I configure endpoints](how-do-i-configure-endpoints.adoc) + + +<!-- core components: START --> * Core Components - * [Bean](bean-component.adoc) - * [Binding](binding-component.adoc) - * [Browse](browse-component.adoc) - * [Class](class-component.adoc) - * [Controlbus](controlbus-component.adoc) - * [Dataformat](dataformat-component.adoc) - * [Dataset](dataset-component.adoc) - * [Direct](direct-component.adoc) - * [Direct-vm](direct-vm-component.adoc) - * [File](file-component.adoc) - * [Language](language-component.adoc) - * [Log](log-component.adoc) - * [Mock](mock-component.adoc) - * [Properties](properties-component.adoc) - * [Ref](ref-component.adoc) - * [Rest](rest-component.adoc) - * [Rest API](rest-api-component.adoc) - * [Scheduler](scheduler-component.adoc) - * [Seda](seda-component.adoc) - * [Stub](stub-component.adoc) - * [Test](test-component.adoc) - * [Timer](timer-component.adoc) - * [Validator](validator-component.adoc) - * [VM](vm-component.adoc) - * [Xslt](xslt-component.adoc) + * [Bean](bean-component.adoc) + * [Binding](binding-component.adoc) + * [Browse](browse-component.adoc) + * [Class](class-component.adoc) + * [Control Bus](controlbus-component.adoc) + * [Data Format](dataformat-component.adoc) + * [Dataset](dataset-component.adoc) + * [Direct](direct-component.adoc) + * [Direct VM](direct-vm-component.adoc) + * [File](file-component.adoc) + * [Language](language-component.adoc) + * [Log](log-component.adoc) + * [Mock](mock-component.adoc) + * [Properties](properties-component.adoc) + * [REST](rest-component.adoc) + * [REST API](rest-api-component.adoc) + * [Ref](ref-component.adoc) + * [SEDA](seda-component.adoc) + * [Scheduler](scheduler-component.adoc) + * [Stub](stub-component.adoc) + * [Test](test-component.adoc) + * [Timer](timer-component.adoc) + * [VM](vm-component.adoc) + * [Validator](validator-component.adoc) + * [XSLT](xslt-component.adoc) +<!-- core components: END --> + + + + + +<!-- components: START --> * Components - * [Async Http Client (AHC)](ahc-component.adoc) - * [AHC Websocket (AHC-WS)](ahc-ws-component.adoc) - * [Amqp](amqp-component.adoc) - * [Apns](apns-component.adoc) - * [Atmosphere Websocket](atmosphere-websocket-component.adoc) - * [Atmos](atmos-component.adoc) - * [Atom](atom-component.adoc) - * [Avro](avro-component.adoc) - * [AWS](aws-component.adoc) - * [AWS CloudWatch](aws-cw-component.adoc) - * [AWS DynamoDB](aws-ddb-component.adoc) - * [AWS DynamoDB Streams](aws-ddbstream-component.adoc) - * [AWS EC2](aws-ec2-component.adoc) - * [AWS Kinesis](aws-kinesis-component.adoc) - * [AWS S3](aws-s3-component.adoc) - * [AWS SDB](aws-sdb-component.adoc) - * [AWS SES](aws-ses-component.adoc) - * [AWS SNS](aws-sns-component.adoc) - * [AWS SQS](aws-sqs-component.adoc) - * [AWS SWF](aws-swf-component.adoc) - * [Bam](bam.adoc) - * [Barcode](barcode-data-format-component.adoc) - * [Base64](base64-component.adoc) - * [Beanstalk](beanstalk-component.adoc) - * [Bean-validator](bean-validator-component.adoc) - * [Bindy](bindy-component.adoc) - * [Blueprint](blueprint-testing-component.adoc) - * [Boon](boon-component.adoc) - * [Box](box-component.adoc) - * [Braintree](braintree-component.adoc) - * [Cache](cache-component.adoc) - * [Cassandraql](cql-component.adoc) - * [Castor](castor-component.adoc) - * [CDI](cdi.adoc) - * [Chunk](chunk-component.adoc) - * [Cmis](cmis-component.adoc) - * [CM SMS](cm-sms-component.adoc) - * [CoAP](coap-component.adoc) - * [Cometd](cometd-component.adoc) - * [Context](context-component.adoc) - * [Couchdb](couchdb-component.adoc) - * [Crypto](crypto-component.adoc) - * [Crypto Digital Signatures](crypto-digital-signatures.adoc) - * [CSV](csv.adoc) - * [CXF](cxf-component.adoc) - * [CXFRS](cxfrs-component.adoc) - * [CXF Transport](cxf-transport.adoc) - * [Disruptor](disruptor-component.adoc) - * [DNS](dns-component.adoc) - * [Docker](docker-component.adoc) - * [Dozer](dozer-component.adoc) - * [Dropbox](dropbox-component.adoc) - * [Eclipse](eclipse.adoc) - * [Ehcache](ehcache-component.adoc) - * [EJB](ejb-component.adoc) - * [ElasticSearch](elasticsearch-component.adoc) - * [Elsql](elsql-component.adoc) - * [Eventadmin](eventadmin-component.adoc) - * [Exec](exec-component.adoc) - * [Facebook](facebook-component.adoc) - * [Flatpack](flatpack-component.adoc) - * [FOP](fop-component.adoc) - * [Freemarker](freemarker-component.adoc) - * [FTP](ftp-component.adoc) - * [Ganglia](ganglia-component.adoc) - * [Geocoder](geocoder-component.adoc) - * [Git](git-component.adoc) - * [Github](github-component.adoc) - * [Google Calendar](google-calendar-component.adoc) - * [Google Drive](google-drive-component.adoc) - * [Google Mail](google-mail-component.adoc) - * [Gora](gora-component.adoc) - * [Grape](grape-component.adoc) - * [Groovy](groovy.adoc) - * [Groovy DSL](groovy-dsl.adoc) - * [Gson](gson.adoc) - * [Guava Eventbus](guava-eventbus-component.adoc) - * [Guice](guice.adoc) - * [Hawtdb](hawtdb.adoc) - * [Hazelcast](hazelcast-component.adoc) - * [Hbase](hbase-component.adoc) - * [HDFS](hdfs-component.adoc) - * [HDFS2](hdfs2-component.adoc) - * [Hessian](hessian.adoc) - * [Hipchat](hipchat-component.adoc) - * [HL7](hl7.adoc) - * [Http](http-component.adoc) - * [Http4](http4-component.adoc) - * [Ibatis](ibatis-component.adoc) - * [Infinispan](infinispan-component.adoc) - * [IRC](irc-component.adoc) - * [Ironmq](ironmq-component.adoc) - * [Jackson](jackson.adoc) - * [Jasypt](jasypt.adoc) - * [Javaspace](javaspace-component.adoc) - * [JMS](jms-component.adoc) - * [JMX](jmx-component.adoc) - * [JSON](json.adoc) - * [Jbpm](jbpm-component.adoc) - * [Jcache](jcache-component.adoc) - * [Jclouds](jclouds-component.adoc) - * [Jcr](jcr-component.adoc) - * [JDBC](jdbc-component.adoc) - * [Jetty](jetty-component.adoc) - * [Jgroups](jgroups-component.adoc) - * [Jing](jing-component.adoc) - * [JIRA](jira-component.adoc) - * [Jolt](jolt-component.adoc) - * [Jpa](jpa-component.adoc) - * [JT400](jt400-component.adoc) - * [Kafka](kafka-component.adoc) - * [Kestrel](kestrel-component.adoc) - * [Krati](krati-component.adoc) - * [Kubernetes](kubernetes-component.adoc) - * [Kura](kura-component.adoc) - * [LDAP](ldap-component.adoc) - * [LevelDB](leveldb.adoc) - * [Linkedin](linkedin-component.adoc) - * [Lucene](lucene-component.adoc) - * [Lumberjack](lumberjack-component.adoc) - * [Mail](mail.adoc) - * [IMAP](imap-component.adoc) - * [IMAPs](imaps-component.adoc) - * [POP3](pop3-component.adoc) - * [POP3s](pop3s-component.adoc) - * [SMTP](smtp-component.adoc) - * [SMTPs](smtps-component.adoc) - * [Metrics](metrics.adoc) - * [Mina](mina-component.adoc) - * [Mina2](mina2-component.adoc) - * [MLLP](mllp.adoc) - * [MongoDB](mongodb-component.adoc) - * [MongoDB-GridFS](gridfs-component.adoc) - * [MQTT](mqtt-component.adoc) - * [Msv](msv-component.adoc) - * [Mustache](mustache-component.adoc) - * [Mvel](mvel-component.adoc) - * [Mybatis](mybatis-component.adoc) - * [Nagios](nagios-component.adoc) - * [Netty](netty-component.adoc) - * [Netty4](netty4-component.adoc) - * [Netty HTTP](netty-http-component.adoc) - * [Netty4 HTTP](netty4-http-component.adoc) - * [NATS](nats-component.adoc) - * [Olingo2](olingo2-component.adoc) - * [Openshift](openshift-component.adoc) - * [Optaplanner](optaplanner-component.adoc) - * [Paho](paho-component.adoc) - * [Paxlogging](paxlogging-component.adoc) - * [PDF](pdf-component.adoc) - * [PGEvent](pgevent-component.adoc) - * [Printer](lpr-component.adoc) - * [Quartz](quartz-component.adoc) - * [Quartz2](quartz2-component.adoc) - * [Quickfix](quickfix-component.adoc) - * [RabbitMQ](rabbitmq-component.adoc) - * [Restlet](restlet-component.adoc) - * [RMI](rmi-component.adoc) - * [Routebox](routebox-component.adoc) - * [RSS](rss-component.adoc) - * [Salesforce](salesforce-component.adoc) - * [SAP NetWeaver](sap-netweaver-component.adoc) - * [Saxon](xquery.adoc) - * [Scp](scp-component.adoc) - * [Schematron](schematron-component.adoc) - * [SCR](camel-and-scr.adoc) - * [Script](script.adoc) - * [Servicenow](servicenow-component.adoc) - * [Servlet](servlet-component.adoc) - * [Servlet Listener](servletlistener.adoc) - * [Shiro](shiro-security.adoc) - * [SIP](sip-component.adoc) - * [SJMS](sjms-component.adoc) - * [SJMS Batch](sjms-batch-component.adoc) - * [Slack](slack-component.adoc) - * [SMPP](smpp-component.adoc) - * [SNMP](snmp-component.adoc) - * [Solr](solr-component.adoc) - * [Spark](spark-component.adoc) - * [Spark-Rest](spark-rest-component.adoc) - * [Splunk](splunk-component.adoc) - * [Spring](spring.adoc) - * [Spring-Batch](spring-batch-component.adoc) - * [Spring-Boot](spring-boot.adoc) - * [Spring-Event](spring-event-component.adoc) - * [Spring-Integration](spring-integration-component.adoc) - * [Spring-Javaconfig](spring-java-config.adoc) - * [Spring-Ldap](spring-ldap-component.adoc) - * [Spring-Redis](spring-redis-component.adoc) - * [Spring-Security](spring-security.adoc) - * [Spring-Web-Services](spring-ws-component.adoc) - * [SQL](sql-component.adoc) - * [SQL-Stored](sql-stored-component.adoc) - * [SSH](ssh-component.adoc) - * [StAX](stax-component.adoc) - * [Stomp](stomp-component.adoc) - * [Stream](stream-component.adoc) - * [Stringtemplate](string-template.adoc) - * [Swagger](swagger.adoc) - * [Swagger Java](swagger-java.adoc) - * [Telegram](telegram-component.adoc) - * [Twitter](twitter-component.adoc) - * [Undertow](undertow-component.adoc) - * [URLRewrite](urlrewrite.adoc) - * [Velocity](velocity-component.adoc) - * [Vertx](vertx-component.adoc) - * [Weather](weather-component.adoc) - * [Websocket](websocket-component.adoc) - * [XML Security](xmlsecurity-component.adoc) - * [XMPP](xmpp-component.adoc) - * [Yammer](yammer-component.adoc) - * [Zipkin](zipkin.adoc) - * [ZooKeeper](zookeeper-component.adoc) + * [AHC](ahc-component.adoc) + * [AHC Websocket](ahc-ws-component.adoc) + * [AMQP](amqp-component.adoc) + * [APNS](apns-component.adoc) + * [AWS CloudWatch](aws-cw-component.adoc) + * [AWS DynamoDB](aws-ddb-component.adoc) + * [AWS DynamoDB Streams](aws-ddbstream-component.adoc) + * [AWS EC2](aws-ec2-component.adoc) + * [AWS Kinesis](aws-kinesis-component.adoc) + * [AWS S3 Storage Service](aws-s3-component.adoc) + * [AWS Simple Email Service](aws-ses-component.adoc) + * [AWS Simple Notification System](aws-sns-component.adoc) + * [AWS Simple Queue Service](aws-sqs-component.adoc) + * [AWS Simple Workflow](aws-swf-component.adoc) + * [AWS SimpleDB](aws-sdb-component.adoc) + * [Apache Flink](flink-component.adoc) + * [Apache Spark](spark-component.adoc) + * [Atmos](atmos-component.adoc) + * [Atmosphere Websocket](atmosphere-websocket-component.adoc) + * [Atom](atom-component.adoc) + * [Avro](avro-component.adoc) + * [Bean Validator](bean-validator-component.adoc) + * [Beanstalk](beanstalk-component.adoc) + * [Box](box-component.adoc) + * [Braintree](braintree-component.adoc) + * [CM SMS Gateway](cm-sms-component.adoc) + * [CMIS](cmis-component.adoc) + * [CXF](cxf-component.adoc) + * [CXF-RS](cxfrs-component.adoc) + * [Camel Context](context-component.adoc) + * [Cassandra CQL](cql-component.adoc) + * [Chronicle Engine](chronicle-engine-component.adoc) + * [Chunk](chunk-component.adoc) + * [CoAP](coap-component.adoc) + * [CometD](cometd-component.adoc) + * [Consul](consul-component.adoc) + * [CouchDB](couchdb-component.adoc) + * [Crypto (JCE)](crypto-component.adoc) + * [DNS](dns-component.adoc) + * [Disruptor](disruptor-component.adoc) + * [Docker](docker-component.adoc) + * [Dozer](dozer-component.adoc) + * [Dropbox](dropbox-component.adoc) + * [EHCache](cache-component.adoc) + * [EJB](ejb-component.adoc) + * [Ehcache](ehcache-component.adoc) + * [ElSQL](elsql-component.adoc) + * [Elasticsearch](elasticsearch-component.adoc) + * [Exec](exec-component.adoc) + * [FOP](fop-component.adoc) + * [FTP](ftp-component.adoc) + * [FTPS](ftps-component.adoc) + * [Facebook](facebook-component.adoc) + * [Flatpack](flatpack-component.adoc) + * [Freemarker](freemarker-component.adoc) + * [Ganglia](ganglia-component.adoc) + * [Geocoder](geocoder-component.adoc) + * [Git](git-component.adoc) + * [GitHub](github-component.adoc) + * [Google Calendar](google-calendar-component.adoc) + * [Google Drive](google-drive-component.adoc) + * [Google Mail](google-mail-component.adoc) + * [Gora](gora-component.adoc) + * [Grape](grape-component.adoc) + * [Guava EventBus](guava-eventbus-component.adoc) + * [HBase](hbase-component.adoc) + * [HDFS](hdfs-component.adoc) + * [HDFS2](hdfs2-component.adoc) + * [HTTP](http-component.adoc) + * [HTTP4](http4-component.adoc) + * [Hazelcast](hazelcast-component.adoc) + * [Hipchat](hipchat-component.adoc) + * [IMAP](imap-component.adoc) + * [IRC](irc-component.adoc) + * [Infinispan](infinispan-component.adoc) + * [InfluxDB](influxdb-component.adoc) + * [JBPM](jbpm-component.adoc) + * [JCR](jcr-component.adoc) + * [JCache](jcache-component.adoc) + * [JClouds](jclouds-component.adoc) + * [JDBC](jdbc-component.adoc) + * [JGroups](jgroups-component.adoc) + * [JIRA](jira-component.adoc) + * [JMS](jms-component.adoc) + * [JMX](jmx-component.adoc) + * [JOLT](jolt-component.adoc) + * [JPA](jpa-component.adoc) + * [JT400](jt400-component.adoc) + * [JavaSpace](javaspace-component.adoc) + * [Jetty 9](jetty-component.adoc) + * [Jetty Websocket](websocket-component.adoc) + * [Jing](jing-component.adoc) + * [Kafka](kafka-component.adoc) + * [Kestrel](kestrel-component.adoc) + * [Krati](krati-component.adoc) + * [Kubernetes](kubernetes-component.adoc) + * [LDAP](ldap-component.adoc) + * [Linkedin](linkedin-component.adoc) + * [Lucene](lucene-component.adoc) + * [Lumberjack](lumberjack-component.adoc) + * [MQTT](mqtt-component.adoc) + * [MSV](msv-component.adoc) + * [MVEL](mvel-component.adoc) + * [Metrics](metrics-component.adoc) + * [Mina](mina-component.adoc) + * [Mina2](mina2-component.adoc) + * [MongoDB](mongodb-component.adoc) + * [MongoDBGridFS](gridfs-component.adoc) + * [Mustache](mustache-component.adoc) + * [MyBatis](mybatis-component.adoc) + * [Nagios](nagios-component.adoc) + * [Nats](nats-component.adoc) + * [Netty](netty-component.adoc) + * [Netty HTTP](netty-http-component.adoc) + * [Netty4](netty4-component.adoc) + * [Netty4 HTTP](netty4-http-component.adoc) + * [OSGi EventAdmin](eventadmin-component.adoc) + * [OSGi PAX Logging](paxlogging-component.adoc) + * [OpenShift](openshift-component.adoc) + * [OptaPlanner](optaplanner-component.adoc) + * [PDF](pdf-component.adoc) + * [Paho](paho-component.adoc) + * [PostgresSQL Event](pgevent-component.adoc) + * [Printer](lpr-component.adoc) + * [Quartz](quartz-component.adoc) + * [Quartz2](quartz2-component.adoc) + * [QuickFix](quickfix-component.adoc) + * [RMI](rmi-component.adoc) + * [RSS](rss-component.adoc) + * [RabbitMQ](rabbitmq-component.adoc) + * [Restlet](restlet-component.adoc) + * [RouteBox](routebox-component.adoc) + * [SAP NetWeaver](sap-netweaver-component.adoc) + * [SCP](scp-component.adoc) + * [SFTP](sftp-component.adoc) + * [SIP](sip-component.adoc) + * [SMPP](smpp-component.adoc) + * [SNMP](snmp-component.adoc) + * [SQL](sql-component.adoc) + * [SQL StoredProcedure](sql-stored-component.adoc) + * [SSH](ssh-component.adoc) + * [Salesforce](salesforce-component.adoc) + * [Schematron](schematron-component.adoc) + * [ServiceNow](servicenow-component.adoc) + * [Servlet](servlet-component.adoc) + * [Simple JMS](sjms-component.adoc) + * [Simple JMS Batch](sjms-batch-component.adoc) + * [Slack](slack-component.adoc) + * [Solr](solr-component.adoc) + * [Spark Rest](spark-rest-component.adoc) + * [Splunk](splunk-component.adoc) + * [Spring Batch](spring-batch-component.adoc) + * [Spring Event](spring-event-component.adoc) + * [Spring Integration](spring-integration-component.adoc) + * [Spring LDAP](spring-ldap-component.adoc) + * [Spring Redis](spring-redis-component.adoc) + * [Spring WebService](spring-ws-component.adoc) + * [StAX](stax-component.adoc) + * [Stomp](stomp-component.adoc) + * [Stream](stream-component.adoc) + * [String Template](string-template-component.adoc) + * [Telegram](telegram-component.adoc) + * [Twitter](twitter-component.adoc) + * [Undertow](undertow-component.adoc) + * [Velocity](velocity-component.adoc) + * [Vert.x](vertx-component.adoc) + * [Weather](weather-component.adoc) + * [XML RPC](xmlrpc-component.adoc) + * [XML Security](xmlsecurity-component.adoc) + * [XMPP](xmpp-component.adoc) + * [XQuery](xquery-component.adoc) + * [Yammer](yammer-component.adoc) + * [ZooKeeper](zookeeper-component.adoc) + * [etcd](etcd-component.adoc) + * [iBatis](ibatis-component.adoc) + * [ironmq](ironmq-component.adoc) + * [mllp](mllp-component.adoc) +<!-- components: END --> + + + + + * [Expression Languages](languages.adoc) * [Bean Language](bean-language.adoc) http://git-wip-us.apache.org/repos/asf/camel/blob/3791e125/platforms/catalog/pom.xml ---------------------------------------------------------------------- diff --git a/platforms/catalog/pom.xml b/platforms/catalog/pom.xml index e76cdcb..413cf3b 100644 --- a/platforms/catalog/pom.xml +++ b/platforms/catalog/pom.xml @@ -90,8 +90,10 @@ <version>${project.version}</version> <executions> <execution> + <!-- prepare the catalog before the user guide --> <goals> <goal>prepare-catalog</goal> + <goal>prepare-user-guide</goal> </goals> <phase>process-resources</phase> </execution> http://git-wip-us.apache.org/repos/asf/camel/blob/3791e125/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 new file mode 100644 index 0000000..1b27084 --- /dev/null +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java @@ -0,0 +1,261 @@ +/** + * 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.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import edu.emory.mathcs.backport.java.util.Collections; +import org.apache.camel.maven.packaging.model.ComponentModel; +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.PackageHelper.loadText; +import static org.apache.camel.maven.packaging.PackageHelper.writeText; + +/** + * Prepares the user guide to keep the table of content up to date with the components, data formats, and languages. + * + * @goal prepare-user-guide + */ +public class PrepareUserGuideMojo extends AbstractMojo { + + /** + * The maven project. + * + * @parameter property="project" + * @required + * @readonly + */ + protected MavenProject project; + + /** + * The directory for components catalog + * + * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/components" + */ + protected File componentsDir; + + /** + * The directory for the user guide + * + * @parameter default-value="${project.directory}/../../../docs/user-manual/en" + */ + protected File userGuideDir; + + /** + * Maven ProjectHelper. + * + * @component + * @readonly + */ + private MavenProjectHelper projectHelper; + + /** + * Execute goal. + * + * @throws MojoExecutionException execution of the main class or one of the + * threads it generated failed. + * @throws MojoFailureException something bad happened... + */ + public void execute() throws MojoExecutionException, MojoFailureException { + executeComponents(); + } + + protected void executeComponents() throws MojoExecutionException, MojoFailureException { + Set<File> componentFiles = new TreeSet<File>(); + + if (componentsDir != null && componentsDir.isDirectory()) { + File[] files = componentsDir.listFiles(); + if (files != null) { + componentFiles.addAll(Arrays.asList(files)); + } + } + + try { + List<ComponentModel> models = new ArrayList<>(); + for (File core : componentFiles) { + String json = loadText(new FileInputStream(core)); + ComponentModel model = generateComponentModel(json); + + // filter out alternative schemas which reuses documentation + boolean add = true; + if (!model.getAlternativeSchemes().isEmpty()) { + String first = model.getAlternativeSchemes().split(",")[0]; + if (!model.getScheme().equals(first)) { + add = false; + } + } + if (add) { + models.add(model); + } + } + + // sor the models + Collections.sort(models, new ComponentComparator()); + + // the summary file has the TOC + File file = new File(userGuideDir, "SUMMARY.md"); + + // update core components + StringBuilder core = new StringBuilder(); + core.append("* Core Components\n"); + for (ComponentModel model : models) { + if (model.getLabel().contains("core")) { + String line = "\t* " + link(model) + "\n"; + core.append(line); + } + } + boolean updated = updateCoreComponents(file, core.toString()); + + // update regular components + StringBuilder regular = new StringBuilder(); + regular.append("* Components\n"); + for (ComponentModel model : models) { + if (!model.getLabel().contains("core")) { + String line = "\t* " + link(model) + "\n"; + regular.append(line); + } + } + updated |= updateComponents(file, regular.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; + } + + try { + String text = loadText(new FileInputStream(file)); + + String existing = StringHelper.between(text, "<!-- core components: START -->" , "<!-- core components: 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, "<!-- core components: START -->"); + String after = StringHelper.after(text, "<!-- core components: END -->"); + text = before + "\n<!-- core components: START -->\n" + changed + "\n<!-- core components: 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<!-- core components: START -->"); + getLog().warn("\t<!-- core components: END -->"); + return false; + } + } catch (Exception e) { + throw new MojoExecutionException("Error reading file " + file + " Reason: " + e, e); + } + } + + private boolean updateComponents(File file, String changed) throws MojoExecutionException { + if (!file.exists()) { + return false; + } + + try { + String text = loadText(new FileInputStream(file)); + + String existing = StringHelper.between(text, "<!-- components: START -->" , "<!-- components: 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, "<!-- components: START -->"); + String after = StringHelper.after(text, "<!-- components: END -->"); + text = before + "\n<!-- components: START -->\n" + changed + "\n<!-- components: 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<!-- components: START -->"); + getLog().warn("\t<!-- components: 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 class ComponentComparator implements Comparator<ComponentModel> { + + @Override + public int compare(ComponentModel o1, ComponentModel o2) { + // lets sory by title + return o1.getTitle().compareTo(o2.getTitle()); + } + } + + private ComponentModel generateComponentModel(String json) { + List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false); + + ComponentModel component = new ComponentModel(); + component.setScheme(JSonSchemaHelper.getSafeValue("scheme", rows)); + component.setSyntax(JSonSchemaHelper.getSafeValue("syntax", rows)); + component.setAlternativeSyntax(JSonSchemaHelper.getSafeValue("alternativeSyntax", rows)); + component.setAlternativeSchemes(JSonSchemaHelper.getSafeValue("alternativeSchemes", rows)); + component.setTitle(JSonSchemaHelper.getSafeValue("title", rows)); + component.setDescription(JSonSchemaHelper.getSafeValue("description", rows)); + component.setLabel(JSonSchemaHelper.getSafeValue("label", rows)); + component.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows)); + component.setConsumerOnly(JSonSchemaHelper.getSafeValue("consumerOnly", rows)); + component.setProducerOnly(JSonSchemaHelper.getSafeValue("producerOnly", rows)); + component.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows)); + component.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows)); + component.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows)); + component.setVersion(JSonSchemaHelper.getSafeValue("version", rows)); + + return component; + } + +} \ No newline at end of file