<?xml version="1.0" encoding="UTF-8"?>
<!--
   ====================================================================
   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.
   ====================================================================

   This software consists of voluntary contributions made by many
   individuals on behalf of the Apache Software Foundation.  For more
   information on the Apache Software Foundation, please see
   <http://www.apache.org />.
 -->

<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.httpcomponents</groupId>
    <artifactId>httpcomponents-client</artifactId>
    <version>4.1</version>
  </parent>
  <artifactId>httpclient-osgi</artifactId>
  <name>HttpClient OSGi bundle</name>
  <inceptionYear>1999</inceptionYear>
  <description>
   HttpComponents Client (OSGi bundle)
  </description>
  <url>http://hc.apache.org/httpcomponents-client</url>
  <packaging>bundle</packaging>

  <dependencies>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>${commons-codec.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpmime</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient-cache</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compile.source>1.5</maven.compile.source>
    <maven.compile.target>1.5</maven.compile.target>
  </properties>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Bundle-Name>Apache ${project.name}</Bundle-Name>
            <Bundle-SymbolicName>${project.groupId}.httpclient</Bundle-SymbolicName>
            <_exportcontents>
            org.apache.http.auth.*;version=${project.version},
            org.apache.http.cookie.*;version=${project.version},
            org.apache.http.conn.*;version=${project.version},
            org.apache.http.client.*;version=${project.version},
            org.apache.http.entity.mime.*;version=${project.version},
            org.apache.http.impl.auth.*;version=${project.version},
            org.apache.http.impl.cookie.*;version=${project.version},
            org.apache.http.impl.conn.*;version=${project.version},
            org.apache.http.impl.client.*;version=${project.version}
            </_exportcontents>
            <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
            <Import-Package>
            javax.crypto,
            javax.crypto.spec,
            javax.net.ssl,javax.security.auth.x500,
            org.ietf.jgss,
            org.apache.commons.logging;version=${commons-logging.version},
            org.apache.http;version=${httpcore.version},
            org.apache.http.entity;version=${httpcore.version},
            org.apache.http.io;version=${httpcore.version},
            org.apache.http.message;version=${httpcore.version},
            org.apache.http.params;version=${httpcore.version},
            org.apache.http.protocol;version=${httpcore.version},
            org.apache.http.util;version=${httpcore.version},
            org.apache.http.impl;version=${httpcore.version},
            org.apache.http.impl.entity;version=${httpcore.version},
            org.apache.http.impl.io;version=${httpcore.version},
            net.sf.ehcache.*;resolution:=optional,
            net.spy.memcached.*;resolution:=optional
            </Import-Package>
            <!-- Stop the JAVA_1_n_HOME variables from being treated as headers by Bnd -->
            <_removeheaders>JAVA_1_3_HOME,JAVA_1_4_HOME</_removeheaders>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>clirr-maven-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
    <finalName>org.apache.httpcomponents.httpclient_${project.version}</finalName>
  </build>

  <reports>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>clirr-maven-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </reports>
</project>
