<!--
  ~ 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.
  -->

<assembly>
    <id>axis2-eclipse-codege-plugin</id>
    <includeBaseDirectory>false</includeBaseDirectory>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>./target/classes</directory>
            <outputDirectory>classes</outputDirectory>
     	</fileSet>
    </fileSets>
	<dependencySets>
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${geronimo.spec.activation.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.geronimo.specs:geronimo-activation_1.1_spec:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${axiom.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
                	<include>org.apache.ws.commons.axiom:axiom-api:jar</include>
                	<include>org.apache.ws.commons.axiom:axiom-dom:jar</include>
                	<include>org.apache.ws.commons.axiom:axiom-impl:jar</include>
	        </includes>
	</dependencySet> 
		<dependencySet>
		<outputFileNameMapping>${artifactId}-${commons.logging.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>commons-logging:commons-logging:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${axis2.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.axis2:axis2:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${neethi.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.neethi:neethi:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${geronimo.spec.stax.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${wsdl4j.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>wsdl4j:wsdl4j:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${xmlbeans.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.xmlbeans:xmlbeans:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${xmlschema.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.ws.commons.schema:XmlSchema:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${log4j.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>log4j:log4j:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${woden.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>org.apache.woden:woden:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${commons.httpclient.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>commons-httpclient:commons-httpclient:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${commons.codec.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
	        	<include>commons-codec:commons-codec:jar</include>
	        </includes>
	</dependencySet> 
	<dependencySet>
		<outputFileNameMapping>${artifactId}-${jibx.version}.${extension}</outputFileNameMapping>
	        <outputDirectory>lib</outputDirectory>
	        <includes>
                	<include>jibx:jibx-bind:jar</include>
                	<include>jibx:jibx-run:jar</include>
	        </includes>
	</dependencySet> 
	</dependencySets>
</assembly>
