<!--
   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>  
        <relativePath>../..</relativePath>
    </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>
