<!--
 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.2</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>
            <version>1.2.0</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>
                <!--Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
                  <Embed-Transitive>true</Embed-Transitive-->
                <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.*</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.0</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.1.0-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.compendium</artifactId>
      <version>1.0.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>
