<!--
  ~ 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 HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content=""/>
  <title></title>
</head>

<body lang="en">
<h1>Code Listing For Axis2SampleDocLitService Service</h1>

<h2>Server:</h2>

<h3>echoString</h3>

<p>Locate the following code segment in "Axis2SampleDocLitServiceSkeleton.java".<br/>
</p>
<source><pre>public org.apache.axis2.userguide.xsd.EchoStringReturnDocument 
        echoString(org.apache.axis2.userguide.xsd.EchoStringParamDocument param4 ){
        //Todo: fill this with the necessary business logic
        throw new  java.lang.UnsupportedOperationException();
   }
</pre></source>

<p>Then complete the code by adding the business logic as shown below:</p>
<source>
<pre>public org.apache.axis2.userguide.xsd.EchoStringReturnDocument 
       echoString(org.apache.axis2.userguide.xsd.EchoStringParamDocument param4) throws Exception {
       //Use the factory to create the output document
       org.apache.axis2.userguide.xsd.EchoStringReturnDocument retDoc = 
           org.apache.axis2.userguide.xsd.EchoStringReturnDocument.Factory.newInstance();
      //send the string back.
      retDoc.setEchoStringReturn(param4.getEchoStringParam());
      return retDoc;
  }</pre>
</source>

<h3>echoStringArray</h3>

<p>The code segment for echoStringArray is shown below:</p>
<source>
<pre>public org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument 
      echoStringArray(org.apache.axis2.userguide.xsd.EchoStringArrayParamDocument param0) throws Exception {
      //Use the factory to create the output document.
     org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument retDoc = 
     org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument.Factory.newInstance();
     //Get the String array from the input parameters.
     String[] inParams = param0.getEchoStringArrayParam().getStringArray();
     org.apache.axis2.userguide.xsd.ArrayOfstringLiteral retParams =
            org.apache.axis2.userguide.xsd.ArrayOfstringLiteral.Factory.newInstance();
     //Set the input parameters to the output parameters for echoing.
     for (int i = 0; i &lt; inParams.length; i++) {
         retParams.addString(inParams[i]);<br/>     }
     //return the output document.
    retDoc.setEchoStringArrayReturn(retParams);
    return retDoc;
   }</pre>
</source>

<h3>echoStruct</h3>

<p>The code segment for echoStruct is shown below:</p>
<source><pre>
  public org.apache.axis2.userguide.xsd.EchoStructReturnDocument 
        echoStruct(org.apache.axis2.userguide.xsd.EchoStructParamDocument param2) throws Exception {
        //Use the factory to create the output document.
        org.apache.axis2.userguide.xsd.EchoStructReturnDocument retDoc =
        org.apache.axis2.userguide.xsd.EchoStructReturnDocument.Factory.newInstance();
        //Get the SOAPStrcut from the incoming parameters
        org.apache.axis2.userguide.xsd.SOAPStruct inStruct = param2.getEchoStructParam();
        //Struct for the sending back
        org.apache.axis2.userguide.xsd.SOAPStruct outStruct =
                org.apache.axis2.userguide.xsd.SOAPStruct.Factory.newInstance();
        //Fill the outgoing struct
        outStruct.setVarFloat(inStruct.getVarFloat());
        outStruct.setVarInt(inStruct.getVarInt());
        outStruct.setVarString(inStruct.getVarString());
        //Set the outgoing document.
        retDoc.setEchoStructReturn(outStruct);
        return retDoc;
    }
</pre></source>

<h2>Client:</h2>

<h3>Client for echoString Operation</h3>

