<?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.
-->

<!-- $Rev$ $Date$ -->

<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.geronimo.javamail</groupId>
        <artifactId>geronimo-javamail_1.4</artifactId>
        <version>1.9.0-SNAPSHOT</version>
    </parent>

    <artifactId>geronimo-javamail_1.4_mail</artifactId>
    <packaging>bundle</packaging>
    <name>Geronimo JavaMail 1.4 :: Mail</name>

    <dependencies>
        <dependency>
            <groupId>org.apache.geronimo.javamail</groupId>
            <artifactId>geronimo-javamail_1.4_provider</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-javamail_1.4_spec</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-activation_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-osgi-locator</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- NOTE:  The shade build step is an important step in getting the bundle
                     built correctly.  This step copies all of the OSGI-INF/services and META-INF/*
                     resources into the local build target, and then the bundle plugin merges those
                     resources with the class files pulled from the dependency jars to create the
                     final result.  Without this extra step, only the class files make it into the
                     final bundle.-->

                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <includes>
                                    <include>org.apache.geronimo.specs:geronimo-javamail_1.4_spec</include>
                                    <include>org.apache.geronimo.javamail:geronimo-javamail_1.4_provider</include>
                                    <include>${project.groupId}:${project.artifactId}</include>
                                </includes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <artifact>org.apache.geronimo.specs:geronimo-javamail_1.4_spec</artifact>
                                    <!-- All of the class files need to be excluded to avoid bnd errors about split packages -->
                                    <excludes>
                                        <exclude>javax/**</exclude>
                                        <exclude>org/apache/geronimo/mail/**</exclude>
                                        <exclude>org/apache/geronimo/osgi/**</exclude>
                                    </excludes>
                                </filter>
                                <filter>
                                    <artifact>org.apache.geronimo.javamail:geronimo-javamail_1.4_provider</artifact>
                                    <excludes>
                                        <exclude>org/apache/geronimo/javamail/**</exclude>
                                        <exclude>org/apache/geronimo/osgi/**</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
                            <createDependencyReducedPom>true</createDependencyReducedPom>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId};singleton=true</Bundle-SymbolicName>
                        <Specification-Title>JSR-919 Javamail API 1.4 merged bundle</Specification-Title>
                        <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
                        <Specification-Version>1.4</Specification-Version>
                        <Private-Package>
                            org.apache.geronimo.osgi.locator,
                            org.apache.geronimo.mail,
                            org.apache.geronimo.mail.util,
                            org.apache.geronimo.javamail.util,
                            org.apache.geronimo.javamail.authentication
                        </Private-Package>
                        <Export-Package>
                            javax.mail*;version=1.4,
                            org.apache.geronimo.javamail.handlers*;version=1.4,
                            org.apache.geronimo.javamail.store*;version=1.4,
                            org.apache.geronimo.javamail.transport*;version=1.4,
                            org.apache.geronimo.mail.handlers*;version=1.4,
                        </Export-Package>
                        <Import-Package>
                            javax.activation,
                            javax.net,
                            javax.mail*,
                            javax.imageio*;resolution:="optional",
                            javax.net.ssl*;resolution:="optional",
                            javax.security.sasl*;resolution:="optional",
                            javax.security.auth.callback*;resolution:="optional",
                            org.apache.geronimo.osgi.registry.api;resolution:="optional",
                            *
                        </Import-Package>
                        <Bundle-Activator>org.apache.geronimo.mail.Activator</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
