<!--
  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.18-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>
