<?xml version="1.0" encoding="UTF-8"?>
<!--
    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.beam</groupId>
    <artifactId>beam-examples-parent</artifactId>
    <version>0.6.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <artifactId>beam-examples-java</artifactId>
  <name>Apache Beam :: Examples :: Java</name>
  <description>Apache Beam SDK provides a simple, Java-based
  interface for processing virtually any size data. This
  artifact includes all Apache Beam Java SDK examples.</description>

  <packaging>jar</packaging>

  <properties>
    <spark.version>1.6.2</spark.version>
  </properties>

  <profiles>

    <!--
      The direct runner is available by default.
      You can also include it on the classpath explicitly with -P direct-runner
    -->
    <profile>
      <id>direct-runner</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.apache.beam</groupId>
          <artifactId>beam-runners-direct-java</artifactId>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>

    <!-- Include the Apache Apex runner with -P apex-runner -->
    <profile>
      <id>apex-runner</id>
      <dependencies>
        <dependency>
          <groupId>org.apache.beam</groupId>
          <artifactId>beam-runners-apex</artifactId>
          <scope>runtime</scope>
        </dependency>
        <!--
          Apex depends on httpclient version 4.3.5, project has a transitive dependency to httpclient 4.0.1 from
          google-http-client. Apex dependency version being specified explicitly so that it gets picked up. This
          can be removed when the project no longer has a dependency on a different httpclient version.
        -->
        <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
          <version>4.3.5</version>
          <scope>runtime</scope>
          <exclusions>
            <exclusion>
              <groupId>commons-codec</groupId>
              <artifactId>commons-codec</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    </profile>

    <!-- Include the Apache Flink runner with -P flink-runner -->
    <profile>
      <id>flink-runner</id>
      <dependencies>
        <dependency>
          <groupId>org.apache.beam</groupId>
          <artifactId>beam-runners-flink_2.10</artifactId>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>

    <!-- Include the Apache Spark runner -P spark-runner -->
    <profile>
      <id>spark-runner</id>
      <dependencies>
        <dependency>
          <groupId>org.apache.beam</groupId>
          <artifactId>beam-runners-spark</artifactId>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-streaming_2.10</artifactId>
          <version>${spark.version}</version>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-core_2.10</artifactId>
          <version>${spark.version}</version>
          <scope>runtime</scope>
          <exclusions>
            <exclusion>
              <groupId>org.slf4j</groupId>
              <artifactId>jul-to-slf4j</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    </profile>

    <!-- Include the Google Cloud Dataflow runner -P dataflow-runner -->
    <profile>
      <id>dataflow-runner</id>
      <dependencies>
        <dependency>
          <groupId>org.apache.beam</groupId>
          <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </profile>

    <!-- Custom set up for our Jenkins precommit tests that comment on GitHub -->
    <profile>
      <id>jenkins-precommit</id>
      <properties>
        <skipITs>false</skipITs>
        <skipDefaultIT>true</skipDefaultIT>
      </properties>

      <dependencies>
        <!--
          This profile requires -P apex-runner and -P spark-runner already. When they are both
          included, the Spark runner's Kryo dependency will pull in a version that is insufficiently
          recent for the Apex runner.

          This dependency makes the Apex runner version "closer" by Maven resolution rules,
          so it will not be overridden.
        -->
        <dependency>
          <groupId>com.esotericsoftware.kryo</groupId>
          <artifactId>kryo</artifactId>
          <version>${apex.kryo.version}</version>
          <scope>runtime</scope>
        </dependency>
      </dependencies>

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
              <useManifestOnlyJar>false</useManifestOnlyJar>
            </configuration>
            <executions>
              <execution>
                <id>direct-runner-integration-tests</id>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <includes>
                    <include>WordCountIT.java</include>
                    <include>WindowedWordCountIT.java</include>
                  </includes>
                  <parallel>all</parallel>
                  <threadCount>4</threadCount>
                  <systemPropertyVariables>
                    <beamTestPipelineOptions>
                      [
                      "--project=apache-beam-testing",
                      "--tempLocation=gs://temp-storage-for-end-to-end-tests",
                      "--tempRoot=gs://temp-storage-for-end-to-end-tests",
                      "--runner=org.apache.beam.runners.direct.DirectRunner"
                      ]
                    </beamTestPipelineOptions>
                  </systemPropertyVariables>
                </configuration>
              </execution>
              <execution>
                <id>flink-runner-integration-tests</id>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <includes>
                    <include>WordCountIT.java</include>
                  </includes>
                  <parallel>all</parallel>
                  <threadCount>4</threadCount>
                  <systemPropertyVariables>
                    <beamTestPipelineOptions>
                      [
                      "--project=apache-beam-testing",
                      "--tempRoot=gs://temp-storage-for-end-to-end-tests",
                      "--runner=org.apache.beam.runners.flink.TestFlinkRunner"
                      ]
                    </beamTestPipelineOptions>
                  </systemPropertyVariables>
                </configuration>
              </execution>
              <execution>
                <id>spark-runner-integration-tests</id>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <includes>
                    <include>WordCountIT.java</include>
                  </includes>
                  <systemPropertyVariables>
                    <beamTestPipelineOptions>
                      [
                      "--project=apache-beam-testing",
                      "--tempRoot=gs://temp-storage-for-end-to-end-tests",
                      "--runner=org.apache.beam.runners.spark.TestSparkRunner"
                      ]
                    </beamTestPipelineOptions>
                  </systemPropertyVariables>
                </configuration>
              </execution>
              <execution>
                <id>dataflow-runner-integration-tests</id>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <includes>
                    <include>WordCountIT.java</include>
                    <include>WindowedWordCountIT.java</include>
                  </includes>
                  <parallel>all</parallel>
                  <threadCount>4</threadCount>
                  <systemPropertyVariables>
                    <beamTestPipelineOptions>
                      [
                      "--project=apache-beam-testing",
                      "--tempRoot=gs://temp-storage-for-end-to-end-tests",
                      "--runner=org.apache.beam.runners.dataflow.testing.TestDataflowRunner"
                      ]
                    </beamTestPipelineOptions>
                  </systemPropertyVariables>
                </configuration>
              </execution>
              <execution>
                <id>apex-runner-integration-tests</id>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <includes>
                    <include>WordCountIT.java</include>
                  </includes>
                  <parallel>all</parallel>
                  <threadCount>4</threadCount>
                  <systemPropertyVariables>
                    <beamTestPipelineOptions>
                      [
                      "--project=apache-beam-testing",
                      "--tempRoot=gs://temp-storage-for-end-to-end-tests",
                      "--runner=org.apache.beam.runners.apex.TestApexRunner"
                      ]
                    </beamTestPipelineOptions>
                  </systemPropertyVariables>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>

    <!--
      This profile disables streaming integration tests which
      have the @Category(StreamingIT.class) annotation.
    -->
    <profile>
      <id>disable-streaming-ITs</id>
      <activation><activeByDefault>false</activeByDefault></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <excludedGroups>org.apache.beam.sdk.testing.StreamingIT</excludedGroups>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

  <build>
    <pluginManagement>
      <plugins>
        <!-- BEAM-933 -->
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>findbugs-maven-plugin</artifactId>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <systemPropertyVariables>
            <beamUseDummyRunner />
            <beamTestPipelineOptions>
            </beamTestPipelineOptions>
          </systemPropertyVariables>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <finalName>${project.artifactId}-bundled-${project.version}</finalName>
              <artifactSet>
                <includes>
                  <include>*:*</include>
                </includes>
              </artifactSet>
              <filters>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                  </excludes>
                </filter>
              </filters>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>

      <!-- Coverage analysis for unit tests. -->
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
          <useManifestOnlyJar>false</useManifestOnlyJar>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
            <configuration>
              <skip>${skipDefaultIT}</skip>
              <parallel>all</parallel>
              <threadCount>4</threadCount>
              <systemPropertyVariables>
                <beamTestPipelineOptions>${integrationTestPipelineOptions}</beamTestPipelineOptions>
              </systemPropertyVariables>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-sdks-java-core</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-bigquery</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.avro</groupId>
      <artifactId>avro</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-pubsub</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.cloud.datastore</groupId>
      <artifactId>datastore-v1-proto-client</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.cloud.datastore</groupId>
      <artifactId>datastore-v1-protos</artifactId>
    </dependency>

    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>

    <!-- Hamcrest and JUnit are required dependencies of PAssert,
         which is used in the main code of DebuggingWordCount example. -->

    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-all</artifactId>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>

    <!-- Test dependencies -->

    <!--
      For testing the example itself, use the direct runner. This is separate from
      the use of RunnableOnService tests for testing a particular runner.
    -->
    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-runners-direct-java</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
