<!--
 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>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <name>iPOJO Event Admin Handler</name>
  <groupId>org.apache.felix</groupId>
  <version>0.7.5-SNAPSHOT</version>
  <artifactId>org.apache.felix.ipojo.handler.event</artifactId>
	  
  <dependencies>
	  <dependency>
  			<groupId>org.apache.felix</groupId>
      		<artifactId>org.apache.felix.ipojo</artifactId>
	        <version>0.7.5-SNAPSHOT</version>
	  </dependency>
	  <dependency>
  			<groupId>org.apache.felix</groupId>
      		<artifactId>org.apache.felix.ipojo.metadata</artifactId>
	      	<version>0.7.5-SNAPSHOT</version>
	  </dependency>
	  <dependency>
  			<groupId>org.apache.felix</groupId>
      		<artifactId>org.osgi.core</artifactId>
      		<version>1.1.0-SNAPSHOT</version>
	  </dependency>
	  <dependency>
	     <groupId>org.apache.felix</groupId>
  		 <artifactId>org.osgi.compendium</artifactId>
         <version>0.9.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>
            <Private-Package>org.apache.felix.ipojo.handler.event</Private-Package>
            <Bundle-Name>${pom.name}</Bundle-Name>
            <Bundle-SymbolicName>ipojo.event.admin.handler</Bundle-SymbolicName>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
	      <groupId>org.apache.felix</groupId>
	      <artifactId>maven-ipojo-plugin</artifactId>
          <version>${pom.version}</version>
		  <executions>
          	<execution>
            	<goals>
	              <goal>ipojo-bundle</goal>
               </goals>
            <configuration>
   				<metadata>metadata.xml</metadata>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
