<?xml version="1.0" encoding="UTF-8"?>
<!--
    The MIT License
    Copyright (c) 2014-2016 Ilkka Seppälä
    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:
    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.
--><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>
    <groupId>com.iluwatar</groupId>
    <artifactId>java-design-patterns</artifactId>
    <version>1.19.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <inceptionYear>2014</inceptionYear>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hibernate.version>5.0.1.Final</hibernate.version>
        <spring.version>4.2.4.RELEASE</spring.version>
        <spring-boot.version>1.3.3.RELEASE</spring-boot.version>
        <spring-data.version>1.9.2.RELEASE</spring-data.version>
        <h2.version>1.4.190</h2.version>
        <junit.version>4.12</junit.version>
        <junit-jupiter.version>5.0.2</junit-jupiter.version>
        <junit-vintage.version>${junit.version}.2</junit-vintage.version>
        <junit-platform.version>1.0.2</junit-platform.version>
        <sping-test-junit5.version>1.0.2</sping-test-junit5.version>
        <compiler.version>3.0</compiler.version>
        <jacoco.version>0.7.9</jacoco.version>
        <commons-dbcp.version>1.4</commons-dbcp.version>
        <camel.version>2.16.1</camel.version>
        <guava.version>19.0</guava.version>
        <mockito.version>1.10.19</mockito.version>
        <apache-httpcomponents.version>4.5.2</apache-httpcomponents.version>
        <htmlunit.version>2.22</htmlunit.version>
        <guice.version>4.0</guice.version>
        <mongo-java-driver.version>3.3.0</mongo-java-driver.version>
        <slf4j.version>1.7.21</slf4j.version>
        <logback.version>1.1.7</logback.version>
    </properties>
    <modules>
        <module>abstract-factory</module>
        <module>tls</module>
        <module>builder</module>
        <module>factory-method</module>
        <module>prototype</module>
        <module>singleton</module>
        <module>adapter</module>
        <module>bridge</module>
        <module>composite</module>
        <module>dao</module>
        <module>data-mapper</module>
        <module>decorator</module>
        <module>facade</module>
        <module>flyweight</module>
        <module>proxy</module>
        <module>chain</module>
        <module>command</module>
        <module>interpreter</module>
        <module>iterator</module>
        <module>mediator</module>
        <module>memento</module>
        <module>model-view-presenter</module>
        <module>observer</module>
        <module>state</module>
        <module>strategy</module>
        <module>template-method</module>
        <module>visitor</module>
        <module>double-checked-locking</module>
        <module>servant</module>
        <module>service-locator</module>
        <module>null-object</module>
        <module>event-aggregator</module>
        <module>callback</module>
        <module>execute-around</module>
        <module>property</module>
        <module>intercepting-filter</module>
        <module>producer-consumer</module>
        <module>poison-pill</module>
        <module>reader-writer-lock</module>
        <module>lazy-loading</module>
        <module>service-layer</module>
        <module>specification</module>
        <module>tolerant-reader</module>
        <module>model-view-controller</module>
        <module>flux</module>
        <module>double-dispatch</module>
        <module>multiton</module>
        <module>resource-acquisition-is-initialization</module>
        <module>thread-pool</module>
        <module>twin</module>
        <module>private-class-data</module>
        <module>object-pool</module>
        <module>dependency-injection</module>
        <module>naked-objects</module>
        <module>front-controller</module>
        <module>repository</module>
        <module>async-method-invocation</module>
        <module>monostate</module>
        <module>step-builder</module>
        <module>business-delegate</module>
        <module>half-sync-half-async</module>
        <module>layers</module>
        <module>message-channel</module>
        <module>fluentinterface</module>
        <module>reactor</module>
        <module>caching</module>
        <module>publish-subscribe</module>
        <module>delegation</module>
        <module>event-driven-architecture</module>
        <module>api-gateway</module>
        <module>factory-kit</module>
        <module>feature-toggle</module>
        <module>value-object</module>
        <module>module</module>
        <module>monad</module>
        <module>mute-idiom</module>
        <module>mutex</module>
        <module>semaphore</module>
        <module>hexagonal</module>
        <module>abstract-document</module>
        <module>aggregator-microservices</module>
        <module>promise</module>
        <module>page-object</module>
        <module>event-asynchronous</module>
        <module>event-queue</module>
        <module>queue-load-leveling</module>
        <module>object-mother</module>
        <module>data-bus</module>
        <module>converter</module>
        <module>guarded-suspension</module>
        <module>balking</module>
        <module>extension-objects</module>
        <module>marker</module>
        <module>cqrs</module>
        <module>event-sourcing</module>
        <module>data-transfer-object</module>
        <module>throttling</module>
        <module>unit-of-work</module>
        <module>partial-response</module>
        <module>eip-wire-tap</module>
        <module>eip-splitter</module>
        <module>eip-aggregator</module>
        <module>retry</module>
		<module>trampoline</module>
    </modules>

    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
                <version>${spring-data.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>${apache-httpcomponents.version}</version>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>${h2.version}</version>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>${commons-dbcp.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-core</artifactId>
                <version>${camel.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-stream</artifactId>
                <version>${camel.version}</version>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>${junit-jupiter.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
                <version>${junit-jupiter.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-params</artifactId>
                <version>${junit-jupiter.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-migrationsupport</artifactId>
                <version>${junit-jupiter.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
                <version>${junit-vintage.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.github.sbrannen</groupId>
                <artifactId>spring-test-junit5</artifactId>
                <version>${sping-test-junit5.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>${mockito.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>${guava.version}</version>
            </dependency>
            <dependency>
                <groupId>net.sourceforge.htmlunit</groupId>
                <artifactId>htmlunit</artifactId>
                <version>${htmlunit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.google.inject</groupId>
                <artifactId>guice</artifactId>
                <version>${guice.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongo-java-driver</artifactId>
                <version>${mongo-java-driver.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <!-- This plugin's configuration is used to store Eclipse m2e settings
                    only. It has no influence on the Maven build itself. TODO: Remove when the
                    m2e plugin can correctly bind to Maven lifecycle -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>org.jacoco</groupId>
                                        <artifactId>
                                            jacoco-maven-plugin
                                        </artifactId>
                                        <versionRange>
                                            [0.6.2,)
                                        </versionRange>
                                        <goals>
                                            <goal>prepare-agent</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore/>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <!-- Tell maven to compile using Java 8 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler.version}</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco.version}</version>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!--checkstyle plug-in. checking against googles styles
               see config at checkstyle.xml
            -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.17</version>
                <executions>
                    <execution>
                        <id>validate</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <phase>validate</phase>
                        <configuration>
                            <configLocation>checkstyle.xml</configLocation>
                            <suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>
                            <encoding>UTF-8</encoding>
                            <consoleOutput>true</consoleOutput>
                            <failsOnError>true</failsOnError>
                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${junit-platform.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <argLine>-Xmx1024M --add-modules java.xml.bind,java.xml.ws.annotation ${argLine}</argLine>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.6</version>
                <configuration>
                    <failOnViolation>true</failOnViolation>
                    <failurePriority>5</failurePriority>
                    <printFailingErrors>true</printFailingErrors>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <excludeFromFailureFile>exclude-pmd.properties</excludeFromFailureFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>com.mycila</groupId>
                <artifactId>license-maven-plugin</artifactId>
                <version>2.11</version>
                <configuration>
                    <header>com/mycila/maven/plugin/license/templates/MIT.txt</header>
                    <properties>
                        <owner>Ilkka Seppälä</owner>
                    </properties>
                    <skipExistingHeaders>true</skipExistingHeaders>
                </configuration>
                <executions>
                    <execution>
                        <id>install-format</id>
                        <phase>install</phase>
                        <goals>
                            <goal>format</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.6</version>
            </plugin>
        </plugins>
    </reporting>

</project>