<!--
 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> -->

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>1.4.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>The 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.*;-split-package:=merge-first,
              org.cybergarage.*,
              org.apache.xerces.impl.dv.util
            </Private-Package>
          </instructions>
	  <excludeDependencies>upnp-stack-jdk13</excludeDependencies>
        </configuration>
	<executions>
	  <execution>
	    <id>jdk13</id>
	    <goals><goal>bundle</goal></goals>
	    <configuration>
	      <classifier>jdk13</classifier>
              <manifestLocation>${project.build.outputDirectory}/META-INF-jdk13</manifestLocation>
              <excludeDependencies>upnp-stack</excludeDependencies>
              <instructions>
                <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.*;-split-package:=merge-first,
                  org.cybergarage.*,
		  org.kxml2.io, org.xmlpull.v1,
                  org.apache.xerces.impl.dv.util
                </Private-Package>
              </instructions>
	    </configuration>
	  </execution>
	</executions>
      </plugin>      
    </plugins>
  </build>


  <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>
    <dependency>
      <groupId>it.cnr.isti.domoware.cyberdomo</groupId>
      <artifactId>upnp-stack</artifactId>
      <version>1.8.0-SNAPSHOT</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>it.cnr.isti.domoware.cyberdomo</groupId>
      <artifactId>upnp-stack-jdk13</artifactId>
      <version>1.8.0-SNAPSHOT</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>
