<!--
	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>ipojo.tests</groupId>
		<artifactId>ipojo.tests</artifactId>
		<version>1.5.0-SNAPSHOT</version>
	</parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>ipojo.tests</groupId>
  <artifactId>tests.transactions</artifactId>
  <packaging>jar</packaging>
  <version>1.5.0-SNAPSHOT</version>
  <name>iPOJO Transaction Handler Test Suite</name>
  <dependencies>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.ipojo</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.ipojo.metadata</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.ipojo.annotations</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.transaction</artifactId>
      <version>0.9.0-SNAPSHOT</version>
    </dependency>
        <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.ipojo.handler.transaction</artifactId>
      <version>${pom.version}</version>
    </dependency>

    <dependency>
      <groupId>org.ow2.chameleon.testing</groupId>
      <artifactId>osgi-helpers</artifactId>
    </dependency>
  <!--
    Pax Exam API:
  -->
  <dependency>
    <groupId>org.ops4j.pax.exam</groupId>
    <artifactId>pax-exam</artifactId>
    <version>1.2.0</version>
  </dependency>
  <!--
    During runtime Pax Exam will discover the OSGi container to use by
    searching metadata available into classpath. Pax Exam comes with a
    default container that uses [Pax Runner] for implementing the
    container requirements:
  -->
  <dependency>
    <groupId>org.ops4j.pax.exam</groupId>
    <artifactId>pax-exam-container-default
    </artifactId>
    <version>1.2.0</version>
  </dependency>
  <!--
    If your test code is based on JUnit you will have to have the Junit
    support artifact:
  -->
  <dependency>
    <groupId>org.ops4j.pax.exam</groupId>
    <artifactId>pax-exam-junit</artifactId>
    <version>1.2.0</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.5</version>
    <type>jar</type>
    <scope>test</scope>
  </dependency>
  <!--  Tinybundles -->
  <dependency>
    <groupId>org.ops4j.pax.swissbox</groupId>
    <artifactId>pax-swissbox-tinybundles</artifactId>
    <version>1.2.0</version>
  </dependency>
   <dependency>
      <groupId>org.ow2.chameleon.testing</groupId>
      <artifactId>tinybundles-ipojo</artifactId>
  </dependency>
   <dependency>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
      <version>2.4.0</version>
    </dependency>
   <dependency>
     <groupId>org.ops4j.pax.logging</groupId>
     <artifactId>pax-logging-api</artifactId>
     <version>1.4</version>
   </dependency>
   <dependency>
     <groupId>org.ops4j.pax.logging</groupId>
     <artifactId>pax-logging-service</artifactId>
     <version>1.4</version>
     <exclusions>
     	<exclusion>
     		<artifactId>jmxtools</artifactId>
     		<groupId>com.sun.jdmk</groupId>
     	</exclusion>
     	<exclusion>
     		<artifactId>jmxri</artifactId>
     		<groupId>com.sun.jmx</groupId>
     	</exclusion>
     </exclusions>
   </dependency>

  </dependencies>

  <repositories>
    <repository>
      <id>ops4j.releases</id>
      <name>OPS4J Release</name>
      <url> http://repository.ops4j.org/maven2/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

    <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.servicemix.tooling</groupId>
        <artifactId>depends-maven-plugin</artifactId>
        <version>1.2</version>
        <executions>
          <execution>
            <id>generate-depends-file</id>
            <goals>
              <goal>generate-depends-file</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      </plugins>
      </build>
</project>
