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

    <!-- ====================================================================== -->
    <!-- P R O J E C T  D E S C R I P T I O N                                   -->
    <!-- ====================================================================== -->
    <groupId>org.apache.jackrabbit.filevault</groupId>
    <artifactId>package-plugin-test-pkg</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>content-package</packaging>
    <name>No Filter File or Inline Filters but one filter Embed test</name>

    <description>Test project that checks that a filter is created with only a embed marked to be a filter entry.</description>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.jackrabbit</groupId>
                <artifactId>filevault-package-maven-plugin</artifactId>
                <version>${plugin.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <packageType>container</packageType>
                    <failOnEmptyFilter>true</failOnEmptyFilter>
                    <embeddeds>
                        <embedded>
                            <groupId>javax.jcr</groupId>
                            <artifactId>jcr</artifactId>
                            <target>/libs/install</target>
                            <filter>true</filter>
                        </embedded>
                    </embeddeds>
                    <subPackages>
                        <subPackage>
                            <groupId>test</groupId>
                            <artifactId>test-package</artifactId>
                            <filter>true</filter>
                        </subPackage>
                    </subPackages>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    <dependencies>
        <dependency>
            <groupId>javax.jcr</groupId>
            <artifactId>jcr</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>test</groupId>
            <artifactId>test-package</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <type>content-package</type>
            <systemPath>${basedir}/../../../test-content/test-package.zip</systemPath>
        </dependency>
    </dependencies>
</project>
