<!--
    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>org.apache.felix.http.parent</artifactId>
        <version>6</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>

    <name>Apache Felix Http Jetty</name>
    <artifactId>org.apache.felix.http.jetty</artifactId>
    <version>3.0.3-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/http/jetty</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/http/jetty</developerConnection>
        <url>http://svn.apache.org/viewvc/felix/trunk/http/jetty/</url>
    </scm>
    
    <properties>
        <http.java.version>7</http.java.version>
    	<!-- jetty.version is moved to http-parent POM -->
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                    	<X-Jetty-Version>
                    		${jetty.version}
                    	</X-Jetty-Version>
                        <Bundle-Activator>
                            org.apache.felix.http.jetty.internal.JettyActivator
                        </Bundle-Activator>
                        <Export-Package>
        					org.eclipse.jetty.*;-split-package:=merge-first;version=${version;===;${jetty.version}},
                            org.apache.felix.http.jetty
                        </Export-Package>
                        <Private-Package>
                            org.apache.felix.http.base.*,
                            org.apache.felix.http.jetty.*
                        </Private-Package>
                        <Import-Package>
                        	javax.imageio;resolution:=optional,
                        	javax.sql;resolution:=optional,
                        	org.slf4j.*;resolution:=optional,
                        	org.ietf.jgss;resolution:=optional,
                        	org.mortbay.log;resolution:=optional;version="[6.1,7)",
                        	org.mortbay.util.ajax;resolution:=optional;version="[6.1,7)",
                        	org.osgi.service.metatype;version="[1.1,2)";resolution:=optional,
                        	org.osgi.service.useradmin;resolution:=optional,
                            *
                        </Import-Package>
                        <DynamicImport-Package>
                            org.osgi.service.metatype;version="[1.1,2)"
                        </DynamicImport-Package>
                        <Provide-Capability>
                            osgi.implementation;osgi.implementation="osgi.http";version:Version="1.0";
                            uses:="javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard",
                            osgi.service;objectClass:List&lt;String&gt;="org.osgi.service.http.runtime.HttpServiceRuntime";
                            uses:="org.osgi.service.http.runtime,org.osgi.service.http.runtime.dto"
                        </Provide-Capability>
                    </instructions>
                <!-- Skip Baselining due to Jetty API -->
	                <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>biz.aQute</groupId>
            <artifactId>bndlib</artifactId>
            <version>1.50.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-util</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-jmx</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-security</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-webapp</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.websocket</groupId>
            <artifactId>websocket-servlet</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.websocket</groupId>
            <artifactId>websocket-server</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.http.api</artifactId>
            <version>3.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.http.base</artifactId>
            <version>3.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>
