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

    <name>Apache Felix Http Jetty</name>
    <description>This is an implementation of the R7 OSGi Http Service and the R7 OSGi Http Whiteboard Specification</description>

    <artifactId>org.apache.felix.http.jetty</artifactId>
    <version>4.0.14</version>
    <packaging>bundle</packaging>
    
    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.http.jetty-4.0.14</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.http.jetty-4.0.14</developerConnection>
        <url>http://svn.apache.org/viewvc/felix/releases/org.apache.felix.http.jetty-4.0.14</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.4.20.v20190813</jetty.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <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.eclipse.jetty,
                            !org.eclipse.jetty.util.log.jmx,
                            !org.eclipse.jetty.version,
                            org.eclipse.jetty.*,
                            org.apache.felix.http.jetty
                        </Export-Package>
                        <Private-Package>
                            org.apache.felix.http.base.*,
                            org.apache.felix.http.jetty.*,
                            org.eclipse.jetty,
                            org.eclipse.jetty.security.authentication,
                            org.eclipse.jetty.util.log.jmx,
                            org.eclipse.jetty.version
                        </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.osgi.service.cm;resolution:=optional;version="[1.3,2)",                        	
                            org.osgi.service.event;resolution:=optional;version="[1.2,2)",
                            org.osgi.service.log;resolution:=optional;version="[1.3,2)",
                            org.osgi.service.metatype;resolution:=optional;version="[1.1,2)",
                            org.osgi.service.useradmin;resolution:=optional;version="[1.1,2)",
                            org.osgi.service.http;version="[1.2.1,1.3)",
                            org.osgi.service.http.context;version="[1.1,1.2)",
                            org.osgi.service.http.runtime;version="[1.1,1.2)",
                            org.osgi.service.http.runtime.dto;version="[1.1,1.2)",
                            *
                        </Import-Package>
                        <DynamicImport-Package>
                            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)"
                        </DynamicImport-Package>
                        <Provide-Capability>
                            osgi.implementation;osgi.implementation="osgi.http";version:Version="1.1";
                            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",
                            osgi.service;objectClass:List&lt;String&gt;="org.osgi.service.http.HttpService";
                            uses:="org.osgi.service.http"
                        </Provide-Capability>
                        <Require-Capability>
                            osgi.contract;filter:="(&amp;(osgi.contract=JavaServlet)(version=3.1))"
                        </Require-Capability>
                        <_removeheaders>
                            Private-Package,Conditional-Package
                        </_removeheaders>
                    </instructions>
                <!-- Skip Baselining due to Jetty API -->
	            <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>light-bundle</id>
                        <goals>
                            <goal>bundle</goal>
                        </goals>
                        <configuration>
                            <classifier>light</classifier>
                            <instructions>
                               <Bundle-Name>${project.name} Light</Bundle-Name>
                               <Bundle-SymbolicName>${project.artifactId}.light</Bundle-SymbolicName>
                               <!-- We need to override this from the base configuration -->
                               <Conditional-Package>
                                   foo
                               </Conditional-Package>
                               <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.jetty
                                </Export-Package>
                                <Private-Package>
                                    org.apache.felix.http.base.*,
                                    org.apache.felix.http.jetty.*
                                </Private-Package>
                                <Import-Package>
                                    org.osgi.service.cm;resolution:=optional;version="[1.3,2)",
                                    org.osgi.service.event;resolution:=optional;version="[1.2,2)",
                                    org.osgi.service.log;resolution:=optional;version="[1.3,2)",
                                    org.osgi.service.metatype;resolution:=optional;version="[1.1,2)",
                                    org.osgi.service.useradmin;resolution:=optional;version="[1.1,2)",
                                    org.osgi.service.http;version="[1.2.1,1.3)",
                                    org.osgi.service.http.context;version="[1.1,1.2)",
                                    org.osgi.service.http.runtime;version="[1.1,1.2)",
                                    org.osgi.service.http.runtime.dto;version="[1.1,1.2)",
                                    org.eclipse.jetty.webapp;resolution:=optional,
                                    *
                                </Import-Package>
                                <_removeheaders>
                                    X-Jetty-Version,Private-Package,Conditional-Package 
                                </_removeheaders>
                            </instructions>
                        </configuration>
                    </execution>
                </executions>
            </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.osgi</groupId>
            <artifactId>org.osgi.service.http</artifactId>
            <version>1.2.1</version>
           <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.http.whiteboard</artifactId>
            <version>1.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.http.base</artifactId>
            <version>4.0.8</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</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>
