<?xml version="1.0" encoding="UTF-8"?>
<!--
  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/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>batchee-extensions</artifactId>
    <groupId>org.apache.batchee</groupId>
    <version>0.6</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>extension-doc-helper</artifactId>
  <name>BatchEE :: Extensions :: Doc Helper</name>
  <description>Just a module to generate index.html for the generate doc, only used for ordering</description>

  <dependencies>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-beanio</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-camel</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-cdi</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-commons-csv</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-extras</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-groovy</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-hazelcast</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-jackson</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-jsefa</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-modelmapper</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.batchee</groupId>
      <artifactId>batchee-jsonp</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>

      <plugin> <!-- note: this execution needs pre-site to have been executed on extensions/ first -->
        <groupId>org.codehaus.gmaven</groupId>
        <artifactId>groovy-maven-plugin</artifactId>
        <version>2.0</version>
        <inherited>false</inherited>
        <executions>
          <execution>
            <phase>pre-site</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <source>
                <![CDATA[
                def generatedFolder = new File(project.parent.parent.basedir, 'src/site/markdown/batchee-site-generated')
                if (!generatedFolder.isDirectory()) throw new IllegalStateException('no generated doc, extensions pre-site should have been executed, no: ' + generatedFolder)
                new File(generatedFolder, 'index.md').withWriter { w ->
                  w.println('# Generated Extensions Documentation\n')

                  generatedFolder.listFiles(new FilenameFilter() {
                    boolean accept(File dir, String name) {
                      return name.endsWith('md')
                    }
                  }).sort(true) { f1, f2 -> f1.name.compareTo(f2.name) }.each {
                    if (it.name == 'index.md') return
                    w.println('* [' + it.name.replace('.md', '').replace('batchee-', '').capitalize() + '](./' + it.name.replace('.md', '.html') + ')')
                  }
                }
                ]]>
                </source>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
