in src/wsdl/org/apache/axis/wsdl/wsdl2ws/cpp/ClientStubWriter.java [175:726]
public void writeMethodInWrapper(MethodInfo minfo) throws WrapperFault, IOException
{
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE */
/* ---------------------------------------------------------------- */
/* CHANGES TO FILE MAY NEED TO BE PROPAGATED TO THE */
/* C-EQUIVALENT FILE IN SUPPORT OF THE C-BINDING INTERFACES. */
/* ---------------------------------------------------------------- */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
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;
boolean returntypeissimple = false;
boolean returntypeisarray = false;
String outparamType = null;
if (returntype != null)
{
retType = wscontext.getTypemap().getType(returntype.getSchemaName());
if (retType != null)
{
outparamType = CUtils.getClassNameFromParamInfoConsideringArrays(returntype, wscontext);
if (retType.isSimpleType())
returntypeissimple = true;
else
{
returntypeissimple = CUtils.isSimpleType (outparamType);
returntypeisarray = CUtils.isArrayType(outparamType);
}
returntypeisarray |= retType.isArray();
}
else
{
outparamType = returntype.getLangName ();
returntypeissimple = CUtils.isSimpleType (outparamType);
}
}
//=============================================================================
// Generate method prototype
//=============================================================================
CUtils.printMethodComment(c_writer, "This method wraps the service method " + minfo.getMethodname() + ".");
//method signature
String paramTypeName;
boolean typeisarray = false;
boolean typeissimple = false;
Type type;
if (returntype == null)
c_writer.write("void");
else if (returntypeissimple
&& (!(returntype.isNillable() || returntype.isOptional())
|| CUtils.isPointerType(outparamType)))
c_writer.write (outparamType);
else if (outparamType.lastIndexOf ("*") > 0)
c_writer.write (outparamType);
else
c_writer.write (outparamType + "*");
c_writer.write(" " + c_classname + "::\n" + minfo.getSanitizedMethodName() + "(");
ArrayList paramsB = (ArrayList) params;
for (int i = 0; i < paramsB.size(); i++)
{
paramTypeName =
CUtils.getClassNameFromParamInfoConsideringArrays((ParameterInfo) paramsB.get(i), wscontext);
if (i > 0)
c_writer.write(", ");
typeissimple = CUtils.isSimpleType(paramTypeName);
if (typeissimple
&& (!(((ParameterInfo) paramsB.get (i)).isNillable ()
|| ((ParameterInfo) paramsB.get (i)).isOptional())
|| CUtils.isPointerType(paramTypeName)))
c_writer.write (paramTypeName + " Value" + i);
else if (paramTypeName.lastIndexOf ("*") > 0)
c_writer.write (paramTypeName + " Value" + i);
else
c_writer.write (paramTypeName + "* Value" + i);
}
// Multiples parameters so fill the methods prototype
ArrayList paramsC = (ArrayList) minfo.getOutputParameterTypes();
if (isAllTreatedAsOutParams)
{
for (int i = 0; i < paramsC.size(); i++)
{
type = wscontext.getTypemap().getType(((ParameterInfo) paramsC.get(i)).getSchemaName());
c_writer.write(", AXIS_OUT_PARAM "
+ CUtils.getClassNameFromParamInfoConsideringArrays(
(ParameterInfo) paramsC.get(i),wscontext) + " *OutValue" + i);
}
}
c_writer.write(")\n{\n");
//=============================================================================
// Generate global variables (outside of try block)
//=============================================================================
if (returntype != null)
{
c_writer.write("\t");
if (returntypeisarray)
c_writer.write(outparamType + " * RetArray = new " + outparamType + "();\n");
else if (!returntypeissimple)
c_writer.write(outparamType + "\tpReturn = NULL;\n");
else if (returntype.isNillable() || returntype.isOptional()
|| CUtils.isPointerType(outparamType))
{
c_writer.write(outparamType);
if (!CUtils.isPointerType(outparamType))
c_writer.write(" *");
c_writer.write("\tRet = NULL;\n");
}
else
{
String initValue = CUtils.getInitValueForType (outparamType);
if (initValue != null)
c_writer.write (outparamType + " Ret = " + initValue + ";\n");
else if (CUtils.getXSDEnumeratorForType( outparamType).equals("XSD_DATETIME")
|| CUtils.getXSDEnumeratorForType( outparamType).equals("XSD_DATE")
|| CUtils.getXSDEnumeratorForType( outparamType).equals("XSD_TIME"))
{
c_writer.write (outparamType + " Ret;\n");
c_writer.write ("\tmemset(&Ret,0,sizeof(" + outparamType + "));\n");
}
else
c_writer.write (outparamType + " Ret;\n");
}
}
c_writer.write("\tconst char* pcCmplxFaultName = NULL;\n\n");
//=============================================================================
// Generate try block and method logic
//=============================================================================
c_writer.write("\ttry\n\t{\n");
c_writer.write("\t\tif (AXIS_SUCCESS != m_pCall->initialize(CPP_RPC_PROVIDER" + "))\n");
c_writer.write("\t\t\treturn ");
if (returntype != null)
{
if (returntypeisarray)
c_writer.write("RetArray;\n");
else if (CUtils.isPointerType(outparamType) ||
(returntypeissimple && !(returntype.isNillable() || returntype.isOptional())))
c_writer.write("Ret;\n");
else if (returntypeissimple)
c_writer.write("*Ret;\n");
else
c_writer.write("pReturn;\n");
}
else
c_writer.write(";\n");
c_writer.write("\n");
c_writer.write("\t\tif( NULL == m_pCall->getTransportProperty( \"SOAPAction\", false))\n");
c_writer.write("\t\t\tm_pCall->setTransportProperty( SOAPACTION_HEADER,\""
+ minfo.getSoapAction() + "\");\n");
c_writer.write("\n");
c_writer.write("\t\tm_pCall->setSOAPVersion( SOAP_VER_1_1);\n");
//TODO check which version is it really.
// Use namespace specified in input binding if one exists
// For rpc/literal operations the namespace must be set, but if not, use
// the target namespace.
String namespaceURI = minfo.getInputNamespaceURI();
if (namespaceURI == null)
namespaceURI = wscontext.getWrapperInfo().getTargetNameSpaceOfWSDL();
c_writer.write("\t\tm_pCall->setOperation( \""
+ minfo.getMethodname() + "\", \""
+ namespaceURI + "\");\n");
//=============================================================================
// Apply user specified properties
//=============================================================================
c_writer.write("\n");
c_writer.write ("\t\tincludeSecure();\n");
c_writer.write ("\t\tapplyUserPreferences();\n");
c_writer.write("\n");
//=============================================================================
// Process elements
//=============================================================================
for (int i = 0; i < paramsB.size(); i++)
{
type = wscontext.getTypemap().getType( ((ParameterInfo) paramsB.get(i)).getSchemaName());
if (type != null)
{
paramTypeName = type.getLanguageSpecificName();
typeisarray = type.isArray();
}
else
{
paramTypeName = ((ParameterInfo) paramsB.get(i)).getLangName();
typeisarray = false;
}
typeissimple = CUtils.isSimpleType(paramTypeName);
if (typeisarray)
{
//arrays
QName qname = CUtils.getArrayType(type).getName();
String containedType = null;
if (CUtils.isSimpleType(qname))
{
containedType = CUtils.getSimpleType(qname);
c_writer.write("\t\tm_pCall->addBasicArrayParameter( ");
c_writer.write("Value" + i + ", "
+ CUtils.getXSDEnumeratorForType(containedType)
+ ", \""
+ ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString()
+ "\"");
}
else
{
containedType = qname.getLocalPart();
c_writer.write("\t\tm_pCall->addCmplxArrayParameter( ");
c_writer.write("Value" + i
+ ",(void *) Axis_Serialize_" + containedType
+ ",(void *) Axis_Delete_" + containedType
+ ",\"" + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString() + "\""
+ ",Axis_URI_" + containedType);
}
}
else if (typeissimple)
{
if (((ParameterInfo) paramsB.get(i)).isNillable()
|| CUtils.isPointerType(paramTypeName))
{
c_writer.write("\t\tm_pCall->addParameter( ");
c_writer.write("(void *) Value" + i + ", \""
+ ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString() + "\", "
+ CUtils.getXSDEnumeratorForType(paramTypeName));
}
else
{
c_writer.write("\t\tm_pCall->addParameter( ");
c_writer.write("(void *) &Value" + i + ", \""
+ ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString() + "\", "
+ CUtils.getXSDEnumeratorForType(paramTypeName));
}
}
else
{
//for complex types
c_writer.write("\t\tm_pCall->addCmplxParameter( ");
c_writer.write("Value" + i
+ ",(void *) Axis_Serialize_" + paramTypeName
+ ",(void *) Axis_Delete_" + paramTypeName
+ ",\"" + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString()
+ "\",Axis_URI_" + paramTypeName);
}
c_writer.write(");\n");
}
//=============================================================================
// Invoke web service - two-way message processing
//=============================================================================
c_writer.write("\n\t\tif( AXIS_SUCCESS == m_pCall->sendAndReceive())\n\t\t{\n");
c_writer.write("\t\t\tif( AXIS_SUCCESS == m_pCall->checkMessage( \""
+ minfo.getOutputMessage().getLocalPart() + "\",\""
+ namespaceURI
+ "\"))\n\t\t\t{\n");
String paramTagName = "";
if( returntype != null)
paramTagName = returntype.getParamNameAsSOAPString();
//=============================================================================
// Process output parameters
//=============================================================================
if (isAllTreatedAsOutParams)
{
String currentParamName;
String currentParaType;
for (int i = 0; i < paramsC.size(); i++)
{
ParameterInfo currentType = (ParameterInfo) paramsC.get(i);
paramTagName = currentType.getParamNameAsSOAPString();
type = wscontext.getTypemap().getType(currentType.getSchemaName());
if (type != null)
{
currentParaType = type.getLanguageSpecificName();
typeisarray = type.isArray();
}
else
{
currentParaType = ((ParameterInfo) paramsC.get(i)).getLangName();
typeisarray = false;
}
typeissimple = CUtils.isSimpleType(currentParaType);
currentParamName = "*OutValue" + i;
// Some code need to be merged as we have some duplicated in coding here.
if (typeisarray)
{
QName qname = CUtils.getArrayType(type).getName();
String containedType = null;
String containedTypeArrayName = null;
if (CUtils.isSimpleType(qname))
{
containedType = CUtils.getSimpleType(qname);
c_writer.write("\n\t\t\tAxis_Array * pReturn" + i + " = m_pCall->getBasicArray( " + CUtils.getXSDEnumeratorForType (containedType)
+ ",\"" + paramTagName
+ "\", 0);\n\n");
c_writer.write("\t\t\tif( pReturn" + i + " != NULL && OutValue" + i + " != NULL)\n");
c_writer.write("\t\t\t{\n");
c_writer.write("\t\t\t\tif( *OutValue" + i + " == NULL)\n");
c_writer.write("\t\t\t\t\t*OutValue" + i + " = new " + currentParaType + "();\n");
c_writer.write("\t\t\t\telse\n");
c_writer.write("\t\t\t\t\t(*OutValue" + i + ")->clear();\n");
c_writer.write("\t\t\t\t(*OutValue" + i + ")->clone( *pReturn" + i + ");\n");
c_writer.write("\t\t\t}\n\n");
c_writer.write("\t\t\tAxis::AxisDelete( (void *) pReturn" + i + ", XSD_ARRAY);\n");
}
else
{
containedType = qname.getLocalPart();
containedTypeArrayName = CUtils.getArrayNameForComplexType(qname);
c_writer.write("\n\t\t\tif( OutValue" + i + " != NULL)\n" );
c_writer.write("\t\t\t{\n");
c_writer.write("\t\t\t\tif( " + currentParamName + " == NULL)\n");
c_writer.write("\t\t\t\t\t" + currentParamName + " = new " + containedTypeArrayName + "();\n");
c_writer.write("\t\t\t\telse\n");
c_writer.write("\t\t\t\t\t(" + currentParamName + ")->clear();\n");
c_writer.write("\t\t\t\tm_pCall->getCmplxArray( " + currentParamName
+ ",(void *) Axis_DeSerialize_" + containedType
+ ",(void *) Axis_Create_" + containedType
+ ",(void *) Axis_Delete_" + containedType
+ ",\"" +currentType.getElementNameAsSOAPString()
+ "\",Axis_URI_" + containedType + ");\n");
c_writer.write("\t\t\t}\n");
c_writer.write("\t\t\telse\n");
c_writer.write("\t\t\t{\n");
c_writer.write("\t\t\t\t// Unable to return value, but will deserialize to ensure subsequent elements can be correctly processed.\n");
c_writer.write("\t\t\t\t" + containedTypeArrayName + " * pTemp" + i
+ " = new " + containedTypeArrayName + "();\n");
c_writer.write("\t\t\t\tm_pCall->getCmplxArray( pTemp" + i
+ ",(void *) Axis_DeSerialize_" + containedType
+ ",(void *) Axis_Create_" + containedType
+ ",(void *) Axis_Delete_" + containedType
+ ",\"" + currentType.getElementNameAsSOAPString()
+ "\",Axis_URI_" + containedType + ");\n");
c_writer.write("\t\t\t\tdelete pTemp" + i + ";\n");
c_writer.write("\t\t\t}\n");
}
}
else if (typeissimple)
{
if( i > 0)
c_writer.write( "\n");
if (CUtils.isPointerType(currentParaType))
{
String xsdType = CUtils.getClassNameFromParamInfoConsideringArrays ((ParameterInfo) paramsC.get (i), wscontext);
if( !CUtils.isPointerType(xsdType))
xsdType += " *";
c_writer.write( "\t\t\t" + currentParaType + " pReturn" + i
+ " = m_pCall->" + CUtils.getDeserializerMethodName( currentParaType, false)
+ "( \"" + paramTagName + "\", 0);\n");
c_writer.write( "\n");
c_writer.write( "\t\t\tif( pReturn" + i + " != NULL && OutValue" + i + " != NULL)\n");
c_writer.write( "\t\t\t\t{\n");
c_writer.write( "\t\t\t\tif( *OutValue" + i + " != NULL)\n");
c_writer.write( "\t\t\t\t{\n");
c_writer.write( "\t\t\t\t\tint\tiStringSize" + i + " = strlen( (char *) *OutValue" + i + ");\n");
c_writer.write( "\t\t\t\t\tint\tiStrLenValue" + i + " = strlen( pReturn" + i + ");\n");
c_writer.write( "\n");
c_writer.write( "\t\t\t\t\tif( iStrLenValue" + i + " > iStringSize" + i + ")\n");
c_writer.write( "\t\t\t\t\t{\n");
c_writer.write( "\t\t\t\t\t\t*OutValue" + i + " =(" + xsdType + ") new char[iStrLenValue" + i + " + 1];\n");
c_writer.write( "\t\t\t\t\t\tstrcpy( (char *) *OutValue" + i + ", pReturn" + i + ");\n");
c_writer.write( "\t\t\t\t\t}\n");
c_writer.write( "\t\t\t\t\telse\n");
c_writer.write( "\t\t\t\t\t\tstrcpy( (char *) *OutValue" + i + ", pReturn" + i + ");\n");
c_writer.write( "\t\t\t\t}\n");
c_writer.write( "\t\t\t\telse\n");
c_writer.write( "\t\t\t\t{\n");
c_writer.write( "\t\t\t\t\t*OutValue" + i + " = (" + xsdType + ") new char[strlen( pReturn" + i + ") + 1];\n");
c_writer.write( "\t\t\t\t\tstrcpy( (char *) *OutValue" + i + ", pReturn" + i + ");\n");
c_writer.write( "\t\t\t\t}\n");
c_writer.write( "\t\t\t}\n");
c_writer.write( "\n");
c_writer.write( "\t\t\tAxis::AxisDelete( (void *) pReturn" + i + ", "
+ CUtils.getXSDEnumeratorForType( currentParaType) + ");\n");
}
else
{
c_writer.write( "\t\t\t" + currentParaType + " * pReturn" + i + " = m_pCall->"
+ CUtils.getDeserializerMethodName( currentParaType, false)
+ "( \"" + paramTagName + "\", 0);\n");
c_writer.write( "\n");
c_writer.write( "\t\t\tif( pReturn" + i + " != NULL && OutValue" + i + " != NULL)\n");
c_writer.write( "\t\t\t{\n");
c_writer.write( "// OutValue" + i + " is not nillable.\n");
c_writer.write( "\t\t\t\tOutValue" + i + " = new " + currentParaType + "();\n");
c_writer.write( "\n");
c_writer.write( "\t\t\t\t*OutValue" + i + " = *pReturn" + i + ";\n");
c_writer.write( "\t\t\t}\n");
c_writer.write( "\n");
c_writer.write( "\t\t\tAxis::AxisDelete( (void *) pReturn" + i + ", "
+ CUtils.getXSDEnumeratorForType( currentParaType) + ");\n");
}
}
else
{
c_writer.write("\t\t\t\t"
+ currentParamName + " = (" + currentParaType
+ " *) m_pCall->getCmplxObject( (void *) Axis_DeSerialize_" + currentParaType
+ ",(void *) Axis_Create_" + currentParaType
+ ",(void *) Axis_Delete_" + currentParaType
+ ",\"" + paramTagName + "\",0);\n");
}
} // end for-loop for paramsC
c_writer.write("\t\t\t}\n");
c_writer.write("\t\t}\n\n");
c_writer.write("\t\tm_pCall->unInitialize();\n");
}
else if (returntype == null)
{
c_writer.write("\t\t\t\t/*not successful*/\n\t\t\t}\n");
c_writer.write("\t\t}\n\n");
c_writer.write("\t\tm_pCall->unInitialize();\n");
}
else if (returntypeisarray)
{
QName qname = CUtils.getArrayType(retType).getName();
String containedType = null;
String containedTypeArrayName = null;
if (CUtils.isSimpleType(qname))
{
containedType = CUtils.getSimpleType(qname);
c_writer.write("\t\t\t\tAxis_Array * RetAxisArray = m_pCall->getBasicArray( "
+ CUtils.getXSDEnumeratorForType(containedType) + ",\""
+ paramTagName + "\",0);\n");
c_writer.write ("\t\t\t\tRetArray->clone( *RetAxisArray);\n");
c_writer.write ("\t\t\t\tAxis::AxisDelete( (void *) RetAxisArray, XSD_ARRAY);\n");
}
else
{
containedType = qname.getLocalPart();
containedTypeArrayName = CUtils.getArrayNameForComplexType(qname);
c_writer.write("\t\t\t\tRetArray = (" + containedTypeArrayName
+ " *) m_pCall->getCmplxArray( RetArray,(void *) Axis_DeSerialize_"
+ containedType);
c_writer.write(",(void *) Axis_Create_" + containedType
+ ",(void *) Axis_Delete_" + containedType
+ ",\"" + paramTagName
+ "\",Axis_URI_" + containedType + ");\n");
}
c_writer.write("\t\t\t}\n\t\t}\n\n");
c_writer.write("\t\tm_pCall->unInitialize();\n\n");
c_writer.write("\t\treturn RetArray;\n");
}
else if (returntypeissimple)
{
if (returntype.isNillable () || CUtils.isPointerType(outparamType))
{
c_writer.write( "\t\t\t\tRet = m_pCall->"
+ CUtils.getDeserializerMethodName( outparamType, false)
+ "(\"" + returntype.getParamNameAsSOAPString() + "\", 0);\n");
}
else
{
c_writer.write ("\t\t\t\t" + outparamType + " * pReturn = m_pCall->" +
CUtils.getDeserializerMethodName(outparamType, false) + "(\"" +
returntype.getElementNameAsSOAPString() + "\", 0);\n");
c_writer.write ("\t\t\t\tif(pReturn)\n");
c_writer.write ("\t\t\t\t{\n");
c_writer.write ("\t\t\t\t\tRet = *pReturn;\n");
c_writer.write ("\t\t\t\t\tAxis::AxisDelete( (void *) pReturn, " + CUtils.getXSDEnumeratorForType( outparamType) + ");\n");
c_writer.write ("\t\t\t\t}\n");
// TODO If we unexpectedly receive a nill value, when nillable="false" we should do something appropriate, perhaps as below:
// writer.write("\t\t\telse");
// writer.write("\t\t\t\tthrow new Exception(\"Unexpected use of nill\");");
}
c_writer.write("\t\t\t}\n");
c_writer.write("\t\t}\n\n");
c_writer.write("\t\tm_pCall->unInitialize();\n");
c_writer.write("\t\treturn Ret;\n");
}
else
{
outparamType = returntype.getLangName();
//need to have complex type name without *
c_writer.write("\t\t\t\tpReturn = (" + outparamType
+ " *) m_pCall->getCmplxObject( (void *) Axis_DeSerialize_"
+ outparamType + ",(void *) Axis_Create_"
+ outparamType + ",(void *) Axis_Delete_"
+ outparamType + ",\"" + paramTagName
+ "\",0);\n\t\t\t}\n");
c_writer.write("\t\t}\n\n");
c_writer.write("\t\tm_pCall->unInitialize();\n\n");
c_writer.write("\t\treturn pReturn;\n");
}
c_writer.write("\t}\n");
//=============================================================================
// End of try block, beginning of catch block
//=============================================================================
writeCatchBlock(minfo);
//=============================================================================
// End of method
//=============================================================================
c_writer.write("}\n");
}