<?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>
        <groupId>org.apache.myfaces.extensions.cdi.modules</groupId>
        <artifactId>jsf20-module-project</artifactId>
        <version>1.0.6</version>
    </parent>

    <groupId>org.apache.myfaces.extensions.cdi.modules</groupId>
    <artifactId>myfaces-extcdi-jsf20-module-impl</artifactId>

    <name>MyFaces Extensions-CDI JSF 2.0 Module Impl</name>


    <dependencies>
        <dependency>
            <groupId>org.apache.myfaces.extensions.cdi.core</groupId>
            <artifactId>myfaces-extcdi-core-api</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.myfaces.extensions.cdi.modules</groupId>
            <artifactId>myfaces-extcdi-jsf20-module-api</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.myfaces.extensions.cdi.modules</groupId>
            <artifactId>myfaces-extcdi-jsf12-module-impl</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.myfaces.extensions.cdi.modules</groupId>
            <artifactId>myfaces-extcdi-message-module-impl</artifactId>
        </dependency>
        
        <dependency>
           <groupId>org.apache.geronimo.specs</groupId>
           <artifactId>geronimo-el_1.0_spec</artifactId>
           <scope>provided</scope>
       </dependency>

        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-interceptor_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- needed for the javadoc generation -->
        <dependency>
            <groupId>org.apache.myfaces.extensions.cdi.modules</groupId>
            <artifactId>myfaces-extcdi-jsf12-module-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>

                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.3.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <createSourcesJar>true</createSourcesJar>
                    <artifactSet>
                        <includes>
                            <include>org.apache.myfaces.extensions.cdi.modules:myfaces-extcdi-jsf12-module-impl</include>
                        </includes>
                    </artifactSet>
<!--
                    <filters>
                      <filter>
                          <artifact>org.apache.myfaces.extensions.cdi.modules:myfaces-extcdi-jsf12-module-impl</artifact>
                          <excludes>
                              <exclude>/META-INF/faces-config.xml</exclude>
                              <exclude>/META-INF/beans.xml</exclude>
                              <exclude>/META-INF/services/javax.enterprise.inject.spi.Extension</exclude>
                          </excludes>
                      </filter>
                    </filters>
-->
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                    </transformers>
                </configuration>

                <!--
                    Not used here, but maven needs to have the same dependencies
                    for the same plugin across the whole project, otherwise
                    the class loading (in this case for transformer implementations)
                    will not work properly (why ever...)
                -->
                <dependencies>
                    <dependency>
                        <groupId>org.apache.myfaces.extensions.cdi</groupId>
                        <artifactId>myfaces-extcdi-maven-utils</artifactId>
                        <version>${project.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <!-- override apache-release profile for custom javadoc configuration -->
            <id>apache-release</id>

            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <executions>
                            <execution>
                                <!-- overrides attach-javadocs from apache-parent -->
                                <id>attach-javadocs</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                                <configuration>
                                    <!-- switch on dependency-driven aggregation -->
                                    <includeDependencySources>true</includeDependencySources>

                                    <dependencySourceExcludes>
                                        <!-- exclude org.apache.geronimo.specs artifacts -->
                                        <dependencySourceExclude>org.apache.geronimo.specs:*</dependencySourceExclude>
                                        <dependencySourceExclude>org.apache.myfaces.core:*</dependencySourceExclude>
                                    </dependencySourceExcludes>

                                    <excludePackageNames>org.apache.myfaces.extensions.cdi.core.*:org.apache.myfaces.extensions.cdi.message.*</excludePackageNames>
                                    <encoding>UTF-8</encoding>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>
