<!--
   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-extensions-opensearch</artifactId>
    <packaging>bundle</packaging>
    <name>Abdera Extensions - OpenSearch</name>
    <version>1.2-SNAPSHOT</version>  
    <description>Atom Specification Extensions - OpenSearch</description>
    <properties>
      <topDir>${basedir}/../..</topDir>
      <abdera.osgi.default.exports>
        org.apache.abdera.ext.opensearch.*
      </abdera.osgi.default.exports>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.abdera</groupId>
            <artifactId>abdera-client</artifactId>
            <version>1.2-SNAPSHOT</version>  
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.abdera</groupId>
            <artifactId>abdera-server</artifactId>
            <version>1.2-SNAPSHOT</version>  
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>${easymock.version}</version>  
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>xmlunit</groupId>
            <artifactId>xmlunit</artifactId>
            <version>1.3</version>  
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty</artifactId>
            <version>${jetty.version}</version>  
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
      <groupId>org.apache.abdera</groupId>
      <artifactId>abdera-extensions-json</artifactId>
      <version>1.2-SNAPSHOT</version>  
      <scope>test</scope>
    </dependency> 
    </dependencies>
</project>
