<?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>

    <parent>
        <groupId>org.apache.sling</groupId>
        <artifactId>sling</artifactId>
        <version>51</version>
        <relativePath />
    </parent>

    <groupId>org.apache.sling</groupId>
    <artifactId>sling-project-archetype</artifactId>
    <version>1.0.13-SNAPSHOT</version>
    <packaging>maven-archetype</packaging>

    <properties>
        <!-- various properties which influence generated archetypes -->
        <archetype.java.version>11</archetype.java.version>

        <!-- dependency versions to use in generated archetypes -->
        <junit.version>4.12</junit.version>
        <slf4japi.version>1.7.25</slf4japi.version>

        <!-- version of the maven archetype plugin -->
        <archetype.version>3.1.2</archetype.version>
    </properties>

    <name>Project Archetype</name>
    <description>
        This archetype is creating a full Sling Project composed of
        a OSGi Bundle and a Content Package which can be deployed
        to the Sling using specific profiles. It also contains two shadow
        folders that provide example code / files which are not part
        of the default build but can be easily copied into the active modules.

        If the project was created with the **optionAll** property set
        to **y** (yes) then an **All** package is created with acts as
        the single deployment unit of all bundles and packages in that
        project.
        Otherwise the **ui.apps** package is the deployment unit.
    </description>

    <scm>
        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-project-archetype.git</connection>
        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-project-archetype.git</developerConnection>
        <url>https://github.com/apache/sling-project-archetype.git</url>
        <tag>HEAD</tag>
    </scm>

    <build>
        <extensions>
            <extension>
                <groupId>org.apache.maven.archetype</groupId>
                <artifactId>archetype-packaging</artifactId>
                <version>${archetype.version}</version>
            </extension>
        </extensions>

        <resources>
            <resource>
                <!-- filter pom.xml -->
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/pom.xml</include>
                </includes>
            </resource>
            <!-- Don't filter anything else -->
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <excludes>
                    <exclude>**/pom.xml</exclude>
                </excludes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <!--
                    allow defining un-filtered resources in the pom.xml
                    For example, the artifactId should not be escaped:

                    <artifact>\${artifactId}</artifactId>
                 -->
                <configuration>
                    <escapeString>\</escapeString>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-archetype-plugin</artifactId>
                <version>${archetype.version}</version>
                <extensions>true</extensions>
                <!-- Verify archetype invocation was successful as part of the verify phase -->
                <configuration>
                    <postBuildHookScript>verify.groovy</postBuildHookScript>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.rat</groupId>
                <artifactId>apache-rat-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>src/test/resources/projects/*/goal.txt</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
