#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
<?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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>\${rootArtifactId}</artifactId>
        <groupId>\${groupId}</groupId>
        <version>\${version}</version>
    </parent>

    <artifactId>\${artifactId}</artifactId>
    <packaging>content-package</packaging>

    <name>\${artifactName} - UI Apps Example</name>
    <description>
        This is the Example Module for the Sample UI Apps module (ui.apps).
        The basic idea is to have a clean 'ui.apps' module in which you
        can choose what examples you want to use rather than having
        to delete a bunch of examples.

        Pleaes copy examples from this module into your 'ui.apps' module
        if you want it to use it in your project. The project structure
        is the same and so you can copy the files from the source to
        the target folder wihtout having to adjust paths or packages.
        This module is not part of the Root Project's build and you can
        either keep it around or you delete it if you don't need
        it anymore.

        The profile to deploy the bundle is removed to avoid accidental
        deployments.
    </description>

    <!-- @startForNotAll@ This is used for the Post Generation Handling. Do not alter or remove -->
    <dependencies>
        <dependency>
            <groupId>\${project.groupId}</groupId>
            <artifactId>core</artifactId>
            <version>\${project.version}</version>
        </dependency>
    </dependencies>
    <!-- @endForNotAll@ This is used for the Post Generation Handling. Do not alter or remove -->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.jackrabbit</groupId>
                <artifactId>filevault-package-maven-plugin</artifactId>
                <configuration>
                    <filterSource>\${basedir}/src/main/content/META-INF/vault/filter.xml</filterSource>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                        <!-- @startForNotAll@ This is used for the Post Generation Handling. Do not alter or remove -->
                        <configuration>
                            <embeddedTarget>/apps/\${appsFolderName}/install</embeddedTarget>
                            <embeddeds>
                                <embedded>
                                    <groupId>\${project.groupId}</groupId>
                                    <artifactId>core</artifactId>
                                    <filter>true</filter>
                                </embedded>
                            </embeddeds>
                        </configuration>
                        <!-- @endForNotAll@ This is used for the Post Generation Handling. Do not alter or remove -->
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <!-- @startForNotAll@ This is used for the Post Generation Handling. Do not alter or remove -->
    <!--Commented out to avoid accidental deployment -->
    <!--<profiles>-->
        <!--<profile>-->
            <!--<id>autoInstallPackage</id>-->
            <!--<build>-->
                <!--<plugins>-->
                    <!--<plugin>-->
                        <!--<groupId>io.wcm.maven.plugins</groupId>-->
                        <!--<artifactId>wcmio-content-package-maven-plugin</artifactId>-->
                        <!--<executions>-->
                            <!--<execution>-->
                                <!--<id>install-package</id>-->
                                <!--<goals>-->
                                    <!--<goal>install</goal>-->
                                <!--</goals>-->
                            <!--</execution>-->
                        <!--</executions>-->
                    <!--</plugin>-->
                <!--</plugins>-->
            <!--</build>-->
        <!--</profile>-->
    <!--</profiles>-->
    <!-- @endForNotAll@ This is used for the Post Generation Handling. Do not alter or remove -->
</project>
