<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<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>org.apache.commons</groupId>
    <artifactId>commons-rng-examples</artifactId>
    <version>1.4-SNAPSHOT</version>
  </parent>

  <artifactId>commons-rng-examples-stress</artifactId>
  <version>1.4-SNAPSHOT</version>
  <!-- This name is used in the shaded jar to provide the application title for the version information. -->
  <name>Apache Commons RNG Examples Stress Utilities</name>

  <description>Application for calling external tools that perform stringent uniformity tests.
  Code in this module is not part of the public API.</description>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <!-- OSGi -->
    <commons.osgi.symbolicName>org.apache.commons.rng.examples.stress</commons.osgi.symbolicName>
    <commons.osgi.export>org.apache.commons.rng.examples.stress</commons.osgi.export>
    <!-- Java 9+ -->
    <commons.automatic.module.name>org.apache.commons.rng.examples.stress</commons.automatic.module.name>
    <!-- Workaround to avoid duplicating config files. -->
    <rng.parent.dir>${basedir}/../..</rng.parent.dir>

    <uberjar.name>examples-stress</uberjar.name>
    <project.mainClass>org.apache.commons.rng.examples.stress.ExamplesStressApplication</project.mainClass>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-rng-simple</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-rng-sampling</artifactId>
    </dependency>
    <dependency>
      <groupId>info.picocli</groupId>
      <artifactId>picocli</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <configuration>
          <!-- The custom ApplicationException cannot be loaded by checkstyle unless the source is
            compiled. Checkstyle runs in the validate phase and fails unless the
            module JavadocMethod has property suppressLoadErrors=true. Workaround setting this
            globally in the configuration file by suppressing fail locally to this module. 
            See: https://checkstyle.sourceforge.io/config_javadoc.html#JavadocMethod -->
          <failOnViolation>false</failOnViolation>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>examples-stress</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <finalName>${uberjar.name}</finalName>
                  <minimizeJar>true</minimizeJar>
                  <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <mainClass>${project.mainClass}</mainClass>
                    </transformer>
                  </transformers>
                  <filters>
                    <filter>
                      <!-- Shading signed JARs will fail without this. http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar -->
                      <artifact>*:*</artifact>
                      <excludes>
                        <exclude>META-INF/*.SF</exclude>
                        <exclude>META-INF/*.DSA</exclude>
                        <exclude>META-INF/*.RSA</exclude>
                      </excludes>
                    </filter>
                  </filters>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
