<!--
  ~ 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.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" />
<meta http-equiv="content-type" content="" />
<title>Code Generator Tool Guide for Command Line and Ant
Task</title>
</head>
<body lang="en" xml:lang="en">
<h1>Code Generator Tool Guide for Command Line and Ant Task</h1>
<p>The Code Generator tool consists of a command line version and
an Ant Task. This document will list the command line references
and Ant task references. Also in detail, this document shows how to
build file using custom Ant task and invoking the Code Generator
from Ant.</p>
<p>This tool is bundled with the <a href="../download.cgi#std-bin">Axis2 Binary
Distribution</a>.</p>
<h2>Content</h2>
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#cmdline">Command Line Version</a>
<ul>
<li><a href="#cmdref">Option Reference</a></li>
</ul>
</li>
<li><a href="#ant">Ant Task</a>
<ul>
<li><a href="#antref">Ant Task Reference</a></li>
<li><a href="#example">Example Build File Using the Custom Ant
Task</a></li>
<li><a href="#invoking">Invoking the Code Generator From
Ant</a></li>
</ul>
</li>
<li><a href="#appendix">Appendix</a></li>
</ul>
<a name="intro" id="intro"></a>
<h2>Introduction</h2>
<p>This basic tool is implemented by the WSDL2Code class and just
for the convenience in the case of Java (which would be the
majority) there is another WSDL2Java class. One can choose to run
the main classes directly or use one of the scripts to run the
WSDL2Code and WSDL2Java appropriately. (the scripts are found in
the bin directory of the <a href=
"../download.cgi#std-bin">Standard Binary
Distribution</a>)</p>
<a name="cmdline" id="cmdline"></a>
<h2>Command Line Version</h2>
<p>For those users who wish to use the command line version of the
tool, this section will be of value.</p>
<a name="cmdref" id="cmdref"></a>
<h3>Option Reference</h3>
<p>Usage WSDL2Code &lt;option_reference&gt;</p>
<p><b>E.g. :- WSDL2Code -uri &lt;Location of WSDL&gt;</b></p>
<table>
<tbody>
<tr>
<td width="20%"><strong>Short Option</strong></td>
<td width="20%"><strong>Long Option</strong></td>
<td width="60%"><strong>Description</strong></td>
<td></td>
</tr>
<tr>
<td width="20%">-uri &lt;Location of WSDL&gt;</td>
<td width="20%">None</td>
<td width="60%">WSDL file location. This should point to a WSDL
file in the local file system.</td>
<td></td>
</tr>
<tr>
<td width="20%">-o &lt;output Location&gt;</td>
<td width="20%">--output &lt;output Location&gt;</td>
<td width="60%">Output file location. This is where the files would
be copied once the code generation is done. If this option is
omitted the generated files would be copied to the working
directory.</td>
<td></td>
</tr>
<tr>
<td width="20%">-l &lt;language&gt;</td>
<td width="20%">--language &lt;language&gt;</td>
<td width="60%">Output language. Currently the code generator can
generate code in Java but it has the ability to be extended to
support other languages.</td>
<td></td>
</tr>
<tr>
<td width="20%">-p &lt;package name&gt;</td>
<td width="20%">--package &lt;package name&gt;</td>
<td width="60%">The target package name. If omitted, a default
package (formed using the target namespace of the WSDL) will be
used.</td>
<td></td>
</tr>
<tr>
<td width="20%">-a</td>
<td width="20%">--async</td>
<td width="60%">Generate code only for async style. When this
option is used the generated stubs will have only the asynchronous
invocation methods. Switched off by default.</td>
<td></td>
</tr>
<tr>
<td width="20%">-s</td>
<td width="20%">--sync</td>
<td width="60%">Generate code only for sync style . When this
option is used the generated stubs will have only the synchronous
invocation methods. Switched off by default. When used with the -a
option, this takes precedence.</td>
<td></td>
</tr>
<tr>
<td width="20%">-t</td>
<td width="20%">--test-case</td>
<td width="60%">Generates a test case. In the case of Java it would
be a JUnit test case.</td>
<td></td>
</tr>
<tr>
<td width="20%">-ss</td>
<td width="20%">--server-side</td>
<td width="60%">Generates server side code (i.e. skeletons).
Default is off.</td>
<td></td>
</tr>
<tr>
<td width="20%">-sd</td>
<td width="20%">--service-description</td>
<td width="60%">Generates the service descriptor (i.e. server.xml).
Default is off. Only valid with -ss, the server side code
generation option.</td>
<td></td>
</tr>
<tr>
<td width="20%">-d &lt;databinding&gt;</td>
<td width="20%">--databinding-method &lt;databinding&gt;</td>
<td width="60%">Specifies the Databinding framework. Valid values
are xmlbeans, adb, jibx, and none. Default is adb.</td>
<td></td>
</tr>
<tr>
<td width="20%">-g</td>
<td width="20%">--generate-all</td>
<td width="60%">Generates all the classes. This option is valid
only with the -ss (server side code generation) option. When on,
the client code (stubs) will also be generated along with the
skeleton.</td>
<td></td>
</tr>
<tr>
<td width="20%">-u</td>
<td width="20%">--unpack-classes</td>
<td width="60%">Unpack classes. This option specifies whether to
unpack the classes and generate separate classes for the
databinders.</td>
<td></td>
</tr>
<tr>
<td width="20%">-sn &lt;service name&gt;</td>
<td width="20%">--service-name &lt;service name&gt;</td>
<td width="60%">Specifies the service name to be code generated. If
the service name is not specified, then the first service will be
picked.</td>
<td></td>
</tr>
<tr>
<td width="20%">-pn &lt;port name&gt;</td>
<td width="20%">--port-name &lt;port name&gt;</td>
<td width="60%">Specifies the port name to be code generated. If
the port name is not specified, then the first port (of the
selected service) will be picked.</td>
<td></td>
</tr>
<tr>
<td width="20%">-ns2p</td>
<td width="20%">--namespace2package</td>
<td width="60%">Specifies a comma separated list of namespaces and
packages where the given package will be used in the place of the
auto generated package for the relevant namespace. The list will be
the format of ns1=pkg1,ns2=pkg2.</td>
<td></td>
</tr>
<tr>
<td width="20%">-ssi</td>
<td width="20%">--serverside-interface</td>
<td width="60%">Generate an interface for the service
skeleton.</td>
<td></td>
</tr>
<tr>
<td width="20%">-wv</td>
<td width="20%">--wsdl-version</td>
<td width="60%">WSDL Version. Valid Options : 2, 2.0, 1.1</td>
<td></td>
</tr>
<tr>
<td width="20%">-S</td>
<td width="20%">--source-folder</td>
<td width="60%">Specify a directory path for generated source</td>
<td></td>
</tr>
<tr>
<td width="20%">-R</td>
<td width="20%">--resource-folder</td>
<td width="60%">Specify a directory path for generated resources</td>
<td></td>
</tr>
<tr>
<td width="20%">-em</td>
<td width="20%">--external-mapping</td>
<td width="60%">Specify an external mapping file</td>
<td></td>
</tr>
<tr>
<td width="20%">-f</td>
<td width="20%">--flatten-files</td>
<td width="60%">Flattens the generated files</td>
<td></td>
</tr>
<tr>
<td width="20%">-uw</td>
<td width="20%">--unwrap-params</td>
<td width="60%">Switch on un-wrapping</td>
<td></td>
</tr>
<tr>
<td width="20%">-xsdconfig</td>
<td width="20%"></td>
<td width="60%">Use XMLBeans .xsdconfig file. Valid only with -d xmlbeans</td>
<td></td>
</tr>
<tr>
<td width="20%">-ap</td>
<td width="20%">--all-ports</td>
<td width="60%">Generate code for all ports</td>
<td></td>
</tr>
<tr>
<td width="20%">-or</td>
<td width="20%">--over-ride</td>
<td width="60%">Overwrite the existing classes</td>
<td></td>
</tr>
<tr>
<td width="20%">-b</td>
<td width="20%">--backword-compatible</td>
<td width="60%">Generate Axis 1.x backword compatible code</td>
<td></td>
</tr>
<tr>
<td width="20%">-sp</td>
<td width="20%">--suppress-prefixes</td>
<td width="60%">Suppress namespace prefixes (Optimzation that reduces size of soap request/response)</td>
<td></td>
</tr>
<tr>
<td width="20%"></td>
<td width="20%">--noBuildXML</td>
<td width="60%">Don't generate the build.xml in the output directory</td>
<td></td>
</tr>
<tr>
<td width="20%"></td>
<td width="20%">--noWSDL</td>
<td width="60%">Don't generate WSDL's in the resources directory</td>
<td></td>
</tr>
<tr>
<td width="20%"></td>
<td width="20%">--noMessageReceiver</td>
<td width="60%">Don't generate a MessageReceiver in the generated sources</td>
<td></td>
</tr>
</tbody>
</table>
<p>Apart from these mentioned options one can pass extra options by
prefixing them with -E (uppercase). These extra options will be
processed by the extensions. The extra options that can be passed
are documented separately with the extensions documentation (For
example with ADB).</p>
<a name="ant" id="ant"></a>
<h2>Ant Task</h2>
<p>The code generator also comes bundled with an Ant task. The ant
task is implemented by the org.apache.axis2.tool.ant.AntCodegenTask
class. Following are the ant task attributes.</p>
<a name="antref" id="antref"></a>
<h3>Ant Task Reference</h3>
<table>
<tbody>
<tr>
<td>wsdlfilename</td>
<td>WSDL file location. Maps to the -uri option of the command line
tool.</td>
</tr>
<tr>
<td>output</td>
<td>Output file location. This is where the files would be copied
once the code generation is done. If this option is omitted the
generated files would be copied to the working directory. Maps to
the -o option of the command line tool.</td>
</tr>
<tr>
<td>language</td>
<td>Output language. Currently the code generator can generate code
in Java. Maps to the -l option of the command line tool.</td>
</tr>
<tr>
<td>packageName</td>
<td>The target package name. If omitted, a default package (formed
using the target namespace of the WSDL) will be used. Maps to the
-p option of the command line tool.</td>
</tr>
<tr>
<td>databindingName</td>
<td>Data binding framework name. Maps to the -d option of the
command line tool. Possible values include "adb", "xmlbeans",
"jibx","jaxbri".</td>
</tr>
<tr>
<td>serviceName</td>
<td>The name of the service in the case of multiple services. Maps
to -sn options of the command line tool.</td>
</tr>
<tr>
<td>portName</td>
<td>The name of the port in the presence of multiple ports. Maps to
-pn options of the command line tool.</td>
</tr>
<tr>
<td>asyncOnly</td>
<td>Generate code only for async style. When this option is used
the generated stubs will have only the asynchronous invocation
methods. Defaults to false if omitted. Only true and false are
applicable as values. Maps to the -a option of the command line
tool.</td>
</tr>
<tr>
<td>syncOnly</td>
<td>Generate code only for sync style. When this option is used the
generated stubs will have only the synchronous invocation methods.
Defaults to false if omitted. Only true and false are applicable as
values. Maps to the -s option of the command line tool.</td>
</tr>
<tr>
<td>serverSide</td>
<td>Generates server side code (i.e. skeletons). Only true and
false are applicable as values. Default is false. Maps to the -ss
option of the command line tool.</td>
</tr>
<tr>
<td>testcase</td>
<td>Generates a test case. Possible values are true and false. Maps
to the -t options of the command line tool.</td>
</tr>
<tr>
<td>generateServiceXml</td>
<td>Generates server side code (i.e. skeletons). Only true and
false are applicable as values. Default is false. Maps to the -sd
option of the command line tool.</td>
</tr>
<tr>
<td>unpackClasses</td>
<td>Unpacks the generated classes. This forces the databinding
classes to be generated separately, which otherwise would have been
generated as inner classes.</td>
</tr>
<tr>
<td>generateAllClasses</td>
<td>Generates all the classes including client and server side
code. Maps to the -g option of the command line tool.</td>
</tr>
<tr>
<td>namespaceToPackages</td>
<td>A list of namespace to package mappings.</td>
</tr>
<tr>
<td>serverSideInterface</td>
<td>Flag stating whether to generate an interface for the server
side skeleton.</td>
</tr>
<tr>
<td>repositoryPath</td>
<td>Sets the repository path to be used. Maps to the -r option of
the command line tool.</td>
</tr>
<tr>
<td>wsdlVersion</td>
<td>Sets the version of the wsdl that is being used during
codegeneration. This deafults to 1.1 and one can set this to 2,
when trying to work with a WSDL 2.0 document. Maps to the -wv
option of the command line tool.</td>
</tr>
<tr>
<td>externalMapping</td>
<td>Location of the external mapping file to be used. Maps to the
-em option of the command line tool.</td>
</tr>
<tr>
<td>targetSourceFolderLocation</td>
<td>Rather than dumping all the code in the same location, one has
the option to make the sources to be generated in a different
location, given using this option. Maps to the -S option of the
command line tool.</td>
</tr>
<tr>
<td>targetResourcesFolderLocation</td>
<td>Rather than dumping all the code in the same location, one has
the option to make the resources to be generated in a different
location, given using this option. Maps to the -R option of the
command line tool.</td>
</tr>
<tr>
<td>unwrap</td>
<td>This will select between wrapped and unwrapped during code
generation. Default is set to false. Maps to the -uw option of the
command line tool.</td>
</tr>
</tbody>
</table>
<a name="example" id="example"></a>
<h3>Example Build File Using the Custom Ant Task</h3>
<p>Following is an example ant build file that uses the custom Ant
task. You can use any wsdl file to test the example. Replace the
"CombinedService.wsdl" with the name of your wsdl file in the
following script.</p>
<pre>
1 &lt;?xml version="1.0"?&gt;
    2 &lt;project name="CodegenExample" default="main" basedir="."&gt;
    3
    4 &lt;path id="example.classpath"&gt;
    5 &lt;fileset dir="classes"&gt;
    6 &lt;include name="**/*.jar" /&gt;
    7 &lt;/fileset&gt;
    8 &lt;/path&gt;
    9
    10 &lt;target name="declare" &gt;
    11 &lt;taskdef name="codegen"
    12 classname="org.apache.axis2.tool.ant.AntCodegenTask"
    13 classpathref="example.classpath"/&gt;
    15 &lt;/target&gt;
    16
    17 &lt;target name="main" depends="declare"&gt;
    18 &lt;codegen
    19 wsdlfilename="C:\test\wsdl\CombinedService.wsdl"
    20 output="C:\output"
    21 serverside="true"
    22 generateservicexml="true"/&gt;
    23 &lt;/target&gt;
    24
    25 &lt;/project&gt;
