<?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">
  <modelVersion>4.0.0</modelVersion>
  <artifactId>brooklyn-archetype-quickstart</artifactId>
  <packaging>maven-archetype</packaging>
  <name>Brooklyn Quick-Start Project Archetype</name>
  <description>
    This project defines an archetype for creating new projects which consume brooklyn,
    including an example application and an example new entity type,
    able to build an OSGi JAR and a binary assembly, with logging and READMEs.
  </description>

  <parent>
    <groupId>org.apache.brooklyn</groupId>
    <artifactId>brooklyn-parent</artifactId>
    <version>1.1.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
    <relativePath>../../../brooklyn-server/parent/pom.xml</relativePath>
  </parent>

  <repositories>
    <!--
        Same as in the parent apache pom. Repeated here in case
        direct parent's pom not found at relativePath. Can't fetch
        the parent from remote repos for snapshot versions - no
        snapshot repos enabled by default.
    -->
    <repository>
      <id>apache.snapshots</id>
      <name>Apache Snapshot Repository</name>
      <url>https://repository.apache.org/snapshots</url>
      <releases>
        <enabled>false</enabled>
      </releases>
    </repository>
  </repositories>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-archetype-plugin</artifactId>
        <!-- all we want to do is skip _integration tests_ when skipTests is set, not other phases;
             but for some reason this seems to do it, and it still builds the archetype (!?).
             whereas setting skip inside the integration-test execution goal does NOT work.
              
             TODO promote to root pom.xml when we better understand why
        -->
        <configuration>
          <skip>${skipTests}</skip>
        </configuration>
      </plugin>
      
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <configuration>
          <filesets>
            <fileset> 
                <directory>src/test/resources/projects/integration-test-1/reference</directory> 
                <includes><include>**/*</include></includes>
            </fileset>
            <fileset> 
                <directory>src/main/resources/archetype-resources/</directory> 
                <includes><include>**/*</include></includes>
            </fileset>
          </filesets>
        </configuration>
      </plugin>

      <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
        <artifactId>maven-replacer-plugin</artifactId>
        <executions>
          <execution>
            <id>copy-brooklyn-sample-to-integration-test-reference</id>
            <phase>clean</phase>
            <goals> <goal>replace</goal> </goals>
            <configuration>
              <basedir>${basedir}/src/brooklyn-sample</basedir> 
              <outputBasedir>${basedir}</outputBasedir>
              <outputDir>src/test/resources/projects/integration-test-1/reference</outputDir>
              <includes> <include>**</include> </includes>
              <excludes> 
                <exclude>.*</exclude> 
                <exclude>.*/**</exclude> 
                <exclude>target/**</exclude> 
                <exclude>*.log</exclude> 
              </excludes>
              
              <replacements />
            </configuration>
          </execution>
          <!-- would be nice to reduce the repetion below, but don't see how;
               have tried with valueTokenMap but it must lie beneath basedir;
               and tried with {input,output}FilePattern but that doesn't apply to dirs  -->
          <execution>
            <!-- copy creating variables and unpackaged, for src/main/java -->
            <id>copy-brooklyn-sample-to-archetype-src-main-java</id>
            <phase>clean</phase>
            <goals> <goal>replace</goal> </goals>
            <configuration>
              <basedir>${basedir}/src/brooklyn-sample/src/main/java/com/acme/sample/brooklyn</basedir>
              <outputBasedir>${basedir}</outputBasedir>
              <outputDir>src/main/resources/archetype-resources/src/main/java</outputDir>
              <includes> <include>**/*</include> </includes>
              <replacements>
                <replacement> <token>extra://brooklyn-sample-extra-repo-url</token> <value>\$\{archetypeRepository}</value> </replacement>
                <replacement> <token>brooklyn-sample</token> <value>\$\{artifactId}</value> </replacement>
                <replacement> <token>com\.acme\.sample\.brooklyn</token> <value>\$\{package}</value> </replacement>
                <replacement> <token>com/acme/sample/brooklyn</token> <value>\$\{packageInPathFormat}</value> </replacement>
                <replacement> <token>com\.acme\.sample</token> <value>\$\{groupId}</value> </replacement>
                <replacement> <token>0.1.0-SNAPSHOT</token> <value>\$\{version}</value> </replacement>
              </replacements>
            </configuration>
          </execution>
          <execution>
            <!-- copy creating variables and unpackaged, for src/test/java -->
            <id>copy-brooklyn-sample-to-archetype-src-test-java</id>
            <phase>clean</phase>
            <goals> <goal>replace</goal> </goals>
            <configuration>
              <basedir>${basedir}/src/brooklyn-sample/src/test/java/com/acme/sample/brooklyn</basedir>
              <outputBasedir>${basedir}</outputBasedir>
              <outputDir>src/main/resources/archetype-resources/src/test/java</outputDir>
              <includes> <include>**/*</include> </includes>
              <replacements>
                <replacement> <token>extra://brooklyn-sample-extra-repo-url</token> <value>\$\{archetypeRepository}</value> </replacement>
                <replacement> <token>brooklyn-sample</token> <value>\$\{artifactId}</value> </replacement>
                <replacement> <token>com\.acme\.sample\.brooklyn</token> <value>\$\{package}</value> </replacement>
                <replacement> <token>com/acme/sample/brooklyn</token> <value>\$\{packageInPathFormat}</value> </replacement>
                <replacement> <token>com\.acme\.sample</token> <value>\$\{groupId}</value> </replacement>
                <replacement> <token>0.1.0-SNAPSHOT</token> <value>\$\{version}</value> </replacement>
              </replacements>
            </configuration>
          </execution>
          <execution>
            <!-- copy creating variables, for all other places -->
            <id>copy-brooklyn-sample-to-archetype-resources</id>
            <phase>clean</phase>
            <goals> <goal>replace</goal> </goals>
            <configuration>
              <basedir>${basedir}/src/brooklyn-sample/</basedir>
              <outputBasedir>${basedir}</outputBasedir>
              <outputDir>src/main/resources/archetype-resources/</outputDir>
              <includes>
                <include>**/*</include>
              </includes>
              <excludes> 
                <exclude>src/main/java/**</exclude> 
                <exclude>src/test/java/**</exclude> 
                <exclude>target/**</exclude> 
                <exclude>test-output/**</exclude> 
                <exclude>.*</exclude> 
                <exclude>**/*.png</exclude> 
                <exclude>.*/**</exclude> 
                <exclude>*.log</exclude>
                <exclude>**/*.sh</exclude>
              </excludes>
              <replacements>
                <!-- special chars in velocity have to be escaped.
                     fortunately we only use fairly simple examples so we don't need to solve the general case! -->
                <!-- escaping # is ugly -->
                <replacement> <token>(#+)</token> <value>#set\(\$H='$1'\)\${H}</value> </replacement>
                <!-- and escaping $ doesn't even seem to work; perhaps an old version of velocity in use?
                     (however velocity ignores $ except for variables which are defined, so we're okay)
                <replacement> <token>\$</token> <value>\\\$</value> </replacement>
                -->
                
                <replacement> <token>extra://brooklyn-sample-extra-repo-url</token> <value>\$\{archetypeRepository}</value> </replacement>
                <replacement> <token>brooklyn-sample</token> <value>\$\{artifactId}</value> </replacement>
                <replacement> <token>com\.acme\.sample\.brooklyn</token> <value>\$\{package}</value> </replacement>
                <replacement> <token>com/acme/sample/brooklyn</token> <value>\$\{packageInPathFormat}</value> </replacement>
                <replacement> <token>com\.acme\.sample</token> <value>\$\{groupId}</value> </replacement>
                <replacement> <token>0.1.0-SNAPSHOT</token> <value>\$\{version}</value> </replacement>
              </replacements>
            </configuration>
          </execution>
          <execution>
            <!-- copy creating variables, for all other places -->
            <id>copy-brooklyn-sample-to-archetype-resources-binary</id>
            <phase>clean</phase>
            <goals> <goal>replace</goal> </goals>
            <configuration>
              <basedir>${basedir}/src/brooklyn-sample/</basedir>
              <outputBasedir>${basedir}</outputBasedir>
              <outputDir>src/main/resources/archetype-resources/</outputDir>
              <includes>
                <include>**/*.png</include>
                <include>**/*.sh</include>
              </includes>
              <excludes> 
                <exclude>target/**</exclude> 
                <exclude>test-output/**</exclude> 
                <exclude>.*</exclude> 
                <exclude>.*/**</exclude> 
              </excludes>
              <!-- no replacements for binary (put one just so we can use this plugin for consistency) -->
              <replacements><replacement> <token>NONCE_123456789XYZ</token> <value>NONCE_123456789XYZ</value> </replacement></replacements>
            </configuration>
          </execution>
          
        </executions>
      </plugin>

    </plugins>
      <pluginManagement>
        <plugins>
          <plugin>
            <groupId>org.apache.rat</groupId>
            <artifactId>apache-rat-plugin</artifactId>
            <configuration>
              <excludes combine.children="append">
                <!-- 
                    The maven archetype are files "without any degree of creativity". They are intended
                    purely as a template to generate a new project for a user, where upon the user can
                    write their code within this new project.
                    The exclusions seem to need to include code that is auto-generated during a test run.
                -->
                <exclude>**/src/main/resources/archetype-resources/**/*</exclude>
                <exclude>**/src/test/resources/projects/integration-test-1/goal.txt</exclude>
                <exclude>**/src/test/resources/projects/integration-test-1/reference/**/*</exclude>
                <exclude>**/src/main/java/sample/**/*Sample*.java</exclude>
                <exclude>**/src/main/resources/logback-custom.xml</exclude>
                <exclude>**/src/brooklyn-sample/README.md</exclude>
                <exclude>**/src/brooklyn-sample/pom.xml</exclude>
                <exclude>**/src/brooklyn-sample/src/main/java/**/*.java</exclude>
                <exclude>**/src/brooklyn-sample/src/main/resources/**/*.bom</exclude>
                <exclude>**/src/brooklyn-sample/src/test/resources/**/*.bom</exclude>
                <exclude>**/src/brooklyn-sample/src/test/resources/**/*.yaml</exclude>
                <exclude>**/src/brooklyn-sample/src/test/java/**/*.java</exclude>
              </excludes>
            </configuration>
          </plugin>
        </plugins>
      </pluginManagement>

  </build>

</project>
