<!--
    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>
      <groupId>javax.portlet</groupId>
      <artifactId>tck</artifactId>
      <version>3.0-SNAPSHOT</version>
   </parent>

   <artifactId>tck-V2AddlUrlTests</artifactId>
   <packaging>war</packaging>

   <dependencies>
      <dependency>
         <groupId>javax.portlet</groupId>
         <artifactId>portlet-api</artifactId>
      </dependency>
      <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>servlet-api</artifactId>
      </dependency>
      <dependency>
         <groupId>javax.portlet</groupId>
         <artifactId>tck-common</artifactId>
         <version>${project.version}</version>
         <scope>compile</scope>
      </dependency>
   </dependencies>

   <properties>

      <!-- This project contains additional test cases to run with the portlets -->
      <additional.testcase.uri>file:///${basedir}/src/main/resources/xml-resources/additionalTCs.xml</additional.testcase.uri>

      <!-- Set to true for modules that define all test cases in a file (TCs are not generated from the portlet.xml) -->
      <additional.testcases.only>true</additional.testcases.only>

      <!-- put all portlets from this module on the same page -->
      <page.file.xsl>plutoMultiPortletPage.xsl</page.file.xsl>

   </properties>

   <build>
      <finalName>${project.artifactId}</finalName>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
         </plugin>
         <!-- Transform the portlet XML into test properties XML file -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
         </plugin>
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xml-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>


   <profiles>
      <profile>
         <id>pluto</id>

         <dependencies>
            <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
            </dependency>
            <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
            </dependency>
         </dependencies>

         <build>
            <plugins>
               <plugin>
                  <artifactId>maven-war-plugin</artifactId>
                  <configuration>
                     <webXml>${project.build.directory}/pluto-resources/web.xml</webXml>
                  </configuration>
               </plugin>
               <!-- bind 'pluto:assemble' goal to 'generate-resources' lifecycle -->
               <plugin>
                  <groupId>org.apache.portals.pluto</groupId>
                  <artifactId>maven-pluto-plugin</artifactId>
                  <executions>
                     <execution>
                        <phase>generate-resources</phase>
                        <goals>
                           <goal>assemble</goal>
                        </goals>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>

</project>
