<!--
 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-parent</artifactId>
        <version>1.2.0</version>
        <relativePath>../../pom/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>bundle</packaging>
    <name>Apache Felix EventAdmin</name>
    <description>
	    This bundle provides an implementation of the OSGi R4 EventAdmin service.
    </description>
    <version>1.2.2</version>
    <artifactId>org.apache.felix.eventadmin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>concurrent</groupId>
            <artifactId>concurrent</artifactId>
            <version>1.3.4</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>1.4.3</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>
                            ${pom.artifactId} 
	                    </Bundle-SymbolicName>
  	                    <Bundle-Activator>
                            ${pom.artifactId}.impl.Activator
                        </Bundle-Activator>
                        <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
                        <DynamicImport-Package>
                            org.osgi.service.log
                        </DynamicImport-Package>
                        <Import-Package>
                            !org.osgi.service.log,
                            <!--
                                Configuration Admin is optional and if it is
                                present, version 1.2 (from R4.0) is enough  
                            -->
                            org.osgi.service.cm;version="[1.2,2)";resolution:=optional,
                            
                            <!--
                                Metatype is optional and if it is
                                present, version 1.1 (from R4.1) is enough  
                            -->
                            org.osgi.service.metatype;version="[1.1,2)";resolution:=optional,
                            
                            <!-- default -->
                            *
                        </Import-Package>
                        <Export-Package>org.osgi.service.event</Export-Package>
                        <Private-Package>org.apache.felix.eventadmin.impl.*</Private-Package>
                        <Import-Service>
            	            org.osgi.service.event.EventHandler, org.osgi.service.log.LogService, org.osgi.service.log.LogReaderService
                        </Import-Service>
                        <Export-Service>
            	            org.osgi.service.event.EventAdmin
                        </Export-Service>
                        <Embed-Dependency>
                            concurrent;inline="EDU/oswego/cs/dl/util/concurrent/*"
                        </Embed-Dependency>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

  <scm>
    <connection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.eventadmin-1.2.2</connection>
    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.eventadmin-1.2.2</developerConnection>
    <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.eventadmin-1.2.2</url>
  </scm>
</project>
