<!--
/*
 * 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.
 *
 * $Id: pom.xml 1326869 2012-04-17 01:30:30Z lu4242 $
 */
-->
<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>org.apache.myfaces.test</groupId>
        <artifactId>myfaces-test-project</artifactId>
        <version>1.0.8-SNAPSHOT</version>
    </parent>

    <artifactId>myfaces-test23</artifactId>
    <packaging>jar</packaging>
    <name>Myfaces Test Framework for JSF 2.3</name>
    
    <dependencies>

        <!-- Required only for using the org.apache.shale.test.config package -->
        <dependency>
            <groupId>commons-digester</groupId>
            <artifactId>commons-digester</artifactId>
            <version>1.8</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>1.14</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>jmock</groupId>
            <artifactId>jmock</artifactId>
            <version>1.0.1</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>jmock</groupId>
            <artifactId>jmock-cglib</artifactId>
            <version>1.0.1</version>
            <optional>true</optional>
        </dependency>        

        <!-- For the "org.apache.shale.test.cargo" package, we need to have  -->
        <!-- JUnit as a compile time dependency, not just scope="test".      -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.5</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-core-uberjar</artifactId>
            <version>0.8</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-ant</artifactId>
            <version>0.8</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>javax.portlet</groupId>
            <artifactId>portlet-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.myfaces.core</groupId>
            <artifactId>myfaces-api</artifactId>
            <version>${jsf-myfaces.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.myfaces.core</groupId>
            <artifactId>myfaces-impl</artifactId>
            <version>${jsf-myfaces.version}</version>
            <scope>test</scope>
        </dependency>
        <!--
        <dependency>
            <groupId>javax.faces</groupId>
            <artifactId>javax.faces-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>-->
        
        <!-- Servlet 3.0 -->
        <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-servlet_3.0_spec</artifactId>
             <version>1.0</version>
             <scope>provided</scope>
        </dependency>
        <!-- JSP 2.1 -->
        <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-jsp_2.1_spec</artifactId>
             <version>1.0.1</version>
             <scope>provided</scope>
        </dependency>
        <!-- EL 1.0 -->
        <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-el_1.0_spec</artifactId>
             <version>1.0.2</version>
             <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-source</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- 
                  - Add a new source directory to the compile path. 
                  -
                  -   test12_sources: contains all the source code from the "main" branch of test,
                  -   which is written to be JSF1.2 and JSF1.1-compatible.
                  -->
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>
                                    ${project.build.directory}/test22_sources
                                </source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            
        </plugins>    
    </build>
    <profiles>
        <!-- To avoid this error: 
                ArchiverException: The source must not be a directory. 
             we need to disable unpack when site generation is done.
             -->
        <profile>
            <id>unpack-sources</id>
            <activation>
                <property>
                    <name>!generateSite</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.myfaces.buildtools</groupId>
                        <artifactId>myfaces-builder-plugin</artifactId>
                        <version>1.0.10</version>
                        <executions>
                          <execution>
                            <id>unpack-test12</id>
                            <phase>generate-sources</phase>
                            <goals>
                              <goal>unpack</goal>
                            </goals>
                            <configuration>
                              <scanModel>false</scanModel>
                              <artifactItems>
                                <artifactItem>
                                  <groupId>org.apache.myfaces.test</groupId>
                                  <artifactId>myfaces-test22</artifactId>
                                  <version>${project.version}</version>
                                  <classifier>sources</classifier>                   
                                  <outputDirectory>${project.build.directory}/test22_sources</outputDirectory>
                                  <includes>org/apache/myfaces/**/*.java</includes>
                                  <excludes>**/*.class,**/META-INF/**</excludes>
                                </artifactItem>
                              </artifactItems>
                            </configuration>
                          </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>generate-assembly</id>
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>
            <build>
                <plugins>

                    <plugin>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>attach-javadoc</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    
                </plugins>
            </build>
        </profile>
    </profiles>
    <reporting>
      <plugins>
        <plugin>
          <artifactId>maven-javadoc-plugin</artifactId>
          <reportSets>
            <reportSet>
              <id>non-aggregate</id>
              <configuration>
                <!-- Specific configuration for the non aggregate report -->
              </configuration>
              <reports>
                <report>javadoc</report>
              </reports>
            </reportSet>
          </reportSets>
        </plugin>
      </plugins>
    </reporting>
    <properties>
        <jsf-ri.version>2.0.2-b10</jsf-ri.version>
        <jsf-myfaces.version>2.2.0</jsf-myfaces.version>
    </properties>
</project>
