<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  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>
	<pomVersion>3</pomVersion>
	<artifactId>jackrabbit-bdb</artifactId>
	<groupId>org.apache.jackrabbit</groupId>
	<name>Jackrabbit BerkeleyDB Persistence Manager</name>
	<currentVersion>1.0-SNAPSHOT</currentVersion>
	<organization>
		<name>The Apache Software Foundation</name>
		<url>http://www.apache.org/</url>
		<logo>http://www.apache.org/images/asf_logo_wide.png</logo>
	</organization>
	<inceptionYear>2005</inceptionYear>
	<package>org.apache.jackrabbit.*</package>
	<logo>/images/jackrabbitlogo.gif</logo>
	<description>
		A BerkeleyDB persistence manager for jackrabbit. It uses the
		BerkeleyDB Java Edition
		(http://www.sleepycat.com/products/je.shtml)
	</description>
	<shortDescription>
		A BerkeleyDB persistence manager for jackrabbit
	</shortDescription>

	<repository>
		<connection>scm:svn:http://svn.apache.org/repos/asf/jackrabbit/trunk/contrib/bdb-persistence</connection>
		<developerConnection>scm:svn:https://svn.apache.org/repos/asf/jackrabbit/trunk/contrib/bdb-persistence</developerConnection>
		<url>http://svn.apache.org/viewcvs</url>
	</repository>
	<developers>
		<developer>
			<name>Guillaume Bort</name>
			<email>guillaume.bort@zenexity.fr</email>
			<organization>zenexity.fr</organization>
			<timezone>+1</timezone>
		</developer>
	</developers>

	<dependencies>
		<!--
			compile-time dependencies of the BerkeleyDB persistence manager
		-->
		<dependency>
			<groupId>berkeleydb</groupId>
			<artifactId>je</artifactId>
			<version>1.7.1</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.0</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>jsr170</groupId>
			<artifactId>jcr</artifactId>
			<version>1.0</version>
			<type>jar</type>
			<url>http://www.day.com/maven/jsr170/jars/jcr-1.0.jar</url>
		</dependency>
		<dependency>
			<groupId>org.apache.jackrabbit</groupId>
			<artifactId>jackrabbit-core</artifactId>
			<version>${pom.currentVersion}</version>
			<type>jar</type>
		</dependency>

		<!--
			compile-time dependencies of the jUnit test-cases 
			in the core project	
		-->
		<dependency>
			<groupId>concurrent</groupId>
			<artifactId>concurrent</artifactId>
			<version>1.3.4</version>
		</dependency>
		<dependency>
			<groupId>geronimo-spec</groupId>
			<artifactId>geronimo-spec-jta</artifactId>
			<version>1.0-M1</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.8</version>
		</dependency>

		<!--
			runtime dependencies of jackrabbit/jUnit test-cases 
		-->
	    <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
			<version>3.1</version>
	    </dependency>
		<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
			<version>1.2.8</version>
		</dependency>
		<dependency>
			<groupId>lucene</groupId>
			<artifactId>lucene</artifactId>
			<version>1.4.3</version>
		</dependency>
	        <dependency>
			<groupId>xerces</groupId>
			<artifactId>xercesImpl</artifactId>
			<version>2.6.2</version>
	        </dependency>
		<dependency>
			<groupId>xerces</groupId>
			<artifactId>xmlParserAPIs</artifactId>
			<version>2.0.2</version>
		</dependency>
	</dependencies>

	<build>
		<sourceDirectory>src/java</sourceDirectory>
		<unitTestSourceDirectory>../../src/test</unitTestSourceDirectory>
		<unitTest>
			<includes>
				<include>**/*TestAll.java</include>
			</includes>
			<excludes>
				<exclude>**/init/*</exclude>
			</excludes>
			<resources>
				<resource>
					<directory>applications/test</directory>
					<includes>
						<include>*.properties</include>
						<include>*.xml</include>
					</includes>
				</resource>
				<resource>
					<directory>../../src/test</directory>
					<includes>
						<include>**/*.xml</include>
						<include>**/*.txt</include>
					</includes>
				</resource>
			</resources>
		</unitTest>
		<resources>
			<resource>
				<directory>src/java</directory>
				<includes>
					<include>**/*.xml</include>
					<include>**/*.properties</include>
					<include>**/*.TextFilterService</include>
				</includes>
			</resource>
		</resources>
	</build>

	<reports>
		<report>maven-changelog-plugin</report>
		<report>maven-changes-plugin</report>
		<report>maven-checkstyle-plugin</report>
		<report>maven-javadoc-plugin</report>
		<report>maven-junit-report-plugin</report>
		<report>maven-jxr-plugin</report>
		<report>maven-license-plugin</report>
		<report>maven-tasklist-plugin</report>
	</reports>

</project>
