<!--
    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.3-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>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <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.apache.felix</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>1.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>1.2.0</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>javax.servlet</artifactId>
                </exclusion>
            </exclusions>
        </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>
