<!--

    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.

-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-parent</artifactId>
    <version>2.21.0-SNAPSHOT</version>
    <relativePath>../parent</relativePath>
  </parent>

   <artifactId>camel-website</artifactId>
   <packaging>jar</packaging>
   <name>Camel Website</name>

   <build>
      <plugins>
         <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <version>0.0.27</version>
            <executions>
               <execution>
                  <id>install node and npm</id>
                  <goals>
                     <goal>install-node-and-npm</goal>
                  </goals>
                  <phase>generate-sources</phase>
                  <configuration>
                     <nodeVersion>v0.10.32</nodeVersion>
                     <npmVersion>1.4.12</npmVersion>
                  </configuration>
               </execution>
               <execution>
                  <id>npm install</id>
                  <goals>
                     <goal>npm</goal>
                  </goals>
                  <phase>generate-sources</phase>
                  <configuration>
                     <arguments>install</arguments>
                  </configuration>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.6</version>
            <executions>
               <execution>
                  <phase>generate-sources</phase>
                  <configuration>
                     <target>
                        <condition property="gitbook.cmd" 
                                   value="${basedir}/node_modules/.bin/gitbook.cmd" 
                                   else="${basedir}/node_modules/.bin/gitbook">
                           <os family="windows" />
                        </condition>

                        <!-- lets generate the gitbook -->
                        <mkdir dir="${basedir}/target/docs/user-manual" />
                        <copy todir="${basedir}/target/docs/user-manual" >
                          <fileset dir="${basedir}/../docs/user-manual/en"/>
                        </copy>
                        <copy todir="${basedir}/target/docs/user-manual" flatten="true">
                          <fileset dir="{basedir}/../../components">
                            <include name="**/src/main/docs/**"/>
                          </fileset>
                          <fileset dir="{basedir}/../../camel-core">
                            <include name="**/src/main/docs/**"/>
                          </fileset>
                        </copy>

                        <mkdir dir="${basedir}/target/classes/user-manual" />
                        <echo>executing ${gitbook.cmd}</echo>
                        <exec executable="${gitbook.cmd}">
                           <arg value="build" />
                           <arg value="${basedir}/target/docs/user-manual" />
                           <arg value="${basedir}/target/classes/user-manual" />
                        </exec>

                        <condition property="grunt.cmd" 
                                   value="${basedir}/node_modules/.bin/grunt.cmd" 
                                   else="${basedir}/node_modules/.bin/grunt">
                           <os family="windows" />
                        </condition>
                        <echo>executing ${grunt.cmd}</echo>
                        <exec executable="${grunt.cmd}" failonerror="false"/>

                     </target>
                  </configuration>
                  <goals>
                     <goal>run</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
</project>
