<!--
    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>9</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>

    <name>Apache Felix Http Jetty</name>
    <artifactId>org.apache.felix.http.jetty</artifactId>
    <version>3.4.8</version>
    <packaging>jar</packaging>
    
    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.http.jetty-3.4.8</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.http.jetty-3.4.8</developerConnection>
        <url>http://svn.apache.org/viewvc/felix/releases/org.apache.felix.http.jetty-3.4.8</url>
    </scm>
    
    <properties>
        <!-- Skip because of problems with Java 8 -->
        <animal.sniffer.skip>true</animal.sniffer.skip>
        <felix.java.version>8</felix.java.version>
        <jetty.version>9.3.22.v20171030</jetty.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <instructions>
                    	<X-Jetty-Version>
                    		${jetty.version}
                    	</X-Jetty-Version>
                        <Bundle-Activator>
                            org.apache.felix.http.jetty.internal.JettyActivator
                        </Bundle-Activator>
                        <Export-Package>
                            org.osgi.service.http,
                            org.osgi.service.http.context,
                            org.osgi.service.http.runtime,
                            org.osgi.service.http.runtime.dto,
                            org.osgi.service.http.whiteboard,
                            org.apache.felix.http.api,
        					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>
                        <Conditional-Package>
                            org.apache.commons.*
                        </Conditional-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.cm;version="[1.3,2)",                        	
                        	org.osgi.service.event;version="[1.2,2)",
                        	org.osgi.service.log;version="[1.3,2)",
                        	org.osgi.service.metatype;version="[1.1,2)";resolution:=optional,
                        	org.osgi.service.useradmin;resolution:=optional,
                            org.apache.felix.http.api;version="[2.0,2.1)",
                            org.osgi.service.http;version="[1.2.1,1.3)",
                            org.osgi.service.http.context;version="[1.0,1.1)",
                            org.osgi.service.http.runtime;version="[1.0,1.1)",
                            org.osgi.service.http.runtime.dto;version="[1.0,1.1)",
                            *
                        </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>
                        <Require-Capability>
                            osgi.contract;filter:="(&amp;(osgi.contract=JavaServlet)(version=3.1))"
                        </Require-Capability>
                    </instructions>
                <!-- Skip Baselining due to Jetty API -->
	                <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi.core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.cm</artifactId>
            <version>1.5.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.event</artifactId>
            <version>1.3.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.metatype</artifactId>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.useradmin</artifactId>
            <version>1.1.0</version>
            <scope>provided</scope>
        </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</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.http.base</artifactId>
            <version>3.0.18</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
  <!-- Testing -->
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.log</artifactId>
            <version>1.3.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
