<!--
  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.1</version>
    <relativePath>../../pom/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <name>Apache Felix iPOJO</name>
  <artifactId>org.apache.felix.ipojo</artifactId>
  <groupId>org.apache.felix</groupId>
  <version>1.6.6</version>

  <properties>
    <ipojo.package.version>1.6.0</ipojo.package.version>
  </properties>

  <description>
  iPOJO Core bundle
  </description>
  <url>
  http://ipojo.org
  </url>

  <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.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.ipojo.metadata</artifactId>
      <version>1.4.0</version>
    </dependency>
    <dependency>
      <groupId>asm</groupId>
      <artifactId>asm-all</artifactId>
      <version>3.0</version>
      <exclusions>
        <exclusion>
          <groupId>asm</groupId>
          <artifactId>asm-tree</artifactId>
        </exclusion>
      </exclusions>
    </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-Name>Apache Felix iPOJO</Bundle-Name>
            <Bundle-Vendor> The Apache Software Foundation </Bundle-Vendor>
            <Bundle-SymbolicName>org.apache.felix.ipojo;singleton:=true</Bundle-SymbolicName>
            <Bundle-Description> iPOJO Core Framework </Bundle-Description>
            <Bundle-Activator> org.apache.felix.ipojo.Extender
            </Bundle-Activator>
            <Bundle-DocURL>
              http://felix.apache.org/site/apache-felix-ipojo.html
            </Bundle-DocURL>
            <IPOJO-Extension>
              component:org.apache.felix.ipojo.ComponentFactory,
              handler:org.apache.felix.ipojo.HandlerManagerFactory
            </IPOJO-Extension>
            <Import-Package>
              org.osgi.framework;version=1.3, <!-- To support KF 2 -->
              org.osgi.service.cm,
              org.osgi.service.log,
              !net.sourceforge.cobertura.* <!--  To support code coverage -->
            </Import-Package>
            <Private-Package>
              org.apache.felix.ipojo.handlers.architecture,
              org.apache.felix.ipojo.handlers.lifecycle.callback,
              org.apache.felix.ipojo.handlers.lifecycle.controller
            </Private-Package>
            <Export-Package>
              org.apache.felix.ipojo; version="${ipojo.package.version}",
              org.apache.felix.ipojo.metadata; version="${ipojo.package.version}",
              org.apache.felix.ipojo.architecture; version="${ipojo.package.version}",
              org.apache.felix.ipojo.parser; version="${ipojo.package.version}",
              org.apache.felix.ipojo.util; version="${ipojo.package.version}",
              org.apache.felix.ipojo.handlers.dependency; version="${ipojo.package.version}",
              org.apache.felix.ipojo.handlers.providedservice.*; version="${ipojo.package.version}",
              org.apache.felix.ipojo.handlers.configuration; version="${ipojo.package.version}",
              org.apache.felix.ipojo.context; version="${ipojo.package.version}",
              org.osgi.service.cm,
              org.osgi.service.log,
              org.objectweb.asm; version=3.0
            </Export-Package>
            <Include-Resource>
              META-INF/LICENSE=LICENSE,
              META-INF/NOTICE=NOTICE, META-INF/LICENSE.asm=LICENSE.asm,
              META-INF/DEPENDENCIES=DEPENDENCIES
            </Include-Resource>
            <_donotcopy> (CVS|.svn|.+.bak|~.+|metadata.xml) </_donotcopy>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-ipojo-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
          <execution>
            <goals>
              <goal>ipojo-bundle</goal>
            </goals>
            <configuration>
              <metadata>metadata.xml</metadata>
              <ignoreAnnotations>true</ignoreAnnotations>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>rat-maven-plugin</artifactId>
        <configuration>
          <excludeSubProjects>false</excludeSubProjects>
          <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
          <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
          <excludes>
            <param>doc/**/*</param>
            <param>maven-eclipse.xml</param>
            <param>.checkstyle</param>
            <param>.externalToolBuilders/*</param>
            <param>LICENSE.asm</param>
            <param>.fbprefs</param>
            <param>DEPENDENCIES</param>
          </excludes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <configuration>
          <enableRulesSummary>false</enableRulesSummary>
          <violationSeverity>warning</violationSeverity>
          <configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
        </configuration>
      </plugin>
    </plugins>

    <resources>
		<resource>
			<directory>src/main/resources</directory>
		</resource>
		<resource>
			<directory>.</directory>
			<targetPath>META-INF</targetPath>
			<includes>
				<include>LICENSE*</include>
				<include>NOTICE*</include>
				<include>DEPENDENCIES*</include>
			</includes>
		</resource>
	</resources>

  </build>

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