/*
 *   Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
 *
 *   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 org.apache.axis.wsdl.wsdl2ws.cpp;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axis.wsdl.wsdl2ws.CUtils;
import org.apache.axis.wsdl.wsdl2ws.WrapperFault;
import org.apache.axis.wsdl.wsdl2ws.info.FaultInfo;
import org.apache.axis.wsdl.wsdl2ws.info.MethodInfo;
import org.apache.axis.wsdl.wsdl2ws.info.ParameterInfo;
import org.apache.axis.wsdl.wsdl2ws.info.Type;
import org.apache.axis.wsdl.wsdl2ws.info.WebServiceContext;

public class WrapWriter extends CPPClassWriter
{
    private ArrayList methods;
    public WrapWriter(WebServiceContext wscontext) throws WrapperFault
    {
        super(wscontext.getServiceInfo().getServicename() + CUtils.WRAPPER_NAME_APPENDER);
        this.wscontext = wscontext;
        this.methods = wscontext.getServiceInfo().getMethods();
    }
    protected void writeClassComment() throws WrapperFault
    {
        try
        {
            c_writer.write("/*\n");
			c_writer.write(" * Copyright 2003-2006 The Apache Software Foundation.\n\n");
			c_writer.write(" *\n");
			c_writer.write(" * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
			c_writer.write(" * you may not use this file except in compliance with the License.\n");
			c_writer.write(" * You may obtain a copy of the License at\n");
			c_writer.write(" *\n");
			c_writer.write(" *\t\thttp://www.apache.org/licenses/LICENSE-2.0\n");
			c_writer.write(" *\n");
			c_writer.write(" * Unless required by applicable law or agreed to in writing, software\n");
			c_writer.write(" * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
			c_writer.write(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
			c_writer.write(" * See the License for the specific language governing permissions and\n");
			c_writer.write(" * limitations under the License.\n");
			c_writer.write(" *\n");
            c_writer.write(" * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)\n");
            c_writer.write(" * This file contains Web Service Wrapper implementations\n");
            c_writer.write(" */\n\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /* (non-Javadoc)
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeConstructors()
     */
    protected void writeConstructors() throws WrapperFault
    {
        try
        {
            c_writer.write(c_classname + "::\n" + c_classname + "()\n{\n");
            c_writer.write(
                "\tpWs = new "
                    + CUtils.getWebServiceNameFromWrapperName(c_classname)
                    + "();\n");
            c_writer.write("}\n\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /* (non-Javadoc)
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeDistructors()
     */
    protected void writeDestructors() throws WrapperFault
    {
        try
        {
            c_writer.write(
                c_classname + "::\n~" + c_classname + "()\n{\n\tdelete pWs;\n}\n\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /* (non-Javadoc)
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeMethods()
     */
    protected void writeMethods() throws WrapperFault
    {
        try
        {
            CUtils.printMethodComment(c_writer, "This method handles faults.");


            c_writer.write(
                "void "
                    + c_classname
                    + "::\nonFault(void *pMsg)\n{"
                    + "\n\tpWs->onFault();\n}\n\n");

            writeInvoke();

            MethodInfo minfo;
            for (int i = 0; i < methods.size(); i++)
            {
                minfo = (MethodInfo) methods.get(i);
                this.writeMethodInWrapper(minfo);
                c_writer.write("\n");
            }

        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /* (non-Javadoc)
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writePreprocssorStatements()
     */
    protected void writePreprocessorStatements() throws WrapperFault
    {
        try
        {
            c_writer.write(
                "#include \""
                    + c_classname
                    + CUtils.getHeaderFileExtension()
                    + "\"\n\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /**
     * write the invoke method
     * @throws IOException
     */
    private void writeInvoke() throws IOException
    {
        CUtils.printMethodComment(c_writer, "This method invokes the right service method.");

        c_writer.write("int " + c_classname + "::\ninvoke(void *pMsg)\n{\n");
        c_writer.write("\tIMessageData* mc = (IMessageData*)pMsg;\n");
        c_writer.write("\tconst AxisChar *method = mc->getOperationName();\n");
        
        //if no methods in the service simply return
        if (methods.size() != 0)
        {
            MethodInfo minfo = (MethodInfo) methods.get(0);
            //if conditions (if parts)		
            c_writer.write(
                "\tif( (0 == strcmp(method, \"" + minfo.getInputMessage().getLocalPart() + "\")) || (0 == strcmp(method, \"" + minfo.getMethodname() + "\")) )\n");
            c_writer.write("\t\treturn " + minfo.getSanitizedMethodName() + "(mc);\n");
            //(else if parts)
            if (methods.size() > 1)
            {
                for (int i = 1; i < methods.size(); i++)
                {
                    minfo = (MethodInfo) methods.get(i);
                    c_writer.write(
                        "\telse if ( (0 == strcmp(method, \"" + minfo.getInputMessage().getLocalPart() + "\")) || (0 == strcmp(method, \"" + minfo.getMethodname() + "\")) )\n");
                    c_writer.write("\t\treturn " + minfo.getSanitizedMethodName() + "(mc);\n");
                }
            }
            //(else part)
            c_writer.write("\telse return AXIS_FAIL;\n");
        }
        //end of method
        c_writer.write("}\n\n");
    }

    /**
     * This method genarate methods that wraps the each method of the service
     * @param methodName
     * @param params
     * @param outparam
     * @throws IOException
     */

    public void writeMethodInWrapper(MethodInfo minfo)
        throws WrapperFault, IOException
    {
        Type type;
        boolean isAllTreatedAsOutParams = false;
        ParameterInfo returntype = null;
        int noOfOutParams = minfo.getOutputParameterTypes().size();
        if (0 == noOfOutParams)
        {
            returntype = null;
        }
        else
        {
            if (1 == noOfOutParams)
            {
                returntype =
                    (ParameterInfo) minfo
                        .getOutputParameterTypes()
                        .iterator()
                        .next();
            }
            else
            {
                isAllTreatedAsOutParams = true;
            }
        }
        Collection params = minfo.getInputParameterTypes();
        Type retType = null;
        String outparamType = null;
        String outparamTypeName = null;
        boolean returntypeissimple = false;
        boolean returntypeisarray = false;
        if (returntype != null)
        {
            outparamTypeName =
                CUtils.getClassNameFromParamInfoConsideringArrays(
                    returntype,
                    wscontext);
            retType =
                wscontext.getTypemap().getType(returntype.getSchemaName());
            if (retType != null)
            {
                returntypeisarray = retType.isArray();
                if (CUtils.isSimpleType(retType.getLanguageSpecificName()))
                {
                    returntypeissimple = true;
                }
            }
        }
        c_writer.write("\n/*\n");
        c_writer.write(" * This method wrap the service method \n");
        c_writer.write(" */\n");
        //method signature
        c_writer.write(
            "int " + c_classname + "::\n" + minfo.getSanitizedMethodName() + "(void* pMsg)\n{\n");
        c_writer.write("\tIMessageData* mc = (IMessageData*)pMsg;\n");
        c_writer.write("\tint nStatus;\n");
        c_writer.write("\tIWrapperSoapSerializer* pIWSSZ = NULL;\n");
        c_writer.write("\tmc->getSoapSerializer(&pIWSSZ);\n");
        c_writer.write("\tif (!pIWSSZ)\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n");
        c_writer.write("\t}\n");
        c_writer.write("\tIWrapperSoapDeSerializer* pIWSDZ = NULL;\n");
        c_writer.write("\tmc->getSoapDeSerializer(&pIWSDZ);\n");
        c_writer.write("\tif (!pIWSDZ)\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n");
        c_writer.write("\t}\n");
        c_writer.write("\t/* check whether we have got correct message */\n");
        c_writer.write(
            "\tif (AXIS_SUCCESS != pIWSDZ->checkMessageBody(\""
                + minfo.getMethodname()
                + "\", \""
                + wscontext.getWrapperInfo().getTargetNameSpaceOfWSDL()
                + "\"))\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n");
        c_writer.write("\t}\n");
        c_writer.write(
            "\tpIWSSZ->createSoapMethod(\""
        		//Chinthana:Fixed for AXISCPP-378 
                //+ minfo.getMethodname()
                //+ "Response\", \""
        		+ minfo.getOutputMessage().getLocalPart()
				+ "\", \""
				//15/06/2005................................
                + wscontext.getWrapperInfo().getTargetNameSpaceOfWSDL()
                + "\");\n");
        //create and populate variables for each parameter
        String paraTypeName;
        String parameterName;
        String returnParamName;
        String paramType;
        ArrayList paramsB = new ArrayList(params);
        for (int i = 0; i < paramsB.size(); i++)
        {
            paraTypeName = ((ParameterInfo) paramsB.get(i)).getLangName();
            paramType =
                CUtils.getClassNameFromParamInfoConsideringArrays(
                    (ParameterInfo) paramsB.get(i),
                    wscontext);
            parameterName = ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString();
            ParameterInfo param = (ParameterInfo) paramsB.get(i);
            if ((CUtils
                .isSimpleType(param.getLangName())))
            {
                //for simple types	
            	if (param.isNillable())
            	{
            		if (CUtils.isPointerType(param.getLangName()))
            		{
            		    c_writer.write("\n\t" + paraTypeName + " v" + i + " = NULL;\n");
	        			c_writer.write("\t"
	                            + paraTypeName
	                            + " value"
	                            + i
	                            + " = pIWSDZ->"
	                            + CUtils.getDeserializerMethodName(paraTypeName, false)
	                            + "(\""
	                            + parameterName + "\",0);\n");
            			c_writer.write("\tif (value" + i + ")\n");
            			c_writer.write("\t{\n");
            			c_writer.write("\t\tv" + i + " = new char[ strlen( value" + i + " ) + 1 ];\n");
            			c_writer.write("\t\tstrcpy( v" + i + ", value" + i + " );\n");
            			c_writer.write("\t\tAxis::AxisDelete( (void *) value" + i + ", " + CUtils.getXSDEnumeratorForType(paraTypeName) + ");\n");
            			c_writer.write("\t}\n");
        			}
            		else
            		{
            		    c_writer.write("\n\t" + paraTypeName + " * v" + i + " = NULL;\n");
            			c_writer.write("\t"
								+ paraTypeName
								+ "* pValue"
								+ i
								+ " = pIWSDZ->"
								+ CUtils.getDeserializerMethodName(paraTypeName, false)
								+ "(\""
								+ parameterName + "\",0);\n");
            			c_writer.write("\tif (pValue" + i + ")\n");
            			c_writer.write("\t{\n");
            			c_writer.write("\t\tv" + i + " = new " + paraTypeName + "();");
            			c_writer.write("\t\t*v" + i + " = *pValue" + i + ";\n");
            			c_writer.write("\t\tAxis::AxisDelete( (void *) pValue" + i + ", " + CUtils.getXSDEnumeratorForType(paraTypeName) + ");\n");
            			c_writer.write("\t}\n");
            		}
            	}
            	else
            	{
            		if (CUtils.isPointerType(param.getLangName()))
            		{
            		    c_writer.write("\n\t" + paraTypeName + " v" + i + " = NULL;\n");
            			c_writer.write("\t"
                            + paraTypeName
                            + " value"
                            + i
                            + " = pIWSDZ->"
                            + CUtils.getDeserializerMethodName(paraTypeName, false)
                            + "(\""
                            + parameterName + "\",0);\n");
            			c_writer.write("\tif (value" + i + ")\n");
            			c_writer.write("\t{\n");
            			c_writer.write("\t\tv" + i + " = new char[ strlen( value" + i + " ) + 1 ];\n");
            			c_writer.write("\t\tstrcpy( v" + i + ", value" + i + " );\n");
            			c_writer.write("\t\tAxis::AxisDelete( (void *) value" + i + ", " + CUtils.getXSDEnumeratorForType(paraTypeName) + ");\n");
            			c_writer.write("\t}\n");
            		}
            		else
            		{
            		    c_writer.write("\n\t" + paraTypeName + " v" + i);
                        String typeInitValue = CUtils.getInitValueForType(paraTypeName);
            		    if (typeInitValue != null)
            		        c_writer.write(" = " + typeInitValue);

            		    c_writer.write(";\n");
	            		c_writer.write("\t"
							+ paraTypeName
							+ " * pValue"
							+ i
							+ " = pIWSDZ->"
							+ CUtils.getDeserializerMethodName(paraTypeName, false)
							+ "(\""
							+ parameterName + "\",0);\n");
	            		c_writer.write("\tif (pValue" + i + ")\n");
	            		c_writer.write("\t{\n");
	            		c_writer.write("\t\tv" + i + " = *pValue" + i + ";\n");
	            		c_writer.write("\t\tAxis::AxisDelete( (void *) pValue" + i + ", " + CUtils.getXSDEnumeratorForType(paraTypeName) + " );\n");
	            		c_writer.write("\t}\n");
            		}
            	}
            }
            else
                if ((type =
                    this.wscontext.getTypemap().getType(
                        ((ParameterInfo) paramsB.get(i)).getSchemaName()))
                    != null
                    && type.isArray())
                {
                    QName qname = CUtils.getArrayType(type).getName();
                    String containedType = null;
                    if (CUtils.isSimpleType(qname))
                    {
                        containedType = CUtils.getSimpleType(qname);
                        String containedTypeArray = CUtils.getArrayNameForType(containedType);
                        
                        c_writer.write("\n\t" + containedTypeArray + " * v" + i +" = new " 
                                + containedTypeArray + "();\n");
                        c_writer.write(
                            "\t"
                                + "Axis_Array * RetArray"
                                + i
                                + " = pIWSDZ->getBasicArray("
                                + CUtils.getXSDEnumeratorForType(containedType)
                                + ", \""
                                + parameterName
                                + "\",0);\n");
                        c_writer.write ("\tv" + i + "->clone(*RetArray"+ i + ");\n");
                        c_writer.write ("\tAxis::AxisDelete( (void *)RetArray" + i + ", XSD_ARRAY);\n\n");
                    }
                    else
                    {
                        containedType = qname.getLocalPart();
                        String containedTypeArray = CUtils.getArrayNameForType(containedType);
                        c_writer.write("\t" + containedTypeArray + " * v" + i +" = new " + containedTypeArray + "();\n");
                        c_writer.write(
                            "\t"
                                + "pIWSDZ->getCmplxArray(v" + i + ", (void*)Axis_DeSerialize_"
                                + containedType
                                + ",\n\t\t(void*)Axis_Create_"
                                + containedType
                                + ", (void*)Axis_Delete_"
                                + containedType
                                + ",\n\t\t \""
                                + parameterName
                                + "\", Axis_URI_"
                                + containedType
                                + ");\n");
                    }
                }
                else
                {
                    //for complex types 
                    c_writer.write(
                        "\n\t"
                            + paraTypeName
                            + " *v"
                            + i
                            + " = ("
                            + paraTypeName
                            + "*)pIWSDZ->getCmplxObject((void*)Axis_DeSerialize_"
                            + paraTypeName
                            + "\n\t\t, (void*)Axis_Create_"
                            + paraTypeName
                            + ", (void*)Axis_Delete_"
                            + paraTypeName
                            + "\n\t\t, \""
                            + parameterName
                            + "\", Axis_URI_"
                            + paraTypeName
                            + ");\n");
                }
        }
        c_writer.write("\tif (AXIS_SUCCESS != (nStatus = pIWSDZ->getStatus()))\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\treturn nStatus;\n");
        c_writer.write("\t}\n");
        // Multiples parameters so fill the methods prototype
        if (isAllTreatedAsOutParams)
        {
            ArrayList paramsC = (ArrayList) minfo.getOutputParameterTypes();
            for (int i = 0; i < paramsC.size(); i++)
            {
                ParameterInfo param = (ParameterInfo) paramsC.get(i);
                String typeName = CUtils.getClassNameFromParamInfoConsideringArrays(
                        			(ParameterInfo) paramsC.get(i), wscontext);
                c_writer.write("\t" + typeName);
                
                if ( (param.isOptional() || param.isNillable()) && CUtils.isSimpleType(typeName) && !CUtils.isPointerType(typeName) && !param.isArray())
                {
                    c_writer.write(" *");
                }
                c_writer.write(" out" + i + ";\n");
            }
        }
        c_writer.write("\ttry\n\t{\n");
        if (returntype != null)
        {
        	/* Invoke the service when return type not void */
        	c_writer.write("\t\t" + outparamTypeName);
  
        	if ((CUtils.isArrayType(outparamTypeName))
        		|| (returntypeissimple
        			&& returntype.isNillable()
        			&&!(CUtils.isPointerType(outparamTypeName))))
        	{
        		c_writer.write(" *");
        	}
            c_writer.write(" ret = "
                    + "pWs->"
                    + minfo.getSanitizedMethodName()
                    + "(");
            if (0 < paramsB.size())
            {
                for (int i = 0; i < paramsB.size() - 1; i++)
                {
                    c_writer.write("v" + i + ",");
                }
                c_writer.write("v" + (paramsB.size() - 1));
            }
            c_writer.write(");\n");
            /* set the result */
            if (returntypeissimple)
            {
            	if (returntype.isNillable()
            			|| (CUtils.isPointerType(outparamTypeName)))
            	{
            		c_writer.write(
    	                    "\t\treturn pIWSSZ->addOutputParam(\""
    	                        + minfo.getMethodname()
    	                        + "Return\", (void*)ret, "
    	                        + CUtils.getXSDEnumeratorForType(outparamTypeName)
    	                        + ");\n");
            	}
            	else
            	{
	                c_writer.write(
	                    "\t\treturn pIWSSZ->addOutputParam(\""
	                        + minfo.getMethodname()
	                        + "Return\", (void*)&ret, "
	                        + CUtils.getXSDEnumeratorForType(outparamTypeName)
	                        + ");\n");
            	}
            }
            else
                if (returntypeisarray)
                {
                    QName qname = CUtils.getArrayType(retType).getName();
                    String containedType = null;
                    if (CUtils.isSimpleType(qname))
                    {
                        containedType = CUtils.getSimpleType(qname);
                        c_writer.write(
                            "\t\tnStatus = pIWSSZ->addOutputBasicArrayParam(ret,"
                                + CUtils.getXSDEnumeratorForType(containedType)
                                + ", \""
                                + minfo.getMethodname()
                                + "Return\");\n");
                        c_writer.write("\t\tdelete ret;\n");
                        c_writer.write("\t\t return nStatus;\n");
                    }
                    else
                    {
                        containedType = qname.getLocalPart();
                        c_writer.write(
                            "\t\tnStatus = pIWSSZ->addOutputCmplxArrayParam(ret,"
                                + "(void*) Axis_Serialize_"
                                + containedType
                                + ", (void*) Axis_Delete_"
                                + containedType
                                + ", \""
                                + minfo.getMethodname()
                                + "Return\", Axis_URI_"
                                + containedType
                                + ");\n");
                        c_writer.write("\t\tdelete ret;\n");
                        c_writer.write("\t\treturn nStatus;\n");
                    }
                }
                else
                {
                    //complex type
                    outparamTypeName = returntype.getLangName();
                    //need to have complex type name without *
                    c_writer.write(
                        "\t\treturn pIWSSZ->addOutputCmplxParam(ret, (void*)Axis_Serialize_"
                            + outparamTypeName
                            + ", (void*)Axis_Delete_"
                            + outparamTypeName
                            + ", \""
                            + minfo.getMethodname()
                            + "Return\", Axis_URI_"
                            + outparamTypeName
                            + ");\n");
                }
        }
        else
            if (isAllTreatedAsOutParams)
            {
                c_writer.write("\t\tpWs->" + minfo.getSanitizedMethodName() + "(");
                if (0 < paramsB.size())
                {
                    for (int i = 0; i < paramsB.size(); i++)
                    {
                        c_writer.write("v" + i + ",");
                    }
                }
                ArrayList paramsC = (ArrayList) minfo.getOutputParameterTypes();
                for (int i = 0; i < paramsC.size() - 1; i++)
                {
                    c_writer.write("&out" + i + ",");
                }
                c_writer.write("&out" + (paramsC.size() - 1));

                c_writer.write(");\n");
                paramsC = (ArrayList) minfo.getOutputParameterTypes();
                for (int i = 0; i < paramsC.size(); i++)
                {
                    ParameterInfo param = (ParameterInfo) paramsC.get(i);
                    retType =
                        wscontext.getTypemap().getType(
                            ((ParameterInfo) paramsC.get(i)).getSchemaName());
                    if (retType != null)
                    {
                        outparamType = retType.getLanguageSpecificName();
                        returntypeisarray = retType.isArray();
                    }
                    else
                    {
                        outparamType = returntype.getLangName();
                    }
                    returntypeissimple = CUtils.isSimpleType(outparamType);
                    returnParamName =
                        ((ParameterInfo) paramsC.get(i)).getParamName();
                    if (returntypeissimple)
                    {
                        
                        if (CUtils.isPointerType(outparamType) || param.isOptional() || param.isNillable())
                    	{
                            if (param.isOptional())
                            {
                                c_writer.write("\tif (out" + i + ")\n");
                                c_writer.write("\t{\n");
                                c_writer.write("\t");
                            }
                    		c_writer.write(
                                    "\tpIWSSZ->addOutputParam(\""
                                        + returnParamName.substring(returnParamName.lastIndexOf(">")+1)
                                        + "\", (void*)out"
                                        + i
                                        + ", "
                                        + CUtils.getXSDEnumeratorForType(outparamType)
                                        + ");\n");
                    		if (param.isOptional())
                    		{
                    		    c_writer.write("\t}\n");
                    		}
                    	}
                    	else
                    	{
                    		c_writer.write(
                                    "\tpIWSSZ->addOutputParam(\""
                    				    + returnParamName.substring(returnParamName.lastIndexOf(">")+1)
                                        + "\", (void*)&out"
                                        + i
                                        + ", "
                                        + CUtils.getXSDEnumeratorForType(outparamType)
                                        + ");\n");
                    	}
                    }
                    else
                        if (returntypeisarray)
                        {
                            QName qname =
                                CUtils.getArrayType(retType).getName();
                            String containedType = null;
                            if (CUtils.isSimpleType(qname))
                            {
                                containedType = CUtils.getSimpleType(qname);
                                c_writer.write(
                                    "\t\tpIWSSZ->addOutputBasicArrayParam((Axis_Array*)(&out"
                                        + i
                                        + "),"
                                        + CUtils.getXSDEnumeratorForType(
                                            containedType)
                                        + ", \""
                                        + returnParamName
                                        + "\");\n");
                            }
                            else
                            {
                                containedType = qname.getLocalPart();
                                c_writer.write(
                                    "\t\tpIWSSZ->addOutputCmplxArrayParam((Axis_Array*)(&out"
                                        + i
                                        + "),"
                                        + "(void*) Axis_Serialize_"
                                        + containedType
                                        + ", (void*) Axis_Delete_"
                                        + containedType
                                        + ", \""
                                        + returnParamName
                                        + "\", Axis_URI_"
                                        + containedType
                                        + ");\n");
                            }
                        }
                        else
                        {
                            //complex type
                            if (param.isOptional())
                            {
                                c_writer.write("\tif (out" + i + ")\n");
                                c_writer.write("\t{\n");
                                c_writer.write("\t");
                            }
                            c_writer.write(
                                "\t\tpIWSSZ->addOutputCmplxParam(out"
                                    + i
                                    + ", (void*)Axis_Serialize_"
                                    + outparamType
                                    + ", (void*)Axis_Delete_"
                                    + outparamType
                                    + ", \""
                                    + returnParamName
                                    + "\", Axis_URI_"
                                    + outparamType
                                    + ");\n");
                            if (param.isOptional())
                            {
                                c_writer.write("\t}\n");
                            }
                        }
                }
                c_writer.write("\treturn AXIS_SUCCESS;\n");
            }
            else
            { //method does not return anything
                /* Invoke the service when return type is void */
                c_writer.write("\t\tpWs->" + minfo.getSanitizedMethodName() + "(");
                if (0 < paramsB.size())
                {
                    for (int i = 0; i < paramsB.size() - 1; i++)
                    {
                        c_writer.write("v" + i + ",");
                    }
                    c_writer.write("v" + (paramsB.size() - 1));
                }
                c_writer.write(");\n");
                c_writer.write("\treturn AXIS_SUCCESS;\n");

            }
        c_writer.write("\t}\n"); //nithya          
        Iterator paramsFault = minfo.getFaultType().iterator();
        String faultInfoName = null;
        String faultType = null;
        String langName = null;
        String paramName = null;
        while (paramsFault.hasNext())
        {
            FaultInfo info = (FaultInfo) paramsFault.next();
            faultInfoName = info.getFaultInfo();
            ArrayList paramInfo = info.getParams();
            for (int i = 0; i < paramInfo.size(); i++)
            {
                ParameterInfo par = (ParameterInfo) paramInfo.get(i);
                paramName = par.getParamName();
                langName = par.getLangName();
                faultType =
                    CUtils.getClassNameFromParamInfoConsideringArrays(
                        par,
                        wscontext);
                writeExceptions(faultType, faultInfoName, paramName, langName);
            }
        }
        
        // Handle SOAP faults not specified within the WSDL (ie OtherFaultException)
        c_writer.write("\tcatch(OtherFaultException * pObjFault)\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\tif (pObjFault)\n");
        c_writer.write("\t\t{\n");
        c_writer.write("\t\t\tpIWSSZ->createSoapFault(\"\", \"\", pObjFault->getFaultCode(), pObjFault->getFaultString());\n");
        c_writer.write("\t\t\tpIWSSZ->addFaultDetail(pObjFault->getFaultDetail());\n");
        c_writer.write("\t\t\tdelete pObjFault;\n");
        c_writer.write("\t\t\tthrow AxisServiceException(AXISC_SERVICE_THROWN_EXCEPTION);\n");
        c_writer.write("\t\t}\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n");
        c_writer.write("\t}\n");
        
        // Handle generic exception, placing the message into a generic SOAP fault
        c_writer.write("\tcatch (exception & e)\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\tpIWSSZ->createSoapFault(\"\", \"\", \"Server\", e.what());\n");
        c_writer.write("\t\tthrow AxisServiceException(AXISC_SERVICE_THROWN_EXCEPTION);\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n");
        c_writer.write("\t}\n");
        
        // Handle any other exception
        c_writer.write("\tcatch(...)\n");
        c_writer.write("\t{\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n");
        c_writer.write("\t}\n");
        //write end of method
        c_writer.write("}\n");
    }
    
    /* (non-Javadoc)
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.CPPClassWriter#writeGlobalCodes()
     */
    private void writeExceptions(
        String faulttype,
        String faultInfoName,
        String paramName,
        String langName)
        throws WrapperFault
    {
        try
        {
            c_writer.write("\tcatch(" + faulttype + " pObjFault)\n");
            c_writer.write("\t{\n");
            c_writer.write("\t\tif (pObjFault)\n");
            c_writer.write("\t\t{\n");
            c_writer.write(
                "\t\tpIWSSZ->createSoapFault(\""
                    + langName
                    + "\", \""
                    + wscontext.getWrapperInfo().getTargetNameSpaceOfWSDL()
                    + "\",\"AxisC++ Faultcode\", \"Custom Out of bound exception\");\n");
            //  writer.write("\t\t"+faulttype+" pObjFault = new "+langName+"();\n");                                                                       
            c_writer.write(
                "\t\t\tpIWSSZ->addFaultDetail(pObjFault, (void*) Axis_Serialize_"
                    + langName
                    + ",\n");
            c_writer.write(
                "\t\t\t(void*) Axis_Delete_"
                    + langName
                    + ",\""
                    + langName
                    + "\", Axis_URI_"
                    + langName
                    + ");\n");
            c_writer.write("\t\tthrow AxisServiceException(AXISC_SERVICE_THROWN_EXCEPTION);\n");
            c_writer.write("\t\t}\n");
            c_writer.write("\t\treturn AXIS_FAIL;\n");
            c_writer.write("\t}\n");
            c_writer.write("\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    protected void writeGlobalCodes() throws WrapperFault
    {
    }
}
