<!--
  ~ 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>
  <link href="../../css/axis-docs.css" rel="stylesheet" type="text/css" media="all" />
</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>
