<!--
  ~ 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.apache.usergrid</bundle.symbolicName>
		<bundle.namespace>org.apache.usergrid</bundle.namespace>
	</properties>

	<parent>
		<groupId>org.apache.usergrid</groupId>
		<artifactId>usergrid</artifactId>
		<version>1.0.0</version>
		<relativePath>../../stack</relativePath>
	</parent>
	
	<modelVersion>4.0.0</modelVersion>
	<artifactId>usergrid-android</artifactId>
	<version>0.0.8</version>
	
	<packaging>jar</packaging>
	<description>A simple java client for usergrid</description>
	<url>http://usergrid.incubator.apache.org</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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.9.1</version>
                <configuration>
                   <doclet>com.sun.tools.doclets.standard.Standard</doclet>
                </configuration>
            </plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<descriptor>assembly.xml</descriptor>
				</configuration>
				<executions>
					<execution>
						<id>assembly</id>
						<goals>
							<goal>single</goal>
						</goals>
						<phase>package</phase>
					</execution>
				</executions>
			</plugin>
        </plugins>
    </build>
	
	<dependencies>
		<dependency>
			<groupId>org.usergrid</groupId>
			<artifactId>usergrid-java-client</artifactId>
			<version>0.0.6</version>
		</dependency>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>android</artifactId>
			<version>2.2.1</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
</project>