</pre>
<p>In the above build script, from line 4 to 8 it sets the
classpath and includes all the .jar files (which are listed below)
into the classpath. From line 10 to 15 it creates a target to
declare a task called "codegen" and sets the appropriate class
(org.apache.axis2.tool.ant.AntCodegenTask) within the classpath in
line 12. From line 17 to 23 it creates the "main" target to
generate the code from the given wsdl. There are some arguments set
form line 19 to 22. Here in line 19 it sets the location of the
wsdl. In line 20 it sets the output directory in which the code is
generated. Line 21 indicates that this build generates the server
side code(skeleton) and line 22 indicates that the services.xml is
also generated.</p>
<p>Notice the main target that uses the "codegen" task which will
use the org.apache.axis2.tool.ant.AntCodegenTask class and run the
code generation tool internally while passing the relevant
arguments and do the proper generation. If a user types</p>
<p><code>&gt;ant</code> or <code>&gt;ant main</code></p>
<p>it will generate the server side code and services.xml for the
given WSDL file (C:\test\wsdl\CombinedService.wsdl -in the above
instance) and the generated code will be written to the specified
output path (C:\output - in the above instance).</p>
<p>For this Ant task to work the following jars need to be in the
class path.</p>
<ul>
<li>axis2-*.jar (from the Axis2 distribution)</li>
<li>wsdl4j-1.6.2.jar or higher (The WSDL4J implementation jar.
Bundled with the Axis2 distribution)</li>
<li>stax-api-1.0.1.jar (The StAX API's that contain the
javax.xml.namespace.QName class. This jar may be replaced by any
other jar that contains the javax.xml.namespace.QName
implementation. However Axis2 uses this class from the
stax-api-1.0.1.jar which comes bundled with the Axis2
distribution)</li>
<li>commons-logging-1.1.jar, neethi-2.0.jar and XmlSchema-1.2.jar
(from the Axis2 distribution)</li>
<li>axiom-api-1.2.1.jar and axiom-impl-1.2.1.jar (from the Axis2
distribution)</li>
<li>activation-1.1.jar (from the Axis2 distribution)</li>
<li>wstx-asl-3.1.0.jar (from the Axis2 distribution)</li>
</ul>
<a name="invoking" id="invoking"></a>
<h3>Invoking the Code Generator From Ant</h3>
<p>Since the users may find altering their ant class path a bit
daunting they can also follow an easier technique. The code
generator main class can be invoked directly through the build
file.</p>
<p>Below is an example of a full build.xml needed to run WSDL2Java
and generate the Java source files, compile the sources, and build
an AAR file ready for deployment (These are done one by one, by
calling the targets in the build file separately):</p>
<pre class="code">
&lt;!DOCTYPE project&gt;

