<!--
 ! 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>
		<artifactId>asterix</artifactId>
		<groupId>org.apache.asterix</groupId>
		<version>0.8.8-incubating</version>
	</parent>
	<artifactId>asterix-runtime</artifactId>

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


  <properties>
      <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
  </properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<fork>true</fork>
				</configuration>
			</plugin>
	      	<plugin>
	        	<groupId>org.apache.asterix</groupId>
	        	<artifactId>lexer-generator-maven-plugin</artifactId>
	        	<version>0.8.8-incubating</version>
	        	<configuration>
	        	  	<grammarFile>src/main/resources/adm.grammar</grammarFile>
	        	  	<outputDir>${project.build.directory}/generated-sources/org/apache/asterix/runtime/operators/file/adm</outputDir>
	        	</configuration>
	        	<executions>
		          	<execution>
		          		<id>generate-lexer</id>
            			<phase>generate-sources</phase>
			            <goals>
	              			<goal>generate-lexer</goal>
	            		</goals>
	          		</execution>
	        	</executions>
	      	</plugin>
	      	 <plugin>
			    <groupId>org.codehaus.mojo</groupId>
			    <artifactId>build-helper-maven-plugin</artifactId>
			    <version>1.9</version>
			    <executions>
			        <execution>
			            <id>add-source</id>
			            <phase>generate-sources</phase>
			            <goals>
			                <goal>add-source</goal>
			            </goals>
			            <configuration>
			                <sources>
			                    <source>${project.build.directory}/generated-sources/</source>
			                </sources>
			            </configuration>
			        </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.asterix
										</groupId>
										<artifactId>
											lexer-generator-maven-plugin
										</artifactId>
										<versionRange>
											[0.1,)
										</versionRange>
										<goals>
											<goal>generate-lexer</goal>
										</goals>
									</pluginExecutionFilter>
									<action>
										<execute>
											<runOnIncremental>false</runOnIncremental>
										</execute>
									</action>
								</pluginExecution>
								<pluginExecution>
									<pluginExecutionFilter>
										<groupId>
											org.codehaus.mojo
										</groupId>
										<artifactId>
											build-helper-maven-plugin
										</artifactId>
										<versionRange>
											[1.7,)
										</versionRange>
										<goals>
											<goal>add-source</goal>
										</goals>
									</pluginExecutionFilter>
									<action>
										<ignore />
									</action>
								</pluginExecution>
							</pluginExecutions>
						</lifecycleMappingMetadata>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

	<dependencies>
		<dependency>
			<groupId>org.apache.asterix</groupId>
			<artifactId>asterix-om</artifactId>
			<version>0.8.8-incubating</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.asterix</groupId>
			<artifactId>asterix-fuzzyjoin</artifactId>
			<version>0.8.8-incubating</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.hyracks</groupId>
			<artifactId>hyracks-storage-am-btree</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.asterix</groupId>
			<artifactId>asterix-transactions</artifactId>
			<version>0.8.8-incubating</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.twitter4j</groupId>
			<artifactId>twitter4j-core</artifactId>
			<version>2.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
		         <groupId>org.apache.hyracks</groupId>
		         <artifactId>hyracks-api</artifactId>
	        </dependency>
	</dependencies>

</project>

