<!-- 
/*
 * 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">
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<bundle.symbolicName>org.usergrid</bundle.symbolicName>
		<bundle.namespace>org.usergrid</bundle.namespace>
		<spring-java-version>1.0.1.RELEASE</spring-java-version>
		<jackson-version>2.1.1</jackson-version>
	</properties>
	
	<parent>
		<groupId>org.sonatype.oss</groupId>
		<artifactId>oss-parent</artifactId>
		<version>7</version>
	</parent>
	
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.usergrid</groupId>
	<artifactId>usergrid-java-client</artifactId>
	<version>0.0.6</version>
	<packaging>jar</packaging>
	<description>A simple java client for usergrid</description>
	<url>https://github.com/apigee/usergrid-stack-internal</url>
	
	<licenses>
		<license>
			<name>The Apache Software License, Version 2.0</name>
			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
			<distribution>repo</distribution>
		</license>
	</licenses>

	<developers>
		<developer>
			<id>eanuff</id>
			<name>Ed Anuff</name>
		</developer>
		<developer>
			<id>tnine</id>
			<name>Todd Nine</name>
		</developer>
		<developer>
			<id>sganyo</id>
			<name>Scott Ganyo</name>
		</developer>
	</developers>
	<dependencies>
		<!-- <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> 
			<version>2.2.1</version> <scope>provided</scope> </dependency> -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson-version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson-version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.android</groupId>
			<artifactId>spring-android-rest-template</artifactId>
			<version>${spring-java-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.android</groupId>
			<artifactId>spring-android-core</artifactId>
			<version>${spring-java-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.6.4</version>
		</dependency>
	</dependencies>
	<repositories>
		<repository>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
			<id>springsource-milestone</id>
			<name>Spring Framework Milestone Repository</name>
			<url>http://maven.springframework.org/milestone</url>
		</repository>
	</repositories>
	<scm>
		<connection>scm:git:git@github.com:apigee/usergrid-java-sdk.git</connection>
		<developerConnection>scm:git:git@github.com:apigee/usergrid-java-sdk.git</developerConnection>
		<url>git@github.com:apigee/usergrid-java-sdk.git</url>
	</scm>
    <name>Usergrid Java SDK 0.0.6</name>
</project>
