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

  <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>hbase-smoke-execution</artifactId>
  <version>0.5.0</version>
  <name>HBase smoke test execution</name>

  <properties>
    <org.apache.maven-dependency-plugin.groupId>org.apache.bigtop.itest</org.apache.maven-dependency-plugin.groupId>
    <org.apache.maven-dependency-plugin.artifactId>hbase-smoke</org.apache.maven-dependency-plugin.artifactId>
    <org.apache.maven-dependency-plugin.version>${hbase-smoke.version}</org.apache.maven-dependency-plugin.version>
    <org.apache.maven-dependency-plugin.type>jar</org.apache.maven-dependency-plugin.type>

    <HBASE_HOME>${env.HBASE_HOME}</HBASE_HOME>
    <ZOOKEEPER_HOME>${env.ZOOKEEPER_HOME}</ZOOKEEPER_HOME>
    <HBASE_CONF_DIR>${env.HBASE_CONF_DIR}</HBASE_CONF_DIR>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.bigtop.itest</groupId>
      <artifactId>hbase-smoke</artifactId>
      <version>${hbase-smoke.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>enforce-property</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireProperty>
                  <property>HBASE_HOME</property>
                  <message>HBASE_HOME env. variable has to be set</message>
                </requireProperty>
                <requireProperty>
                  <property>HBASE_CONF_DIR</property>
                  <message>HBASE_CONF_DIR env. variable has to be set</message>
                </requireProperty>
                <requireProperty>
                  <property>ZOOKEEPER_HOME</property>
                  <message>ZOOKEEPER_HOME env. variable has to be set</message>
                </requireProperty>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <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>
          <systemPropertyVariables>
            <org.apache.bigtop.itest.hbasesmoke.TestHbasePigSmoke.extra_jars>
            ${ZOOKEEPER_HOME}/${zookeeper.jar}:${HBASE_HOME}/${hbase.jar}:${HBASE_HOME}/lib/guava-r06.jar
            </org.apache.bigtop.itest.hbasesmoke.TestHbasePigSmoke.extra_jars>
          </systemPropertyVariables>
          <additionalClasspathElements>
            <additionalClasspathElement>${HBASE_CONF_DIR}</additionalClasspathElement>
            <additionalClasspathElement>${HADOOP_CONF_DIR}</additionalClasspathElement>
          </additionalClasspathElements>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.groovy.maven</groupId>
        <artifactId>gmaven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>find-versioned-jar</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <source>
                if (!System.getProperties().keySet().contains('enforcer.skip')) {
                  project.properties['zookeeper.jar'] =
                    org.apache.bigtop.itest.JarContent.getJarName(
                        "${ZOOKEEPER_HOME}", 'zookeeper-.*.jar');
                  if ( project.properties['zookeeper.jar'] == null ) {
                    throw new IOException ("zookeeper*.jar isn't found");
                  }
                  project.properties['hbase.jar'] =
                    org.apache.bigtop.itest.JarContent.getJarName(
                        "${HBASE_HOME}", 'hbase-.*.jar');
                  if ( project.properties['hbase.jar'] == null ) {
                    throw new IOException ("hbase*.jar isn't found");
                  }
                }
              </source>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
