/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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.
 */

package test.interop.whitemesa.round2.util.soap12;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import test.interop.whitemesa.SunClientUtil;

public class GroupbSoap12EchoNestedArrayUtil implements SunClientUtil {

    public SOAPEnvelope getEchoSoapEnvelope() {

        SOAPFactory omfactory = OMAbstractFactory.getSOAP12Factory();
        SOAPEnvelope reqEnv = omfactory.getDefaultEnvelope();
        reqEnv.declareNamespace("http://www.w3.org/2001/XMLSchema", "xsd");
        reqEnv.declareNamespace("http://schemas.xmlsoap.org/soap/encoding/", "SOAP-ENC");
        reqEnv.declareNamespace("http://soapinterop.org/", "tns");
        reqEnv.declareNamespace("http://soapinterop.org/xsd", "s");
        reqEnv.declareNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");

        OMElement operation = omfactory.createOMElement("echoNestedArray", "http://soapinterop.org/", null);
        reqEnv.getBody().addChild(operation);
        operation.addAttribute("soapenv:encodingStyle", "http://www.w3.org/2003/05/soap-encoding", null);

        OMElement part = omfactory.createOMElement("inputStruct", "", null);
        part.addAttribute("xsi:type", "s:SOAPStruct", null);

        OMElement value0 = omfactory.createOMElement("varString", "", null);
        value0.addAttribute("xsi:type", "xsd:string", null);
        value0.addChild(omfactory.createOMText("strss fdfing1"));

        OMElement value1 = omfactory.createOMElement("varInt", "", null);
        value1.addAttribute("xsi:type", "xsd:int", null);
        value1.addChild(omfactory.createOMText("25"));

        OMElement value2 = omfactory.createOMElement("varFloat", "", null);
        value2.addAttribute("xsi:type", "xsd:float", null);
        value2.addChild(omfactory.createOMText("25.23"));

        OMElement value3 = omfactory.createOMElement("varArray", "", null);
        part.addAttribute("xsi:type", "s:SOAPArrayStruct", null);
        value3.addAttribute("SOAP-ENC:arrayType", "xsd:string[3]", null);

        OMElement value30 = omfactory.createOMElement("item", "", null);
        value30.addAttribute("xsi:type", "xsd:string", null);
        value30.addChild(omfactory.createOMText("strss fdfing1"));

        OMElement value31 = omfactory.createOMElement("item", "", null);
        value31.addAttribute("xsi:type", "xsd:string", null);
        value31.addChild(omfactory.createOMText("strss fdfing2"));

        OMElement value32 = omfactory.createOMElement("item", "", null);
        value32.addAttribute("xsi:type", "xsd:string", null);
        value32.addChild(omfactory.createOMText("strss fdfing3"));

        value3.addChild(value30);
        value3.addChild(value31);
        value3.addChild(value32);

        part.addChild(value0);
        part.addChild(value1);
        part.addChild(value2);
        part.addChild(value3);

        operation.addChild(part);

        return reqEnv;

    }
}
