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

  <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>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<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>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.jvnet.jaxb2.maven2</groupId>
				<artifactId>maven-jaxb2-plugin</artifactId>
				<version>0.9.0</version>
				<executions>
					<execution>
						<id>event</id>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<args>
								<arg>-Xsetters</arg>
								<arg>-Xvalue-constructor</arg>
							</args>
							<plugins>
								<plugin>
									<groupId>org.jvnet.jaxb2_commons</groupId>
									<artifactId>jaxb2-basics</artifactId>
									<version>0.6.2</version>
								</plugin>
								<plugin>
									<groupId>org.jvnet.jaxb2_commons</groupId>
									<artifactId>jaxb2-value-constructor</artifactId>
									<version>3.0</version>
								</plugin>
							</plugins>
							<schemaDirectory>src/main/resources/schema</schemaDirectory>
							<schemaIncludes>
								<include>event.xsd</include>
							</schemaIncludes>
							<generatePackage>org.apache.asterix.event.schema.event</generatePackage>
							<generateDirectory>${project.build.directory}/generated-sources/event</generateDirectory>
						</configuration>
					</execution>
					<execution>
						<id>configuration</id>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<args>
								<arg>-Xsetters</arg>
								<arg>-Xvalue-constructor</arg>
							</args>
							<plugins>
								<plugin>
									<groupId>org.jvnet.jaxb2_commons</groupId>
									<artifactId>jaxb2-basics</artifactId>
									<version>0.6.2</version>
								</plugin>
								<plugin>
									<groupId>org.jvnet.jaxb2_commons</groupId>
									<artifactId>jaxb2-value-constructor</artifactId>
									<version>3.0</version>
								</plugin>
							</plugins>
							<schemaDirectory>src/main/resources/schema</schemaDirectory>
							<schemaIncludes>
								<include>installer-conf.xsd</include>
							</schemaIncludes>
							<generatePackage>org.apache.asterix.installer.schema.conf</generatePackage>
							<generateDirectory>${project.build.directory}/generated-sources/configuration</generateDirectory>
						</configuration>
					</execution>
					<execution>
						<id>pattern</id>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<args>
								<arg>-Xsetters</arg>
								<arg>-Xvalue-constructor</arg>
							</args>
							<plugins>
								<plugin>
									<groupId>org.jvnet.jaxb2_commons</groupId>
									<artifactId>jaxb2-basics</artifactId>
									<version>0.6.2</version>
								</plugin>
								<plugin>
									<groupId>org.jvnet.jaxb2_commons</groupId>
									<artifactId>jaxb2-value-constructor</artifactId>
									<version>3.0</version>
								</plugin>
							</plugins>
							<schemaDirectory>src/main/resources/schema</schemaDirectory>
							<schemaIncludes>
								<include>pattern.xsd</include>
							</schemaIncludes>
							<generatePackage>org.apache.asterix.event.schema.pattern</generatePackage>
							<generateDirectory>${project.build.directory}/generated-sources/pattern</generateDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>args4j</groupId>
			<artifactId>args4j</artifactId>
			<version>2.0.12</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.jvnet.jaxb2_commons</groupId>
			<artifactId>jaxb2-value-constructor</artifactId>
			<version>3.0</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.5</version>
			<exclusions>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.asterix</groupId>
			<artifactId>asterix-common</artifactId>
			<version>0.8.8-incubating</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.9</version>
		</dependency>
	</dependencies>
</project>