&lt;project name="wsdl2java-example" default="usage" basedir="."&gt;

&lt;property name="project-name" value="wsdl2java-example"/&gt;
&lt;property file="build.properties"/&gt;

&lt;property name="build" value="build"/&gt;
&lt;property name="src" value="src"/&gt;
&lt;property name="build.classes" value="build/classes" /&gt;

&lt;path id="axis.classpath"&gt;
&lt;pathelement location="build/classes" /&gt;
&lt;fileset dir="${axis.home}/lib"&gt;
&lt;include name="**/*.jar" /&gt;
&lt;/fileset&gt;
&lt;pathelement location="${build.classes}" /&gt;
&lt;/path&gt;

&lt;path id="axis_client.classpath"&gt;
&lt;pathelement location="build/classes" /&gt;
&lt;fileset dir="${axis.home}"&gt;
&lt;include name="**/*.jar" /&gt;
&lt;/fileset&gt;
&lt;fileset dir="lib"&gt;
&lt;include name="*.jar" /&gt;
&lt;/fileset&gt;
&lt;pathelement location="${build.classes}" /&gt;
&lt;/path&gt;

&lt;target name="usage" description="Build file usage info (default task)"&gt;
&lt;echo message=" " /&gt;
&lt;echo message="${project-name} " /&gt;
&lt;echo message="-------------------------------------------------------" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message="Available Targets:" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message=" Compiling:" /&gt;
&lt;echo message=" compile - Compiles the WSDL2Java source code" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message=" Compiling client:" /&gt;
&lt;echo message=" compile_client - Compiles the client source code" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message=" Cleaning up:" /&gt;
&lt;echo message=" clean - Delete class files" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message=" WSDL:" /&gt;
&lt;echo message=" wsdl2java - Generate source from WSDL" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message=" AAR:" /&gt;
&lt;echo message=" aar - Generate an .aar for deployment into WEB-INF/services" /&gt;
&lt;echo message=" " /&gt;
&lt;echo message=" Executing:" /&gt;
&lt;echo message=" runLogin - Execute the runLogin client" /&gt;
&lt;/target&gt;

