<!--
 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>
    <name>Apache Felix Declarative Services</name>
    <description>
        Implementation of the Declarative Services specification 1.0
    </description>
    <artifactId>org.apache.felix.scr</artifactId>
    <version>1.0.9-SNAPSHOT</version>
    <scm>
        <connection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/scr</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/scr</developerConnection>
        <url>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/scr</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>
    </properties>
    
    
    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.1.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>
        <dependency>
            <groupId>${pom.groupId}</groupId>
            <artifactId>org.apache.felix.shell</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.osgi.core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>net.sf.kxml</groupId>
            <artifactId>kxml2</artifactId>
            <version>2.2.2</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>
        <directory>${bundle.build.name}</directory>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>
                            ${artifactId}
                        </Bundle-SymbolicName>
                        <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
                        <Bundle-DocURL>
                            http://felix.apache.org/site/apache-felix-service-component-runtime.html
                        </Bundle-DocURL>
                        <Bundle-Activator>
                            org.apache.felix.scr.impl.Activator
                        </Bundle-Activator>
                        <Export-Package>
                            org.apache.felix.scr;version=${pom.version},
                            org.osgi.service.component
                        </Export-Package>
                        <Private-Package>
                            org.apache.felix.scr.impl.*,
                            org.osgi.util.tracker
                        </Private-Package>
                        <Import-Package>
                            <!--
                                The Felix Shell support is optional 
                            -->
                            org.apache.felix.shell; resolution:=optional,
                            
                            <!--
                                Framework version 1.3 (from R4.0) is enough,
                                the Bundle.getBundleContext method is guarded
                            -->
                            org.osgi.framework;version=1.3,
                            
                            <!--
                                Configuration Admin is optional and if it is
                                present, version 1.2 (from R4.0) is enough  
                            -->
                            org.osgi.service.cm;version=1.2;resolution:=optional
                        </Import-Package>
                        <DynamicImport-Package>
                            org.osgi.service.log
                        </DynamicImport-Package>
                        <Embed-Dependency>
                            kxml2
                        </Embed-Dependency>
                    </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>
                            <testIncludes>
                                <testInclude>**/integration/**</testInclude>
                            </testIncludes>
                            <testExcludes>
                                <testExclude>**/impl/**</testExclude>
                            </testExcludes>
                        </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>**/components/**</exclude>
                            </excludes>
                            <includes>
                                <include>**/integration/*</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>**/integration/**</exclude>
                        <exclude>**/components/**</exclude>
                        <exclude>**/instances/**</exclude>
                        <exclude>**/instances2/**</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>scr-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}/scr.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>
