<!--
    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 R7 OSGi Http Service and the R7 OSGi Http Whiteboard Specification</description>

    <artifactId>org.apache.felix.http.jetty</artifactId>
    <version>5.0.0-SNAPSHOT</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>HEAD</tag>
  </scm>

    <properties>
        <felix.java.version>11</felix.java.version>
        <jetty.version>11.0.7</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
                        </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
                                </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)",
                                    org.eclipse.jetty.webapp;resolution:=optional,
                                    *
                                </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</groupId>
            <artifactId>jetty-webapp</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.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.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</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>