&lt;target name="prepare" &gt;
&lt;mkdir dir="${build.classes}" /&gt;
&lt;/target&gt;

&lt;target name="clean" &gt;
&lt;delete dir="${build}" /&gt;
&lt;delete dir="${dist}" /&gt;
&lt;/target&gt;

&lt;target name="compile"&gt;
&lt;echo message="Compiling wsdl2 files"/&gt;

&lt;javac
srcdir="output"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true"&gt;

&lt;classpath refid="axis.classpath"/&gt;
&lt;/javac&gt;

&lt;/target&gt;

&lt;target name="wsdl2java" depends="clean,prepare"&gt;
&lt;delete dir="output" /&gt;
&lt;java classname="org.apache.axis2.wsdl.WSDL2Java" fork="true"&gt;
&lt;classpath refid="axis.classpath"/&gt;
&lt;arg value="-d"/&gt;
&lt;arg value="xmlbeans"/&gt;
&lt;arg value="-uri"/&gt;
&lt;arg file="wsdl/LoginEndpoint.wsdl"/&gt;
&lt;arg value="-ss"/&gt;
&lt;arg value="-g"/&gt;
&lt;arg value="-sd"/&gt;
&lt;arg value="-o"/&gt;
&lt;arg file="output"/&gt;
&lt;arg value="-p"/&gt;
&lt;arg value="org.example.types"/&gt;
&lt;/java&gt;