<p>The following code fragment shows the necessary code for utilizing the
echoString operation of the Axis2SampleDocLitService that we have already
deployed. The code is very simple to understand and the explanations are in
the form of comments.</p>
<source><pre>     try {
                      org.apache.axis2.userguide.Axis2SampleDocLitServiceStub stub 
                        = new org.apache.axis2.userguide.Axis2SampleDocLitServiceStub(null,
                           "http://localhost:8080/axis2/services/Axis2SampleDocLitService");
                      //Create the request document to be sent.
                      org.apache.axis2.userguide.xsd.EchoStringParamDocument reqDoc =
                          org.apache.axis2.userguide.xsd.EchoStringParamDocument.Factory.newInstance();
                      reqDoc.setEchoStringParam("Axis2 Echo");
                      //invokes the Web service.
                      org.apache.axis2.userguide.xsd.EchoStringReturnDocument resDoc = 
                                        stub.echoString(reqDoc);
                      System.out.println(resDoc.getEchoStringReturn());
                      } catch (java.rmi.RemoteException e) {
                       e.printStackTrace();
                      }
</pre></source>

<p>Similarly the following code fragments show client side code for
echoStringArray operation and echoStruct operation respectively.</p>

<h3>Client for echoStringArray Operation</h3>
<source><pre>      try {
                       //Create the stub by passing the AXIS_HOME and target EPR.
                       //We pass null to the AXIS_HOME and hence the stub will use the current directory as the AXIS_HOME
                       org.apache.axis2.userguide.Axis2SampleDocLitServiceStub stub = 
                                    new org.apache.axis2.userguide.Axis2SampleDocLitServiceStub(null,
                                    "http://localhost:8080/axis2/services/Axis2SampleDocLitService");
                       //Create the request document to be sent.
                       org.apache.axis2.userguide.xsd.EchoStringArrayParamDocument reqDoc = 
                          org.apache.axis2.userguide.xsd.EchoStringArrayParamDocument.Factory.newInstance();
                      org.apache.axis2.userguide.xsd.ArrayOfstringLiteral paramArray = 
                           org.apache.axis2.userguide.xsd.ArrayOfstringLiteral.Factory.newInstance();
                      paramArray.addString("Axis2");
                      paramArray.addString("Echo");
                      reqDoc.setEchoStringArrayParam(paramArray);
                      org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument resDoc = 
                      stub.echoStringArray(reqDoc); 
                      //Get the response params
                      String[] resParams = resDoc.getEchoStringArrayReturn().getStringArray();
                      for (int i = 0; i &lt; resParams.length; i++) {
                          System.out.println(resParams[i]);
                      }
                    } catch (java.rmi.RemoteException e) {
                       e.printStackTrace(); 
                    }
               </pre>
    </source>

<h3>Client for echoStruct Operation</h3>
<source><pre>try {
                //Create the stub by passing the AXIS_HOME and target EPR.
                //We pass null to the AXIS_HOME and hence the stub will use the current directory as the AXIS_HOME
                org.apache.axis2.userguide.Axis2SampleDocLitServiceStub stub =
                        new org.apache.axis2.userguide.Axis2SampleDocLitServiceStub(null,
                        "http://localhost:8080/axis2/services/Axis2SampleDocLitService");
                          //Create the request Document
                        org.apache.axis2.userguide.xsd.EchoStructParamDocument reqDoc =
                          org.apache.axis2.userguide.xsd.EchoStructParamDocument.Factory.newInstance();
                         //Create the complex type
                        org.apache.axis2.userguide.xsd.SOAPStruct reqStruct =
                        org.apache.axis2.userguide.xsd.SOAPStruct.Factory.newInstance();
                        reqStruct.setVarFloat(100.50F);
                        reqStruct.setVarInt(10);
                        reqStruct.setVarString("High");
                        reqDoc.setEchoStructParam(reqStruct);
                        //Service invocation
                        org.apache.axis2.userguide.xsd.EchoStructReturnDocument resDoc = 
                         stub.echoStruct(reqDoc);
                       org.apache.axis2.userguide.xsd.SOAPStruct resStruct = 
                          resDoc.getEchoStructReturn();
                       System.out.println("floot Value :" + resStruct.getVarFloat());
                       System.out.println("int Value :" + resStruct.getVarInt());
                       System.out.println("String Value :" + resStruct.getVarString());
                     } catch (java.rmi.RemoteException e) {
                        e.printStackTrace();
                    }
</pre></source>

</body>
</html>
