public void writeMethodInWrapper()

in src/wsdl/org/apache/axis/wsdl/wsdl2ws/cpp/literal/WrapWriter.java [55:623]


    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;
        boolean returntypeissimple = false;
        boolean returntypeisarray = false;
        
        if (returntype != null)
        {
            retType = wscontext.getTypemap().getType(returntype.getSchemaName());
            if (retType != null)
            {
                if (retType.isSimpleType())
                { 
                    returntypeissimple = true;
                    outparamType = CUtils.getSimpleType(retType.getBaseType());
                }
                else if (returntype.isArray())
                {
                    outparamType = CUtils.getClassNameFromParamInfoConsideringArrays(returntype,wscontext);
                    returntypeissimple =
                        (null != CUtils.getSimpleType(retType.getName())
                            && CUtils.isSimpleType(CUtils.getSimpleType(retType.getName())));
                    returntypeisarray = true;
                }
                else
                {
                    outparamType = retType.getLanguageSpecificName();
                    returntypeissimple = CUtils.isSimpleType(outparamType);
                    returntypeisarray = retType.isArray();
                }
            }
            else
            {
                outparamType = returntype.getLangName();
                returntypeissimple = CUtils.isSimpleType(outparamType);
            }
        }
        
        CUtils.printMethodComment(c_writer, "This method wraps the service method " + minfo.getMethodname() + ".");

        //method signature
        c_writer.write("int " + c_classname + "::" + minfo.getSanitizedMethodName() + "(void* pMsg)\n{\n");
        c_writer.write("\tIMessageData* mc = (IMessageData*)pMsg;\n");
        c_writer.write("\tint nStatus;\n\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\treturn AXIS_FAIL;\n\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\treturn AXIS_FAIL;\n\n");

        c_writer.write("\t// check whether we have got correct message\n");
        c_writer.write("\tif (AXIS_SUCCESS != pIWSDZ->checkMessageBody(\""
                + minfo.getInputMessage().getLocalPart() + "\", \""
                + minfo.getInputMessage().getNamespaceURI() + "\"))\n");
        c_writer.write("\t\treturn AXIS_FAIL;\n\n");

        if (minfo.getOutputMessage() != null)
        {
            c_writer.write("\tpIWSSZ->createSoapMethod(\""
                    + minfo.getOutputMessage().getLocalPart() + "\", \""
                    + minfo.getOutputMessage().getNamespaceURI() + "\");\n");
        }
        //create and populate variables for each parameter
        String paraTypeName;

        String elementName;
        String returnParamName;
        ArrayList paramsB = new ArrayList(params);
        for (int i = 0; i < paramsB.size(); i++)
        {
            ParameterInfo param = (ParameterInfo) paramsB.get(i);
            type = this.wscontext.getTypemap().getType(param.getSchemaName());
            
            if (type != null && type.isSimpleType())
                paraTypeName = CUtils.getSimpleType(type.getBaseType());
            else if (param.isArray())
                paraTypeName = CUtils.getClassNameFromParamInfoConsideringArrays(param,wscontext);
            else
                paraTypeName = param.getLangName();

            elementName = param.getElementNameAsSOAPString();
            if (type != null && type.isSimpleType())
            {
                String splatPtr = " ";
                String splatDeref = " ";
                
                if (!CUtils.isPointerType(type.getLanguageSpecificName()))
                {
                    if (param.isNillable() || param.isOptional())
                        splatPtr   = " * ";
                    else 
                        splatDeref = " * ";
                }
                
                c_writer.write("\t" + paraTypeName + splatPtr + "v" + i + " =" + splatDeref
                        + "(pIWSDZ->" + CUtils.getDeserializerMethodName(paraTypeName,false)
                        + "(\"" + elementName + "\",0));\n");
            }
            else if ((CUtils.isSimpleType(param.getLangName())))
            {
                //for simple types    
                if (param.isArray())
                {
                    String containedType      = CUtils.getSimpleType(type.getName());
                    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)
                            + ", \"" + elementName + "\",0);\n");
                    c_writer.write ("\tv" + i + "->clone(*RetArray"+ i + ");\n");
                    c_writer.write ("\tAxis::AxisDelete( (void *)RetArray" + i + ", XSD_ARRAY);\n\n");
                }
                else if (CUtils.isPointerType(paraTypeName))
                {
                    c_writer.write("\n\t" + paraTypeName + " v" + i + " = NULL;\n");
                    if (param.isOptional())
                    {
                        c_writer.write("\tconst char * elementName" + i + " = pIWSDZ->peekNextElementName();\n");
                        c_writer.write("\tif ( strcmp( elementName" + i + ", \"" + elementName + "\" ) == 0)\n");
                        c_writer.write("\t{\n");
                    }
                    c_writer.write("\t" + paraTypeName + " value" + i + " = pIWSDZ->"
                        + CUtils.getDeserializerMethodName(paraTypeName,false)
                        + "(\"" + elementName + "\",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");
                    if (param.isOptional())
                        c_writer.write("\t}\n");
                }
                else if (param.isNillable()  || param.isOptional())
                {
                    c_writer.write("\n\t" + paraTypeName + " * v" + i + " = NULL;\n");
                    if (param.isOptional())
                    {
                        c_writer.write("\tconst char * elementName" + i + " = pIWSDZ->peekNextElementName();\n");
                        c_writer.write("\tif (strcmp( elementName" + i + ", \"" + elementName + "\" ) == 0)\n");
                        c_writer.write("\t{\n");
                    }
                    c_writer.write("\t" + paraTypeName + " * pValue" + i + " = pIWSDZ->"
                            + CUtils.getDeserializerMethodName(paraTypeName,false)
                            + "(\"" + elementName + "\",0);\n");
                    c_writer.write("\tif (pValue" + i +")\n");
                    c_writer.write("\t{\n");
                    c_writer.write("\t\tv" + i + " = new " + paraTypeName + "();\n");
                    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");
                    if (param.isOptional())
                        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) + "(\""
                            + elementName + "\", 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 != null) && type.isArray())
            {
                Type arrayType = CUtils.getArrayType(type);
                QName qname = arrayType.getName();
                String containedType = null;
                if (CUtils.isSimpleType(qname))
                {
                    containedType = CUtils.getSimpleType(qname);
                    String containedTypeArray = CUtils.getArrayNameForType(outparamType);

                    c_writer.write("\n\t" + containedTypeArray + " * v" + i +" = new " + containedTypeArray + "();\n");
                    c_writer.write("\t"
                        + "Axis_Array * RetArray" + i + " = pIWSDZ->getBasicArray("
                        + CUtils.getXSDEnumeratorForType(containedType)
                        + ", \"" + elementName + "\",0);\n");
                    c_writer.write ("\tv" + i + "->clone(*RetArray"+ i + ");\n");
                    c_writer.write ("\tAxis::AxisDelete( (void *)RetArray" + i + ", XSD_ARRAY);\n\n");
                }
                else if (arrayType.isSimpleType())
                {
                    containedType = CUtils.getSimpleType(arrayType.getBaseType());
                    c_writer.write("\n\t" + outparamType + " * v" + i +" = new " + outparamType + "();\n");
                    c_writer.write("\t"
                        + "Axis_Array * RetArray" + i + " = pIWSDZ->getBasicArray("
                        + CUtils.getXSDEnumeratorForType(containedType)
                        + ", \"" + elementName + "\",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();
                    c_writer.write("\n\t" + paraTypeName + " * v" + i +" = new " + paraTypeName + "();\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 \"" + elementName + "\", Axis_URI_" + containedType + ");\n");
                }
            }
            else if (param.isAnyElement())
            {
                c_writer.write("\t" + paraTypeName + " *v" + i + " = (" + paraTypeName
                        + "*)pIWSDZ->getAnyObject();\n");
            }
            else
            {
                //for complex types 
                c_writer.write("\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, \"" + elementName
                        + "\", Axis_URI_" + paraTypeName + ");\n");
            }
        } // for loop
        
        c_writer.write("\n\tif (AXIS_SUCCESS != (nStatus = pIWSDZ->getStatus()))\n");
        c_writer.write("\t\treturn nStatus;\n\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"); //nithya
        if (returntype != null)
        { 
            /* Invoke the service when return type not void */
            returnParamName = returntype.getElementNameAsSOAPString();
            c_writer.write("\t\t" + outparamType);
            if ((CUtils.isArrayType(outparamType))
                    ||(!returntypeisarray 
                            && (!returntypeissimple
                                    || (returntypeissimple 
                                            && (returntype.isNillable() || returntype.isOptional())
                                            && !(CUtils.isPointerType(retType.getLanguageSpecificName()))))))
                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.isArray())
                {
                    String containedType = CUtils.getSimpleType(retType.getName());
                    c_writer.write("\t\tnStatus = pIWSSZ->addOutputBasicArrayParam(ret, "
                            + CUtils.getXSDEnumeratorForType(containedType) + ", \""
                            + returnParamName + "\");\n");
                    c_writer.write("\t\tdelete ret;\n");
                    c_writer.write("\t\treturn nStatus;\n");
                }
                else
                {
                    String returnParamTypeName = retType.getLanguageSpecificName();
                    if (returntype.isNillable()
                            || returntype.isOptional()
                            || CUtils.isPointerType(returnParamTypeName))
                    {
                        c_writer.write("\t\treturn pIWSSZ->addOutputParam(\"" + returnParamName
                            + "\", (void*)ret, " + CUtils.getXSDEnumeratorForType(outparamType) + ");\n");
                    }
                    else
                    {
                        c_writer.write("\t\treturn pIWSSZ->addOutputParam(\"" + returnParamName
                            + "\", (void*)&ret, " + CUtils.getXSDEnumeratorForType(outparamType) + ");\n");
                    }
                }
            }
            else if (returntypeisarray)
            {
                Type arrayType = CUtils.getArrayType(retType);
                QName qname = arrayType.getName();
                String containedType = null;
                if (CUtils.isSimpleType(qname))
                {
                    containedType = CUtils.getSimpleType(qname);
                    c_writer.write("\t\tnStatus = pIWSSZ->addOutputBasicArrayParam(ret, "
                                + CUtils.getXSDEnumeratorForType(containedType)
                                + ", \"" + returnParamName + "\");\n");
                    c_writer.write("\t\tdelete ret;\n");
                    c_writer.write("\t\treturn nStatus;\n");
                }
                else if (arrayType.isSimpleType())
                {
                    containedType = CUtils.getSimpleType(arrayType.getBaseType());
                    c_writer.write("\t\tnStatus = pIWSSZ->addOutputBasicArrayParam(ret, "
                            + CUtils.getXSDEnumeratorForType(containedType)
                            + ", \"" + returnParamName + "\");\n");
                    c_writer.write("\t\tdelete ret;\n");
                    c_writer.write("\t\treturn nStatus;\n");
                }
                else
                {
                    containedType = qname.getLocalPart();
                    c_writer.write("\t\tnStatus = pIWSSZ->addOutputCmplxArrayParam(ret,"
                            + "(void*) Axis_Serialize_" + containedType
                            + ", (void*) Axis_Delete_" + containedType
                            + ", \"" + returnParamName
                            + "\", Axis_URI_" + containedType + ");\n");
                    c_writer.write("\t\tdelete ret;\n");
                    c_writer.write("\t\treturn nStatus;\n");
                }
            }
            else if (returntype.isAnyElement())
                c_writer.write( "\t\treturn pIWSSZ->addOutputAnyObject(ret);\n");
            else
            {
                //complex type
                c_writer.write("\t\treturn pIWSSZ->addOutputCmplxParam(ret, (void*)Axis_Serialize_"
                        + outparamType
                        + ", (void*)Axis_Delete_" + outparamType
                        + ", \"" + returnParamName + "\", Axis_URI_" + outparamType + ");\n");
            }
        }
        else if (isAllTreatedAsOutParams)
        {
            c_writer.write("\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(param.getSchemaName());
                if (retType != null)
                {
                    if (retType.isSimpleType())
                    {
                        returntypeissimple = true;
                        outparamType =
                            CUtils.getSimpleType(retType.getBaseType());
                    }
                    else
                    {
                        outparamType = retType.getLanguageSpecificName();
                        returntypeisarray = retType.isArray();
                        returntypeissimple =
                            CUtils.isSimpleType(outparamType);
                    }
                }
                else
                {
                    outparamType = param.getLangName();
                    returntypeissimple = CUtils.isSimpleType(outparamType);
                }
                
                returnParamName = param.getElementNameAsSOAPString();
                
                if (returntypeissimple)
                {
                    if (param.isArray())
                    {
                        String containedType = CUtils.getSimpleType(retType.getName());
                        c_writer.write("\treturn pIWSSZ->addOutputBasicArrayParam((Axis_Array*)(&out" + i + "),"
                                + CUtils.getXSDEnumeratorForType(containedType)
                                + ", \"" + returnParamName + "\");\n");
                    }
                    else 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
                                    + "\", (void*)out" + i + ", "
                                    + CUtils.getXSDEnumeratorForType(outparamType) + ");\n");
                        
                        if (param.isOptional())
                            c_writer.write("\t}\n");
                    }
                    else
                    {
                        c_writer.write("\tpIWSSZ->addOutputParam(\""
                                    + returnParamName
                                    + "\", (void*)&out" + i + ", "
                                    + CUtils.getXSDEnumeratorForType(outparamType) + ");\n");
                    }
                }
                else if (returntypeisarray)
                {
                    Type arrayType = CUtils.getArrayType(retType);
                    QName qname = arrayType.getName();
                    String containedType = null;
                    
                    if (CUtils.isSimpleType(qname))
                    {
                        containedType = CUtils.getSimpleType(qname);
                        c_writer.write("\tpIWSSZ->addOutputBasicArrayParam((Axis_Array*)(&out"
                                + i + ")," + CUtils.getXSDEnumeratorForType( containedType)
                                + ", \"" + returnParamName + "\");\n");
                    }
                    else if (arrayType.isSimpleType())
                    {
                        containedType = CUtils.getSimpleType(arrayType.getBaseType());
                        c_writer.write("\tpIWSSZ->addOutputBasicArrayParam((Axis_Array*)(&out"
                                + i + ")," + CUtils.getXSDEnumeratorForType(containedType)
                                + ", \"" + returnParamName + "\");\n");
                    }
                    else
                    {
                        containedType = qname.getLocalPart();
                        c_writer.write("\tpIWSSZ->addOutputCmplxArrayParam((Axis_Array*)(&out" + i  + "),"
                                + "(void*) Axis_Serialize_" + containedType
                                + ", (void*) Axis_Delete_" + containedType
                                + ", \"" + returnParamName + "\", Axis_URI_" + containedType + ");\n");
                    }
                }
                else if (param.isAnyElement())
                    c_writer.write("\tpIWSSZ->addOutputAnyObject(out" + i + ");\n");
                else
                {
                    if (param.isOptional())
                    {
                        c_writer.write("\tif (out" + i + ")\n");
                        c_writer.write("\t{\n");
                        c_writer.write("\t");
                    }
                    //complex type
                    c_writer.write("\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("\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");

        c_writer.write("}\n");
    }