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

    Copyright 2013-2025 chronicle.software; SPDX-License-Identifier: Apache-2.0

-->

<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>net.openhft</groupId>
        <artifactId>root-parent-pom</artifactId>
        <version>2026.XYZ</version>
        <relativePath/>
    </parent>

    <artifactId>java-parent-pom</artifactId>
    <version>2026.XYZ</version>
    <packaging>pom</packaging>

    <name>OpenHFT/Java Parent POM</name>
    <description>This parent pom is used by all the OpenHft java projects</description>

    <organization>
        <name>Chronicle Software Ltd</name>
        <url>https://chronicle.software/</url>
    </organization>

    <properties>
        <sonar.organization>openhft</sonar.organization>
        <sonar.host.url>https://sonarcloud.io</sonar.host.url>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <license.year>2013-2025</license.year>
        <license.owner>chronicle.software</license.owner>
        <license.spdx>Apache-2.0</license.spdx>
        <license.skip>false</license.skip>
        <quality.enforced>true</quality.enforced>
        <quality.version>2026.XYZ</quality.version>
        <slf4j.version>2.0.17</slf4j.version>

        <pmd.targetJdk>1.8</pmd.targetJdk>
        <pmd.includeTests>true</pmd.includeTests>
        <pmd.ruleset>net/openhft/quality/pmd26/pmd-ruleset.xml</pmd.ruleset>
        <pmd.skip>false</pmd.skip>
        <pmdVersion>7.19.0</pmdVersion>

        <pitest.version>1.22.0</pitest.version>
        <pitest.junit5.version>1.2.3</pitest.junit5.version>
        <pitest.targetClasses>${project.groupId}.**</pitest.targetClasses>
        <pitest.targetTests>${project.groupId}.**</pitest.targetTests>
        <pitest.mutationThreshold>70</pitest.mutationThreshold>
        <pitest.coverageThreshold>80</pitest.coverageThreshold>
        <pitest.threads>4</pitest.threads>
        <pitest.timeoutFactor>2</pitest.timeoutFactor>
        <pitest.jvmArgs>-Xmx2g</pitest.jvmArgs>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.mycila</groupId>
                <artifactId>license-maven-plugin</artifactId>
                <version>4.6</version>
                <configuration>
                    <skip>${license.skip}</skip>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <strictCheck>true</strictCheck>
                    <defaultProperties>
                        <year>${license.year}</year>
                        <owner>${license.owner}</owner>
                        <spdx>${license.spdx}</spdx>
                    </defaultProperties>
                    <mapping>
                        <java>SLASHSTAR_STYLE</java>
                        <sh>SCRIPT_STYLE</sh>
                    </mapping>
                    <licenseSets>
                        <licenseSet>
                            <inlineHeader><![CDATA[Copyright ${license.year} ${license.owner}; SPDX-License-Identifier: ${license.spdx}]]></inlineHeader>
                            <includes>
                                <include>**/*.java</include>
                                <include>**/*.sh</include>
                            </includes>
                            <excludes>
                                <exclude>**/target/**</exclude>
                                <exclude>**/generated-sources/**</exclude>
                                <exclude>**/build/generated/**</exclude>
                                <exclude>**/src/test/resources/**</exclude>
                                <exclude>**/src/main/resources/**</exclude>
                            </excludes>
                            <useDefaultExcludes>true</useDefaultExcludes>
                        </licenseSet>
                    </licenseSets>
                </configuration>
                <executions>
                    <execution>
                        <id>license-check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <arg>-Xlint:all,-options,-processing</arg>
                        <arg>-parameters</arg>
                    </compilerArgs>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <failOnWarning>${quality.enforced}</failOnWarning>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                    <proc>none</proc>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <argLine>@{argLine} ${jvm.requiredArgs} ${jvm.extraArgs} -Djvm.coverage=true</argLine>
                    <systemPropertyVariables>
                        <project.build.directory>${project.build.directory}</project.build.directory>
                    </systemPropertyVariables>
                    <enableAssertions>true</enableAssertions>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-scm-publish-plugin</artifactId>
                <configuration>
                    <checkoutDirectory>${project.build.directory}/scmpublish/javadoc</checkoutDirectory>
                    <checkinComment>Publishing javadoc for ${project.artifactId}:${project.version}</checkinComment>
                    <content>${project.reporting.outputDirectory}</content>
                    <skipDeletedFiles>true</skipDeletedFiles>
                    <pubScmUrl>scm:git:git@github.com:OpenHFT/${project.artifactId}
                    </pubScmUrl>
                    <scmBranch>gh-pages</scmBranch>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-javadocs</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <source>8</source>
                    <failOnError>true</failOnError>
                    <failOnWarnings>${quality.enforced}</failOnWarnings>
                    <excludePackageNames>*.internal:*.internal.*;*.impl;*.impl.*</excludePackageNames>
                    <doclint>all,-missing</doclint>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <profiles>
        <profile>
            <id>quality</id>
            <properties>
                <quality.enforced>true</quality.enforced>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-checkstyle-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>validate</id>
                                <phase>validate</phase>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <configLocation>net/openhft/quality/checkstyle26/chronicle-baseline-checkstyle.xml</configLocation>
                            <failOnViolation>${quality.enforced}</failOnViolation>
                            <logViolationsToConsole>true</logViolationsToConsole>
                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
                            <violationSeverity>warning</violationSeverity>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>com.puppycrawl.tools</groupId>
                                <artifactId>checkstyle</artifactId>
                                <version>9.3</version>
                            </dependency>
                            <dependency>
                                <groupId>net.openhft</groupId>
                                <artifactId>quality</artifactId>
                                <version>${quality.version}</version>
                            </dependency>
                        </dependencies>
                    </plugin>
                    <plugin>
                        <groupId>com.github.spotbugs</groupId>
                        <artifactId>spotbugs-maven-plugin</artifactId>
                        <!-- SpotBugs 4.8 line for Java 8 compatibility -->
                        <configuration>
                            <effort>Max</effort>
                            <threshold>Low</threshold>
                            <includeTests>true</includeTests>
                            <failOnError>${quality.enforced}</failOnError>
                            <!-- Shared SpotBugs filters from quality rules -->
                            <includeFilterFile>net/openhft/quality/spotbugs26/chronicle-spotbugs-include.xml</includeFilterFile>
                            <excludeFilterFile>net/openhft/quality/spotbugs26/chronicle-spotbugs-exclude.xml</excludeFilterFile>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>net.openhft</groupId>
                                <artifactId>quality</artifactId>
                                <version>${quality.version}</version>
                            </dependency>
                        </dependencies>
                        <executions>
                            <execution>
                                <id>spotbugs-main</id>
                                <!-- Run after compilation of main and test classes, and gate on findings -->
                                <phase>process-test-classes</phase>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-pmd-plugin</artifactId>
                        <configuration>
                            <rulesets>
                                <ruleset>${pmd.ruleset}</ruleset>
                            </rulesets>
                            <excludeRoots>
                                <excludeRoot>${project.build.directory}/generated-sources</excludeRoot>
                                <excludeRoot>${project.build.directory}/generated-test-sources</excludeRoot>
                                <excludeRoot>${project.build.directory}/classes</excludeRoot>
                                <excludeRoot>${project.build.directory}/test-classes</excludeRoot>
                            </excludeRoots>
                            <excludes>
                                <exclude>**/target/**</exclude>
                                <exclude>**/build/**</exclude>
                                <exclude>**/out/**</exclude>
                                <exclude>**/generated/**</exclude>
                            </excludes>
                            <includeTests>${pmd.includeTests}</includeTests>
                            <failOnViolation>${quality.enforced}</failOnViolation>
                            <targetJdk>${pmd.targetJdk}</targetJdk>
                            <skip>${pmd.skip}</skip>
                            <printFailingErrors>true</printFailingErrors>
                            <linkXRef>false</linkXRef>
                            <format>xml</format>
                            <outputFormat>xdoc</outputFormat>
                            <skipEmptyReport>true</skipEmptyReport>
                            <analysisCache>true</analysisCache>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>net.sourceforge.pmd</groupId>
                                <artifactId>pmd-core</artifactId>
                                <version>${pmdVersion}</version>
                            </dependency>
                            <dependency>
                                <groupId>net.sourceforge.pmd</groupId>
                                <artifactId>pmd-java</artifactId>
                                <version>${pmdVersion}</version>
                            </dependency>
                            <dependency>
                                <groupId>net.openhft</groupId>
                                <artifactId>quality</artifactId>
                                <version>${quality.version}</version>
                            </dependency>
                        </dependencies>
                        <executions>
                            <execution>
                                <id>pmd-check</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>cpd-check</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>cpd-check</goal>
                                </goals>
                                <configuration>
                                    <failOnViolation>${quality.enforced}</failOnViolation>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>jacoco</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>prepare-agent</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                                <configuration>
                                    <propertyName>argLine</propertyName>
                                </configuration>
                            </execution>
                            <execution>
                                <id>report</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>report</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>check</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                                <configuration>
                                    <rules>
                                        <rule>
                                            <element>BUNDLE</element>
                                            <limits>
                                                <limit>
                                                    <counter>LINE</counter>
                                                    <value>COVEREDRATIO</value>
                                                    <minimum>${jacoco.line.coverage}</minimum>
                                                </limit>
                                                <limit>
                                                    <counter>BRANCH</counter>
                                                    <value>COVEREDRATIO</value>
                                                    <minimum>${jacoco.branch.coverage}</minimum>
                                                </limit>
                                            </limits>
                                        </rule>
                                    </rules>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>pitest</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.pitest</groupId>
                        <artifactId>pitest-maven</artifactId>
                        <version>${pitest.version}</version>
                        <dependencies>
                            <dependency>
                                <groupId>org.pitest</groupId>
                                <artifactId>pitest-junit5-plugin</artifactId>
                                <version>${pitest.junit5.version}</version>
                            </dependency>
                        </dependencies>
                        <configuration>
                            <targetClasses>
                                <param>${pitest.targetClasses}</param>
                            </targetClasses>
                            <targetTests>
                                <param>${pitest.targetTests}</param>
                            </targetTests>
                            <threads>${pitest.threads}</threads>
                            <timeoutFactor>${pitest.timeoutFactor}</timeoutFactor>
                            <jvmArgs>
                                <param>${pitest.jvmArgs}</param>
                            </jvmArgs>
                            <outputFormats>
                                <param>HTML</param>
                                <param>XML</param>
                            </outputFormats>
                            <mutationThreshold>${pitest.mutationThreshold}</mutationThreshold>
                            <coverageThreshold>${pitest.coverageThreshold}</coverageThreshold>
                            <fullMutationMatrix>true</fullMutationMatrix>
                        </configuration>
                        <executions>
                            <execution>
                                <id>pit</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>mutationCoverage</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <scm>
        <connection>scm:git:git@github.com:OpenHFT/OpenHFT.git</connection>
        <developerConnection>scm:git:git@github.com:OpenHFT/OpenHFT.git</developerConnection>
        <url>scm:git:git@github.com:OpenHFT/OpenHFT.git</url>
        <tag>ea</tag>
    </scm>
</project>