&lt;!-- Move the schema folder to classpath--&gt;
&lt;move todir="${build.classes}"&gt;
&lt;fileset dir="output/resources"&gt;
&lt;include name="**/*schema*/**/*.class"/&gt;
&lt;include name="**/*schema*/**/*.xsb"/&gt;
&lt;/fileset&gt;
&lt;/move&gt;

&lt;/target&gt;

&lt;target name="jar_wsdl" depends="compile"&gt;
&lt;jar jarfile="lib/axis2_example_wsdl.jar" &gt;
&lt;fileset dir="${build.classes}" /&gt;
&lt;/jar&gt;
&lt;/target&gt;

&lt;!-- build an .aar file for axis2 web services --&gt;
&lt;target name="aar" depends="compile"&gt;
&lt;delete dir="${build.classes}/META-INF" /&gt;
&lt;mkdir dir="${build.classes}/META-INF" /&gt;
&lt;copy todir="${build.classes}/META-INF" &gt;
&lt;fileset dir="output/resources" &gt;
&lt;!-- axis2 web services definitions file --&gt;
&lt;include name="services.xml"/&gt;
&lt;/fileset&gt;
&lt;fileset dir="wsdl" &gt;
&lt;include name="LoginEndpoint.wsdl"/&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
&lt;jar jarfile="dist/LoginEndpoint.aar" &gt;
&lt;fileset dir="${build.classes}" /&gt;
&lt;/jar&gt;
&lt;/target&gt;

