<?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.5-SNAPSHOT</version>
  </parent>

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

  <description>Contains examples of output from the samplers.
  Code in this module is not part of the public API.</description>

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

    <uberjar.name>examples-sampling</uberjar.name>
    <project.mainClass>org.apache.commons.rng.examples.sampling.ExamplesSamplingApplication</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>

  <profiles>
    <profile>
      <id>examples-sampling</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>${rng.shade.version}</version>
            <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>
                        <exclude>META-INF/LICENSE</exclude>
                        <exclude>META-INF/MANIFEST.MF</exclude>
                        <exclude>META-INF/NOTICE</exclude>
                      </excludes>
                    </filter>
                  </filters>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
