<!--
 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>2.1</version>
        <relativePath />
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>bundle</packaging>
    <name>Apache Felix Declarative Services</name>
    <description>
        Implementation of the Declarative Services specification 1.2
    </description>
    <artifactId>org.apache.felix.scr</artifactId>
    <version>1.8.3-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>
        <felix.ca.version>1.8.0</felix.ca.version>
    </properties>
    
    
    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.annotation</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.enterprise</artifactId>
            <version>5.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.utils</artifactId>
            <version>1.4.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>${project.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>org.apache.felix</groupId>
            <artifactId>org.apache.felix.gogo.runtime</artifactId>
            <version>0.6.1</version>
            <scope>provided</scope>
        </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>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-container-forked</artifactId>
            <version>3.2.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-junit4</artifactId>
            <version>3.2.0</version>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-link-mvn</artifactId>
            <version>3.2.0</version>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>org.ops4j.pax.url</groupId>
            <artifactId>pax-url-aether</artifactId>
            <version>1.4.0.RC1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.url</groupId>
            <artifactId>pax-url-wrap</artifactId>
            <version>1.4.0.RC1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.logging</groupId>
            <artifactId>pax-logging-api</artifactId>
            <version>1.6.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.logging</groupId>
            <artifactId>pax-logging-service</artifactId>
            <version>1.6.3</version>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>0.9.29</version>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.29</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.configadmin</artifactId>
            <version>1.8.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-atinject_1.0_spec</artifactId>
            <version>1.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.servicemix.bundles</groupId>
            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
            <version>4.9_2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.base</groupId>
            <artifactId>ops4j-base-lang</artifactId>
            <version>1.2.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.base</groupId>
            <artifactId>ops4j-base-net</artifactId>
            <version>1.2.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.tinybundles</groupId>
            <artifactId>tinybundles</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
		<dependency>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>animal-sniffer-annotations</artifactId>
			<version>1.9</version>
			<scope>compile</scope>
		</dependency>
    </dependencies>
    <build>
        <directory>${bundle.build.name}</directory>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.4.0</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <_include>-bnd.bnd</_include>
<!--                         <Bundle-Category>osgi</Bundle-Category>
                        <Bundle-SymbolicName>
                            ${project.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=1.8,
                            org.apache.felix.scr.component;version=1.0;
                                mandatory:="status"; status="provisional",
                            org.osgi.service.component,
                            org.osgi.service.component.runtime.*,
                            org.osgi.dto,
                            org.osgi.framework.dto
                        </Export-Package>
                        <Private-Package>
                            org.apache.felix.scr.impl.*,
                            org.osgi.util.tracker,
                            org.apache.felix.utils.extender
                        </Private-Package>
                        <Import-Package>
                            
                                Configuration Admin is optional and dynamic, but allow eager
                                wiring by importing it
                           
                            org.osgi.service.cm;version="[1.2,2)";resolution:=optional,

                            
                                Metatype import is optional and dynamic, but allow eager
                                wiring by importing it
                           
                            org.osgi.service.metatype;version="[1.1,2)";resolution:=optional,
                            
                                optional import for Gogo annotations 
                           
                            org.apache.felix.service.command;resolution:=optional,
                            
                            
                                The Felix Shell support is optional 
                           
                            org.apache.felix.shell;provide:=true;resolution:=optional,
                            
                            
                                Framework version 1.4 (from R4.1) is required
                                because we depend on ServiceReference being
                                Comparable and Bundle.getBundleContext method
                                being available.
                           
                            org.osgi.framework;version="[1.4,2)",
                            
                            
                                LogService is optional but if present the
                                R4.0 version 1.3 is sufficient.
                           
                            org.osgi.service.log;version="[1.3,2)";resolution:=optional,

                            
                                PackageAdmin is used to find reference types if
                                the component's bundle does not import it.
                                See BindMethod.getParameterClass(Class) for details.
                                R4.0 version 1.2 is sufficient. 
                           
                            org.osgi.service.packageadmin;version="[1.2,2)";resolution:=optional,
                            
                            
                                SCR API is required (we also export it) and must
                                be of the same minor version as we export, because
                                we implement that exact version. This import is
                                only used if the framework decides to wire the
                                bundle to another API provider.
                                (version is automatically deduced from export) 
                           
                            org.osgi.service.component;provide:=true,

                            
                                SCR Admin API is required (we also export it) and
                                must be of the same minor version as we export,
                                because we implement that exact version. This
                                import is only used if the framework decides to
                                wire the bundle to another API provider. 
                           
                            org.apache.felix.scr;provide:=true
                        </Import-Package>
                        <DynamicImport-Package>
                            
                                Configuration Admin version 1.2 (from R4.0) is enough
                           
                            org.osgi.service.cm;version="[1.2,2)",
                            
                            
                                Metatype is optional and if it is
                                present, version 1.1 (from R4.1) is enough  
                           
                            org.osgi.service.metatype;version="[1.1,2)"
                        </DynamicImport-Package>
                        <Embed-Dependency>
                            kxml2;inline=org/kxml2/io/KXmlParser.class|org/xmlpull/v1/XmlPull**,
                        </Embed-Dependency>
 -->                    </instructions>
                </configuration>
            </plugin>

            <!--
                Ensure not using too recent Java API
                - Ensure Java 5 API
            -->
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>animal-sniffer-maven-plugin</artifactId>
                <version>1.7</version>
                <configuration>
                    <signature>
                        <groupId>org.codehaus.mojo.signature</groupId>
                        <artifactId>java15</artifactId>
                        <version>1.0</version>
                    </signature>
                </configuration>
                <executions>
                    <execution>
                        <phase>test</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!--
                Configure default compilation for Java 5
            -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>

            <!-- plain unit tests -->
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>**/integration/**</exclude>
                        <exclude>**/components/**</exclude>
                        <exclude>**/instances/**</exclude>
                        <exclude>**/instances2/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- integration tests run with pax-exam -->
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.12</version>
                <executions>
                  <execution>
                    <goals>
                      <goal>integration-test</goal>
                      <goal>verify</goal>
                    </goals>
                  </execution>
                </executions>
                <configuration>
                    <systemPropertyVariables>
                        <project.bundle.file>${bundle.file.name}</project.bundle.file>
                        <felix.ca.version>${felix.ca.version}</felix.ca.version>    
                    </systemPropertyVariables>
                    <excludes>
                        <exclude>**/components/**</exclude>
                    </excludes>
                    <includes>
                        <include>**/integration/**</include>
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <excludePackageNames>*.impl</excludePackageNames>
                </configuration>
            </plugin>
             <plugin>
                <groupId>org.apache.aries.versioning</groupId>
                <artifactId>org.apache.aries.versioning.plugin</artifactId>
                <version>0.1.0</version>
                <executions>
                    <execution>
                        <id>default-verify</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>version-check</goal>
                        </goals>
                        <configuration>
                            <oldArtifact>org.apache.felix:org.apache.felix.scr:1.6.2</oldArtifact>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

	<reporting>
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>findbugs-maven-plugin</artifactId>
				<version>2.5.2</version>
				<configuration>
					<effort>Max</effort>
					<threshold>Low</threshold>
				</configuration>
			</plugin>
		</plugins>
	</reporting>

    <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>
                        <executions>
                            <execution>
                                <id>scr-file-create</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <target>
                                        <copy file="${project.build.directory}/${project.build.finalName}.jar" tofile="${project.build.directory}/scr.jar" />
                                    </target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <profile>
            <id>felix</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.apache.felix.framework</artifactId>
                    <version>4.0.2</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>equinox</id>
            <dependencies>
                <dependency>
                    <groupId>org.eclipse</groupId>
                    <artifactId>org.eclipse.osgi</artifactId>
                    <version>3.8.0.v20120529-1548</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <!--  use to test with R4 ca, without change count, targetetPids, location changed event -->
            <!--  remember you need to specify all profiles using this, e.g. -PcaR4,felix -->
            <id>caR4</id>
            <properties>
                <felix.ca.version>1.0.10</felix.ca.version>
            </properties>
        </profile>
    </profiles>
        
</project>
