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

  <properties>
    <httpcore.osgi.import.version>"[4.3.0, 4.4.0)"</httpcore.osgi.import.version>
    <commons-logging.osgi.import.version>"[1.1.0, 1.2.0)"</commons-logging.osgi.import.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpcore</artifactId>
      <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>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>fluent-hc</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.osgi</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>4.2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.osgi</groupId>
      <artifactId>org.osgi.compendium</artifactId>
      <version>4.2.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- test dependencies, mainly OSGi runtime environment -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
      </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.execchain.*;version=${project.version},
            org.apache.http.impl.client.*;version=${project.version},
            org.apache.http.osgi.services.*;version=${project.version}
            </_exportcontents>
            <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
            <Import-Package>
            javax.crypto,
            javax.crypto.spec,
            javax.net,
            javax.net.ssl,
            javax.security.auth.x500,
            org.ietf.jgss,,
            org.osgi.framework,
            org.osgi.service.cm,
            org.apache.commons.logging;version=${commons-logging.osgi.import.version},
            org.apache.http;version=${httpcore.osgi.import.version},
            org.apache.http.config;version=${httpcore.osgi.import.version},
            org.apache.http.concurrent;version=${httpcore.osgi.import.version},
            org.apache.http.entity;version=${httpcore.osgi.import.version},
            org.apache.http.io;version=${httpcore.osgi.import.version},
            org.apache.http.message;version=${httpcore.osgi.import.version},
            org.apache.http.params;version=${httpcore.osgi.import.version},
            org.apache.http.pool;version=${httpcore.osgi.import.version},
            org.apache.http.protocol;version=${httpcore.osgi.import.version},
            org.apache.http.util;version=${httpcore.osgi.import.version},
            org.apache.http.impl;version=${httpcore.osgi.import.version},
            org.apache.http.impl.entity;version=${httpcore.osgi.import.version},
            org.apache.http.impl.io;version=${httpcore.osgi.import.version},
            org.apache.http.impl.pool;version=${httpcore.osgi.import.version},
            net.sf.ehcache.*;resolution:=optional,
            net.spy.memcached.*;resolution:=optional
            </Import-Package>
            <Bundle-Activator>org.apache.http.osgi.impl.HttpProxyConfigurationActivator</Bundle-Activator>
            <!-- 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>

  <reporting>
    <plugins>

      <plugin>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>${hc.project-info.version}</version>
        <inherited>false</inherited>
        <reportSets>
          <reportSet>
            <reports>
              <report>dependencies</report>
              <report>dependency-info</report>
              <report>summary</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>

    </plugins>
  </reporting>

</project>