&lt;target name="compile_client"&gt;
&lt;echo message="Compiling client files"/&gt;

&lt;javac
srcdir="src"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true"&gt;

&lt;classpath refid="axis.classpath"/&gt;
&lt;/javac&gt;

&lt;/target&gt;

&lt;target name="runLogin" depends="prepare,compile_client" description="run simple Login client"&gt;
&lt;java classname="org.client.LoginClient" &gt;
&lt;classpath refid="axis_client.classpath"/&gt;
&lt;/java&gt;
&lt;/target&gt;

&lt;/project&gt;
</pre>
<p>Place the above build.xml file in the 'bin' directory of the
axis2 binary distribution. Then create a build.properties file in
the same directory and specify the axis.home path pointing to the
axis2 binary distribution</p>
<p>E.g. :- axis.home=C://Axis2//axis2-1.1-bin</p>
<p>The above build.xml example also assumes three empty directories
exist, 'dist', 'lib', and 'src'.</p>
<p>Below is a validated WSDL Document following the
Document/Literal Style. The name of this file matches the name used
in the WSDL2Java ant task above, LoginEndpoint.wsdl.</p>
<pre class="code">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;

    &lt;definitions name="LoginService" targetNamespace="http://login" xmlns:tns="http://login"
    xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://login/types"&gt;

    &lt;types&gt;
    &lt;schema targetNamespace="http://login/types" xmlns:tns="http://login/types"
    xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns="http://www.w3.org/2001/XMLSchema"&gt;
    &lt;import namespace="http://schemas.xmlsoap.org/soap/encoding/"/&gt;
    &lt;element name="returnWebLoginElement"&gt;
    &lt;complexType&gt;
    &lt;sequence&gt;

    &lt;element ref="tns:soap_session_idElement"/&gt;
    &lt;element ref="tns:web_user_nameElement"/&gt;
    &lt;/sequence&gt;
    &lt;/complexType&gt;
    &lt;/element&gt;
    &lt;element name="webLoginElement"&gt;

    &lt;complexType&gt;
    &lt;sequence&gt;
    &lt;element ref="tns:user_nameElement"/&gt;
    &lt;element ref="tns:user_passwordElement"/&gt;
    &lt;/sequence&gt;
    &lt;/complexType&gt;

    &lt;/element&gt;
    &lt;element name="user_nameElement" type="xsd:string"/&gt;
    &lt;element name="user_passwordElement" type="xsd:string"/&gt;
    &lt;element name="soap_session_idElement" type="xsd:string"/&gt;
    &lt;element name="web_user_nameElement" type="xsd:string"/&gt;
    &lt;/schema&gt;&lt;/types&gt;

    &lt;message name="LoginEndpoint_webLogin"&gt;
    &lt;part name="parameters" element="ns2:webLoginElement"/&gt;
    &lt;/message&gt;
    &lt;message name="LoginEndpoint_webLoginResponse"&gt;
    &lt;part name="result" element="ns2:returnWebLoginElement"/&gt;
    &lt;/message&gt;

    &lt;portType name="LoginEndpoint"&gt;
    &lt;operation name="webLogin"&gt;
    &lt;input message="tns:LoginEndpoint_webLogin" name="LoginEndpoint_webLogin"/&gt;
    &lt;output message="tns:LoginEndpoint_webLoginResponse" name="LoginEndpoint_webLoginResponse"/&gt;
    &lt;/operation&gt;
    &lt;/portType&gt;

    &lt;binding name="LoginEndpointBinding" type="tns:LoginEndpoint"&gt;
    &lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/&gt;
    &lt;operation name="webLogin"&gt;
    &lt;soap:operation soapAction="webLogin"/&gt;
    &lt;input name="LoginEndpoint_webLogin"&gt;
    &lt;soap:body use="literal"/&gt;

    &lt;/input&gt;
    &lt;output name="LoginEndpoint_webLoginResponse"&gt;
    &lt;soap:body use="literal"/&gt;
    &lt;/output&gt;
    &lt;/operation&gt;
    &lt;/binding&gt;

    &lt;service name="LoginService"&gt;
    &lt;port name="LoginEndpointPort" binding="tns:LoginEndpointBinding"&gt;
    &lt;soap:address location="http://localhost:8080/axis2/services/LoginService"/&gt;&lt;/port&gt;
    &lt;/service&gt;&lt;/definitions&gt;
