<!--
# 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.stratos</groupId>
        <artifactId>stratos-components-parent</artifactId>
        <version>4.0.0-SNAPSHOT</version>
<!--	<relativePath>../pom.xml</relativePath>-->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>org.apache.stratos.usage.agent</artifactId>
    <packaging>bundle</packaging>
    <name>Apache Stratos - Usage Agent</name>

    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Axis2Module>${project.artifactId}-${project.version}</Axis2Module>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <Private-Package>
                        	!org.apache.stratos.usage.agent.api.*,
                            org.apache.stratos.usage.agent.*,
                        </Private-Package>
                        <Export-Package>
                            org.apache.stratos.usage.agent.api.*,
                            org.apache.stratos.usage.agent.beans.*,
                            org.apache.stratos.usage.agent.util.PublisherUtils,
                        </Export-Package>
                        <Import-Package>
                            org.apache.stratos.common.*,
                            org.wso2.carbon.registry.core.*;version=1.0.1,
                            org.wso2.carbon.registry.resource.*,
                            !javax.xml.namespace,
                            javax.xml.namespace; version=0.0.0,
                            javax.servlet;version="${imp.pkg.version.javax.servlet}",
                            javax.servlet.http;version="${imp.pkg.version.javax.servlet}",
                            org.apache.axiom.*; version="${axiom.osgi.version.range}",
                            *;resolution:=optional
                        </Import-Package>
                        <DynamicImport-Package>*</DynamicImport-Package>
                    </instructions>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <dependencies>

        <dependency>
            <groupId>org.apache.axis2.wso2</groupId>
            <artifactId>axis2</artifactId>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.utils</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.registry.core</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.stratos</groupId>
            <artifactId>org.apache.stratos.common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.statistics</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>
	<dependency>
            <groupId>org.wso2.carbon</groupId>
	    <artifactId>org.wso2.carbon.registry.common</artifactId>
            <version>${carbon.platform.version}</version>
	</dependency>
	<dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.event.core</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>
	<dependency>
	    <groupId>org.wso2.carbon</groupId>
	    <artifactId>org.wso2.carbon.email.verification</artifactId>
            <version>${carbon.platform.version}</version>
	</dependency>
	<dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.server</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.tomcat.ext</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>
	<dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.databridge.agent.thrift</artifactId>
            <version>${carbon.platform.version}</version>
        </dependency>

    </dependencies>

</project>
