<!--
 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">
  <parent>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix</artifactId>
    <version>1.0.3-SNAPSHOT</version>
    <relativePath>../../pom/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <groupId>org.apache.felix</groupId>
  <name>Apache Felix UPnP Base Driver</name>
  <artifactId>org.apache.felix.upnp.basedriver</artifactId>
  <version>0.3.0-SNAPSHOT</version>
  <repositories>
    <!-- For snapshots (no release jars or non-apache jars)           -->
    <repository>
      <id>snap.domoware.isti.cnr.it</id>
      <name>Domoware Snapshot Repository</name>
      <url>http://domoware.isti.cnr.it/maven2-snap</url>
      <releases>
        <enabled>false</enabled>
      </releases>
    </repository>
    <!-- For release (no snapshots jars or non-apache jars)           -->
    <repository>
      <id>release.domoware.isti.cnr.it</id>
      <name>Domoware Release Repository</name>
      <url>http://domoware.isti.cnr.it/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
  <!-- <url>http://maven.apache.org</url> -->

  <profiles>

    <profile>
      <id>jdk13</id>
      <activation>
        <property>
          <name>platform</name>
          <value>jdk13</value>
        </property>
      </activation>
      <dependencies>
        <dependency>
          <groupId>it.cnr.isti.domoware.cyberdomo</groupId>
          <artifactId>upnp-stack-jdk13</artifactId>
          <version>1.8.0-SNAPSHOT</version>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
              <instructions>
                <Bundle-Name>${pom.name}</Bundle-Name>
                <Bundle-Activator>
                  org.apache.felix.upnp.basedriver.Activator
                </Bundle-Activator>
                <Bundle-Vendor>
                  Apache Software Foundation
                </Bundle-Vendor>
                <Bundle-Author>
                  <![CDATA[Matteo Demuru <demuru@apache.org>,Francesco Furfari <furfari@apache.org>,Stefano "Kismet" Lenzi <lenzi@apache.org>]]>
                </Bundle-Author>
                <Bundle-Description>
                  A Bundle implementation of the UPnP Service
                  Specification R4
                </Bundle-Description>
                <Bundle-SymbolicName>
                  org.apache.felix.upnp.basedriver
                </Bundle-SymbolicName>
                <Export-Package>
                  org.apache.felix.upnp.basedriver.controller;version=0.1.0,
                  org.apache.felix.upnp.basedriver.util;version=0.3.0,
                  org.apache.felix.upnp.basedriver.resources;version=0.3.0,
                  org.osgi.service.upnp;version=1.1.0
                </Export-Package>
                <Import-Package>org.osgi.framework, org.osgi.service.log</Import-Package>
                <Private-Package>
                  org.apache.felix.upnp.basedriver.controller.impl,
                  org.apache.felix.upnp.basedriver.importer.*,
                  org.apache.felix.upnp.basedriver.export.*,
                  org.apache.felix.upnp.basedriver.tool,
                  org.apache.felix.upnp.basedriver,
                  org.kxml2.io, org.xmlpull.v1,
                  org.cybergarage.*,
                  org.apache.xerces.impl.dv.util
                </Private-Package>
              </instructions>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>jdk14-or-above</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <dependencies>
        <dependency>
          <groupId>it.cnr.isti.domoware.cyberdomo</groupId>
          <artifactId>upnp-stack</artifactId>
          <version>1.8.0-SNAPSHOT</version>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>1.2.1</version>
            <extensions>true</extensions>
            <configuration>
              <instructions>
                <Bundle-Name>${pom.name}</Bundle-Name>
                <Bundle-Activator>
                  org.apache.felix.upnp.basedriver.Activator
                </Bundle-Activator>
                <Bundle-Vendor>
                  Apache Software Foundation
                </Bundle-Vendor>
                <Bundle-Author>
                  <![CDATA[Matteo Demuru <demuru@apache.org>,Francesco Furfari <furfari@apache.org>,Stefano "Kismet" Lenzi <lenzi@apache.org>]]>
                </Bundle-Author>
                <Bundle-Description>
                  A Bundle implementation of the UPnP Service
                  Specification R4
                </Bundle-Description>
                <Bundle-SymbolicName>
                  org.apache.felix.upnp.basedriver
                </Bundle-SymbolicName>
                <Export-Package>
                  org.apache.felix.upnp.basedriver.controller;version=0.1.0,
                  org.apache.felix.upnp.basedriver.util;version=0.3.0,
                  org.apache.felix.upnp.basedriver.resources;version=0.3.0
                </Export-Package>
                <Import-Package>
                  org.osgi.*, javax.xml.parsers, org.w3c.dom, org.xml.sax
                </Import-Package>
                <Private-Package>
                  org.apache.felix.upnp.basedriver.controller.impl,
                  org.apache.felix.upnp.basedriver.importer.*,
                  org.apache.felix.upnp.basedriver.export.*,
                  org.apache.felix.upnp.basedriver.tool,
                  org.apache.felix.upnp.basedriver,
                  org.cybergarage.*,
                  org.apache.xerces.impl.dv.util
                </Private-Package>
              </instructions>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>


  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>1.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.compendium</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
</project>
