<!--
# 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</artifactId>
    <packaging>bundle</packaging>
    <name>Apache Stratos - Usage</name>

    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>target/generated-code/src</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <ListenerManager-RequiredServices>
                            org.apache.stratos.usage.api.TenantUsageRetriever
                        </ListenerManager-RequiredServices>
                        <Private-Package>
                            org.apache.stratos.usage.internal.*,
                            org.apache.stratos.usage.util.*,
                            org.apache.stratos.usage.services.*,
                            org.apache.stratos.usage.client.*
                        </Private-Package>
                        <Export-Package>
                            org.apache.stratos.usage.beans.*,
                            org.apache.stratos.usage.api.*,
                        </Export-Package>
                        <Import-Package>
                            org.wso2.carbon.rule.*,
                            org.wso2.carbon.registry.core.*;version=1.0.1,
                            org.wso2.carbon.registry.resource.*,
                            org.apache.stratos.common.*,
                            !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>
                    </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.registry.core</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.user.core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.user.mgt</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.stratos</groupId>
            <artifactId>org.apache.stratos.common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.stratos</groupId>
            <artifactId>org.apache.stratos.usage.agent</artifactId>
	    <version>${project.version}</version>
        </dependency>
         <!--<dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.usage.meteringqueryds.stub</artifactId>
        </dependency>-->
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.ndatasource.core</artifactId>
            <version>4.2.0</version>
        </dependency>
    </dependencies>
</project>
