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

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

    <artifactId>org.apache.felix.http.jetty</artifactId>
    <version>5.1.0</version>
    <packaging>bundle</packaging>

    <scm>
        <connection>scm:git:https://github.com/apache/felix-dev.git</connection>
        <developerConnection>scm:git:https://github.com/apache/felix-dev.git</developerConnection>
        <url>https://gitbox.apache.org/repos/asf?p=felix-dev.git</url>
      <tag>org.apache.felix.http.jetty-5.1.0</tag>
  </scm>

    <properties>
        <felix.java.version>11</felix.java.version>
	<jetty.version>11.0.15</jetty.version>
    </properties>

    <build>
        <plugins>

            <!-- Use a groovy script to preserve the META-INF/services/* files for the artifacts that are embeded in the uber jar -->
            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>groovy-maven-plugin</artifactId>
                <version>2.1.1</version>
                <executions>
                    <execution>
                        <id>groovy-magic</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <source><![CDATA[
                                // make an output dir for the merged resource files
                                def slDir = new File(project.build.directory, "serviceloader-resources");
                                slDir.mkdirs();

                                // scan each of the artifacts to preserve the information found in any META-INF/services/* files
                                project.artifacts.each() { artifact ->

                                    if (artifact.getArtifactHandler().isAddedToClasspath() && !org.apache.maven.artifact.Artifact.SCOPE_TEST.equals( artifact.getScope() )) {
                                        def jar;
                                        try {
                                            jar = new java.util.jar.JarFile(artifact.file)
                                            jar.stream().each() { entry ->
                                               if (!entry.isDirectory() && entry.name.startsWith("META-INF/services/")) {

                                                   // check if we already have a file with this name
                                                   def svcFile = new File(slDir, entry.name)
                                                   def svcSet = new LinkedHashSet();
                                                   if (svcFile.exists()) {
                                                       // found existing file, so load the items from the existing file so we can merge
                                                       svcFile.eachLine { className ->
                                                           className = className.trim();
                                                           if (!className.isEmpty()) {
                                                               svcSet.add(className);
                                                           }
                                                       }
                                                   }

                                                   // read the content of the found entry
                                                   def lineReader;
                                                   try {
                                                       lineReader = new BufferedReader(new InputStreamReader(jar.getInputStream(entry), java.nio.charset.StandardCharsets.UTF_8));
                                                       def className;
                                                       while ( ( className = lineReader.readLine() ) != null ) {
                                                           className = className.trim();
                                                           if (!className.isEmpty()) {
                                                               svcSet.add(className);
                                                           }
                                                       }
                                                   } finally {
                                                       // cleanup
                                                       if (lineReader != null) {
                                                           lineReader.close()
                                                       }
                                                   }

                                                   // write the merged data to the output file
                                                   if (!svcSet.isEmpty()) {
                                                       // make any missing folders
                                                       svcFile.getParentFile().mkdirs();

                                                       svcFile.withWriter('utf-8') { writer ->
                                                           svcSet.each() { item ->
                                                               writer.writeLine item;
                                                           }

                                                           // finish up with a blank line
                                                           writer.println();
                                                       }
                                                   }

                                               }
                                            }
                                        } finally {
                                            // cleanup
                                            if (jar != null) {
                                                jar.close();
                                            }
                                        }
                                    }

                                }
                            ]]></source>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>5.1.4</version>
                <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.osgi.service.servlet.context,
                            org.osgi.service.servlet.runtime,
                            org.osgi.service.servlet.runtime.dto,
                            org.osgi.service.servlet.whiteboard,
                            !org.eclipse.jetty,
                            !org.eclipse.jetty.version,
                            org.eclipse.jetty.*,
			    org.apache.felix.http.jetty,
                            org.apache.felix.http.jakartawrappers,
			    org.apache.felix.http.javaxwrappers
                        </Export-Package>
                        <Private-Package>
                            org.apache.felix.http.base.*,
                            org.apache.felix.http.jetty.*,
                            org.eclipse.jetty,
                            org.eclipse.jetty.version
                        </Private-Package>
                        <Conditional-Package>
                            org.apache.commons.*
                        </Conditional-Package>
                        <Import-Package>
                            sun.misc;resolution:=optional,
                            sun.nio.ch;resolution:=optional,
                            javax.imageio;resolution:=optional,
                            javax.sql;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)",
                            org.slf4j;version="[1.0,3.0)",
                            *
                        </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.4,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.implementation;osgi.implementation="osgi.http";version:Version="2.0";
                            uses:="jakarta.servlet,jakarta.servlet.http,org.osgi.service.servlet.context,org.osgi.service.servlet.whiteboard",
                            osgi.service;objectClass:List&lt;String&gt;="org.osgi.service.servlet.runtime.HttpServiceRuntime";
                            uses:="org.osgi.service.servlet.runtime,org.osgi.service.servlet.runtime.dto",
                            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",
                            osgi.serviceloader;osgi.serviceloader="org.eclipse.jetty.http.HttpFieldPreEncoder"
                        </Provide-Capability>
                        <Require-Capability>
                            osgi.contract;filter:="(&amp;(osgi.contract=JavaServlet)(version=4.0))",
                            osgi.contract;filter:="(&amp;(osgi.contract=JakartaServlet)(version=5.0))",
                            osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional,
                            osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional,
                            osgi.serviceloader;filter:="(osgi.serviceloader=org.eclipse.jetty.http.HttpFieldPreEncoder)";resolution:=optional;cardinality:=multiple,
                            osgi.serviceloader;filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Server)";resolution:=optional;cardinality:=multiple
                        </Require-Capability>
                        <Include-Resource>
                            {maven-resources},${project.build.directory}/serviceloader-resources
                        </Include-Resource>
                        <_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.osgi.service.servlet.*,
				    org.apache.felix.http.jetty,
				    org.apache.felix.http.javaxwrappers,
				    org.apache.felix.http.jakartawrappers
                                </Export-Package>
                                <Private-Package>
                                    org.apache.felix.http.base.*,
                                    org.apache.felix.http.jetty.*,
                                    org.osgi.service.servlet.*
                                </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.4,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>
                                <!-- We need to override this from the base configuration to exclude the ServiceLoader capabilities -->
                                <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.implementation;osgi.implementation="osgi.http";version:Version="2.0";
                                    uses:="jakarta.servlet,jakarta.servlet.http,org.osgi.service.servlet.context,org.osgi.service.servlet.whiteboard",
                                    osgi.service;objectClass:List&lt;String&gt;="org.osgi.service.servlet.runtime.HttpServiceRuntime";
                                    uses:="org.osgi.service.servlet.runtime,org.osgi.service.servlet.runtime.dto",
                                    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>
                                <!-- We need to override this from the base configuration to exclude the ServiceLoader capabilities -->
                                <Require-Capability>
                                  osgi.contract;filter:="(&amp;(osgi.contract=JavaServlet)(version=4.0))",
                                  osgi.contract;filter:="(&amp;(osgi.contract=JakartaServlet)(version=5.0))"
                                </Require-Capability>
                                <!-- We need to override this from the base configuration to exclude the ServiceLoader resources -->
                                <Include-Resource>
                                    {maven-resources}
                                </Include-Resource>
                                <_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.4.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-util-ajax</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.http2</groupId>
            <artifactId>http2-server</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.http2</groupId>
            <artifactId>http2-common</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.http2</groupId>
            <artifactId>http2-hpack</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-alpn-server</artifactId>
            <version>${jetty.version}</version>
        </dependency>
       <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.service.servlet</artifactId>
            <version>2.0.0</version>
            <scope>provided</scope>
        </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>5.1.0</version>
        </dependency>
	<dependency>
            <groupId>org.apache.felix</groupId>
	    <artifactId>org.apache.felix.http.wrappers</artifactId>
	    <version>1.0.0</version>
	</dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</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>
