<?xml version="1.0" encoding="UTF-8"?>
<!--
/*
 * Copyright 2001-2004 The Apache Software Foundation.
 *
 * Licensed 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>
    <pomVersion>3</pomVersion>
    <extend>../../etc/project.xml</extend>

    <name>Apache Axis 2.0 - Security Policy</name>
    <id>axis2-secpolicy</id>
    <groupId>org.apache.axis2</groupId>
    <description>Axis2 : WS-Security Policy implementation</description>

    <dependencies>
    	<dependency>
            <groupId>org.apache.ws.commons.axiom</groupId>
            <artifactId>axiom-api</artifactId>
            <version>${axiom.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ws.commons.axiom</groupId>
            <artifactId>axiom-impl</artifactId>
            <version>${axiom.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ws.commons.axiom</groupId>
            <artifactId>axiom-dom</artifactId>
            <version>${axiom.version}</version>
        </dependency>
        <dependency>
			<groupId>${stax.impl.groupid}</groupId>
			<artifactId>${stax.impl.artifactid}</artifactId>
			<version>${stax.impl.version}</version>
			<properties>
				<module>true</module>
			</properties>
		</dependency>
		<dependency>
			<groupId>stax</groupId>
			<artifactId>stax-api</artifactId>
			<version>${stax.api.version}</version>
			<properties>
				<module>true</module>
			</properties>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>${commons.logging.version}</version>
			<properties>
				<module>true</module>
			</properties>
		</dependency>
    	 <dependency>
            <groupId>org.apache.ws.commons.neethi</groupId>
            <artifactId>neethi</artifactId>
            <version>1.0.1</version>
            <properties>
                <module>true</module>
            </properties>
        </dependency>
	<dependency>
            <groupId>org.apache.neethi</groupId>
            <artifactId>neethi</artifactId>
            <version>2.0</version>
            <properties>
                <module>true</module>
            </properties>
        </dependency>
	
    </dependencies>
    <!-- build information for the project -->
    <build>
        <nagEmailAddress>axis-dev@ws.apache.org</nagEmailAddress>
        <sourceDirectory>src</sourceDirectory>
        <unitTestSourceDirectory>test</unitTestSourceDirectory>

        <unitTest>
            <includes>
                <include>**/*Test.java</include>
            </includes>
        </unitTest>
	</build>
    <reports/>
</project>
