<!-- 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">
	<modelVersion>4.0.0</modelVersion>
	<groupId>${groupId}</groupId>
	<artifactId>${artifactId}</artifactId>
	<packaging>war</packaging>
	<version>${version}</version>
	<name>${project.artifactId}</name>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<version.cxf>2.7.6</version.cxf>
		<version.eclipselink>2.5.1</version.eclipselink>
		<version.javax.persistence>2.0.5</version.javax.persistence>
		<version.olingo>2.0.3-RC01</version.olingo>
	</properties>

	<dependencies>

		<!-- OData Annotation Support -->
		<dependency>
			<groupId>org.apache.olingo</groupId>
			<artifactId>olingo-odata2-api-annotation</artifactId>
			<version>${version.olingo}</version>
		</dependency>

		<!--OData Core Support -->
		<dependency>
			<groupId>org.apache.olingo</groupId>
			<artifactId>olingo-odata2-api</artifactId>
			<version>${version.olingo}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.olingo</groupId>
			<artifactId>olingo-odata2-core</artifactId>
			<version>${version.olingo}</version>
		</dependency>

		<!--OData JPA Processor Support -->
		<dependency>
			<groupId>org.apache.olingo</groupId>
			<artifactId>olingo-odata2-jpa-processor-api</artifactId>
			<version>${version.olingo}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.olingo</groupId>
			<artifactId>olingo-odata2-jpa-processor-core</artifactId>
			<version>${version.olingo}</version>
		</dependency>

		<!-- JPA Support -->
		<dependency>
			<groupId>org.eclipse.persistence</groupId>
			<artifactId>eclipselink</artifactId>
			<version>${version.eclipselink}</version>
		</dependency>
		<dependency>
			<groupId>org.eclipse.persistence</groupId>
			<artifactId>javax.persistence</artifactId>
			<version>${version.javax.persistence}</version>
		</dependency>
		<dependency>
			<groupId>org.hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<version>1.8.0.10</version>
		</dependency>

		<!-- Web Support -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxrs</artifactId>
			<version>${version.cxf}</version>
		</dependency>

	</dependencies>
</project>
