<!--
   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.1.1</version>  
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>abdera-core</artifactId>
  <packaging>bundle</packaging>
  <name>Abdera Core</name>
  <version>1.1.1</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>
  </properties>
  <dependencies>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.abdera</groupId>
  		<artifactId>abdera-i18n</artifactId>
  		<version>1.1.1</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>
