<?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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.taverna</groupId>
        <artifactId>apache-taverna-parent</artifactId>
        <version>2-incubating</version>
    </parent>

    <groupId>org.apache.taverna.engine</groupId>
    <artifactId>apache-taverna-engine</artifactId>
    <version>3.1.0-incubating</version>
    <packaging>pom</packaging>
    <name>Apache Taverna Engine and Platform</name>

    <properties>
        <taverna.language.version>0.15.1-incubating</taverna.language.version>
        <taverna.osgi.version>0.2.1-incubating</taverna.osgi.version>
                <servicemix.derby.version>10.12.1.1_1</servicemix.derby.version> 
    </properties>

    <modules>
        <!-- TODO: see separate branch taverna-platform-integration-tests -->
        <!-- <module>taverna-platform-integration-tests</module> --> 

        <!-- TODO: see separate branch taverna-integration-tests -->
        <!-- <module>taverna-integration-tests</module> --> 

        <module>taverna-activity-archetype</module>
        <module>taverna-activity-test-utils</module>
        <module>taverna-capability-api</module>
        <module>taverna-capability-impl</module>
        <module>taverna-credential-manager-api</module>
        <module>taverna-credential-manager-impl</module>
        <module>taverna-database-configuration-api</module>
        <module>taverna-database-configuration-impl</module>

        <module>taverna-dataflow-activity</module>
        <module>taverna-execution-api</module>
        <module>taverna-execution-hadoop</module>
        <module>taverna-execution-impl</module>
        <module>taverna-execution-local</module>
        <module>taverna-execution-remote</module>
        <module>taverna-observer</module>

        <!-- FIXME: Upgrade to T3 <module>taverna-prov</module> 
        <module>taverna-prov-owl-bindings</module>
-->
        <!-- <module>taverna-provenanceconnector</module> -->
        <module>taverna-reference-api</module>
        <module>taverna-reference-impl</module>
        <module>taverna-reference-testhelpers</module>
        <module>taverna-reference-types</module>
        <module>taverna-report-api</module>
        <module>taverna-run-api</module>
        <module>taverna-run-impl</module>
        <module>taverna-services-api</module>
        <module>taverna-services-impl</module>
        <module>taverna-stringconstant-activity</module>
        <module>taverna-workflowmodel-api</module>
        <module>taverna-workflowmodel-extensions</module>
        <module>taverna-workflowmodel-impl</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
            <groupId>org.apache.rat</groupId>
            <artifactId>apache-rat-plugin</artifactId>
                <configuration>
                    <excludes combine.children="append">
                        <exclude>**/mimetype</exclude> <!-- really a binary file -->
                        <exclude>**/*.txt</exclude> <!-- workflow values -->
                        <exclude>**/src/main/resources/archetype-resources/</exclude> <!-- Don't want our archetype to generate ASF headers -->
                        <exclude>**/META-INF/spring.*</exclude> <!-- Miniscule spring marker files -->
                        <exclude>**/workflowrun.json</exclude> <!-- example workflow run report -->
        
                        <exclude>**/org/pingel/util/CrossProduct.java</exclude> <!-- BSD 3-Clause (see NOTICE) -->
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <links>
                        <link>https://taverna.incubator.apache.org/javadoc/taverna-language/</link>
                        <link>https://taverna.incubator.apache.org/javadoc/taverna-osgi/</link>
                    </links>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <scm>
        <connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-taverna-engine.git</connection>
        <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-taverna-engine.git</developerConnection>
        <url>https://github.com/apache/incubator-taverna-engine</url>
        <tag>3.1.0-incubating-RC3</tag>
    </scm>

    <repositories>
        <repository>
            <id>apache.snapshots</id>
            <name>Apache Snapshot Repository</name>
            <url>https://repository.apache.org/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>



</project>
