<?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.3-incubating</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-shiro</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-ste should have been executed')
                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 + '](./' + it.name.replace('.md', '.html') + ')')
                  }
                }
                ]]>
                </source>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>