<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta content="">
  <meta http-equiv="content-type" content="">
  <title>Migrating from Axis 1.x</title>
</head>

<body lang="en">
<h1>Migrating from Axis 1.x to Axis 2</h1>

<h2>Compatibility</h2>

<p>Axis1.x and Axis2 have been evolved from different architectures.</p>

<p><strong>Speed</strong> - Axis2 is based on StAX API, which gives greater
speed than SAX event based parsing that has been used in Axis1.x.</p>

<p><strong>Stability</strong> - Axis2 has fixed phases and for extensions an
area of user defined phases. This allows far more stability and flexibility
than Axis1.x.</p>

<p><strong>Transport framework</strong> - Simple abstraction in the designing of
transports (i.e., senders and listeners for SOAP over various protocols such
as SMTP, etc), allows far more flexibility and the core of the engine is
completely transport-independent.</p>

<p><strong>WSDL support</strong> - Axis2 supports version 1.1 and 2.0, which
allows creating stubs and skeletons, to manipulate the web services arena.</p>

<p><strong>Component - oriented architecture</strong> - This is merely
through archives (.mar and .aar) . Easily reusable components such as
handlers, modules allow patterns processing for your applications, or to
distribution to partners. Axis2 is more concerned on the "Module" concept rather the
"Handler" concept. Modules contain handlers that have been ordered through the
phase rules. These are ordered to specific service(s).</p>

<h2>Getting started</h2>

<p>Lets look at a simple example of echoing at client API.</p>

