<?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>
        <artifactId>apache-james-mpt</artifactId>
        <groupId>org.apache.james</groupId>
        <version>3.0.0-RC1</version>
        <relativePath>../..</relativePath>
    </parent>

    <artifactId>apache-james-mpt-imapmailbox</artifactId>
    <name>Apache James MPT Imap Mailbox</name>
    <packaging>pom</packaging>

    <modules>
        <module>core</module>
        <module>cassandra</module>
        <module>cyrus</module>
        <module>elasticsearch</module>
        <module>external-james</module>
        <module>hbase</module>
        <module>inmemory</module>
        <module>jcr</module>
        <module>jpa</module>
        <module>maildir</module>
        <module>lucenesearch</module>
    </modules>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-cassandra</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-core</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-hbase</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-inmemory</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-jcr</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-jpa</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-maildir</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-cyrus</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-elasticsearch</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>apache-james-mpt-imapmailbox-jpa-lucene</artifactId>
                <version>${project.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <cassandra.includes>empty</cassandra.includes>
        <hbase.includes>empty</hbase.includes>
        <inmemory.includes>empty</inmemory.includes>
        <jcr.includes>empty</jcr.includes>
        <jpa.includes>empty</jpa.includes>
        <maildir.includes>empty</maildir.includes>
        <cyrus.includes>empty</cyrus.includes>
        <elasticsearch.includes>empty</elasticsearch.includes>
        <jpa-lucene.includes>empty</jpa-lucene.includes>
    </properties>

    <profiles>
        <profile>
            <id>cassandra</id>
            <properties>
                <cassandra.includes>**/cassandra/**/*.java</cassandra.includes>
            </properties>
        </profile>
        <profile>
            <id>hbase</id>
            <properties>
                <hbase.includes>**/hbase/**/*.java</hbase.includes>
            </properties>
        </profile>
        <profile>
            <id>inmemory</id>
            <properties>
                <inmemory.includes>**/inmemory/**/*.java</inmemory.includes>
            </properties>
        </profile>
        <profile>
            <id>jcr</id>
            <properties>
                <jcr.includes>**/jcr/**/*.java</jcr.includes>
            </properties>
        </profile>
        <profile>
            <id>jpa</id>
            <properties>
                <jpa.includes>**/jpa/**/*.java</jpa.includes>
            </properties>
        </profile>
        <profile>
            <id>jpa-lucene</id>
            <properties>
                <jpa-lucene.includes>**/lucenesearch/**/*.java</jpa-lucene.includes>
            </properties>
        </profile>
        <profile>
            <id>maildir</id>
            <properties>
                <maildir.includes>**/maildir/**/*.java</maildir.includes>
            </properties>
        </profile>
        <profile>
            <id>cyrus</id>
            <properties>
                <cyrus.includes>**/cyrus/**/*.java</cyrus.includes>
            </properties>
        </profile>
        <profile>
            <id>elasticsearch</id>
            <properties>
                <elasticsearch.includes>**/elasticsearch/**/*.java</elasticsearch.includes>
            </properties>
        </profile>
    </profiles>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                       <excludes>
                           <exclude>**/suite/*.java</exclude>
                           <exclude>**/suite/**/*.java</exclude>
                       </excludes>
                       <includes>
                           <include>${cassandra.includes}, ${hbase.includes}, ${inmemory.includes}, ${jcr.includes}, ${jpa.includes}, ${maildir.includes}, ${cyrus.includes}, 
${elasticsearch.includes}, ${jpa-lucene.includes}</include>
                       </includes>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

