Hi Mark,
Fortunately I had a backup of the file prior to making changes. PFA.
One of the problems of identifying the changes is because I did some
indentation fixes. Sorry about that.
I ran the test on Linux and Chinthana helped me to test this on
Windows. On both platforms, with the changes in place, AxisBench client
does not crash. However, the output we get is different from the
formatting in the expected out file (but the outputs seem correct)
When you say fail does it mean that it segfaults? Are there any other
tests that segfault?
Thanks,
Samisa...
On Fri, 2005-03-18 at 17:27, Mark Whitlock wrote:
>
>
> Hi Samisa,
> I am investigating AxisBench failing on linux. It appears to fail when
> deleting the last (i=99) output BenchBasicDataType. This test succeeded on
> the 14th March but failed on the 15th (and all builds subsequently). So I
> looked through all the changes that were made on the 14th and 15th March
> and I have eliminated all but your change to
> cpp/literal/ClientStubWriter.java. Unfortunately the file got formatted for
> this change so it is hard to see exactly which lines you really changed. In
> your JIRA comment you said you had to make large changes.
>
> I apologise if I am unfairly accusing your fix. I just need some help
> sorting this problem. I will try (privately) backing off your change and
> see if that fixes AxisBench but that may be difficult since code has been
> added since.
>
> Please could you help?
> Thanks,
> Mark
> Mark Whitlock
> IBM
--
Samisa Abeysinghe <[EMAIL PROTECTED]>
Virtusa Corporation
/*
* Copyright 2003-2004 The Apache Software Foundation.
*
* 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.
*/
/**
* @author Susantha Kumara([EMAIL PROTECTED], [EMAIL PROTECTED])
* @author Samisa Abeysinghe ([EMAIL PROTECTED])
*/
/*
* Revision 1.1 2004/05/26 samisa
* Added Stub base class into code generation
*/
package org.apache.axis.wsdl.wsdl2ws.cpp.literal;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
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.WrapperUtils;
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 org.apache.axis.wsdl.wsdl2ws.cpp.ClientStubWriter
{
public ClientStubWriter (WebServiceContext wscontext) throws WrapperFault
{
super (wscontext);
}
/* (non-Javadoc)
* @see
org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeConstructors()
*/
protected void writeConstructors () throws WrapperFault
{
try
{
writer.write (classname
+ "::"
+ classname
+
"(const char* pcEndpointUri, AXIS_PROTOCOL_TYPE
eProtocol):Stub(pcEndpointUri, eProtocol)\n{\n");
writer.write ("}\n\n");
writer.write (classname
+ "::"
+ classname + "()\n:Stub(\" \", APTHTTP1_1)\n{\n");
//TODO get TransportURI from WrapInfo and check what the transport
is and do the following line accordingly
writer.write ("\tm_pCall->setEndpointURI(\""
+ wscontext.getWrapInfo ().getTargetEndpointURI ()
+ "\");\n");
writer.write ("}\n\n");
}
catch (IOException e)
{
throw new WrapperFault (e);
}
}
/* (non-Javadoc)
* @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeMethods()
*/
protected void writeMethods () throws WrapperFault
{
try
{
writer.
write
("\n/*Methods corresponding to the web service methods*/\n");
MethodInfo minfo;
for (int i = 0; i < methods.size (); i++)
{
minfo = (MethodInfo) methods.get (i);
this.writeMethodInWrapper (minfo);
writer.write ("\n");
}
writer.write ("/*Methods for supporting SecureChannel*/\n\n");
// FJP - SecureChannel
writer.write ("void "
+ classname
+ "::SetSecure( char * pszArguments, ...)\n");
// FJP - SecureChannel
writer.write ("{\n"); // FJP - SecureChannel
writer.write ("\tchar **\tppszArgPtr = &pszArguments;\n");
// FJP - SecureChannel
writer.write ("\tint\t\tiArgIndex = 0;\n\n"); // FJP -
SecureChannel
writer.write ("\twhile( *ppszArgPtr != NULL)\n");
// FJP - SecureChannel
writer.write ("\t{\n"); // FJP - SecureChannel
writer.write ("\t\tsArguments[iArgIndex] = *ppszArgPtr;\n\n");
// FJP - SecureChannel
writer.write ("\t\tiArgIndex++;\n"); // FJP - SecureChannel
writer.write ("\t\tppszArgPtr++;\n"); // FJP - SecureChannel
writer.write ("\t}\n"); // FJP - SecureChannel
writer.write ("}\n\n"); // FJP - SecureChannel
writer.write ("void " + classname + "::includeSecure()\n");
// FJP - SecureChannel
writer.write ("{\n"); // FJP - SecureChannel
writer.
write
("\tm_pCall->setTransportProperty( SECURE_PROPERTIES, (const
char *) &sArguments);\n");
// FJP - SecureChannel
writer.write ("}\n"); // FJP - SecureChannel
}
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 (classname))
{
writer.write ("#include \""
+ getServiceName ()
+ "_"
+ classname
+ CUtils.CPP_HEADER_SUFFIX + "\"\n\n");
}
else
{
writer.write ("#include \""
+ classname
+ CUtils.CPP_HEADER_SUFFIX + "\"\n\n");
}
writer.write ("#include <axis/AxisWrapperAPI.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
{
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 ();
String methodName = minfo.getMethodname ();
Type retType = null;
boolean returntypeissimple = false;
boolean returntypeisarray = false;
String outparamType = null;
if (returntype != null)
{
retType =
wscontext.getTypemap ().getType (returntype.getSchemaName ());
}
if (retType != null)
{
if (retType.isSimpleType ())
{
outparamType = CUtils.getclass4qname (retType.getBaseType ());
}
else
{
outparamType = retType.getLanguageSpecificName ();
}
returntypeisarray = retType.isArray ();
}
else
{
if (returntype != null)
{
outparamType = returntype.getLangName ();
}
}
if (returntype != null)
{
returntypeissimple = CUtils.isSimpleType (outparamType);
}
writer.write ("\n/*\n");
writer.write (" * This method wrap the service method" + methodName +
"\n");
writer.write (" */\n");
//method signature
String paraTypeName;
boolean typeisarray = false;
boolean typeissimple = false;
Type type;
if (returntype == null)
{
writer.write ("void");
}
else
{
if (returntypeisarray
|| (returntypeissimple
&& (!returntype.isNillable ()
|| outparamType.equals ("xsd__string")
|| outparamType.equals ("xsd__anyURI")
|| outparamType.equals ("xsd__QName")
|| outparamType.equals ("xsd__notation"))))
{
writer.write (outparamType);
}
else
{ //for AnyType too
writer.write (outparamType + "*");
}
}
writer.write (" " + classname + "::" + methodName + "(");
ArrayList paramsB = (ArrayList) params;
if (0 < paramsB.size ())
{
type =
wscontext.getTypemap ().getType (((ParameterInfo) paramsB.
get (0)).getSchemaName ());
if (type != null)
{
if (type.isSimpleType ())
{ //schema defined simpleType
paraTypeName =
CUtils.getclass4qname (type.getBaseType ());
}
else
{
paraTypeName = type.getLanguageSpecificName ();
}
typeisarray = type.isArray ();
}
else
{
paraTypeName =
((ParameterInfo) paramsB.get (0)).getLangName ();
typeisarray = false;
}
typeissimple = CUtils.isSimpleType (paraTypeName);
if (typeisarray
|| (typeissimple
&& (!((ParameterInfo) paramsB.get (0)).isNillable ()
|| paraTypeName.equals ("xsd__string")
|| paraTypeName.equals ("xsd__anyURI")
|| paraTypeName.equals ("xsd__QName")
|| paraTypeName.equals ("xsd__notation"))))
{
writer.write (paraTypeName + " Value0");
}
else
{ //for AnyType too
writer.write (paraTypeName + "* Value0");
}
for (int i = 1; i < paramsB.size (); i++)
{
type =
wscontext.getTypemap ().getType (((ParameterInfo) paramsB.
get (i)).
getSchemaName ());
if (type != null)
{
if (type.isSimpleType ())
{ //schema defined simpleType
paraTypeName =
CUtils.getclass4qname (type.getBaseType ());
}
else
{
paraTypeName = type.getLanguageSpecificName ();
}
typeisarray = type.isArray ();
}
else
{
paraTypeName =
((ParameterInfo) paramsB.get (i)).getLangName ();
typeisarray = false;
}
typeissimple = CUtils.isSimpleType (paraTypeName);
if (typeisarray
|| (typeissimple
&& (!((ParameterInfo) paramsB.get (i)).isNillable ()
|| paraTypeName.equals ("xsd__string")
|| paraTypeName.equals ("xsd__anyURI")
|| paraTypeName.equals ("xsd__QName")
|| paraTypeName.equals ("xsd__notation"))))
{
writer.write (", " + paraTypeName + " Value" + i);
}
else
{ //for AnyType too
writer.write (", " + paraTypeName + "* 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 ());
writer.write (", AXIS_OUT_PARAM " +
WrapperUtils.
getClassNameFromParamInfoConsideringArrays
((ParameterInfo) paramsC.get (i), wscontext) + "* OutValue" + i);
}
}
writer.write (")\n{\n");
if (returntype != null)
{
writer.write ("\t");
if (returntypeisarray)
{
//for arrays
writer.write (outparamType + " RetArray = {NULL, 0};\n");
}
else
{
if (!returntypeissimple)
{ //for AnyType too
writer.write (outparamType + "* pReturn = NULL;\n");
//for complex types
}
else
{
//for simple types
if (returntype.isNillable ()
&& !(outparamType.equals ("xsd__string")
|| outparamType.equals ("xsd__anyURI")
|| outparamType.equals ("xsd__QName")
|| outparamType.equals ("xsd__notation")))
{
writer.write (outparamType + "* Ret = NULL;\n");
}
else
{
String initValue = CUtils.getInitValue (outparamType);
if (initValue != null)
{
writer.write (outparamType + " Ret = " +
initValue + ";\n");
}
else
{
if (outparamType.equals ("xsd__base64Binary")
|| outparamType.equals ("xsd__hexBinary"))
{
writer.write (outparamType + " Ret;\n");
writer.write ("\tRet.__ptr = NULL;\n");
writer.write ("\tRet.__size = 0;\n");
}
else
{
if (outparamType.equals ("xsd__dateTime")
|| outparamType.equals ("xsd__date")
|| outparamType.equals ("xsd__time"))
{
writer.write (outparamType + " Ret;\n");
writer.write ("\tmemset(&Ret,0,sizeof(" +
outparamType + "));\n");
}
else
{
writer.write (outparamType + " Ret;\n");
}
}
}
}
}
//TODO initialize return parameter appropriately.
}
}
writer.write ("\tconst char* pcCmplxFaultName;\n");
writer.write ("\ttry\n\t{");
writer.
write
("\tif (AXIS_SUCCESS != m_pCall->initialize(CPP_DOC_PROVIDER" +
")) return ");
if (returntype != null)
{
writer.write ((returntypeisarray
? "RetArray"
: returntypeissimple
? "Ret" : "pReturn") + ";\n\t");
}
else
{
writer.write (";\n");
}
writer.
write
("\tif
(NULL==m_pCall->getTransportProperty(\"SOAPAction\",false))\n");
writer.write ("\t{\n");
writer.
write ("\t\tm_pCall->setTransportProperty(SOAPACTION_HEADER , \""
+ minfo.getSoapAction () + "\");\n");
writer.write ("\t}\n");
writer.write ("\tm_pCall->setSOAPVersion(SOAP_VER_1_1);\n");
//TODO check which version is it really.
writer.write ("\tm_pCall->setOperation(\""
+ minfo.getInputMessage ().getLocalPart ()
+ "\", \""
+ minfo.getInputMessage ().getNamespaceURI ()
+ "\");\n");
// Add attributes to soap method
for (int i = 0; i < paramsB.size (); i++)
{
ParameterInfo param = (ParameterInfo) paramsB.get (i);
if (param.isAttribute ())
{
String elementType = param.getElementName ().getLocalPart ();
if ("string".equals (elementType))
{
writer.write ("\tm_pCall->setSOAPMethodAttribute(\""
+ param.getParamName ()
+ "\", \"\", Value" + i + ");\n");
}
else
{
if ("int".equals (elementType))
{
writer.write ("\t{\n");
writer.write ("\t\tchar buffer[20];\n");
writer.write ("\t\tsprintf(buffer,\"%d\", Value" + i +
");\n");
writer.
write ("\t\tm_pCall->setSOAPMethodAttribute(\"" +
param.getParamName () +
"\", \"\", buffer);\n");
writer.write ("\t}\n");
}
}
}
}
//new calls from stub base
writer.write ("\tincludeSecure();\n"); // FJP - SecureChannel
writer.write ("\tapplyUserPreferences();\n");
for (int i = 0; i < paramsB.size (); i++)
{
ParameterInfo param = (ParameterInfo) paramsB.get (i);
// Ignore attributes, while adding elements
if (!param.isAttribute ())
{
type =
wscontext.getTypemap ().getType (param.getSchemaName ());
if (type != null)
{
if (type.isSimpleType ())
{ //schema defined simpleType possibly with
restrictions
paraTypeName =
CUtils.getclass4qname (type.getBaseType ());
}
else
{
paraTypeName = type.getLanguageSpecificName ();
}
typeisarray = type.isArray ();
}
else
{
paraTypeName =
((ParameterInfo) paramsB.get (i)).getLangName ();
typeisarray = false;
}
if (param.isAnyType ())
{
//for anyType
writer.write ("\tm_pCall->addAnyObject(Value" + i);
}
else
{
//String parameterName =
((ParameterInfo)paramsB.get(i)).getElementName().getLocalPart();
//Samisa 22/08/2004
String parameterName =
((ParameterInfo) paramsB.get (i)).
getElementNameAsString ();
//Samisa
String namespace =
((ParameterInfo) paramsB.get (i)).getElementName ().
getNamespaceURI ();
if (namespace.length () == 0)
{
writer.write ("\tchar cPrefixAndParamName"
+ i
+ "["
+ "] = \"" + parameterName + "\";\n");
}
else
{
int stringLength =
8 + 1 + parameterName.length () + 1;
writer.write ("\tchar cPrefixAndParamName" + i + "[" +
stringLength + "];\n");
writer.write ("\tsprintf( cPrefixAndParamName" + i +
", \"%s:" + parameterName +
"\", m_pCall->getNamespacePrefix(\"" +
namespace + "\"));\n");
}
if (typeisarray)
{
// Array
Type arrayType = WrapperUtils.getArrayType (type);
QName qname = arrayType.getName ();
if (CUtils.isSimpleType (qname))
{
// Array of simple type
String containedType =
CUtils.getclass4qname (qname);
writer.
write ("\tm_pCall->addBasicArrayParameter(");
writer.write ("(Axis_Array*)(&Value" + i + "), " +
CUtils.
getXSDTypeForBasicType
(containedType) +
", cPrefixAndParamName" + i);
}
else
{
if (arrayType.isSimpleType ())
{
// Simple type in the schema
String containedType =
CUtils.getclass4qname (arrayType.
getBaseType ());
writer.
write
("\tm_pCall->addBasicArrayParameter(");
writer.write ("(Axis_Array*)(&Value" + i +
"), " +
CUtils.
getXSDTypeForBasicType
(containedType) +
", cPrefixAndParamName" + i);
}
else
{
// Array of complex type
String containedType = qname.getLocalPart ();
writer.
write
("\tm_pCall->addCmplxArrayParameter(");
writer.write ("(Axis_Array*)(&Value" + i +
"), (void*)Axis_Serialize_" +
containedType +
", (void*)Axis_Delete_" +
containedType +
", (void*) Axis_GetSize_" +
containedType + ", \"" +
parameterName + "\"" + ", ");
if (namespace.length () == 0)
{
writer.write ("NULL");
}
else
{
writer.write ("Axis_URI_"
+ containedType);
}
}
}
}
else
{
if (CUtils.isSimpleType (paraTypeName))
{
// Simple Type
if (param.isNillable ()
|| paraTypeName.equals ("xsd__string")
|| paraTypeName.equals ("xsd__anyURI")
|| paraTypeName.equals ("xsd__QName")
|| paraTypeName.equals ("xsd__notation"))
{
writer.write ("\tm_pCall->addParameter(");
writer.write ("(void*)Value"
+ i
+ ", cPrefixAndParamName"
+ i
+ ", "
+
CUtils.
getXSDTypeForBasicType
(paraTypeName));
}
else
{
writer.write ("\tm_pCall->addParameter(");
writer.write ("(void*)&Value"
+ i
+ ", cPrefixAndParamName"
+ i
+ ", "
+
CUtils.
getXSDTypeForBasicType
(paraTypeName));
}
}
else
{
// Complex Type
writer.write ("\tm_pCall->addCmplxParameter(");
writer.write ("Value"
+ i
+ ", (void*)Axis_Serialize_"
+ paraTypeName
+ ", (void*)Axis_Delete_"
+ paraTypeName
+ ", cPrefixAndParamName"
+ i + ", Axis_URI_" + paraTypeName);
}
}
}
// Adrian - end of namespace correction
writer.write (");\n");
}
}
writer.write ("\tif (AXIS_SUCCESS == m_pCall->invoke())\n\t{\n");
if (minfo.getOutputMessage () != null)
{
writer.write ("\t\tif(AXIS_SUCCESS == m_pCall->checkMessage(\""
+ minfo.getOutputMessage ().getLocalPart ()
+ "\", \""
+ minfo.getOutputMessage ().getNamespaceURI ()
+ "\"))\n\t\t{\n");
}
if (isAllTreatedAsOutParams)
{
String currentParamName;
String currentParaType;
for (int i = 0; i < paramsC.size (); i++)
{
ParameterInfo currentType = (ParameterInfo) paramsC.get (i);
type =
wscontext.getTypemap ().getType (currentType.
getSchemaName ());
if (type != null)
{
if (type.isSimpleType ())
{
currentParaType =
CUtils.getclass4qname (type.getBaseType ());
}
else
{
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)
{
Type arrayType = WrapperUtils.getArrayType (type);
QName qname = arrayType.getName ();
String containedType = null;
if (CUtils.isSimpleType (qname))
{
containedType = CUtils.getclass4qname (qname);
writer.write ("\t\t\t"
+ currentParamName
+ " = ("
+ currentParaType
+ "&)m_pCall->getBasicArray("
+
CUtils.
getXSDTypeForBasicType (containedType) +
", \"" +
currentType.getElementName ().
getLocalPart () + "\", 0);\n");
}
else
{
if (arrayType.isSimpleType ())
{ //SimpleType in the schema
containedType =
CUtils.getclass4qname (arrayType.
getBaseType ());
writer.write ("\t\t\t" + currentParamName +
" = (" + currentParaType +
"&)m_pCall->getBasicArray(" +
CUtils.
getXSDTypeForBasicType
(containedType) + ", \"" +
currentType.getElementName ().
getLocalPart () + "\", 0);\n");
}
else
{
containedType = qname.getLocalPart ();
writer.
write
("\t\t\tAxis_Array arr2 =
m_pCall->getCmplxArray((void*) Axis_DeSerialize_"
+ containedType);
//writer.write(", (void*)
Axis_Create_"+containedType+", (void*) Axis_Delete_"+containedType+", (void*)
Axis_GetSize_"+containedType+",
\""+currentType.getElementName().getLocalPart()+"\",
Axis_URI_"+containedType+");\n");
writer.write (", (void*) Axis_Create_"
+ containedType
+ ", (void*) Axis_Delete_"
+ containedType
+ ", (void*) Axis_GetSize_"
+ containedType
+ ", \""
+
currentType.
getElementNameAsString () +
"\", Axis_URI_" + containedType +
");\n\t\t\t" + currentParamName +
" = (" + currentParaType +
"&)arr2;\n");
}
}
}
else
{
if (typeissimple)
{
writer.write ("\t\t\t"
+ currentParamName
+ " = m_pCall->"
+
CUtils.
getParameterGetValueMethodName
(currentParaType,
false) + "(\"" +
currentType.getParamName () +
"\", 0);\n");
}
else
{
if (currentType.isAnyType ())
{
//for anyTtype
writer.write ("\t\t\t"
+ currentParamName
+ " = ("
+ currentParaType
+ "*)m_pCall->getAnyObject();\n");
}
else
{
//writer.write("\t\t\t" + currentParamName + " =
("+currentParaType+"*)m_pCall->getCmplxObject((void*)
Axis_DeSerialize_"+currentParaType+", (void*) Axis_Create_"+currentParaType+",
(void*)
Axis_Delete_"+currentParaType+",\""+currentType.getElementName().getLocalPart()+"\",
0);\n");
//Samisa 22/08/2004
writer.write ("\t\t\t"
+ currentParamName
+ " = ("
+ currentParaType
+
"*)m_pCall->getCmplxObject((void*)
Axis_DeSerialize_"
+ currentParaType +
", (void*) Axis_Create_" +
currentParaType +
", (void*) Axis_Delete_" +
currentParaType + ",\"" +
currentType.
getElementNameAsString () +
"\", 0);\n");
//Samisa
}
}
}
}
writer.write ("\t\t}\n");
writer.write ("\t}\n");
writer.write ("\tm_pCall->unInitialize();\n");
}
else
{
if (returntype == null)
{
if (minfo.getOutputMessage () != null)
{
writer.write ("\t\t\t/*not successful*/\n\t\t}\n");
}
writer.write ("\t}\n");
writer.write ("\tm_pCall->unInitialize();\n");
//writer.write("\t}\n\tm_pCall->unInitialize();\n");
}
else
{
if (returntypeisarray)
{
QName qname =
WrapperUtils.getArrayType (retType).getName ();
String containedType = null;
if (CUtils.isSimpleType (qname))
{
containedType = CUtils.getclass4qname (qname);
writer.write ("\tRetArray = ("
+ outparamType
+ "&)m_pCall->getBasicArray("
+
CUtils.
getXSDTypeForBasicType (containedType) +
", \"" +
returntype.getElementName ().
getLocalPart () + "\", 0);\n\t\t}\n");
}
else
{
containedType = qname.getLocalPart ();
writer.
write
("\tAxis_Array arr2 =
m_pCall->getCmplxArray((void*) Axis_DeSerialize_"
+ containedType);
//writer.write(", (void*)
Axis_Create_"+containedType+", (void*) Axis_Delete_"+containedType+", (void*)
Axis_GetSize_"+containedType+",
\""+returntype.getElementName().getLocalPart()+"\",
Axis_URI_"+containedType+");\n\t\t}\n");
writer.write (", (void*) Axis_Create_"
+ containedType
+ ", (void*) Axis_Delete_"
+ containedType
+ ", (void*) Axis_GetSize_"
+ containedType
+ ", \""
+ returntype.getElementNameAsString ()
+ "\", Axis_URI_"
+ containedType
+ ");\n\t\t\tRetArray = ("
+ outparamType + "&)arr2;\n\t\t}\n");
}
writer.write ("\t}\n");
writer.write ("\tm_pCall->unInitialize();\n");
// writer.write("\t}\n\tm_pCall->unInitialize();\n");
writer.write ("\treturn RetArray;\n");
}
else
{
if (returntypeissimple)
{
if (returntype.isNillable ())
{
writer.write ("\t\t\tRet = m_pCall->"
+
CUtils.
getParameterGetValueMethodName
(outparamType,
false) + "(\"" +
returntype.getParamName () +
"\", 0);\n\t\t}\n");
}
else
{
if (outparamType.equals ("xsd__string")
|| outparamType.equals ("xsd__anyURI")
|| outparamType.equals ("xsd__QName")
|| outparamType.equals ("xsd__notation"))
{
writer.write ("\t\t\t" + outparamType +
" pReturn = m_pCall->" +
CUtils.
getParameterGetValueMethodName
(outparamType,
false) + "(\"" +
returntype.getParamName () +
"\", 0);\n");
writer.write ("\t\t\tif(pReturn)\n");
writer.write ("\t\t\t\tRet = pReturn;\n");
}
else
{
writer.write ("\t\t\t" + outparamType +
" * pReturn = m_pCall->" +
CUtils.
getParameterGetValueMethodName
(outparamType,
false) + "(\"" +
returntype.getParamName () +
"\", 0);\n");
writer.write ("\t\t\tif(pReturn)\n");
writer.write ("\t\t\t\tRet = *pReturn;\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\");");
writer.write ("\t\t}\n");
}
writer.write ("\t}\n");
writer.write ("\tm_pCall->unInitialize();\n");
//
writer.write("\t}\n\tm_pCall->unInitialize();\n");
writer.write ("\treturn Ret;\n");
}
else
{
if (returntype.isAnyType ())
{
//for anyTtype
writer.write ("\t\t\tpReturn = ("
+ outparamType
+
"*)m_pCall->getAnyObject();\n\t\t}\n");
writer.write ("\t}\n");
writer.write ("\tm_pCall->unInitialize();\n");
//
writer.write("\t}\n\tm_pCall->unInitialize();\n");
writer.write ("\treturn pReturn;\n");
}
else
{
//writer.write("\t\t\tpReturn =
("+outparamType+"*)m_pCall->getCmplxObject((void*)
Axis_DeSerialize_"+outparamType+", (void*) Axis_Create_"+outparamType+",
(void*)
Axis_Delete_"+outparamType+",\""+returntype.getElementName().getLocalPart()+"\",
0);\n\t\t}\n");
//Samisa 22/08/2004
writer.write ("\t\t\tpReturn = ("
+ outparamType
+
"*)m_pCall->getCmplxObject((void*)
Axis_DeSerialize_"
+ outparamType +
", (void*) Axis_Create_" +
outparamType +
", (void*) Axis_Delete_" +
outparamType + ",\"" +
returntype.
getElementNameAsString () +
"\", 0);\n\t\t}\n");
//Samisa
writer.write ("\t}\n");
writer.write ("\tm_pCall->unInitialize();\n");
//
writer.write("\t}\n\tm_pCall->unInitialize();\n");
writer.write ("\treturn pReturn;\n");
}
}
}
}
}
//added by nithya
writer.write ("\t}\n");
writer.write ("\tcatch(AxisException& e)\n\t{\n");
writer.write ("\t\tint iExceptionCode = e.getExceptionCode();\n");
writer.
write
("\t\tif(AXISC_NODE_VALUE_MISMATCH_EXCEPTION != iExceptionCode)\n");
writer.write ("\t\t{\n");
writer.write ("\t\t\tthrow;\n");
writer.write ("\t\t}\n");
writer.write ("\t\tISoapFault* pSoapFault = (ISoapFault*)\n");
writer.write ("\t\t\tm_pCall->checkFault(\"Fault\",\""
+ wscontext.getWrapInfo ().getTargetEndpointURI ()
+ "\" );\n");
writer.write ("\t\tif(pSoapFault)\n");
writer.write ("\t\t{\n");
//to get fault info
Iterator paramsFault = minfo.getFaultType ().iterator ();
String faultInfoName = null;
String faultType = null;
String langName = null;
String paramName = null;
boolean flag = false;
int j = 0;
if (!paramsFault.hasNext ())
{
writer.
write
("\t\t\t\tconst char *detail =
pSoapFault->getSimpleFaultDetail();\n");
writer.write ("\t\t\t\tbool deleteDetail=false;\n");
writer.write ("\t\t\t\tif (NULL==detail || 0==strlen(detail))\n");
writer.write ("\t\t\t\t{\n");
writer.
write ("\t\t\t\t\tdetail=m_pCall->getFaultAsXMLString();\n");
writer.write ("\t\t\t\t\tif (NULL==detail)\n");
writer.write ("\t\t\t\t\t\tdetail=\"\";\n");
writer.write ("\t\t\t\t\telse\n");
writer.write ("\t\t\t\t\t\tdeleteDetail=true;\n");
writer.write ("\t\t\t\t}\n");
writer.
write
("\t\t\t\tOtherFaultException
ofe(pSoapFault->getFaultcode(),\n");
writer.
write
("\t\t\t\t\tpSoapFault->getFaultstring(),
pSoapFault->getFaultactor(),\n");
writer.write ("\t\t\t\t\tdetail, iExceptionCode);\n");
writer.write ("\t\t\t\tif (deleteDetail && NULL!=detail)\n");
writer.write ("\t\t\t\t\tdelete [] const_cast<char*>(detail);\n");
writer.write ("\t\t\t\tm_pCall->unInitialize();\n");
writer.write ("\t\t\t\tthrow ofe;\n");
}
else
{
flag = true;
writer.
write
("\t\t\tpcCmplxFaultName =
pSoapFault->getCmplxFaultObjectName();\n");
}
while (paramsFault.hasNext ())
{
j = j + 1;
FaultInfo info = (FaultInfo) paramsFault.next ();
faultInfoName = info.getFaultInfo ();
// FJP - D0004 > 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 ();
boolean found = false;
while (infoArrayListIterator.hasNext () && !found)
{
ParameterInfo paramInfo =
(ParameterInfo) infoArrayListIterator.next ();
if (paramInfo != null)
{
if ("error".equals (paramInfo.getParamName ()))
{
faultInfoName =
paramInfo.getElementName ().getLocalPart ();
found = true;
}
}
}
// FJP - D0004 <
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 =
WrapperUtils.
getClassNameFromParamInfoConsideringArrays (par,
wscontext);
if (j > 1)
{
writer.write ("\t\t\telse if");
writeExceptions (faultType,
faultInfoName, paramName, langName);
}
else
{
writer.write ("\t\t\tif");
writeExceptions (faultType,
faultInfoName, paramName, langName);
}
}
}
if (flag == true)
{
writer.write ("\t\t\telse\n");
writer.write ("\t\t\t{\n");
writer.
write
("\t\t\t\tconst char *detail =
pSoapFault->getSimpleFaultDetail();\n");
writer.write ("\t\t\t\tbool deleteDetail=false;\n");
writer.write ("\t\t\t\tif (NULL==detail || 0==strlen(detail))\n");
writer.write ("\t\t\t\t{\n");
writer.
write ("\t\t\t\t\tdetail=m_pCall->getFaultAsXMLString();\n");
writer.write ("\t\t\t\t\tif (NULL==detail)\n");
writer.write ("\t\t\t\t\t\tdetail=\"\";\n");
writer.write ("\t\t\t\t\telse\n");
writer.write ("\t\t\t\t\t\tdeleteDetail=true;\n");
writer.write ("\t\t\t\t}\n");
writer.
write
("\t\t\t\tOtherFaultException
ofe(pSoapFault->getFaultcode(),\n");
writer.
write
("\t\t\t\t\tpSoapFault->getFaultstring(),
pSoapFault->getFaultactor(),\n");
writer.write ("\t\t\t\t\tdetail, iExceptionCode);\n");
writer.write ("\t\t\t\tif (deleteDetail && NULL!=detail)\n");
writer.write ("\t\t\t\t\tdelete [] const_cast<char*>(detail);\n");
writer.write ("\t\t\t\tm_pCall->unInitialize();\n");
writer.write ("\t\t\t\tthrow ofe;\n");
writer.write ("\t\t\t}\n");
}
writer.write ("\t\t}\n");
writer.write ("\t\telse throw;\n");
writer.write ("\t}\n");
writer.write ("}\n");
}
private void writeExceptions (String faulttype,
String faultInfoName,
String paramName,
String langName) throws WrapperFault
{
try
{
writer.write ("(0 == strcmp(\"" + faultInfoName +
"\", pcCmplxFaultName))\n");
writer.write ("\t\t\t{\n");
writer.write ("\t\t\t\t" + faulttype + " pFaultDetail = \n");
writer.write ("\t\t\t\t\t(" + faulttype +
")pSoapFault->getCmplxFaultObject(\n");
writer.write ("\t\t\t\t\t\t(void*) Axis_DeSerialize_" + langName +
",\n");
writer.write ("\t\t\t\t\t\t(void*) Axis_Create_" + langName +
",\n");
writer.write ("\t\t\t\t\t\t(void*) Axis_Delete_" + langName +
",\n");
writer.write ("\t\t\t\t\t\t\"" + faultInfoName + "\",\n");
writer.write ("\t\t\t\t\t\t0);\n\n");
writer.
write
("\t\t\t\tpFaultDetail->setFaultCode(pSoapFault->getFaultcode());\n");
writer.
write
("\t\t\t\tpFaultDetail->setFaultString(pSoapFault->getFaultstring());\n");
writer.
write
("\t\t\t\tpFaultDetail->setFaultActor(pSoapFault->getFaultactor());\n");
writer.
write
("\t\t\t\tpFaultDetail->setExceptionCode(e.getExceptionCode());\n");
writer.write ("\t\t\t\tm_pCall->unInitialize();\n");
writer.write ("\t\t\t\tthrow *pFaultDetail;\n");
writer.write ("\t\t\t}\n");
}
catch (IOException e)
{
throw new WrapperFault (e);
}
}
/* (non-Javadoc)
* @see org.apache.axis.wsdl.wsdl2ws.cpp.CPPClassWriter#writeGlobalCodes()
*/
protected void writeGlobalCodes () throws WrapperFault
{
Iterator types = wscontext.getTypemap ().getTypes ().iterator ();
HashSet typeSet = new HashSet ();
String typeName;
Type type;
try
{
while (types.hasNext ())
{
type = (Type) types.next ();
if (type.isSimpleType ())
{
continue;
}
if (type.isArray ())
{
continue;
}
typeName = type.getLanguageSpecificName ();
if (typeName.startsWith (">"))
{
continue;
}
typeSet.add (typeName);
}
Iterator itr = typeSet.iterator ();
while (itr.hasNext ())
{
typeName = itr.next ().toString ();
writer.write ("extern int Axis_DeSerialize_"
+ typeName
+ "("
+ typeName
+ "* param, IWrapperSoapDeSerializer* pDZ);\n");
writer.write ("extern void* Axis_Create_"
+ typeName
+ "("
+ typeName
+
" *Obj, bool bArray = false, int nSize=0);\n");
writer.write ("extern void Axis_Delete_" + typeName + "(" +
typeName +
"* param, bool bArray = false, int nSize=0);\n");
writer.write ("extern int Axis_Serialize_" + typeName + "(" +
typeName +
"* param, IWrapperSoapSerializer* pSZ, bool
bArray = false);\n");
writer.write ("extern int Axis_GetSize_" + typeName +
"();\n\n");
}
}
catch (IOException e)
{
throw new WrapperFault (e);
}
}
}