<!--
	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>
	<artifactId>org.apache.felix.ipojo.handler.temporal</artifactId>
	<groupId>org.apache.felix</groupId>
	<version>1.3.0-SNAPSHOT</version>
	<name>Apache Felix iPOJO Temporal Service Dependency Handler</name>
	<dependencies>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>1.0.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo</artifactId>
			<version>${pom.version}</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>
						<Private-Package>
							org.apache.felix.ipojo.handler.temporal,
							org.objectweb.asm
						</Private-Package>
						<Bundle-Name>${pom.name}</Bundle-Name>
						<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
						<Import-Package>!org.objectweb.asm.tree, *</Import-Package>
						<Bundle-Vendor> The Apache Software Foundation </Bundle-Vendor>
						<Bundle-Description> iPOJO Temporal Dependency Handler
						</Bundle-Description>
						<Bundle-DocURL>
							http://felix.apache.org/site/temporal-service-dependency.html
						</Bundle-DocURL>
						<Include-Resource> META-INF/LICENCE=LICENSE,
							META-INF/LICENCE.asm=LICENSE.asm,
							META-INF/NOTICE=NOTICE
						 </Include-Resource>
					</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>
			<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>
					</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>
	</build>
</project>