<!--
   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">

  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.abdera2</groupId>
    <artifactId>abdera2</artifactId>
    <version>2.0-SNAPSHOT</version>  
  </parent>
  
  <artifactId>abdera2-core</artifactId>
  <packaging>bundle</packaging>
  <name>Abdera2 Core</name>
  <version>2.0-SNAPSHOT</version>  
  <description>Atom Specification Implementation Core</description>
  
  <properties>
    <topDir>${basedir}/..</topDir>
    <!-- 
    <abdera.osgi.default.exports>
    org.apache.abdera2;
    org.apache.abdera2.extra.*;
    org.apache.abdera2.factory.*;
    org.apache.abdera2.model.*;
    org.apache.abdera2.model.selector.*;
    org.apache.abdera2.parser.*;
    org.apache.abdera2.parser.axiom.*;
    org.apache.abdera2.parser.filter.*;
    org.apache.abdera2.protocol;
    org.apache.abdera2.protocol.error.*;
    org.apache.abdera2.util.*;
    org.apache.abdera2.writer.*;
    org.apache.abdera2.xpath.*
  </abdera.osgi.default.exports>
    <abdera.osgi.default.imports>
      org.apache.commons.codec*;version="[1.5,2)",
      *
    </abdera.osgi.default.imports>
    -->
  </properties>
  
  <dependencies>

    <dependency>
      <groupId>org.apache.abdera2</groupId>
      <artifactId>abdera2-common</artifactId>
      <version>2.0-SNAPSHOT</version>  
    </dependency>

    <dependency>
      <groupId>org.apache.ws.commons.axiom</groupId>
      <artifactId>axiom-impl</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.geronimo.specs</groupId>
      <artifactId>geronimo-activation_1.1_spec</artifactId>
    </dependency>

    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
    </dependency>

    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </dependency>

  </dependencies>
  
</project>