</pre>
<p>Place the above file, named LoginEndpoint.wsdl, in the directory
'wsdl' which is also inside the 'bin' directory. Run the wsdl2java
command via the ant task defined above (&gt;ant wsdl2java), and
there will be a directory called 'output' created. This directory
contains the WSDL2Java generated source.</p>
<p>An important detail is that an XMLBean class file is also
generated by WSDL2Java, TypeSystemHolder.class. That file is placed
into build/classes by the above ant task and will be needed to
compile the generated sources. A frequent problem is users get an
error such as:</p>
<p><em><b>ClassNotFoundException : Cannot load SchemaTypeSystem.
Unable to load class with name
schemaorg_apache_xmlbeans.system.s68C41DB812F52C975439BA10FE4FEE54.TypeSystemHolder.
Make sure the generated binary files are on the
classpath.</b></em></p>
<p>The TypeSystemHolder.class generated by WSDL2Java must be placed
in your classpath in order to avoid this error.</p>
<p>The next step is to modify the generated Skeleton Java Source
file - the Web service. This file as generated returns null and
needs to be updated to contain the business logic.</p>
<p>After the WSDL2Java command runs the file LoginEndpoint.wsdl,
edit the following file:</p>
<p>output/src/org/example/types/LoginServiceSkeleton.java. You
should see the following code:</p>
<pre class="code">
/**
    * LoginServiceSkeleton.java
    *
    * This file was auto-generated from WSDL
    * by the Apache Axis2 version: 1.0-RC4 Apr 28, 2006 (05:23:23 IST)
    */
    package org.example.types;
    /**
    * LoginServiceSkeleton java skeleton for the axisService
    */
    public class LoginServiceSkeleton {


    /**
    * Auto generated method signature

    * @param param0

    */
    public login.types.ReturnWebLoginElementDocument webLogin
    (login.types.WebLoginElementDocument param0 )

    {
    //Todo fill this with the necessary business logic
    throw new java.lang.UnsupportedOperationException();
    }

    }
</pre>
<p>Replace the contents of this file with the following, which uses
the complex types generated by WSDL2Java and the example wsdl
file:</p>
<pre class="code">
/**
    * LoginServiceSkeleton.java
    *
    * This file was auto-generated from WSDL
    * by the Apache Axis2 version: 1.0-RC4 Apr 28, 2006 (05:23:23 IST)
    */
    package org.example.types;
    import login.types.ReturnWebLoginElementDocument;
    import login.types.ReturnWebLoginElementDocument.*;
    import login.types.WebLoginElementDocument;
    import login.types.WebLoginElementDocument.*;

    /**
    * Auto generated java skeleton for the service by the Axis code generator
    */
    public class LoginServiceSkeleton {

    /**
    * Auto generated method signature

    * @param webLoginElementDocument changed from param0

    */
    public ReturnWebLoginElementDocument webLogin
    (WebLoginElementDocument webLoginElementDocument ){

    //Todo fill this with the necessary business logic
    System.out.println("LoginServiceSkeleton.webLogin reached successfully!");

    // Get parameters passed in
    WebLoginElement webLoginElement = webLoginElementDocument.getWebLoginElement();
    String userName = webLoginElement.getUserNameElement();
    String password = webLoginElement.getUserPasswordElement();
    System.out.println("LoginServiceSkeleton.webLogin userName: " + userName);
    System.out.println("LoginServiceSkeleton.webLogin password: " + password);

    // input paramaters would be used here

    // prepare output
    ReturnWebLoginElementDocument retDoc =
    ReturnWebLoginElementDocument.Factory.newInstance();

    ReturnWebLoginElement retElement = ReturnWebLoginElement.Factory.newInstance();

    retElement.setWebUserNameElement("joe sixpack");
    retElement.setSoapSessionIdElement("some_random_string");
    System.out.println("validate retElement: " + retElement.validate());

    retDoc.setReturnWebLoginElement(retElement);
    System.out.println("validate retDoc: " + retDoc.validate());

    System.out.println("LoginServiceSkeleton.webLogin returning...");

    return retDoc;

    }
    }
