public void writeMethodInWrapper()

in src/wsdl/org/apache/axis/wsdl/wsdl2ws/cpp/WrapWriter.java [207:800]


    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");
    }