<!--
   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">
  <parent>
    <groupId>org.apache.abdera</groupId>
    <artifactId>abdera</artifactId>
    <version>1.2-SNAPSHOT</version>  
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>abdera-core</artifactId>
  <packaging>bundle</packaging>
  <name>Abdera Core</name>
  <version>1.2-SNAPSHOT</version>  
  <description>Atom Specification Implementation Core</description>
  <properties>
    <topDir>${basedir}/..</topDir>
    <abdera.osgi.default.exports>
		org.apache.abdera;
		org.apache.abdera.factory.*;
		org.apache.abdera.filter.*;
		org.apache.abdera.model.*;
		org.apache.abdera.parser.*;
		org.apache.abdera.protocol.*;
		org.apache.abdera.util.*;
		org.apache.abdera.writer.*;
		org.apache.abdera.xpath.*
	</abdera.osgi.default.exports>
    <abdera.osgi.default.imports>
      org.apache.commons.codec*;version="[1.3,2)",
      *
    </abdera.osgi.default.imports>
  </properties>
  <dependencies>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.abdera</groupId>
  		<artifactId>abdera-i18n</artifactId>
  		<version>1.2-SNAPSHOT</version>  
  	</dependency>
  	<dependency>
  		<groupId>org.apache.geronimo.specs</groupId>
  		<artifactId>geronimo-activation_1.0.2_spec</artifactId>
  	</dependency>
	<dependency>
      <groupId>org.apache.geronimo.specs</groupId>
      <artifactId>geronimo-stax-api_1.0_spec</artifactId>
      <version>1.0.1</version>  
    </dependency>
  	<dependency>
  		<groupId>commons-codec</groupId>
  		<artifactId>commons-codec</artifactId>
  	</dependency>
	<dependency>
  		<groupId>commons-logging</groupId>
  		<artifactId>commons-logging</artifactId>
  	</dependency>
	<dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>${easymock.version}</version>  
        <scope>test</scope>
    </dependency>
  </dependencies>
</project>
