<?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>

  <groupId>org.apache.commons</groupId>
  <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>
