blob: 5b5e38b4fc45a654c567c494d892524007f629ba [file] [log] [blame]
/*
* 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.
*/
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* 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 */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
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 ClientStubWriter extends CPPClassWriter
{
protected ArrayList methods;
public ClientStubWriter(WebServiceContext wscontext) throws WrapperFault
{
super(wscontext.getServiceInfo().getServicename());
this.wscontext = wscontext;
this.methods = wscontext.getServiceInfo().getMethods();
}
protected void writeClassComment() throws WrapperFault
{
try
{
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 Client Stub implementation for remote web service.\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
{
CUtils.printMethodComment(c_writer, "Constructor for service " + c_classname + ".");
c_writer.write(c_classname + "::\n" + c_classname
+ "(const char* pcEndpointUri, AXIS_PROTOCOL_TYPE eProtocol)\n:Stub(pcEndpointUri, eProtocol)\n{\n");
c_writer.write("}\n");
CUtils.printMethodComment(c_writer, "Constructor for service " + c_classname + ".");
c_writer.write(c_classname + "::\n" + c_classname + "()\n:Stub(\" \", APTHTTP1_1)\n{\n");
//TODO get TransportURI from WrapInfo and check what the transport is and do the following line accordingly
c_writer.write("\tm_pCall->setEndpointURI(\""
+ wscontext.getServiceInfo().getTargetEndpointURI() + "\");\n");
c_writer.write("}\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
{
CUtils.printMethodComment(c_writer, "Destructor for service " + c_classname + ".");
c_writer.write(c_classname + "::\n~" + c_classname + "()\n{\n}\n");
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
/*
* @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeMethods()
* Used by literal code too!
*/
protected void writeMethods() throws WrapperFault
{
try
{
MethodInfo minfo;
for (int i = 0; i < methods.size(); i++)
{
minfo = (MethodInfo) methods.get(i);
this.writeMethodInWrapper(minfo);
}
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
/*
* (non-Javadoc)
*
* @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writePreprocssorStatements()
*/
protected void writePreprocessorStatements() throws WrapperFault
{
try
{
if ("AxisClientException".equals(c_classname))
{
c_writer.write("#include \"" + wscontext.getServiceInfo().getServicename() + "_" + c_classname
+ CUtils.getHeaderFileExtension() + "\"\n\n");
}
else
c_writer.write("#include \"" + c_classname + CUtils.getHeaderFileExtension() + "\"\n\n");
c_writer.write("#include <axis/AxisWrapperAPI.hpp>\n");
c_writer.write ("#include <axis/Axis.hpp>\n");
c_writer.write ("#include <axis/IWrapperSoapSerializer.hpp>\n\n");
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
/**
* 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
{
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* 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");
}
/**
* Used to write out the catch blocks
* Used by literal code too!
*/
protected void writeCatchBlock(MethodInfo minfo) throws WrapperFault, IOException
{
c_writer.write ("\tcatch(AxisException& e)\n\t{\n");
c_writer.write ("\t\tint iExceptionCode = e.getExceptionCode();\n\n");
c_writer.write ("\t\tif(AXISC_NODE_VALUE_MISMATCH_EXCEPTION != iExceptionCode)\n");
c_writer.write ("\t\t{\n");
c_writer.write ("\t\t\tm_pCall->unInitialize();\n");
c_writer.write ("\t\t\tthrow;\n");
c_writer.write ("\t\t}\n\n");
c_writer.write ("\t\tISoapFault* pSoapFault = (ISoapFault*)\n");
c_writer.write ("\t\t\tm_pCall->checkFault(\"Fault\",\""
+ wscontext.getServiceInfo().getTargetEndpointURI () + "\" );\n\n");
c_writer.write ("\t\tif(pSoapFault)\n");
c_writer.write ("\t\t{\n");
//to get fault info
Iterator paramsFault = minfo.getFaultType ().iterator ();
String faultInfoName = null;
boolean flag = false;
if (!paramsFault.hasNext ())
writeOtherFaultException("");
else
{
flag = true;
c_writer.write ("\t\t\tpcCmplxFaultName = pSoapFault->getCmplxFaultObjectName();\n");
}
boolean printedIF = false;
while (paramsFault.hasNext ())
{
FaultInfo info = (FaultInfo) paramsFault.next ();
faultInfoName = info.getFaultInfo ();
// Looking through the list of attributes for the 'error' part of
// the fault message. If found, update the faultInfoName with the
// 'localname' of the qname of the attribute.
Iterator infoArrayListIterator = info.getParams ().iterator ();
while (infoArrayListIterator.hasNext ())
{
ParameterInfo paramInfo = (ParameterInfo) infoArrayListIterator.next ();
if (paramInfo != null)
if ("error".equals (paramInfo.getParamName ()))
{
faultInfoName = paramInfo.getElementName ().getLocalPart ();
break;
}
}
ArrayList paramInfo = info.getParams ();
for (int i = 0; i < paramInfo.size (); i++)
{
ParameterInfo par = (ParameterInfo) paramInfo.get (i);
String langName = par.getLangName ();
String faultType = CUtils.getClassNameFromParamInfoConsideringArrays (par,wscontext);
String faultTypeName = faultType;
if (faultType.lastIndexOf('*') != -1)
faultTypeName = faultType.substring(0, faultType.lastIndexOf('*'));
// TODO Currently we do not create exception classes for simple types!
if (CUtils.isSimpleType (faultTypeName))
continue;
if (printedIF)
c_writer.write ("\t\t\telse if");
else
{
c_writer.write ("\t\t\tif");
printedIF = true;
}
writeExceptions (faultTypeName, faultType, faultInfoName, langName);
}
}
if (flag == true)
{
String tab = "";
if (printedIF)
{
c_writer.write ("\t\t\telse\n");
c_writer.write ("\t\t\t{\n");
tab = "\t";
}
writeOtherFaultException(tab);
if (printedIF)
c_writer.write ("\t\t\t}\n");
}
c_writer.write ("\t\t}\n");
c_writer.write ("\t\telse\n");
c_writer.write ("\t\t{\n");
c_writer.write ("\t\t\tm_pCall->unInitialize();\n");
c_writer.write ("\t\t\tdelete pSoapFault;\n");
c_writer.write ("\t\t\tthrow;\n");
c_writer.write ("\t\t}\n");
c_writer.write ("\t}\n");
}
/**
* Used by literal code too!
*/
private void writeExceptions(String faultTypeName,
String faulttype,
String faultInfoName,
String langName) throws IOException
{
c_writer.write("(0 == strcmp(\"" + faultInfoName + "\", pcCmplxFaultName))\n");
c_writer.write("\t\t\t{\n");
// TODO Simple types we will let it fall through....reason being that this "fix" is being done
// after the fact - that is, we never handled simple types as SOAP fault correctly.
// And thus we generated invalid code that does not compile.
if (CUtils.isSimpleType (faultTypeName))
{
// TODO use simple exception class....
}
else
{
c_writer.write("\t\t\t\t" + faulttype + " pFaultDetail = \n");
c_writer.write("\t\t\t\t\t(" + faulttype + ")pSoapFault->getCmplxFaultObject(\n");
c_writer.write("\t\t\t\t\t\t(void*) Axis_DeSerialize_" + langName + ",\n");
c_writer.write("\t\t\t\t\t\t(void*) Axis_Create_" + langName + ",\n");
c_writer.write("\t\t\t\t\t\t(void*) Axis_Delete_" + langName + ",\n");
c_writer.write("\t\t\t\t\t\t\"" + faultInfoName + "\",\n");
c_writer.write("\t\t\t\t\t\t0);\n\n");
c_writer.write("\t\t\t\tpFaultDetail->setFaultCode(pSoapFault->getFaultcode());\n");
c_writer.write("\t\t\t\tpFaultDetail->setFaultString(pSoapFault->getFaultstring());\n");
c_writer.write("\t\t\t\tpFaultDetail->setFaultActor(pSoapFault->getFaultactor());\n");
c_writer.write("\t\t\t\tpFaultDetail->setExceptionCode(e.getExceptionCode());\n");
c_writer.write("\t\t\t\tm_pCall->unInitialize();\n");
c_writer.write ("\t\t\t\tdelete pSoapFault;\n");
c_writer.write ("\t\t\t\t" + faultTypeName + " fault = *pFaultDetail;\n");
c_writer.write ("\t\t\t\tdelete pFaultDetail;\n");
c_writer.write ("\t\t\t\tthrow fault;\n");
}
c_writer.write("\t\t\t}\n");
}
private void writeOtherFaultException(String tabs) throws IOException
{
c_writer.write (tabs + "\t\t\tconst char *detail = pSoapFault->getSimpleFaultDetail();\n");
c_writer.write (tabs + "\t\t\tbool deleteDetail=false;\n\n");
c_writer.write (tabs + "\t\t\tif (NULL==detail || 0==strlen(detail))\n");
c_writer.write (tabs + "\t\t\t{\n");
c_writer.write (tabs + "\t\t\t\tdetail=m_pCall->getFaultAsXMLString();\n");
c_writer.write (tabs + "\t\t\t\tif (NULL==detail)\n");
c_writer.write (tabs + "\t\t\t\t\tdetail=\"\";\n");
c_writer.write (tabs + "\t\t\t\telse\n");
c_writer.write (tabs + "\t\t\t\t\tdeleteDetail=true;\n");
c_writer.write (tabs + "\t\t\t}\n\n");
c_writer.write (tabs + "\t\t\tOtherFaultException ofe(pSoapFault->getFaultcode(),\n");
c_writer.write (tabs + "\t\t\t\tpSoapFault->getFaultstring(), pSoapFault->getFaultactor(),\n");
c_writer.write (tabs + "\t\t\t\tdetail, iExceptionCode);\n\n");
c_writer.write (tabs + "\t\t\tif (deleteDetail && NULL!=detail)\n");
c_writer.write (tabs + "\t\t\t\tAxis::AxisDelete( (void *) const_cast<char*>(detail), XSD_STRING);\n");
c_writer.write (tabs + "\n");
c_writer.write (tabs + "\t\t\tm_pCall->unInitialize();\n");
c_writer.write (tabs + "\t\t\tdelete pSoapFault;\n");
c_writer.write (tabs + "\t\t\tthrow ofe;\n");
}
}