<?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-sdks-java-parent</artifactId>
    <version>2.3.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <artifactId>beam-sdks-java-io-parent</artifactId>
  <packaging>pom</packaging>
  <name>Apache Beam :: SDKs :: Java :: IO</name>
  <description>Beam SDK Java IO provides different connectivity components
  (sources and sinks) to consume and produce data from systems.</description>

  <properties>
    <!-- Necessary to make sure that integration with perfkit in io-it-suite works -->
    <integrationTestPipelineOptions />
    <pkbBeamRunnerProfile />
    <pkbBeamRunnerOption />
  </properties>

  <modules>
    <module>amqp</module>
    <module>cassandra</module>
    <module>common</module>
    <module>elasticsearch</module>
    <module>elasticsearch-tests</module>
    <module>google-cloud-platform</module>
    <module>hadoop-common</module>
    <module>hadoop-file-system</module>
    <module>hadoop</module>
    <module>hbase</module>
    <module>hcatalog</module>
    <module>jdbc</module>
    <module>jms</module>
    <module>kafka</module>
    <module>kinesis</module>
    <module>mongodb</module>
    <module>mqtt</module>
    <module>redis</module>
    <module>solr</module>
    <module>tika</module>
    <module>xml</module>
  </modules>

  <profiles>
    <profile>
      <id>io-it</id>
      <activation>
      <property><name>io-it</name></property>
      </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>
                  <useManifestOnlyJar>false</useManifestOnlyJar>
                  <skip>${skipDefaultIT}</skip>
                  <parallel>all</parallel>
                  <threadCount>4</threadCount>
                  <systemPropertyVariables>
                    <beamTestPipelineOptions>${integrationTestPipelineOptions}</beamTestPipelineOptions>
                  </systemPropertyVariables>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${surefire-plugin.version}</version>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
      <properties>
        <skipITs>false</skipITs>
      </properties>
    </profile>

    <!-- this profile is for use with io-it-suite -->
    <profile>
      <id>forceDirectRunner</id>
      <activation>
        <property>
          <name>forceDirectRunner</name>
        </property>
      </activation>
      <properties>
        <!-- These intentionally have a hanging equals sign so that an empty
             string is passed to pkb. Passing "" will cause e.g. -P"" to
             get added to the mvn command line -->
        <pkbBeamRunnerProfile>-beam_runner_profile=</pkbBeamRunnerProfile>
        <pkbBeamRunnerOption>-beam_runner_option=</pkbBeamRunnerOption>
      </properties>
    </profile>
  </profiles>
</project>
