<!--
 ! Copyright 2009-2013 by The Regents of the University of California
 ! Licensed 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 from
 ! 
 !     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">
  <modelVersion>4.0.0</modelVersion>
  <artifactId>algebricks-tests</artifactId>
  <name>algebricks-tests</name>

  <parent>
    <groupId>edu.uci.ics.hyracks</groupId>
    <artifactId>algebricks</artifactId>
    <version>0.2.15</version>
  </parent>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
      <comments>A business-friendly OSS license</comments>
    </license>
  </licenses>


  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <fork>true</fork>
	  <encoding>UTF-8</encoding>
	</configuration>
      </plugin>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>generate-sources</phase>
            <configuration>
              <tasks>
                <ant antfile="build-script.xml" target="build">
                  <property name="main.class" value="edu.uci.ics.hyracks.algebricks.tests.script.IdentityStreamingScript" />
                  <property name="script.classpath" refid="maven.compile.classpath" />
                  <property name="jvm.params" value="" />
                  <property name="program.params" value="" />
                  <property name="source" value="${basedir}/src/main/scripts/run" />
                  <property name="target.dir" value="${basedir}/target/testscripts" />
                  <property name="target" value="idscript" />
                </ant>
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <pluginManagement>
    	<plugins>
    		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
    		<plugin>
    			<groupId>org.eclipse.m2e</groupId>
    			<artifactId>lifecycle-mapping</artifactId>
    			<version>1.0.0</version>
    			<configuration>
    				<lifecycleMappingMetadata>
    					<pluginExecutions>
    						<pluginExecution>
    							<pluginExecutionFilter>
    								<groupId>
    									org.apache.maven.plugins
    								</groupId>
    								<artifactId>
    									maven-antrun-plugin
    								</artifactId>
    								<versionRange>[1.3,)</versionRange>
    								<goals>
    									<goal>run</goal>
    								</goals>
    							</pluginExecutionFilter>
    							<action>
    								<ignore />
    							</action>
    						</pluginExecution>
    					</pluginExecutions>
    				</lifecycleMappingMetadata>
    			</configuration>
    		</plugin>
    	</plugins>
    </pluginManagement>
  </build>
  <dependencies>
    <dependency>
      <!-- Dependency management inherited from top-level hyracks -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
      <groupId>edu.uci.ics.hyracks</groupId>
      <artifactId>algebricks-compiler</artifactId>
      <version>0.2.15</version>
    </dependency>
    <dependency>
      <groupId>edu.uci.ics.hyracks</groupId>
      <artifactId>hyracks-control-cc</artifactId>
      <version>0.2.15</version>
    </dependency>
    <dependency>
      <groupId>edu.uci.ics.hyracks</groupId>
      <artifactId>hyracks-control-nc</artifactId>
      <version>0.2.15</version>
    </dependency>
    <dependency>
      <groupId>edu.uci.ics.hyracks</groupId>
      <artifactId>hyracks-data-std</artifactId>
      <version>0.2.15</version>
    </dependency>
  </dependencies>
</project>
