<!--
  ~ 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>
<link href="../../css/axis-docs.css" rel="stylesheet" type=
"text/css" media="all" />
</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=
"http://ws.apache.org/axis2/download.cgi">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/1_1/download.html#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 border="1" cellpadding="0" cellspacing="0" style=
"border-collapse: collapse" width="100%" id="AutoNumber1">
<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 border="1" cellpadding="0" cellspacing="0" style=
"border-collapse: collapse" width="100%" id="AutoNumber2">
<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".</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>
