<?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>3-SNAPSHOT</version>
        <relativePath>../pom/pom.xml</relativePath>
    </parent>

    <artifactId>org.apache.felix.configadmin</artifactId>
    <version>1.2.9-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <name>Apache Felix Configuration Admin Service</name>
    <description>
        Implementation of the OSGi Configuration Admin Service Specification 1.2
    </description>

    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/configadmin</connection>
        <developerConnection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/configadmin</developerConnection>
        <url>http://svn.apache.org/repos/asf/felix/configadmin</url>
    </scm>

    <!--
        A Note on Testing
        =================
        
        This project contains two kinds of tests: regular unit tests running
        in the test phase and integration tests based on PAX Exam running
        in the integration-test phase.
        
        Basically the complete project is build using Java 1.3 source and target
        compatibility (as inherited from the parent pom). The exception are the
        unit tests in the "integration" packages. These have to be compiled with
        Java 5 source and target compatibility because the employ annotations
        and generics.
        
        For running the integration tests from the console using Maven nothing
        special has to be done as the tests run automatically. To run the tests
        in your IDE, the project has to be built to the "package" phase with
        the profile "ide" enabled:
        
             $ mvn -Pide clean package
             
        This creates the scr.jar file in the target folder, which is used by
        the integration tests when run from the IDE. Alternatively the
        "project.bundle.file" system property may be set to the bundle JAR
        in the IDE launcher. 
    -->
    <properties>
        <bundle.build.name>
            ${basedir}/target
        </bundle.build.name>
        <bundle.file.name>
            ${bundle.build.name}/${project.build.finalName}.jar
        </bundle.file.name>

		<api-package-version>1.0</api-package-version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
        
        <!-- Integration Testing with Pax Exam -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam</artifactId>
            <version>0.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-junit</artifactId>
            <version>0.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-container-default</artifactId>
            <version>0.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.swissbox</groupId>
            <artifactId>pax-swissbox-tinybundles</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.5-SNAPSHOT</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-Category>osgi</Bundle-Category>
                        <Bundle-SymbolicName>
                            ${artifactId}
                        </Bundle-SymbolicName>
                        <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
                        <Bundle-DocURL>
                            http://felix.apache.org/site/apache-felix-config-admin.html
                        </Bundle-DocURL>
                        <Bundle-Activator>
                            org.apache.felix.cm.impl.ConfigurationManager
                        </Bundle-Activator>
                        <Export-Package>
                            org.apache.felix.cm;
                            org.apache.felix.cm.file;version=${api-package-version};provide:=true,
                            org.osgi.service.cm;provide:=true
                        </Export-Package>
                        <Private-Package>
                            org.apache.felix.cm.impl,
                            org.osgi.util.tracker
                        </Private-Package>
                        <Import-Package>
                            *
                        </Import-Package>
                        <DynamicImport-Package>
                            org.osgi.service.log;version="1.3"
                        </DynamicImport-Package>
						<Export-Service>
							org.osgi.service.cm.ConfigurationAdmin;
								service.description="Configuration Admin Service Specification 1.3 Implementation";
								service.pid="org.osgi.service.cm.ConfigurationAdmin";
								service.vendor="Apache Software Foundation",
							org.apache.felix.cm.PersistenceManager;
								service.description="Platform Filesystem Persistence Manager";
								service.pid="org.apache.felix.cm.file.FilePersistenceManager";
								service.vendor="Apache Software Foundation"
						</Export-Service>
						<Import-Service>
							org.osgi.service.log.LogService;availability:=optional;multiple:=false
						</Import-Service>
                    </instructions>
                </configuration>
            </plugin>
            <!--
                configure default compilation for Java 1.3 and integration
                test compilation for Java 5 (since integration tests use
                Java Annotations for Pax Exam)
            -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>test-compile-java5</id>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                            <testExcludes>
                                <testExclude>**/cm/*</testExclude>
                                <testExclude>**/cm/file/*</testExclude>
                                <testExclude>**/cm/impl/**</testExclude>
                            </testExcludes>
                            <testIncludes>
                                <testInclude>**/integration/**</testInclude>
                            </testIncludes>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <testExcludes>
                        <testExclude>**/integration/**</testExclude>
                    </testExcludes>
                </configuration>
            </plugin>

            <!--
                Exclude Integration tests in (default) unit tests and
                conversely enable integration tests for integration testing
                only. Helper classes are completely excluded from testing. 
            -->
            <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>**/cm/*</exclude>
                                <exclude>**/cm/file/*</exclude>
                                <exclude>**/cm/impl/**</exclude>
                            </excludes>
                            <includes>
                                <include>**/integration/*</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>**/integration/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    <profiles>
        <!--
            copy the package such that IDEs may easily use it without
            setting the system property
        -->
        <profile>
            <id>ide</id>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.3</version>
                        <executions>
                            <execution>
                                <id>cm-file-create</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <tasks>
                                        <copy file="${project.build.directory}/${project.build.finalName}.jar" tofile="${project.build.directory}/configadmin.jar" />
                                    </tasks>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    
    <!-- repositories for Pax Exam and BND tool -->
    <repositories>
        <repository>
            <id>ops4j</id>
            <name>ops4j</name>
            <url>http://repository.ops4j.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>aqute</id>
            <name>aqute</name>
            <url>http://www.aqute.biz/repo</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>