</pre>
<p>The next steps assume the axis2.war has been deployed and has
expanded in a servlet container.</p>
<p>Run the 'jar_wsdl' ant task from the example build.xml (&gt;ant
jar_wsdl), which generates a jar file axis2_example_wsdl.jar in the
'bin/lib' directory. This jar will be used to compile the client,
and also will be placed in the servlet container.</p>
<p>Next, run the 'aar' ant task from the example build.xml (&gt;ant
aar), which generates the deployable axis2 Web service. Place
dist/LoginEndpoint.aar into axis2/WEB-INF/services . Place
lib/axis2_example_wsdl.jar into axis2/WEB-INF/lib . Verify the
happy axis page loaded the services correctly - there should be the
service 'LoginEndpoint' with the available operation 'webLogin'
displayed.</p>
<p>The last step is to create and run the client. In the src
directory create the file org.client.LoginClient.java, with the
contents below:</p>
<pre class="code">
package org.client;

    import org.apache.axis2.AxisFault;

    import login.types.ReturnWebLoginElementDocument;
    import login.types.ReturnWebLoginElementDocument.*;
    import login.types.WebLoginElementDocument;
    import login.types.WebLoginElementDocument.*;
    import org.example.types.LoginServiceStub;

    /**
    * Login.
    *
    */
    public class LoginClient {

    public static void main(String[] args) {
    try {

    System.out.println("webLogin, firing...");
    LoginServiceStub stub = new LoginServiceStub();

    WebLoginElementDocument webLoginElementDocument
    = WebLoginElementDocument.Factory.newInstance();
    WebLoginElement webLoginElement =
    WebLoginElement.Factory.newInstance();
    webLoginElement.setUserNameElement("joe");
    webLoginElement.setUserPasswordElement("sixpack");

    webLoginElementDocument.setWebLoginElement(webLoginElement);

    System.out.println("validate: " + webLoginElement.validate());
    stub.webLogin(webLoginElementDocument);

    ReturnWebLoginElementDocument returnWebLoginElementDocument =
    stub.webLogin(webLoginElementDocument);

    System.out.println("Client returned");

    ReturnWebLoginElementDocument.ReturnWebLoginElement
    retElement = returnWebLoginElementDocument.getReturnWebLoginElement();

    System.out.println("WebUserName: " + retElement.getWebUserNameElement());
    System.out.println("SOAPSessionId: " + retElement.getSoapSessionIdElement());
    System.out.println("webLogin, completed!!!");

    } catch (AxisFault axisFault) {
    axisFault.printStackTrace();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }
</pre>
<p>Now run the ant task 'runLogin' (&gt;ant runLogin). The
following output should appear:</p>
<pre class="code">
runLogin:
    [echo] running the webLogin client
    [java] webLogin, firing...
    [java] validate: true
    [java] Client returned
    [java] WebUserName: joe sixpack
    [java] SOAPSessionId: some_random_string
    [java] webLogin, completed!!!
</pre>
<a name="appendix" id="appendix"></a>
<h2>Appendix</h2>
<ul>
<li>Eclipse reference - <a href=
"http://www.eclipse.org/">http://www.eclipse.org/</a></li>
<li>Custom Ant Tasks - <a href=
"http://ant.apache.org/manual/develop.html">http://ant.apache.org/manual/develop.html</a></li>
</ul>
</body>
</html>
