<?xml version="1.0" encoding="UTF-8"?>
<!--
    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">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.apache.felix</groupId>
		<artifactId>felix-parent</artifactId>
		<version>2.1</version>
		<relativePath>../../pom/pom.xml</relativePath>
	</parent>

	<artifactId>org.apache.felix.dependencymanager.test2</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>bundle</packaging>

	<name>Apache Felix Dependency Manager Integration Tests 2</name>

	<properties>
		<bundle.build.name>
			${basedir}/target
		</bundle.build.name>
		<bundle.file.name>
			${bundle.build.name}/${project.build.finalName}.jar
		</bundle.file.name>

		<felix.build.source>5</felix.build.source>
		<felix.build.target>5</felix.build.target>
		<felix.java.signature.artifactId>java15</felix.java.signature.artifactId>
		<exam.version>3.0.0</exam.version>
		<url.version>1.5.2</url.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>5.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>5.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.dependencymanager</artifactId>
			<version>3.1.1-SNAPSHOT</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.6</version>
			<scope>provided</scope>
		</dependency>

		<!-- Integration Testing with Pax Exam -->
		<dependency>
			<groupId>org.ops4j.pax.exam</groupId>
			<artifactId>pax-exam-container-native</artifactId>
			<version>${exam.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.ops4j.pax.exam</groupId>
			<artifactId>pax-exam-junit4</artifactId>
			<version>${exam.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.ops4j.pax.exam</groupId>
			<artifactId>pax-exam-link-mvn</artifactId>
			<version>${exam.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.ops4j.pax.url</groupId>
			<artifactId>pax-url-aether</artifactId>
			<version>${url.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.framework</artifactId>
			<version>4.2.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>0.9.20</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>0.9.20</version>
			<scope>test</scope>
		</dependency>

		<!-- Dependency Manager Annotations -->
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.dependencymanager.annotation</artifactId>
			<version>3.1.1-SNAPSHOT</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- Build the bundle which contains various components used by integration tests -->
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>2.3.7</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-Name>Apache Felix Dependency Manager Annotations Tests</Bundle-Name>
						<Bundle-SymbolicName>org.apache.felix.dependencymanager.test2.components</Bundle-SymbolicName>
						<Export-Package>org.apache.felix.dependencymanager.test2.components</Export-Package>
					</instructions>
				</configuration>
			</plugin>
			
			<!-- java 5 required for annotations support -->
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
				</configuration>
			</plugin>
			
			<!-- DM annotation plugin used to parse annotations from org.apache.felix.dependencymanager.test2.components artifact -->
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>org.apache.felix.dependencymanager.annotation</artifactId>
				<version>3.1.1-SNAPSHOT</version>
				<executions>
					<execution>
						<goals>
							<goal>scan</goal>
						</goals>
						<configuration>
							<log>debug</log>
							<!-- generated-output-dir>.</generated-output-dir> -->
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- We have no unit tests, we only have integration tests -->
			<plugin>
				<artifactId>maven-surefire-plugin</artifactId>
				<executions>
					<execution>
						<id>surefire-it</id>
						<phase>integration-test</phase>
						<goals>
							<goal>test</goal>
						</goals>
						<configuration>
							<systemProperties>
								<property>
									<name>project.bundle.file</name>
									<value>${bundle.file.name}</value>
								</property>
							</systemProperties>
							<excludes>
								<exclude>**/components/*</exclude>
							</excludes>
							<includes>
								<!-- By default, all integration tests are run. For running a specific test, 
								     you can specify a given test below: for example:
								     <include>**/integration/**/AspectBaseTest.java</include>
								-->
								<include>**/integration/**/*.java</include>
							</includes>
						</configuration>
					</execution>
				</executions>
				<configuration>
					<excludes>
						<exclude>**/integration/**</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
