<!-- 
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 current 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.tamaya.ext</groupId>
        <artifactId>tamaya-sandbox</artifactId>
        <version>0.4-incubating-SNAPSHOT</version>
    </parent>

    <artifactId>tamaya-jsr382</artifactId>
    <name>Apache Tamaya Modules - JSR 382 Implementation</name>
    <packaging>jar</packaging>

    <properties>
        <jsr.version>1.0-SNAPSHOT</jsr.version>
        <maven.compile.sourceLevel>1.8</maven.compile.sourceLevel>
        <maven.compile.targetLevel>1.8</maven.compile.targetLevel>
        <JavaConfig.config.version>1.1</JavaConfig.config.version>
        <geronimo-atinject-1.0-spec.version>1.0</geronimo-atinject-1.0-spec.version>
        <geronimo-jcdi-1.1-spec.version>1.0</geronimo-jcdi-1.1-spec.version>
        <version.shrinkwrap.resolvers>2.2.6</version.shrinkwrap.resolvers>
        <arquillian.version>1.1.13.Final</arquillian.version>
        <arquillian-weld-embedded.version>2.0.0.Beta5</arquillian-weld-embedded.version>
        <cdi-api.version>2.0</cdi-api.version>
        <weld.version>3.0.1.Final</weld.version>
        <deltaspike.version>1.1.0</deltaspike.version>
        <openejb.version>4.7.1</openejb.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>java-hamcrest</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.tamaya</groupId>
            <artifactId>tamaya-core</artifactId>
            <version>${project.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tamaya</groupId>
            <artifactId>tamaya-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tamaya.ext</groupId>
            <artifactId>tamaya-injection-api</artifactId>
            <version>${project.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tamaya.ext</groupId>
            <artifactId>tamaya-functions</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tamaya.ext</groupId>
            <artifactId>tamaya-events</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
        </dependency>
        <!-- Config API -->
        <dependency>
            <groupId>com.github.eclipse</groupId>
            <artifactId>ConfigJSR</artifactId>
            <version>bdab2f22923ba83e93a841f61e177c95796cfb68</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>${cdi-api.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se-shaded</artifactId>
            <version>${weld.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- JavaConfig TCK support only -->
        <dependency>
            <groupId>org.jboss.arquillian.testng</groupId>
            <artifactId>arquillian-testng-container</artifactId>
            <version>${arquillian.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.shrinkwrap.resolver</groupId>
            <artifactId>shrinkwrap-resolver-depchain</artifactId>
            <version>${version.shrinkwrap.resolvers}</version>
            <scope>test</scope>
            <type>pom</type>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>TCK</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>javax.config</groupId>
                    <artifactId>javaconfig-tck</artifactId>
                    <version>${jsr.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.jboss.arquillian.container</groupId>
                    <artifactId>arquillian-weld-embedded</artifactId>
                    <version>${arquillian-weld-embedded.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>

            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.20.1</version>
                        <configuration>
                            <suiteXmlFiles>
                                <suiteXmlFile>src/test/tck-suite.xml</suiteXmlFile>
                            </suiteXmlFiles>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <!-- Used to resolve the latest Config JSR API release. -->
    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

</project>
