<?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/maven-v4_0_0.xsd">

  <parent>
    <groupId>org.apache.bigtop.itest</groupId>
    <artifactId>smoke-tests</artifactId>
    <version>0.5.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.bigtop.itest</groupId>
  <artifactId>pig-smoke-execution</artifactId>
  <packaging>jar</packaging>
  <version>0.5.0</version>
  <name>pigsmokes</name>

  <properties>
    <org.codehaus.groovy.maven.jar>${project.build.directory}/pigsmoke-${pig-smoke.version}.jar</org.codehaus.groovy.maven.jar>

    <org.apache.maven-dependency-plugin.groupId>org.apache.pig</org.apache.maven-dependency-plugin.groupId>
    <org.apache.maven-dependency-plugin.artifactId>pigsmoke</org.apache.maven-dependency-plugin.artifactId>
    <org.apache.maven-dependency-plugin.version>${pig-smoke.version}</org.apache.maven-dependency-plugin.version>
    <org.apache.maven-dependency-plugin.output>${project.build.directory}</org.apache.maven-dependency-plugin.output>
    <org.apache.maven-dependency-plugin.pattern>test/data/**/*</org.apache.maven-dependency-plugin.pattern>
    <org.apache.maven-dependency-plugin.type>jar</org.apache.maven-dependency-plugin.type>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.pig</groupId>
      <artifactId>pig</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.pig</groupId>
      <artifactId>pigsmoke</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
    </dependency>
  </dependencies>

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

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.11</version>
        <configuration>
          <forkMode>always</forkMode>
          <argLine>-Dpigunit.exectype.cluster=true</argLine>
          <additionalClasspathElements>
            <additionalClasspathElement>
              ${HADOOP_CONF_DIR}
            </additionalClasspathElement>
            <additionalClasspathElement>
              <!-- the value of ${lzo.jar} property is set by a groovy
                   script during pre-integration-test phase below-->
              ${HADOOP_HOME}/lib/${lzo.jar}
            </additionalClasspathElement>
          </additionalClasspathElements>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.codehaus.groovy.maven</groupId>
        <artifactId>gmaven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>find-lzo-jar</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <source>
                if (!System.getProperties().keySet().contains('enforcer.skip')) {
                  project.properties['lzo.jar'] =
                    org.apache.bigtop.itest.JarContent.getJarName(
                        "${HADOOP_HOME}/lib", 'hadoop.*lzo.*.jar');
                  if ( project.properties['lzo.jar'] == null ) {
                    throw new IOException ("hadoop-lzo.jar isn't found");
                  }
                }
              </source>
            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>
</project>