<p><b>Axis 1.x</b></p>
<pre>import ...
public class TestClient {
        public static void main(String [] args) {
                try {
                        String endpoint = ... ;
                        Service axisService = new Service();
                        Call call = (Call) axisService.createCall();
                        call.setTargetEndpointAddress( new java.net.URL(endpoint) );
                        call.setOperationName(new QName("http://soapinterop.org/", echoString"));
                        String ret = (String) call.invoke( new Object[] { "Hello!" } );
                        System.out.println("Sent 'Hello!', got '" + ret + "'");
                } catch (Exception e) {
                        System.err.println(e.toString());
                }
        }
}</pre>

<p><b>Axis 2</b></p>
<pre>import ...
public class EchoBlockingClient {
        private static EndpointReference targetEPR = new EndpointReference(
        AddressingConstants.WSA_TO,
                                "http://127.0.0.1:8080/axis2/services/MyService");
        public static void main(String[] args) {
                try {
                        OMElement payload = ClientUtil.getEchoOMElement();
                        Options options = new Options();
                        ServiceClient client = new ServiceClient();
                        options.setTo(targetEPR);
                        //Blocking invocation
                        OMElement result = client.sendReceive(payload);
                        ...
                } catch (AxisFault axisFault) {
                        axisFault.printStackTrace();
                } catch (XMLStreamException e) {
                        e.printStackTrace();
                }
        }
}</pre>

<p>It has been clearly depicted that the invocation in Axis2 is dealt with SOAP
body element itself. Here the invocation is synchronous but Axis2 can handle
asynchronous invocations as well. The "payload" variable above contains the SOAP body element
which should go in the soap envelope.</p>

<p>Once the service is called through the stub in Axis2, "payload" is according
to the data binding framework that will be used. So the extra work of
"payload" will be vanished.</p>

<p>Apart from synchronous invocation, Axis2 supports asynchronous invocation
through sendReceiveNonblocking(). Synchronous/Asynchronous invocations can
handle both single/double HTTP connections.</p>

<p>With this advanced architecture, Axis2 is capable of handling megabytes of
requests and responses, which is far from what Axis1.x was capable of.</p>

<h2>Custom deployment of services, handlers and modules</h2>

<p>In Axis 1.x, the deployment of services was via WSDD, which in my opinion was
highly cumbersome. Service deployment in Axis2 is straight forward and
dynamic. Dynamic behavior is from the "Administrator" facility given by the
development in the server side. It's just a matter of creating the .aar file, and
deploying it. More detail regarding this is given in the Axis2 user guide.</p>

<p>Axis2 is far from the "Handler concept" and is more into the "Module concept". 
Abstractly speaking, the module concept is a collection of handlers with rules of
governing which modules are created as .mar files. It has module.xml, which is the
brain behind manipulating the handlers.</p>

<p>When a service is called through a handler, it is just a matter of giving a
reference to the module that includes the handler in the services.xml (using
&lt;module ref="foo/&gt;").</p>

<p>Services are hot deployable in Axis2, but modules are not. This is one
feature which is unique to Axis2.</p>

<p>Lets take a detailed look at what it takes to migrate the Axis 1.x handlers to the
Axis 2 modules via the "SOAP Monitor". The SOAP monitor is really a combination of three
components: An applet which displays responses / requests, a servlet which
binds to a default port of 5001 and connects to the applet, and a handler
chain used to intercept the soap messages. Here we'll focus on the
handler.</p>

<p><b>Axis 1.x required two WSDD's to use the SOAP Monitor. First, the SOAP
Monitor Handler itself:</b></p>
<pre>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
    
  &lt;handler name="soapmonitor" 
      type="java:org.apache.axis.handlers.SOAPMonitorHandler"&gt;
    &lt;parameter name="wsdlURL" 
      value="/wzs/SOAPMonitorService-impl.wsdl"/&gt;
    &lt;parameter name="namespace" 
      value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/&gt;
    &lt;parameter name="serviceName" value="SOAPMonitorService"/&gt;
    &lt;parameter name="portName" value="Demo"/&gt;
  &lt;/handler&gt;

  &lt;service name="SOAPMonitorService" provider="java:RPC"&gt;
    &lt;parameter name="allowedMethods" value="publishMessage"/&gt;
    &lt;parameter name="className" 
      value="org.apache.axis.monitor.SOAPMonitorService"/&gt;
    &lt;parameter name="scope" value="Application"/&gt;
  &lt;/service&gt;
&lt;/deployment&gt;</pre>

<p><b>Axis 1.x requires a reference to the handler in the user's WSDD that
defines their Web Service:</b></p>
<pre>&lt;deployment name="example" xmlns="http://xml.apache.org/axis/wsdd/" 
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
  
  &lt;service name="urn:myService" provider="java:RPC"&gt;
    &lt;parameter name="className" value="org.MyService"/&gt;
    &lt;parameter name="allowedMethods" value="*"/&gt;

    &lt;requestFlow&gt;
      &lt;handler type="soapmonitor"/&gt;
    &lt;/requestFlow&gt;
    &lt;responseFlow&gt;
      &lt;handler type="soapmonitor"/&gt;
    &lt;/responseFlow&gt;

  &lt;/service&gt;
&lt;/deployment&gt;</pre>

<p><b>Axis 2 requires a module.xml, placed inside a jar with a .mar extension
under WEB-INF/modules, to define a Handler:</b></p>
<pre>&lt;module name="soapmonitor" class="org.apache.axis2.handlers.soapmonitor.SOAPMonitorModule"&gt;
    &lt;inflow&gt;
        &lt;handler name="InFlowSOAPMonitorHandler" class="org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler"&gt;
            &lt;order phase="soapmonitorPhase"/&gt;
        &lt;/handler&gt;
    &lt;/inflow&gt;

    &lt;outflow&gt;
        &lt;handler name="OutFlowSOAPMonitorHandler" class="org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler"&gt;
            &lt;order phase="soapmonitorPhase"/&gt;
        &lt;/handler&gt;
    &lt;/outflow&gt;

    &lt;Outfaultflow&gt;
        &lt;handler name="FaultOutFlowSOAPMonitorHandler" class="org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler"&gt;
            &lt;order phase="soapmonitorPhase"/&gt;
        &lt;/handler&gt;
    &lt;/Outfaultflow&gt;

    &lt;INfaultflow&gt;
        &lt;handler name="FaultInFlowSOAPMonitorHandler" class="org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler"&gt;
            &lt;order phase="soapmonitorPhase"/&gt;
        &lt;/handler&gt;
    &lt;/INfaultflow&gt;
&lt;/module&gt;</pre>

<p>The SOAPMonitorModule referenced above simply implements
org.apache.axis2.modules.Module and is used for any additional tasks needed
to initialize the module and shutdown the module. In this case nothing is
needed and the implemented interface methods have blank bodies. Furthermore,
the 'soapmonitorPhase' will be used later below in the axis2.xml .</p>

<p><b>Axis 1.x the SOAPMonitorHandler has the class signature as:</b></p>
<pre>public class SOAPMonitorHandler extends BasicHandler</pre>

<p><b>Axis 2 the SOAPMonitorHandler has the class signature as:</b></p>
<pre>public class SOAPMonitorHandler extends AbstractHandler </pre>

<p><b>In axis2, you need to reference the module that contains the handler
chain that you want to use inside your services.xml:</b></p>
<pre>&lt;service name="ExampleService"&gt;
    &lt;module ref="soapmonitor"/&gt;
    &lt;description&gt;
       This service has the SOAP Monitor wired in 
    &lt;/description&gt;
    &lt;parameter name="ServiceClass" locked="false"&gt;org.ExampleService&lt;/parameter&gt;
    &lt;operation name="myExecute"&gt;
        &lt;messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/&gt;
    &lt;/operation&gt;
&lt;/service&gt;</pre>

<p><b>Finally, axis2 requires you to make some changes to axis2.xml. Start by
adding a global module:</b></p>
<pre>    &lt;module ref="soapmonitor"/&gt;</pre>

<p><b>Then define your phase orders for 'soapmonitorPhase' referenced in the
module.xml :</b></p>
<pre>    &lt;phaseOrder type="inflow"&gt;
        &lt;!--  System pre defined phases       --&gt;
        &lt;phase name="TransportIn"/&gt;
        &lt;phase name="PreDispatch"/&gt;
        &lt;phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase"&gt;
            &lt;handler name="AddressingBasedDispatcher"
                     class="org.apache.axis2.engine.AddressingBasedDispatcher"&gt;
                &lt;order phase="Dispatch"/&gt;
            &lt;/handler&gt;

            &lt;handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.engine.RequestURIBasedDispatcher"&gt;
                &lt;order phase="Dispatch"/&gt;
            &lt;/handler&gt;

            &lt;handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPActionBasedDispatcher"&gt;
                &lt;order phase="Dispatch"/&gt;
            &lt;/handler&gt;

            &lt;handler name="SOAPMessageBodyBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher"&gt;
                &lt;order phase="Dispatch"/&gt;
            &lt;/handler&gt;
            &lt;handler name="InstanceDispatcher"
                     class="org.apache.axis2.engine.InstanceDispatcher"&gt;
                &lt;order phase="PostDispatch"/&gt;
            &lt;/handler&gt;
        &lt;/phase&gt;
        &lt;!--  System pre defined phases       --&gt;
        &lt;!--   After Postdispatch phase module author or or service author can add any phase he want      --&gt;
        &lt;phase name="userphase1"/&gt;
        &lt;phase name="soapmonitorPhase"/&gt;
    &lt;/phaseOrder&gt;
    &lt;phaseOrder type="outflow"&gt;
        &lt;!--      user can add his own phases to this area  --&gt;
        &lt;phase name="userphase1"/&gt;
        &lt;phase name="soapmonitorPhase"/&gt;
        &lt;!--system predefined phase--&gt;
        &lt;!--these phase will run irrespective of the service--&gt;
        &lt;phase name="PolicyDetermination"/&gt;
        &lt;phase name="MessageOut"/&gt;
    &lt;/phaseOrder&gt;
    &lt;phaseOrder type="INfaultflow"&gt;
        &lt;!--      user can add his own phases to this area  --&gt;
        &lt;phase name="userphase1"/&gt;
        &lt;phase name="soapmonitorPhase"/&gt;
    &lt;/phaseOrder&gt;
    &lt;phaseOrder type="Outfaultflow"&gt;
        &lt;!--      user can add his own phases to this area  --&gt;
        &lt;phase name="userphase1"/&gt;
        &lt;phase name="soapmonitorPhase"/&gt;
        &lt;phase name="PolicyDetermination"/&gt;
        &lt;phase name="MessageOut"/&gt;
    &lt;/phaseOrder&gt;</pre>

<p>See the user guide for more info on axis2 modules.</p>

<h2>Transports for HTTP Connection</h2>

<p>Axis2 comes with two  CommonsHTTPTransportSender which is based on
commons-httpclient.</p>

<p>It should be noted that axis2.xml should be configured to call the commons
transports, with the statement,</p>
<pre>...
&lt;transportSender name="http" class="org.apache.axis2.transport.http.CommonsHTTPTransportSender"&gt; 
   &lt;parameter name="PROTOCOL" locked="false"&gt;HTTP/1.1&lt;/parameter&gt; 
   &lt;parameter name="Transfer-Encoding" locked="false"&gt;chunked&lt;/parameter&gt;
&lt;/transportSender&gt;
...</pre>

<h2>Data Binding Support</h2>

<p>ADB is used to provide data binding support. In Axis2, xml is manipulated
via AXIOM, which is based on the StAX API. XML gives full schema support. Thus,
serialization and de-serialization of XML is handled in Axis2 via the xml-data
binding framework.</p>

<p>Below is an example of migrating an WSDL based Axis 1.x Web Service to Axis2. </p>

<p>First, lets take a look at a simple document / literal style WSDL used in an Axis 1.x 
Web Service. This example assumes the name of simple.wsdl for the wsdl below: </p>

<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;definitions name="SimpleService" targetNamespace="http://simpleNS" xmlns:tns="http://simpleNS" 
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://simpleNS/types"&gt;
  &lt;types&gt;
    &lt;schema targetNamespace="http://simpleNS/types" xmlns:tns="http://simpleNS/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="simpleLogin"&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name="user_name" type="xsd:string"/&gt;
            &lt;element name="user_password" type="xsd:string"/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
      &lt;element name="simpleLoginResponse"&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name="soap_session_id" type="xsd:string"/&gt;
            &lt;element name="web_user_name" type="xsd:string"/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
&lt;/schema&gt;&lt;/types&gt;
  &lt;message name="SimpleEndpoint_simpleLogin"&gt;
     &lt;part name="parameters" element="ns2:simpleLogin"/&gt;
  &lt;/message&gt;
  &lt;message name="SimpleEndpoint_simpleLoginResponse"&gt;
    &lt;part name="result" element="ns2:simpleLoginResponse"/&gt;
  &lt;/message&gt;
  &lt;portType name="SimpleEndpoint"&gt;
    &lt;operation name="simpleLogin"&gt;
      &lt;input message="tns:SimpleEndpoint_simpleLogin" name="SimpleEndpoint_simpleLogin"/&gt;
      &lt;output message="tns:SimpleEndpoint_simpleLoginResponse" name="SimpleEndpoint_simpleLoginResponse"/&gt;
    &lt;/operation&gt;
  &lt;/portType&gt;
  &lt;binding name="SimpleEndpointBinding" type="tns:SimpleEndpoint"&gt;
    &lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/&gt;
    &lt;operation name="simpleLogin"&gt;
      &lt;soap:operation soapAction="simpleLogin"/&gt;
      &lt;input name="SimpleEndpoint_simpleLogin"&gt;
        &lt;soap:body use="literal"/&gt;
      &lt;/input&gt;
      &lt;output name="SimpleEndpoint_simpleLoginResponse"&gt;
        &lt;soap:body use="literal"/&gt;
      &lt;/output&gt;
    &lt;/operation&gt;
  &lt;/binding&gt;
  &lt;service name="SimpleService"&gt;
    &lt;port name="SimpleEndpointPort" binding="tns:SimpleEndpointBinding"&gt;
      &lt;soap:address location="http://localhost:8080/axis/services/SimpleEndpointPort"/&gt;&lt;/port&gt;&lt;/service&gt;&lt;/definitions&gt;</pre>

<p>The next step is run WSDL2Java on the wsdl. For axis 1.x, this example uses the following ant task:</p>

<pre>&lt;target name="wsdl2java" description="axis 1.x"&gt;
       &lt;delete dir="output" /&gt;
       &lt;mkdir dir="output" /&gt;
       &lt;axis-wsdl2java
         output="output"
         verbose="true"
         url="wsdl/simple.wsdl"
         serverside="true"
         skeletondeploy="true"
         nowrapped="true"
         &gt;
       &lt;/axis-wsdl2java&gt;
   &lt;/target&gt;</pre>

<p>The axis 1.x ant task above takes the simple.wsdl under the directory 'wsdl' , and 
from that creates files under the directory 'output'. The files created are shown below:</p>

<pre>output/
output/simpleNS
output/simpleNS/types
output/simpleNS/types/SimpleLoginResponse.java
output/simpleNS/types/SimpleLogin.java
output/simpleNS/SimpleEndpoint.java
output/simpleNS/SimpleEndpointBindingStub.java
output/simpleNS/SimpleEndpointBindingSkeleton.java
output/simpleNS/SimpleEndpointBindingImpl.java
output/simpleNS/SimpleService.java
output/simpleNS/SimpleServiceLocator.java
output/simpleNS/deploy.wsdd
output/simpleNS/undeploy.wsdd</pre>

<p>Now lets run WSDL2Java with Axis2. In this example, the only change to simple.wsdl required for axis2 is that 'soap:address location' be changed to: </p>

<pre>&lt;soap:address location="http://localhost:8080/axis2/services/SimpleEndpoint"/&gt;&lt;/port&gt;&lt;/service&gt;&lt;/definitions&gt;</pre>

<p>In Axis2 the default databinding uses ADB. However, xmlbeans and jaxme are also supported. This example uses 
xmlbeans. For Axis2, our example uses the following ant task:</p>

<pre>&lt;target name="wsdl2java"&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/simple.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.simple.endpoint"/&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;</pre>

<p>For an explanation of the Axis2 WSDL2Java ant task and its options, see the CodegenToolReference guide.</p>

<p>A feature of xmlbeans is that there is one class file created with WSDL2java, and a series of xsb files. 
These must be referenced when compiling, and as the example shows these files are moved to a build directory </p>

<p>The Axis2 WSDL2Java example also takes the simple.wsdl under the directory 'wsdl' , and 
from that creates files under the directory 'output'. The relevant non-xmlbean files created are shown below:</p>

<pre>output/resources/services.xml
output/src/org/simple
output/src/org/simple/endpoint
output/src/org/simple/endpoint/SimpleEndpointSkeleton.java
output/src/org/simple/endpoint/SimpleEndpointMessageReceiverInOut.java
output/src/org/simple/endpoint/SimpleEndpointCallbackHandler.java
output/src/org/simple/endpoint/SimpleEndpointStub.java
output/src/simplens
output/src/simplens/types
output/src/simplens/types/SimpleLoginDocument.java
output/src/simplens/types/impl
output/src/simplens/types/impl/SimpleLoginDocumentImpl.java
output/src/simplens/types/impl/SimpleLoginResponseDocumentImpl.java
output/src/simplens/types/SimpleLoginResponseDocument.java</pre>

<p>The first important distinction is that while the Axis 1.x example generated deploy.wsdd and undeploy.wsdd, 
the Axis2 example created a services.xml. The files deploy.wsdd and services.xml are a breed apart, comming 
from different architectures. There is no direct parallel between them. See the Axis2 user guide for an 
explanation about services.xml</p>

<p>Now we're ready to code. We'll start with Axis 1.x on the service side. To implement the business 
logic we'll change simpleNS/SimpleEndpointBindingImpl.java from: </p>

<pre class="code">package simpleNS;

public class SimpleEndpointBindingImpl implements simpleNS.SimpleEndpoint{
    public simpleNS.types.SimpleLoginResponse simpleLogin(simpleNS.types.SimpleLogin parameters) 
        throws java.rmi.RemoteException {
        return null;
    }

}</pre>

<p>To: </p>

<pre class="code">package simpleNS;

public class SimpleEndpointBindingImpl implements simpleNS.SimpleEndpoint{
    public simpleNS.types.SimpleLoginResponse simpleLogin(simpleNS.types.SimpleLogin parameters) 
        throws java.rmi.RemoteException {

        String userName = parameters.getUser_name();
        String password = parameters.getUser_password();
        // do something with those vars...
        return new simpleNS.types.SimpleLoginResponse("mySessionID", "username");
    }

}</pre>

<p>In Axis 1.x, the next step is to compile the classes and put them in the Axis.war, and then run the admin 
client with the generated deploy.wsdd. You'll then look at the happy axis page to verify the service is 
installed correctly. </p>

<p>Now lets code Axis2. In Axis 1.x, while the ant task shown in the example created a skeleton, a peek inside 
shows that the skeleton calls the binding implementation class. In Axis2 we work with the skeleton directly. 
To implement the business logic in the Axis2 generated classes we'll change 
org/simple/endpoint/SimpleEndpointSkeleton.java from: </p>

<pre class="code">package org.simple.endpoint;
    /**
     *  SimpleEndpointSkeleton java skeleton for the axisService
     */
    public class SimpleEndpointSkeleton {

        /**
         * Auto generated method signature
          * @param param0
         */
        public  simplens.types.SimpleLoginResponseDocument simpleLogin
                  (simplens.types.SimpleLoginDocument param0 ) throws Exception {
                //Todo fill this with the necessary business logic
                throw new  java.lang.UnsupportedOperationException();
        }
}</pre>

<p>To: </p>

<pre class="code">package org.simple.endpoint;
    
    import simplens.types.*;
    import simplens.types.SimpleLoginResponseDocument.*;
    import simplens.types.SimpleLoginDocument.*;
    /**
     *  SimpleEndpointSkeleton java skeleton for the axisService
     */
    public class SimpleEndpointSkeleton {
     
        /**
         * Modified 
          * @param simpleLoginDocument
         */
        public SimpleLoginResponseDocument simpleLogin
                  (simplens.types.SimpleLoginDocument simpleLoginDocument){
                //Todo fill this with the necessary business logic

                SimpleLoginResponseDocument retDoc =
                    SimpleLoginResponseDocument.Factory.newInstance();
                 
                SimpleLoginResponse retElement =
                    SimpleLoginResponse.Factory.newInstance();
                // Get parameters passed in 
                SimpleLogin simpleLogin = simpleLoginDocument.getSimpleLogin();
                String userName = simpleLogin.getUserName();
                String password = simpleLogin.getUserPassword();
                // do something with those vars...

                retElement.setWebUserName(userName);
                retElement.setSoapSessionId("my random string");
                retDoc.setSimpleLoginResponse(retElement);
                return retDoc; 
        }
}</pre>

<p>In Axis2, the next step is to compile the classes, put them along with the generated services.xml in an AAR, 
and then hot deploy the AAR by placing it in the Axis2.war under WEB-INF/services . Point a browser to 
http://localhost:8080/axis2/listServices , and you should see the service 'SimpleService' ready for action. 
See the Axis2 user guide for more info.</p>

<p>The last step is the client. Our Axis 1.x client for this example is: </p>

<pre>package org;

import simpleNS.*;
import simpleNS.types.*;

public class Tester {
  public static void main(String [] args) throws Exception {
    // Make a service
    SimpleService service = new SimpleServiceLocator();

    // Now use the service to get a stub which implements the SDI.
    SimpleEndpoint port =  service.getSimpleEndpointPort();

    // set the params
    SimpleLogin parameters = new SimpleLogin("username","password");
    // Make the actual call
    SimpleLoginResponse simpleLoginResponse = port.simpleLogin(parameters);
    String session = simpleLoginResponse.getSoap_session_id();
    String user = simpleLoginResponse.getWeb_user_name();
    System.out.println("simpleLoginResponse, session: " + session + ", user: " + user);
  }
}</pre>

<p>Finally, our Axis2 client for this example is: </p>

<pre>package org;
import simplens.types.*;
import simplens.types.SimpleLoginDocument.*;
import simplens.types.SimpleLoginResponseDocument.*;
import simplens.types.impl.*;
import org.simple.endpoint.*;

public class Tester {
  public static void main(String [] args) throws Exception {

    // you may not need to pass in the url to the constructor - try the default no arg one
    SimpleEndpointStub stub =
         new SimpleEndpointStub(null, "http://localhost:8080/axis2/services/SimpleService");

    SimpleLogin simpleLogin = SimpleLogin.Factory.newInstance();
    simpleLogin.setUserName("userName");
    simpleLogin.setUserPassword("password");

    SimpleLoginDocument simpleLoginDocument =
        SimpleLoginDocument.Factory.newInstance();

    simpleLoginDocument.setSimpleLogin(simpleLogin);

    SimpleLoginResponseDocument simpleLoginResponseDocument
        = stub.simpleLogin(simpleLoginDocument);

    SimpleLoginResponse simpleLoginResponse =
        simpleLoginResponseDocument.getSimpleLoginResponse();

    String session = simpleLoginResponse.getSoapSessionId();
    String user = simpleLoginResponse.getWebUserName();
    System.out.println("simpleLoginResponse, session: " + session + ", user: " + user);

  }
}</pre>

<p>Axis2 clients also have asynchronous options via a Callback and alternatively 'Fire and forget'. See the 
user guide for more details. </p>

<h2>Best Usage</h2>

<p>Axis1.x and Axis2 have different ways of seeing the SOAP stack. So the best
way to migrate is to follow the User guide and the Architecture
guide of Axis2 properly. Axis2 is very much straight forward and friendly to use than it's successor.</p>
</body>
</html>
