<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>ai.timefold.solver.enterprise</groupId>
    <artifactId>timefold-solver-enterprise-parent</artifactId>
    <version>2.2.0</version>
    <relativePath>../../pom.xml</relativePath>
  </parent>

  <artifactId>timefold-solver-enterprise-build-parent</artifactId>
  <packaging>pom</packaging>

  <name>Timefold Solver Enterprise Edition - Build parent</name>
  <url>https://timefold.ai</url>

  <properties>
    <!-- ************************************************************************ -->
    <!-- Dependencies -->
    <!-- ************************************************************************ -->
    <version.com.rabbitmq>5.31.0</version.com.rabbitmq>

    <version.io.quarkus>3.36.2</version.io.quarkus>
    <version.org.bouncycastle>1.84</version.org.bouncycastle>
    <version.org.springframework.boot>4.1.0</version.org.springframework.boot>
    <version.tools.jackson>3.2.0</version.tools.jackson>

    <!-- Used in a plugin dependency -->
    <version.org.mapstruct>1.6.3</version.org.mapstruct>

    <!-- ************************************************************************ -->
    <!-- Dependencies Override -->
    <!-- ************************************************************************ -->

    <version.quarkus.google-cloud-services>2.22.0</version.quarkus.google-cloud-services>
    <version.quarkus.amazon-services>3.19.0</version.quarkus.amazon-services>
    <version.quarkus.azure-services>1.2.4</version.quarkus.azure-services>
    <version.quarkus.reactive-messaging-http>2.8.0</version.quarkus.reactive-messaging-http>

    <!-- ************************************************************************ -->
    <!-- Plugins -->
    <!-- ************************************************************************ -->
    <version.compiler.plugin>3.15.0</version.compiler.plugin>
    <version.dependency.plugin>3.11.0</version.dependency.plugin>
    <version.enforcer.plugin>3.6.3</version.enforcer.plugin>
    <version.exec.plugin>3.6.3</version.exec.plugin>
    <version.failsafe-plugin>${version.surefire.plugin}</version.failsafe-plugin>
    <version.jandex.plugin>3.6.0</version.jandex.plugin>
    <version.resources.plugin>3.5.0</version.resources.plugin>
    <version.revapi.plugin>0.15.1</version.revapi.plugin>
    <version.spotless.plugin>3.6.0</version.spotless.plugin>
    <version.surefire.plugin>3.5.6</version.surefire.plugin>

    <!-- ************************************************************************ -->
    <!-- Test plugins switches -->
    <!-- ************************************************************************ -->
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>

    <!-- Latest release to be used by api-compatibility-check to check backwards compatibility of the API. -->
    <revapi.oldTimefoldVersion>2.1.0</revapi.oldTimefoldVersion>

    <!-- Plugin configuration properties -->
    <maven.min.version>3.9.11</maven.min.version>
    <maven.compiler.release>21</maven.compiler.release>
    <spotless.skip>false</spotless.skip>
    <spotless.goal>apply</spotless.goal>
    <enforcer.failOnDuplicatedClasses>true</enforcer.failOnDuplicatedClasses>
    <!--suppress UnresolvedMavenProperty-->
    <project.root.dir>${maven.multiModuleProjectDirectory}</project.root.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>ai.timefold.solver.enterprise</groupId>
        <artifactId>timefold-solver-enterprise-bom</artifactId>
        <version>${project.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--
        This will only inherit dependency management, not plugin management.
        If we wanted to include plugin management,
        we would need to extend the open-source build parent.
        We do not want that, as that would likely adversely affect the BOM too.
        Duplicating plugin configuration is arguably not a big deal,
        as opposed to duplicating dependency configuration.
      -->
      <dependency>
        <groupId>ai.timefold.solver</groupId>
        <artifactId>timefold-solver-build-parent</artifactId>
        <version>${project.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-bom</artifactId>
        <version>${version.io.quarkus}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bc-jdk18on-bom</artifactId>
        <version>${version.org.bouncycastle}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>io.quarkiverse.reactivemessaging.http</groupId>
        <artifactId>quarkus-reactive-messaging-http</artifactId>
        <version>${version.quarkus.reactive-messaging-http}</version>
      </dependency>
      <dependency>
        <groupId>io.quarkiverse.reactivemessaging.http</groupId>
        <artifactId>quarkus-reactive-messaging-http-deployment</artifactId>
        <version>${version.quarkus.reactive-messaging-http}</version>
      </dependency>
      <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>${version.com.rabbitmq}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>io.quarkus</groupId>
          <artifactId>quarkus-maven-plugin</artifactId>
          <version>${version.io.quarkus}</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>${version.dependency.plugin}</version>
        </plugin>
        <plugin>
          <artifactId>maven-enforcer-plugin</artifactId>
          <version>${version.enforcer.plugin}</version>
          <dependencies>
            <dependency>
              <groupId>org.commonjava.maven.enforcer</groupId>
              <artifactId>enforce-managed-deps-rule</artifactId>
              <version>1.3</version>
            </dependency>
            <dependency>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>extra-enforcer-rules</artifactId>
              <version>1.12.0</version>
            </dependency>
          </dependencies>
          <executions>
            <execution>
              <id>enforcement</id>
              <goals>
                <goal>enforce</goal>
              </goals>
              <configuration>
                <rules>
                  <requireFilesDontExist>
                    <files>
                      <file>${project.basedir}/src/main/resources/logback-test.xml</file>
                      <file>${project.basedir}/src/main/filtered-resources/logback-test.xml</file>
                    </files>
                  </requireFilesDontExist>
                  <requireManagedDeps>
                    <checkProfiles>true</checkProfiles>
                  </requireManagedDeps>
                  <bannedDependencies>
                    <excludes combine.children="append">
                      <!-- Ban forbidden logging deps (we only use SLF4J + Logback) -->
                      <!-- In case of transitive dependency, exclude it and use 'org.slf4j:jcl-over-slf4j' instead -->
                      <exclude>commons-logging:commons-log*</exclude>
                      <!-- In case of transitive dependency, exclude it and use 'org.apache.logging.log4j:log4j-to-slf4j' instead -->
                      <exclude>log4j:log4j</exclude>
                      <!-- In case of transitive dependency, exclude it and use 'org.javassist:javassist' instead -->
                      <exclude>javassist:javassist</exclude>
                      <exclude>org.apache.cxf:cxf-bundle-jaxrs</exclude>
                      <exclude>org.mockito:mockito-all</exclude><!-- Use mockito-core instead -->
                    </excludes>
                  </bannedDependencies>
                  <banDuplicatePomDependencyVersions/>
                </rules>
                <fail>true</fail>
              </configuration>
            </execution>
            <execution>
              <id>enforcement-duplicate-classes</id>
              <goals>
                <goal>enforce</goal>
              </goals>
              <configuration>
                <rules>
                  <banDuplicateClasses>
                    <ignoreClasses>
                      <!-- ignoring java 9 compatible class for modules -->
                      <ignoreClass>module-info</ignoreClass>
                      <!-- ignoring multirelease jar classes -->
                      <ignoreClass>META-INF/versions/*</ignoreClass>
                    </ignoreClasses>
                    <dependencies>
                      <dependency>
                        <!-- quarkus-ide-launcher is a dependency of quarkus-core that they auto exclude during the build -->
                        <groupId>io.quarkus</groupId>
                        <artifactId>quarkus-ide-launcher</artifactId>
                        <ignoreClasses>
                          <ignoreClass>*</ignoreClass>
                        </ignoreClasses>
                      </dependency>
                    </dependencies>
                    <findAllDuplicates>true</findAllDuplicates>
                  </banDuplicateClasses>
                </rules>
                <fail>${enforcer.failOnDuplicatedClasses}</fail>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.revapi</groupId>
          <artifactId>revapi-maven-plugin</artifactId>
          <version>${version.revapi.plugin}</version>
          <dependencies>
            <dependency>
              <groupId>org.revapi</groupId>
              <artifactId>revapi-java</artifactId>
              <version>0.28.4</version>
            </dependency>
          </dependencies>
          <configuration>
            <checkDependencies>false</checkDependencies>
            <oldArtifacts>
              <artifact>${project.groupId}:${project.artifactId}:${revapi.oldTimefoldVersion}</artifact>
            </oldArtifacts>
            <newArtifacts>
              <artifact>${project.groupId}:${project.artifactId}:${project.version}</artifact>
            </newArtifacts>
            <analysisConfigurationFiles>
              <file>${project.basedir}/src/build/revapi-filter.json</file>
              <file>${project.basedir}/src/build/revapi-differences.json</file>
            </analysisConfigurationFiles>
          </configuration>
          <executions>
            <execution>
              <id>check</id>
              <goals>
                <goal>check</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>${version.resources.plugin}</version>
          <configuration>
            <encoding>${project.build.sourceEncoding}</encoding>
          </configuration>
        </plugin>
        <!-- Packaging -->
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${version.jar.plugin}</version>
          <executions>
            <execution>
              <id>test-jar</id>
              <goals>
                <goal>test-jar</goal>
              </goals>
              <configuration>
                <skipIfEmpty>true</skipIfEmpty>
                <excludes>
                  <exclude>**/logback-test.xml</exclude>
                </excludes>
              </configuration>
            </execution>
          </executions>
          <configuration>
            <archive>
              <manifest>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              </manifest>
            </archive>
            <excludes>
              <!-- Remove unnecessary metadata generated by the jaxb2-maven-plugin. -->
              <exclude>META-INF/JAXB/</exclude>
              <!-- Remove the intermediate benchmark XSD that is later merged with the solver XSD. -->
              <exclude>${schema.filename.benchmark}</exclude>
            </excludes>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-source-plugin</artifactId>
          <version>${version.source.plugin}</version>
        </plugin>
        <plugin>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>${version.javadoc.plugin}</version>
          <configuration>
            <author>false</author>
            <failOnError>true</failOnError>
            <quiet>true</quiet>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${version.compiler.plugin}</version>
          <configuration>
            <release>${maven.compiler.release}</release>
            <source>${maven.compiler.release}</source>
            <target>${maven.compiler.release}</target>
            <encoding>${project.build.sourceEncoding}</encoding>
            <compilerArgs>
              <!--
                Suppress warnings about generated code to reduce log length.
                Warnings are primarily dealt with during development in the IDE.
              -->
              <compilerArgument>-Xlint:none</compilerArgument>
            </compilerArgs>
          </configuration>
          <executions>
            <execution>
              <id>default-compile</id>
              <phase>compile</phase>
              <goals>
                <goal>compile</goal>
              </goals>
              <!-- no useModulePath override here -->
            </execution>

            <!-- test compile: force classpath (no module-path) -->
            <execution>
              <id>default-testCompile</id>
              <phase>test-compile</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <configuration>
                <useModulePath>false</useModulePath>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>com.diffplug.spotless</groupId>
          <artifactId>spotless-maven-plugin</artifactId>
          <version>${version.spotless.plugin}</version>
          <dependencies>
            <dependency>
              <groupId>ai.timefold.solver</groupId>
              <artifactId>timefold-solver-ide-config</artifactId>
              <version>${project.version}</version>
            </dependency>
          </dependencies>
          <executions>
            <execution>
              <id>spotless-formatting</id>
              <phase>compile</phase>
              <goals>
                <goal>${spotless.goal}</goal>
              </goals>
              <configuration>
                <skip>${spotless.skip}</skip>
                <java>
                  <eclipse>
                    <file>eclipse-format.xml</file>
                  </eclipse>
                  <importOrder>
                    <file>eclipse.importorder</file>
                  </importOrder>
                  <removeUnusedImports/>
                  <replaceRegex> <!-- Wildcard imports will break the build. -->
                    <name>Remove wildcard imports</name>
                    <searchRegex>import\s+[^\*\s]+\*;(\r\n|\r|\n)</searchRegex>
                    <replacement>$1</replacement>
                  </replaceRegex>
                </java>
                <pom/>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>${version.assembly.plugin}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>${version.exec.plugin}</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>com.diffplug.spotless</groupId>
        <artifactId>spotless-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-enforcer-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${version.surefire.plugin}</version>
        <configuration>
          <useModulePath>false</useModulePath>
          <redirectTestOutputToFile>true</redirectTestOutputToFile>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>${version.surefire.plugin}</version>
        <configuration>
          <!-- Currently not running on the module path, despite including JPMS -->
          <useModulePath>false</useModulePath>
        </configuration>
      </plugin>
      <!-- Do not move to full profile. Otherwise upstream dependency changes can break our build without CI catching it. -->
      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>${version.dependency.plugin}</version>
        <executions>
          <execution>
            <id>analyze-only</id>
            <goals>
              <goal>analyze-only</goal>
            </goals>
            <configuration>
              <failOnWarning>true</failOnWarning>
              <ignoreNonCompile>true</ignoreNonCompile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <!-- Fail the build in CI if code does not follow the standards. -->
      <id>validate-formatting-ci</id>
      <activation>
        <property>
          <name>env.CI</name>
        </property>
      </activation>
      <properties>
        <spotless.goal>check</spotless.goal>
      </properties>
    </profile>
    <profile>
      <id>quickProfile</id>
      <activation>
        <property>
          <name>quickly</name>
        </property>
      </activation>
      <properties>
        <enforcer.skip>true</enforcer.skip>
        <revapi.skip>true</revapi.skip>
        <skipTests>true</skipTests>
        <skipITs>true</skipITs>
        <spotless.skip>true</spotless.skip>
      </properties>
    </profile>
  </profiles>
</project>
