<!--
    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.felix</groupId>
        <artifactId>felix-parent</artifactId>
        <version>1.2.0</version>
        <relativePath>../pom/pom.xml</relativePath>
    </parent>

    <artifactId>org.apache.felix.webconsole</artifactId>
    <packaging>bundle</packaging>
    <version>2.0.5-SNAPSHOT</version>

    <name>Apache Felix Web Management Console</name>
    <description>
        Web Based Management Console for OSGi Frameworks. See
        http://felix.apache.org/site/apache-felix-web-console.html for more
        information on this bundle.
    </description>

    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/webconsole</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/webconsole</developerConnection>
        <url>http://svn.apache.org/viewvc/felix/trunk/webconsole</url>
    </scm>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>1.4.3</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>
                            ${artifactId}
                        </Bundle-SymbolicName>
                        <Bundle-Vendor>
                            The Apache Software Foundation
                        </Bundle-Vendor>
                        <Bundle-DocURL>
                            http://felix.apache.org/site/apache-felix-web-console.html
                        </Bundle-DocURL>
                        <Bundle-Activator>
                            org.apache.felix.webconsole.internal.OsgiManagerActivator
                        </Bundle-Activator>
                        <Export-Package>
                            org.apache.felix.webconsole;version=${project.version}
                        </Export-Package>
                        <Private-Package>
                            !org.apache.felix.webconsole,
                            org.apache.felix.webconsole.*,
                        </Private-Package>
                        <Import-Package>
                            org.osgi.service.http,
                            org.apache.felix.scr;
                            org.apache.felix.shell;
                            org.osgi.service.*;resolution:=optional,
                            javax.portlet;resolution:=optional,
                            javax.servlet.*;version=2.4,*;
                        </Import-Package>
                        <Embed-Dependency>
                            <!-- Import/Export-Package parsing -->
                            org.apache.felix.bundlerepository;
                                inline=org/apache/felix/bundlerepository/R4*.class|
                                    org/apache/felix/bundlerepository/Util.class|
                                    org/apache/felix/bundlerepository/VersionRange.class,
                            
                            <!-- ServiceTracker -->
                            org.osgi.compendium;
                                inline=org/osgi/util/tracker/*,
                                
                            <!-- Required for JSON data transfer -->
                            json,
                            
                            <!-- File Upload functionality -->
                            commons-fileupload,
    
                            <!-- Required by FileUpload and Util -->
                            commons-io
                        </Embed-Dependency>
                        
                        <_donotcopy>NOTICE.bare</_donotcopy>
                        <_removeheaders>
                            Embed-Dependency,Private-Package,Include-Resource
                        </_removeheaders>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!--
            The "bare-bundle" profile builds a bundle not including certain
            3rd party libraries and classes, namely: Commons IO, Commons
            FileUpload, JSON, and the OSGi ServiceTracker. These are imported
            by this bundle. The classes from the bundlerepository bundle are
            still included because they are not exported from the
            bundlerepository bundle and thus cannot be imported.
            The "bare-bundle" can be used if the non-embedded libraries are
            provided by the framework in which the web console is installed.
        -->
        <profile>
            <id>bare-bundle</id>
            <activation><activeByDefault>true</activeByDefault></activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.felix</groupId>
                        <artifactId>maven-bundle-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>bare-bundle</id>
                                <goals>
                                    <goal>bundle</goal>
                                </goals>
                                <configuration>
                                    <classifier>bare</classifier>
                                    <instructions>
                                        <Include-Resource>
                                            {maven-resources},META-INF/NOTICE=src/main/bare-resources/NOTICE.bare
                                        </Include-Resource>
                                        <_donotcopy>LICENSE.json</_donotcopy>
                                        <!-- <_donotcopy>(LICENSE.json|NOTICE.bare)</_donotcopy> -->
                                        <Embed-Dependency>
                                            org.apache.felix.bundlerepository;
                                                inline=org/apache/felix/bundlerepository/R4*.class|
                                                    org/apache/felix/bundlerepository/Util.class|
                                                    org/apache/felix/bundlerepository/VersionRange.class,
                                        </Embed-Dependency>
                                    </instructions>
                                </configuration>
                            </execution>
                        </executions>
                </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.4</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.1.1</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.4</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20070829</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- OBR Service API -->
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.osgi.service.obr</artifactId>
            <version>1.0.2</version>
            <scope>provided</scope>
        </dependency>

        <!--  Parsing Import/Export-Package headers -->
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.bundlerepository</artifactId>
            <version>1.0.3</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>

    </dependencies>
</project>
