<?xml version="1.0" encoding="UTF-8"?>
<!--

    This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).

    The MIT License
    Copyright © 2014-2022 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.26.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <inceptionYear>2014-2022</inceptionYear>
  <name>Java Design Patterns</name>
  <description>Java Design Patterns</description>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <sonar-maven-plugin.version>3.11.0.3922</sonar-maven-plugin.version>
    <spring-boot.version>2.7.5</spring-boot.version>
    <jacoco.version>0.8.11</jacoco.version>
    <commons-dbcp.version>1.4</commons-dbcp.version>
    <htmlunit.version>4.1.0</htmlunit.version>
    <gson.version>2.10.1</gson.version>
    <guice.version>5.1.0</guice.version>
    <system-lambda.version>1.1.0</system-lambda.version>
    <maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
    <maven-checkstyle-plugin.version>3.3.0</maven-checkstyle-plugin.version>
    <license-maven-plugin.version>4.3</license-maven-plugin.version>
    <urm-maven-plugin.version>2.1.1</urm-maven-plugin.version>
    <slf4j.version>2.0.13</slf4j.version>
    <logback.version>1.5.6</logback.version>
    <!-- SonarCloud -->
    <sonar.host.url>https://sonarcloud.io</sonar.host.url>
    <sonar.organization>iluwatar</sonar.organization>
    <sonar.projectKey>iluwatar_java-design-patterns</sonar.projectKey>
    <sonar.moduleKey>${project.artifactId}</sonar.moduleKey>
    <sonar.projectName>Java Design Patterns</sonar.projectName>
  </properties>
  <modules>
    <module>abstract-factory</module>
    <module>collecting-parameter</module>
    <module>monitor</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-of-responsibility</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>version-number</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>pipeline</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>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>fluentinterface</module>
    <module>reactor</module>
    <module>caching</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>hexagonal</module>
    <module>abstract-document</module>
    <module>aggregator-microservices</module>
    <module>promise</module>
    <module>page-controller</module>
    <module>page-object</module>
    <module>event-based-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>retry</module>
    <module>dirty-flag</module>
    <module>trampoline</module>
    <module>ambassador</module>
    <module>acyclic-visitor</module>
    <module>collection-pipeline</module>
    <module>master-worker-pattern</module>
    <module>spatial-partition</module>
    <module>priority-queue</module>
    <module>commander</module>
    <module>typeobjectpattern</module>
    <module>bytecode</module>
    <module>leader-election</module>
    <module>data-locality</module>
    <module>subclass-sandbox</module>
    <module>circuit-breaker</module>
    <module>role-object</module>
    <module>saga</module>
    <module>double-buffer</module>
    <module>sharding</module>
    <module>game-loop</module>
    <module>combinator</module>
    <module>update-method</module>
    <module>leader-followers</module>
    <module>strangler</module>
    <module>arrange-act-assert</module>
    <module>transaction-script</module>
    <module>registry</module>
    <module>filterer</module>
    <module>factory</module>
    <module>separated-interface</module>
    <module>special-case</module>
    <module>parameter-object</module>
    <module>active-object</module>
    <module>model-view-viewmodel</module>
    <module>composite-entity</module>
    <module>table-module</module>
    <module>presentation-model</module>
    <module>lockable-object</module>
    <module>fanout-fanin</module>
    <module>domain-model</module>
    <module>composite-view</module>
    <module>metadata-mapping</module>
    <module>service-to-worker</module>
    <module>client-session</module>
    <module>model-view-intent</module>
    <module>embedded-value</module>
    <module>currying</module>
    <module>serialized-entity</module>
    <module>identity-map</module>
    <module>component</module>
    <module>context-object</module>
    <module>thread-local-storage</module>
    <module>optimistic-offline-lock</module>
    <module>crtp</module>
    <module>log-aggregation</module>
    <module>anti-corruption-layer</module>
    <module>health-check</module>
    <module>notification</module>
    <module>single-table-inheritance</module>
    <module>dynamic-proxy</module>
    <module>gateway</module>
    <module>slob</module>
    <module>server-session</module>
  </modules>
  <repositories>
    <repository>
      <id>jitpack.io</id>
      <url>https://jitpack.io</url>
    </repository>
  </repositories>
  <dependencyManagement>
    <dependencies>
      <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>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>${commons-dbcp.version}</version>
      </dependency>
      <dependency>
        <groupId>org.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>${htmlunit.version}</version>
      </dependency>
      <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>${gson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>${guice.version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.stefanbirkner</groupId>
        <artifactId>system-lambda</artifactId>
        <version>${system-lambda.version}</version>
        <scope>test</scope>
      </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>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>17</source>
            <target>17</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>${maven-surefire-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <!-- Maven assembly plugin template for all child project to follow -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
              <configuration>
                <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- below two line make sure the fat jar is sharing the same name
                                    as of project name -->
                <finalName>${project.artifactId}</finalName>
                <appendAssemblyId>false</appendAssemblyId>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.sonarsource.scanner.maven</groupId>
          <artifactId>sonar-maven-plugin</artifactId>
          <version>${sonar-maven-plugin.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>${maven-checkstyle-plugin.version}</version>
        <executions>
          <execution>
            <id>validate</id>
            <goals>
              <goal>check</goal>
            </goals>
            <phase>validate</phase>
            <configuration>
              <configLocation>google_checks.xml</configLocation>
              <suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>

              <failOnViolation>true</failOnViolation>
              <violationSeverity>warning</violationSeverity>
              <includeTestSourceDirectory>false</includeTestSourceDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>com.mycila</groupId>
        <artifactId>license-maven-plugin</artifactId>
        <version>${license-maven-plugin.version}</version>
        <configuration>
          <licenseSets>
            <licenseSet>
              <multi>
                <preamble><![CDATA[This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).]]></preamble>
                <header>com/mycila/maven/plugin/license/templates/MIT.txt</header>
              </multi>
              <excludes>
                <exclude>**/README</exclude>
                <exclude>src/test/resources/**</exclude>
                <exclude>src/main/resources/**</exclude>
                <exclude>checkstyle-suppressions.xml</exclude>
              </excludes>
            </licenseSet>
          </licenseSets>
          <properties>
            <owner>Ilkka Seppälä</owner>
            <email>iluwatar@gmail.com</email>
          </properties>
        </configuration>
        <executions>
          <execution>
            <id>install-format</id>
            <phase>install</phase>
            <goals>
              <goal>format</goal>
            </goals>
          </execution>
        </executions>
      </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>
          <execution>
            <id>report</id>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>com.iluwatar.urm</groupId>
        <artifactId>urm-maven-plugin</artifactId>
        <version>${urm-maven-plugin.version}</version>
        <configuration>
          <!-- if outputDirectory is not set explicitly it will default to your build dir -->
          <outputDirectory>${project.basedir}/etc</outputDirectory>
          <packages>
            <param>com.iluwatar</param>
          </packages>
          <includeMainDirectory>true</includeMainDirectory>
          <includeTestDirectory>false</includeTestDirectory>
          <presenter>plantuml</presenter>
        </configuration>
        <executions>
          <execution>
            <phase>process-classes</phase>
            <goals>
              <goal>map</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
