<!--
 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>
  <groupId>ipojo.tests</groupId>
  <artifactId>ipojo.tests</artifactId>
  <version>1.5.0-SNAPSHOT</version>
  <name>Apache Felix iPOJO Tests</name>
  <packaging>pom</packaging>

  <repositories>
      <repository>
          <releases>
              <enabled>false</enabled>
          </releases>
          <id>ow2.snapshots</id>
          <name>OW2 Snapshot Repository</name>
          <url>http://maven.ow2.org/maven2-snapshot/</url>
      </repository>

    <repository>
      <id>apache.snapshots</id>
      <name>snapshot plugins</name>
      <url>http://repository.apache.org/snapshots</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>apache.plugins.snapshots</id>
      <name>snapshot plugins</name>
      <url>http://repository.apache.org/snapshots</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </pluginRepository>
  </pluginRepositories>

  <properties>
    <ipojo.core.release>1.8.2</ipojo.core.release>
    <ipojo.core.snapshot>1.9.0-SNAPSHOT</ipojo.core.snapshot>

    <ipojo.api.release>1.6.0</ipojo.api.release>
    <ipojo.api.snapshot>1.7.0-SNAPSHOT</ipojo.api.snapshot>

    <ipojo.composite.release>1.8.2</ipojo.composite.release>
    <ipojo.composite.snapshot>1.9.0-SNAPSHOT</ipojo.composite.snapshot>

    <ipojo.eah.release>1.6.0</ipojo.eah.release>
    <ipojo.eah.snapshot>1.9.0-SNAPSHOT</ipojo.eah.snapshot>
    <ipojo.temporal.snapshot>1.7.0-SNAPSHOT</ipojo.temporal.snapshot>
    <ipojo.wbp.snapshot>1.6.1-SNAPSHOT</ipojo.wbp.snapshot>

    <ipojo.manipulator.release>1.8.6</ipojo.manipulator.release>
    <ipojo.manipulator.snapshot>1.9.0-SNAPSHOT</ipojo.manipulator.snapshot>
  </properties>

  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.ipojo</artifactId>
            <version>${ipojo.core.snapshot}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.ipojo.annotations</artifactId>
            <version>${ipojo.core.snapshot}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.ipojo.api</artifactId>
            <version>${ipojo.api.release}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.ipojo.composite</artifactId>
            <version>${ipojo.composite.snapshot}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
            <version>${ipojo.manipulator.release}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
              <groupId>org.apache.felix</groupId>
              <artifactId>org.apache.felix.ipojo.metadata</artifactId>
              <version>1.4.0</version>
           </dependency>

        <dependency>
            <groupId>org.ow2.chameleon.testing</groupId>
            <artifactId>tinybundles-ipojo</artifactId>
            <version>0.2.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ow2.chameleon.testing</groupId>
            <artifactId>osgi-helpers</artifactId>
            <version>0.2.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
  </dependencyManagement>

  <modules>
  <module>manipulator/manipulation</module>
  <module>manipulator/metadata</module>
  <module>manipulator/primitives</module>
  <module>manipulator/creation</module>
  <module>core/factories</module>
  <module>core/lifecycle-controller</module>
  <module>core/service-providing</module>
  <module>core/lifecycle-callback</module>
  <module>core/service-dependency</module>
  <module>core/service-dependency-bindingpolicy</module>
  <module>core/service-dependency-filter</module>
  <module>core/service-dependency-comparator</module>
  <module>core/service-providing-strategies</module>
  <module>core/service-providing-inheritance</module>
  <module>core/service-dependency-optional</module>
  <module>core/configuration</module>
  <module>core/handler</module>
  <module>core/external-handlers</module>
  <module>core/bad-configurations</module>
  <module>core/logger</module>
  <module>core/factory-version</module>
  <module>composite/composite-runtime</module>
  <module>composite/import-export</module>
  <module>composite/service-instance</module>
  <module>composite/service-providing</module>
  <module>handler/temporal</module>
  <module>handler/whiteboard</module>
  <module>handler/eventadmin</module>
  <module>core/configadmin</module>
  <module>api</module>
  <module>online-manipulator</module>
  </modules>

  <build>
      <pluginManagement>
          <plugins>
              <plugin>
                  <groupId>org.apache.felix</groupId>
                  <artifactId>maven-ipojo-plugin</artifactId>
                  <version>${ipojo.manipulator.snapshot}</version>
              </plugin>
              <plugin>
                  <groupId>org.apache.felix</groupId>
                  <artifactId>maven-bundle-plugin</artifactId>
                  <version>2.0.1</version>
              </plugin>
          </plugins>
      </pluginManagement>
  </build>
  <profiles>
    <profile>
      <id>java5</id>
      <activation>
        <jdk>1.5</jdk>
      </activation>
      <modules>
        <module>core/annotations</module>
        <module>manipulator/manipulator-java5</module>
        <module>handler/jmx</module>
        <module>handler/transaction</module>
      </modules>
    </profile>
    <profile>
      <id>java6</id>
      <activation>
        <jdk>1.6</jdk>
      </activation>
      <modules>
        <module>core/annotations</module>
        <module>manipulator/manipulator-java5</module>
        <module>handler/jmx</module>
        <module>handler/transaction</module>
      </modules>
    </profile>

    <profile>
      <id>integration-tests</id>
      <modules>
        <module>integration-tests</module>
      </modules>
    </profile>
  </profiles>

</project>
