<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ QQQ - Low-code Application Framework for Engineers.
  ~ Copyright (C) 2021-2022.  Kingsrook, LLC
  ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
  ~ contact@kingsrook.com
  ~ https://github.com/Kingsrook/
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU Affero General Public License as
  ~ published by the Free Software Foundation, either version 3 of the
  ~ License, or (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  ~ GNU Affero General Public License for more details.
  ~
  ~ You should have received a copy of the GNU Affero General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  -->

<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.kingsrook.qqq</groupId>
   <artifactId>qqq-parent-project</artifactId>
   <version>${revision}</version>
   <packaging>pom</packaging>

   <modules>
      <module>qqq-backend-core</module>
      <module>qqq-backend-module-api</module>
      <module>qqq-backend-module-filesystem</module>
      <module>qqq-backend-module-rdbms</module>
      <module>qqq-language-support-javascript</module>
      <module>qqq-middleware-picocli</module>
      <module>qqq-middleware-javalin</module>
      <module>qqq-middleware-lambda</module>
      <module>qqq-utility-lambdas</module>
      <module>qqq-sample-project</module>
   </modules>

   <properties>
      <revision>0.10.0-SNAPSHOT</revision>

      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
      <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>
      <maven.compiler.showWarnings>true</maven.compiler.showWarnings>
      <coverage.haltOnFailure>true</coverage.haltOnFailure>
      <coverage.instructionCoveredRatioMinimum>0.80</coverage.instructionCoveredRatioMinimum>
      <coverage.classCoveredRatioMinimum>0.95</coverage.classCoveredRatioMinimum>
      <plugin.shade.phase>none</plugin.shade.phase>
   </properties>

   <profiles>
      <profile>
         <!-- For qqq-middleware-lambda - to build its shaded jar, its qqq dependencies also need
          to build a shaded jar.  So to activate that mode, use this profile (-P buildShadedJar)-->
         <id>buildShadedJar</id>
         <properties>
            <plugin.shade.phase>package</plugin.shade.phase>
         </properties>
      </profile>
   </profiles>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>3.1.2</version>
         </dependency>
         <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.17.1</version>
         </dependency>
         <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.17.1</version>
         </dependency>
         <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
         </dependency>
         <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
         </dependency>
         <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.23.1</version>
            <scope>test</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <!-- plugins specifically for this module -->
         <!-- none at this time -->

         <!-- Common plugins for all qqq modules -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
               <compilerArgument>-Xlint:unchecked</compilerArgument>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M5</version>
            <configuration>
               <!-- Sets the VM argument line used when integration tests are run. -->
               <argLine>@{jaCoCoArgLine}</argLine>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>3.1.2</version>
            <dependencies>
               <dependency>
                  <groupId>com.puppycrawl.tools</groupId>
                  <artifactId>checkstyle</artifactId>
                  <version>9.0</version>
               </dependency>
            </dependencies>
            <executions>
               <execution>
                  <id>validate</id>
                  <phase>validate</phase>
                  <configuration>
                     <configLocation>checkstyle/config.xml</configLocation>
                     <headerLocation>checkstyle/license.txt</headerLocation>
                     <!-- <suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation> -->
                     <encoding>UTF-8</encoding>
                     <consoleOutput>true</consoleOutput>
                     <failsOnError>false</failsOnError>
                     <failOnViolation>true</failOnViolation>
                     <violationSeverity>warning</violationSeverity>
                     <excludes>**/target/generated-sources/*.*</excludes>
                     <!-- <linkXRef>false</linkXRef> -->
                  </configuration>
                  <goals>
                     <goal>check</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>flatten-maven-plugin</artifactId>
            <version>1.1.0</version>
            <configuration>
               <updatePomFile>true</updatePomFile>
               <flattenMode>resolveCiFriendliesOnly</flattenMode>
            </configuration>
            <executions>
               <execution>
                  <id>flatten</id>
                  <phase>process-resources</phase>
                  <goals>
                     <goal>flatten</goal>
                  </goals>
               </execution>
               <execution>
                  <id>flatten.clean</id>
                  <phase>clean</phase>
                  <goals>
                     <goal>clean</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>com.amashchenko.maven.plugin</groupId>
            <artifactId>gitflow-maven-plugin</artifactId>
            <version>1.18.0</version>
            <configuration>
               <gitFlowConfig>
                  <productionBranch>main</productionBranch>
                  <developmentBranch>dev</developmentBranch>
                  <versionTagPrefix>version-</versionTagPrefix>
               </gitFlowConfig>
               <skipFeatureVersion>true</skipFeatureVersion> <!-- Keep feature names out of versions -->
               <postReleaseGoals>install</postReleaseGoals>  <!-- Let CI run deploys -->
               <commitDevelopmentVersionAtStart>true</commitDevelopmentVersionAtStart>
               <versionDigitToIncrement>1</versionDigitToIncrement> <!-- In general, we update the minor -->
               <versionProperty>revision</versionProperty>
               <skipUpdateVersion>true</skipUpdateVersion>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.8</version>
            <executions>
               <execution>
                  <id>pre-unit-test</id>
                  <goals>
                     <goal>prepare-agent</goal>
                  </goals>
                  <configuration>
                     <propertyName>jaCoCoArgLine</propertyName>
                  </configuration>
               </execution>
               <execution>
                  <id>unit-test-check</id>
                  <goals>
                     <goal>check</goal>
                  </goals>
                  <configuration>
                     <!-- Gives us the ability to pass a parameter to not fail due to coverage E.g. -Dcoverage.haltOnFailure=false -->
                     <haltOnFailure>${coverage.haltOnFailure}</haltOnFailure>
                     <rules>
                        <rule>
                           <element>BUNDLE</element>
                           <limits>
                              <limit>
                                 <counter>INSTRUCTION</counter>
                                 <value>COVEREDRATIO</value>
                                 <minimum>${coverage.instructionCoveredRatioMinimum}</minimum>
                              </limit>
                              <limit>
                                 <counter>CLASS</counter>
                                 <value>COVEREDRATIO</value>
                                 <minimum>${coverage.classCoveredRatioMinimum}</minimum>
                              </limit>
                           </limits>
                        </rule>
                     </rules>
                  </configuration>
               </execution>
               <execution>
                  <id>post-unit-test</id>
                  <phase>verify</phase>
                  <goals>
                     <goal>report</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>exec-maven-plugin</artifactId>
            <groupId>org.codehaus.mojo</groupId>
            <version>3.0.0</version>
            <executions>
               <execution>
                  <id>test-coverage-summary</id>
                  <phase>verify</phase>
                  <goals>
                     <goal>exec</goal>
                  </goals>
                  <configuration>
                     <executable>sh</executable>
                     <arguments>
                        <argument>-c</argument>
                        <argument>
                           <![CDATA[
if [ ! -e target/site/jacoco/index.html ]; then
   echo "No jacoco coverage report here.";
   exit;
fi

echo
echo "Jacoco coverage summary report:"
echo "   See also target/site/jacoco/index.html"
echo "   and https://www.jacoco.org/jacoco/trunk/doc/counters.html"
echo "------------------------------------------------------------"
which xpath > /dev/null 2>&1
if [ "$?" == "0" ]; then
   echo "Element\nInstructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$.headers
   xpath -n -q -e '/html/body/table/tfoot/tr[1]/td/text()' target/site/jacoco/index.html > /tmp/$$.values
   paste /tmp/$$.headers /tmp/$$.values | tail +2 | awk -v FS='\t' '{printf("%-20s %s\n",$1,$2)}'
   rm /tmp/$$.headers /tmp/$$.values
else
   echo "xpath is not installed.  Jacoco coverage summary will not be produced here..";
fi
                           ]]>
                        </argument>
                     </arguments>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>

   <repositories>
      <repository>
         <id>github-qqq-maven-registry</id>
         <name>GitHub QQQ Maven Registry</name>
         <url>https://maven.pkg.github.com/Kingsrook/qqq-maven-registry</url>
      </repository>
   </repositories>

   <distributionManagement>
      <repository>
         <id>github-qqq-maven-registry</id>
         <name>GitHub QQQ Maven Registry</name>
         <url>https://maven.pkg.github.com/Kingsrook/qqq-maven-registry</url>
      </repository>
   </distributionManagement>

</project>
