<?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.

-->
<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.taverna.commonactivities</groupId>
		<artifactId>apache-taverna-common-activities</artifactId>
		<version>2.1.1-incubating-SNAPSHOT</version>
	</parent>
	<artifactId>taverna-wsdl-activity</artifactId>
	<packaging>bundle</packaging>
	<name>Apache Taverna WSDL Activity</name>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<!-- Use the java version instead of xmlcommons for javax.* packages -->
						<Import-Package>javax.xml.namespace;version="0.0.0",javax.xml.parsers;version="0.0.0",org.w3c.dom;version="0.0.0",org.xml.sax;version="0.0.0",*</Import-Package>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
		<dependency>
			<groupId>org.apache.taverna.engine</groupId>
			<artifactId>taverna-workflowmodel-api</artifactId>
			<version>${taverna.engine.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.taverna.engine</groupId>
			<artifactId>taverna-reference-api</artifactId>
			<version>${taverna.engine.version}</version>
		</dependency>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>taverna-wsdl-generic</artifactId>
			<version>${project.parent.version}</version>
			<type>test-jar</type>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>taverna-wsdl-generic</artifactId>
			<version>${project.parent.version}</version>			
		</dependency>
		<dependency>
			<groupId>org.apache.taverna.engine</groupId>
			<artifactId>taverna-credential-manager-api</artifactId>
			<version>${taverna.engine.version}</version>
		</dependency>
		<dependency>
			<groupId>org.jdom</groupId>
			<artifactId>com.springsource.org.jdom</artifactId>
			<version>${jdom.version}</version>
		</dependency>
<!--
		<dependency>
			<groupId>org.apache.ws</groupId>
			<artifactId>com.springsource.org.apache.ws.security</artifactId>
			<version>${ws.security.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.xml</groupId>
			<artifactId>com.springsource.org.apache.xml.security</artifactId>
			<version>${xml.security.version}</version>
		</dependency>
-->
<!--
<dependency>
  <groupId>org.apache.axis</groupId>
  <artifactId>com.springsource.org.apache.axis</artifactId>
  <version>1.4.0</version>
</dependency>
-->
<dependency>
  <groupId>org.apache.ws.security</groupId>
  <artifactId>wss4j</artifactId>
  <version>${wss4j.version}</version>
  <!-- NOTE: wss4j 1.6 removes org.apache.ws.axis.security.WSDoAllSender
       Do we still need this? I can't see how it's used.. -->
</dependency>
<dependency>
  <groupId>org.apache.santuario</groupId>
  <artifactId>xmlsec</artifactId>
  <version>${santuario.xmlsec.version}</version>
</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.taverna.engine</groupId>
			<artifactId>taverna-activity-test-utils</artifactId>
			<version>${taverna.engine.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.taverna.engine</groupId>
			<artifactId>taverna-workflowmodel-impl</artifactId>
			<version>${taverna.engine.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
