blob: 89b3314fb5008204bfd0a81572a1a23044ed0e5b [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.
*/
/**
* @author Srinath Perera(hemapani@openource.lk)
* @author Susantha Kumara(susantha@opensource.lk, skumara@virtusa.com)
*/
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* 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.Iterator;
import javax.xml.namespace.QName;
import org.apache.axis.wsdl.wsdl2ws.WSDL2Ws;
import org.apache.axis.wsdl.wsdl2ws.CUtils;
import org.apache.axis.wsdl.wsdl2ws.WrapperFault;
import org.apache.axis.wsdl.wsdl2ws.info.Type;
import org.apache.axis.wsdl.wsdl2ws.info.WebServiceContext;
/**
* Genarate a webservice for the complex types likes structs.
*
* @author hemapani
*/
public class BeanParamWriter extends ParamCPPFileWriter
{
boolean infoMessageIssued = false;
public BeanParamWriter(WebServiceContext wscontext, Type type)
throws WrapperFault
{
super(wscontext, type);
}
/*
* (non-Javadoc)
*
* @see org.apache.axis.wsdl.wsdl2ws.cpp.ParamCPPFileWriter#writeGlobalCodes()
*/
protected void writeGlobalCodes() throws WrapperFault
{
try
{
writeGetSetMethods();
writeSerializeGlobalMethod();
writeDeSerializeGlobalMethod();
writeCreateGlobalMethod();
writeDeleteGlobalMethod();
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
/**
* Dushshantha: following method writes getters and setters for the
* attributes
*/
private void writeGetSetMethods() throws WrapperFault
{
if (type.isArray())
return;
try
{
int anyCounter = 0;
for (int i = 0; i < attribs.length; i++)
{
// Set method name
String methodName = attribs[i].getMethodName();
// Set parameter name
String parameterName = attribs[i].getParamNameAsMember();
// Set the type to use
String properParamType = getCorrectParmNameConsideringArraysAndComplexTypes(attribs[i]);
String type = attribs[i].getTypeName();
// arrays require '*' in prototype for type if one not specified.
String asterisk = " ";
// Details
if (attribs[i].isArray())
{
// Ensure that type on prototype is a pointer to an array
if (!properParamType.endsWith("*"))
asterisk += "* ";
}
else if (attribs[i].getType().isAnyElement())
{
// We use a counter appended to parameter name.
anyCounter += 1;
parameterName = parameterName + Integer.toString(anyCounter);
methodName = methodName + Integer.toString(anyCounter);
}
properParamType = CUtils.sanitizeStringWithSplats(properParamType);
type = CUtils.sanitizeString(type);
//=============================================================================
// Write getter method
//=============================================================================
CUtils.printMethodComment(c_writer, "Getter method for class member field "
+ parameterName + ".");
c_writer.write(properParamType + asterisk + c_classname + "::\nget" + methodName + "()\n{\n");
c_writer.write("\t" + "return " + parameterName + "; \n}\n");
//=============================================================================
// Write setter method
//=============================================================================
CUtils.printMethodComment(c_writer, "Setter method for class member field "
+ parameterName + ".");
// TODO setter leaks memory if setting complex type!
if (attribs[i].isArray())
{
c_writer.write("void " + c_classname + "::\nset"
+ methodName + "(" + properParamType + asterisk + "pInValue)\n{\n");
if (attribs[i].getChoiceElement())
{
c_writer.write("\t// For 'choice' you need to ensure that any\n");
c_writer.write("\t// other objects belonging to this union of elements are empty.\n");
}
c_writer.write("\tif(" + parameterName + " == NULL)\n");
c_writer.write("\t\t" + parameterName + " = new " + properParamType + "();\n");
c_writer.write("\t" + parameterName + "->clone( *pInValue);\n");
c_writer.write("}\n");
}
else if (isElementNillable(i) || isElementOptional(i))
{
// Setter method
c_writer.write("void " + c_classname + "::\nset"
+ methodName + "(" + properParamType
+ " pInValue, bool deep, bool makeCopy)\n{\n");
if (attribs[i].getChoiceElement())
{
c_writer.write("\t// For 'choice' you need to ensure that any\n");
c_writer.write("\t// other objects belonging to this union of elements are NULL.\n");
}
c_writer.write("\tif (__axis_deepcopy_" + parameterName + ")\n");
c_writer.write("\t\tdelete " + parameterName + ";\n");
c_writer.write("\t" + parameterName + " = NULL;\n");
c_writer.write("\tif (pInValue != NULL)\n");
c_writer.write("\t{\n");
c_writer.write("\t\tif (deep && makeCopy)\n");
c_writer.write("\t\t{\n");
c_writer.write("\t\t\t" + parameterName + " = new " + type + "();\n");
c_writer.write("\t\t\t*" + parameterName + " = *pInValue;\n");
c_writer.write("\t\t}\n");
c_writer.write("\t\telse\n");
c_writer.write("\t\t\t" + parameterName + " = pInValue;\n");
c_writer.write("\t}\n");
c_writer.write("\t__axis_deepcopy_" + parameterName + " = deep;\n");
c_writer.write("}\n");
}
else
{
c_writer.write("void " + c_classname + "::\nset"
+ methodName + "(" + properParamType + " InValue");
Type attributeType = attribs[i].getType();
boolean isPointerType = false;
if (attributeType.isSimpleType())
isPointerType = CUtils.isPointerType(CUtils.getSimpleType(attributeType.getBaseType()));
else
isPointerType = CUtils.isPointerType(getCorrectParmNameConsideringArraysAndComplexTypes(attribs[i]));
if((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
&& (isPointerType || attribs[i].getAllElement() || attribs[i].getChoiceElement()))
c_writer.write(", bool deep, bool makeCopy");
c_writer.write(")\n{\n");
if (attribs[i].getChoiceElement())
{
c_writer.write("\t// For 'choice' you need to ensure that any\n");
c_writer.write("\t// other objects belonging to this union of elements are NULL.\n");
}
if(isPointerType)
{
c_writer.write("\tif (__axis_deepcopy_" + parameterName + ")\n");
c_writer.write("\t\tdelete [] " + parameterName + ";\n");
c_writer.write("\t" + parameterName + " = NULL;\n");
c_writer.write("\tif(InValue != NULL)\n");
c_writer.write("\t{\n");
c_writer.write("\t\tif (deep && makeCopy)\n");
c_writer.write("\t\t{\n");
c_writer.write("\t\t\t" + parameterName + " = new char[strlen(InValue) + 1];\n");
c_writer.write("\t\t\tstrcpy(" + parameterName + ", InValue);\n");
c_writer.write("\t\t}\n");
c_writer.write("\t\telse\n");
c_writer.write("\t\t\t" + parameterName + " = InValue;\n");
c_writer.write("\t}\n");
c_writer.write("\t__axis_deepcopy_" + parameterName + " = deep;\n");
}
else if ((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
&& (attribs[i].getAllElement() || attribs[i].getChoiceElement()))
{
c_writer.write("\tif (__axis_deepcopy_" + parameterName + ")\n");
c_writer.write("\t\tdelete " + parameterName + ";\n");
c_writer.write("\t" + parameterName + " = NULL;\n");
c_writer.write("\tif (InValue != NULL)\n");
c_writer.write("\t{\n");
c_writer.write("\t\tif (deep && makeCopy)\n");
c_writer.write("\t\t{\n");
c_writer.write("\t\t\t" + parameterName + " = new " + type + "();\n");
c_writer.write("\t\t\t*" + parameterName + " = *InValue;\n");
c_writer.write("\t\t}\n");
c_writer.write("\t\telse\n");
c_writer.write("\t\t\t" + parameterName + " = InValue;\n");
c_writer.write("\t}\n");
c_writer.write("\t__axis_deepcopy_" + parameterName + " = deep;\n");
}
else
c_writer.write("\t" + parameterName + " = InValue ; \n");
c_writer.write("}\n");
}
} // for loop
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
private void writeSerializeExtensionCode() throws IOException, WrapperFault
{
// TODO: xsd:extension not fully or correctly supported.
if (extensionBaseAttrib != null)
{
CUtils.printBlockComment(c_writer, "Serialize extension.");
String typeName = extensionBaseAttrib.getTypeName();
if (extensionBaseAttrib.isSimpleType())
{
c_writer.write("\tpSZ->serializeAsChardata((void*)");
if (!CUtils.isPointerType(typeName))
c_writer.write("&");
c_writer.write("(param->" + extensionBaseAttrib.getParamNameAsMember() + "), "
+ CUtils.getXSDEnumeratorForType(typeName) + ");\n");
}
else
{
// TODO
throw new WrapperFault("Error : Complex content extensions is not supported. ");
}
}
else if (attribs.length == 0)
{
if (!infoMessageIssued && WSDL2Ws.c_verbose)
{
infoMessageIssued = true;
System.out.println("INFO: Class " + c_classname + " has no attributes or elements.");
}
}
}
private void writeSerializeGlobalMethod() throws IOException, WrapperFault
{
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* 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 */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
CUtils.printMethodComment(c_writer, "Function to serialize an object of type "
+ c_classname + ".");
c_writer.write( "int Axis_Serialize_" + c_classname
+ "( " + c_classname + "* param, IWrapperSoapSerializer* pSZ, bool bArray)\n");
c_writer.write( "{\n");
//=============================================================================
// No attributes or elements to serialize? Then serialize extension and return.
//=============================================================================
if (attribs.length == 0)
{
CUtils.printBlockComment(c_writer, "No attributes or elements to serialize.");
c_writer.write("\tpSZ->serialize(\">\", NULL);\n");
writeSerializeExtensionCode();
c_writer.write("\treturn AXIS_SUCCESS;\n");
c_writer.write("}\n");
return;
}
//=============================================================================
// NULL param passed in? Assume nillable although type does not know whether
// it is used as a nillable parameter so this may not be the appropriate place
// to put this, or we need to find a way to determine if nillable.
//=============================================================================
CUtils.printBlockComment(c_writer, "If null input, serialize as nil element.");
c_writer.write("\tif ( param == NULL )\n\t{\n");
c_writer.write("\t\tpSZ->serializeAsAttribute( \"xsi:nil\", 0, (void*)&(xsd_boolean_true), XSD_BOOLEAN);\n");
c_writer.write("\t\tpSZ->serialize( \">\", NULL);\n");
c_writer.write("\t\treturn AXIS_SUCCESS;\n");
c_writer.write("\t}\n");
//=============================================================================
// This is the only real difference for the serializer between rpc/encoded and
// doc/literal objects
//=============================================================================
if (wscontext.getWrapperInfo().getBindingStyle().equals("rpc"))
writeRPCArrayPortionOfSerializeGlobalMethod();
else
writeDOCArrayPortionOfSerializeGlobalMethod();
//=============================================================================
// Serialize attributes, if any
//=============================================================================
if (attributeParamCount > 0)
CUtils.printBlockComment(c_writer, "Serialize attributes.");
for (int i = 0; i < attributeParamCount; i++)
{
if (attribs[i].isArray() || !(attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()))
throw new WrapperFault("Error : an attribute is not basic type");
String soapTagName = attribs[i].getParamNameAsSOAPString();
Type attrType = attribs[i].getType();
String basicType = null;
if (!attribs[i].isSimpleType() && attrType.isSimpleType())
basicType = CUtils.getSimpleType(attrType.getBaseType());
else
basicType = attribs[i].getTypeName();
if (CUtils.isPointerType(basicType) || attribs[i].isOptional())
{
// TODO: Add check if ptr type and not optional and is null, throw exception.
c_writer.write("\tif (0 != param->" + attribs[i].getParamNameAsMember() + ")\n\t");
c_writer.write("\tpSZ->serializeAsAttribute(\""
+ soapTagName + "\", 0, (void*)(param->"
+ attribs[i].getParamNameAsMember() + "), "
+ CUtils.getXSDEnumeratorForType(basicType) + ");\n");
}
else
{
c_writer.write("\tpSZ->serializeAsAttribute(\""
+ soapTagName + "\", 0, (void*)&(param->"
+ attribs[i].getParamNameAsMember() + "), "
+ CUtils.getXSDEnumeratorForType(attribs[i].getTypeName()) + ");\n");
}
}
//=============================================================================
// Serialization relating to faults
//=============================================================================
if (type.isFault())
{
c_writer.write("\tif(Axis_URI_" + c_classname + ")\n\t{\n");
c_writer.write("\t\tbool blnIsNewPrefix = false;\n");
c_writer.write("\t\tconst AxisChar* sPrefix = pSZ->getNamespacePrefix(Axis_URI_"
+ c_classname + ", blnIsNewPrefix);\n");
c_writer.write("\t\tpSZ->serialize(\" xmlns:\", sPrefix, \"=\\\"\",");
c_writer.write("Axis_URI_" + c_classname + ", \" " + " \\\"\"");
c_writer.write(", NULL);\n\t}\n");
}
if (wscontext.getWrapperInfo().getBindingStyle().equals("document"))
c_writer.write("\tpSZ->serialize( \">\", 0);\n");
//=============================================================================
// Serialize extension, if any
//=============================================================================
writeSerializeExtensionCode();
//=============================================================================
// Serialize elements, if any
//=============================================================================
if (attributeParamCount < attribs.length)
CUtils.printBlockComment(c_writer, "Serialize sub-elements.");
boolean firstIfWritten = false;
int anyCounter = 0; //counter for any types.
String arrayType;
for (int i = attributeParamCount; i < attribs.length; i++)
{
String namespace = "NULL";
if (attribs[i].getNsQualified())
{
namespace = "Axis_URI_" + c_classname;
// Elements can reference other elements in different schema...need to handle.
QName elementName = attribs[i].getElementName();
if (elementName != null)
namespace = "\"" + elementName.getNamespaceURI() + "\"";
}
// if the attribute is a choice following should do
boolean ifCheckPrinted = false;
if (attribs[i].getChoiceElement())
{
if (!firstIfWritten)
{
c_writer.write("\tif");
firstIfWritten = true;
}
else
c_writer.write("\telse if");
ifCheckPrinted = true;
c_writer.write("(param->" + attribs[i].getParamNameAsMember() + ")\n\t{\n\t");
}
else
firstIfWritten = false;
//if the attribute is a 'all' following should do
if (attribs[i].getAllElement())
if (attribs[i].getMinOccurs() == 0)
{
ifCheckPrinted = true;
c_writer.write("\tif(param->" + attribs[i].getParamNameAsMember() + ")\n\t{\n\t");
}
if (attribs[i].isAnyElement())
{
anyCounter += 1;
String fieldName = "any" + Integer.toString(anyCounter);
if (!ifCheckPrinted && attribs[i].isOptional())
c_writer.write("\tif (param->" + fieldName + " != NULL)\n");
c_writer.write("\t\tpSZ->serializeAnyObject(param->" + fieldName +");\n");
}
else if (attribs[i].isArray())
{
if (attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
{
String baseTypeName = null;
if (!attribs[i].isSimpleType() && attribs[i].getType().isSimpleType())
baseTypeName = CUtils.getSimpleType(attribs[i].getType().getBaseType());
else
baseTypeName = attribs[i].getTypeName();
c_writer.write("\tpSZ->serializeBasicArray(param->" + attribs[i].getParamNameAsMember()
+ ", " + namespace + ","
+ CUtils.getXSDEnumeratorForType(baseTypeName) + ", \""
+ attribs[i].getParamNameAsSOAPString() + "\");\n");
}
else
{
arrayType = attribs[i].getTypeName();
c_writer.write("\tpSZ->serializeCmplxArray(param->" + attribs[i].getParamNameAsMember()
+ ", (void*)Axis_Serialize_" + arrayType
+ ", (void*)Axis_Delete_" + arrayType
+ ", \"" + attribs[i].getElementNameAsSOAPString() + "\", " + namespace + ");\n");
}
}
else if (attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
{
String typeName = attribs[i].getTypeName();
String baseTypeName = null;
if (attribs[i].getType().isSimpleType())
baseTypeName = CUtils.getSimpleType (attribs[i].getType().getBaseType ());
else
baseTypeName = typeName;
if (!ifCheckPrinted && attribs[i].isOptional())
c_writer.write("\tif (param->" + attribs[i].getParamNameAsMember() + " != NULL)\n\t");
// If the simple type is a choice it is handled
// as a pointer variable. This is the same in 'all' element and nillable elements.
String ampersand = "&";
if (CUtils.isPointerType(baseTypeName)
|| attribs[i].getChoiceElement()
|| attribs[i].getAllElement()
|| isElementNillable(i) || isElementOptional(i))
ampersand = "";
c_writer.write("\tpSZ->serializeAsElement(\""
+ attribs[i].getElementNameAsSOAPString() + "\", " + namespace
+ ", (void*)" + ampersand + "(param->" + attribs[i].getParamNameAsMember() + "), "
+ CUtils.getXSDEnumeratorForType(baseTypeName) + ");\n");
}
else
{
//if complex type
String tab = "";
if (ifCheckPrinted)
tab = "\t";
else if (attribs[i].isOptional())
{
tab = "\t";
c_writer.write("\tif (param->" + attribs[i].getParamNameAsMember() + " != NULL)\n\t{\n\t");
}
String elm = attribs[i].getParamNameAsSOAPString();
if (attribs[i].isReference())
elm = attribs[i].getTypeName();
if (attribs[i].getNsQualified())
{
namespace = type.getName().getNamespaceURI();
QName elementName = attribs[i].getElementName();
if (elementName != null)
namespace = elementName.getNamespaceURI();
c_writer.write("\tsPrefix = pSZ->getNamespacePrefix(\"" + namespace + "\", blnIsNewSubElemPrefix);\n");
c_writer.write(tab + "\tpSZ->serialize(\"<\", sPrefix, \":\", \"" + elm + "\", 0);\n");
c_writer.write(tab + "\tif (blnIsNewSubElemPrefix)\n");
c_writer.write(tab + "\t\tpSZ->serialize(\" xmlns:\", sPrefix, \"=\\\"\", \"" + namespace + "\", \"\\\"\", 0);\n");
c_writer.write(tab + "\tAxis_Serialize_" + attribs[i].getTypeName() + "(param->" + attribs[i].getParamNameAsMember() + ", pSZ);\n");
c_writer.write(tab + "\tpSZ->serialize(\"</\", sPrefix, \":\", \"" + elm + "\", \">\", 0);\n");
c_writer.write(tab + "\tif (blnIsNewSubElemPrefix)\n");
c_writer.write(tab + "\t\tpSZ->removeNamespacePrefix(\"" + namespace + "\");\n");
}
else
{
c_writer.write("\tpSZ->serialize(\"<" + elm + "\", 0);\n");
c_writer.write(tab + "\tAxis_Serialize_" + attribs[i].getTypeName()
+ "(param->" + attribs[i].getParamNameAsMember() + ", pSZ);\n");
c_writer.write(tab + "\tpSZ->serialize(\"</" + elm + "\", \">\", 0);\n");
}
if (!ifCheckPrinted && attribs[i].isOptional())
c_writer.write("\t}\n");
}
//end if choice element
if (ifCheckPrinted)
c_writer.write("\t}\n");
}
//=============================================================================
// End of attribute and element serialization
//=============================================================================
if (wscontext.getWrapperInfo().getBindingStyle().equals("rpc"))
{
c_writer.write("\n\tpSZ->serialize(\"</\", Axis_TypeName_" + c_classname
+ ", \">\", NULL);\n");
}
CUtils.printBlockComment(c_writer, "Remove namespace, if new.");
c_writer.write("\tif (!bArray && blnIsNewPrefix)\n");
c_writer.write("\t\tpSZ->removeNamespacePrefix(Axis_URI_" + c_classname + ");\n");
c_writer.write("\n");
c_writer.write("\treturn AXIS_SUCCESS;\n");
c_writer.write("}\n");
}
/**
* @throws IOException
*/
private void writeDOCArrayPortionOfSerializeGlobalMethod() throws IOException
{
CUtils.printBlockComment(c_writer, "Serialize top-most element, possibly defining new namespace.");
// For doc/literal objects
c_writer.write("\tbool blnIsNewSubElemPrefix = false;\n");
c_writer.write("\tbool blnIsNewPrefix = false;\n");
c_writer.write("\tconst AxisChar* sPrefix;\n");
c_writer.write("\tif (!bArray)\n\t{\n");
c_writer.write("\t\tsPrefix = pSZ->getNamespacePrefix(Axis_URI_" + c_classname + ", blnIsNewPrefix);\n");
c_writer.write("\t\tif (blnIsNewPrefix)\n");
c_writer.write("\t\t\tpSZ->serialize(\" xmlns:\", sPrefix, \"=\\\"\", "
+ "Axis_URI_" + c_classname + ", \"\\\"\", NULL);\n");
c_writer.write( "\t}\n");
}
/**
* @throws IOException
*/
private void writeRPCArrayPortionOfSerializeGlobalMethod() throws IOException
{
// For rpc/encoded objects
c_writer.write("\tbool blnIsNewSubElemPrefix = false;\n");
c_writer.write("\tbool blnIsNewPrefix = false;\n");
c_writer.write("\tconst AxisChar* sPrefix;\n");
c_writer.write( "\tif( bArray)\n");
c_writer.write( "\t\tpSZ->serialize( \"<\", Axis_TypeName_" + c_classname + ", \">\", NULL);\n");
c_writer.write( "\telse\n");
c_writer.write( "\t{\n");
c_writer.write( "\t\tsPrefix = pSZ->getNamespacePrefix( Axis_URI_"
+ c_classname + ", blnIsNewPrefix);\n\n");
c_writer.write( "\t\t// If there are objects that require a local namespace, then define it here.\n");
c_writer.write( "\t\t// NB: This namespace will go out of scope when the closing tag is reached.\n");
c_writer.write( "\t\tif( !blnIsNewPrefix)\n");
c_writer.write( "\t\t\tpSZ->serialize( \"<\", Axis_TypeName_" + c_classname + ", "
+ "\" xsi:type=\\\"\", sPrefix, \":\", "
+ "Axis_TypeName_" + c_classname + ", \"\\\">\", NULL);\n");
c_writer.write( "\t\telse\n");
c_writer.write( "\t\t\tpSZ->serialize( \"<\", Axis_TypeName_" + c_classname + ", "
+ "\" xsi:type=\\\"\", sPrefix, \":\", "
+ "Axis_TypeName_" + c_classname + ", \"\\\" xmlns:\", "
+ "sPrefix, \"=\\\"\", Axis_URI_" + c_classname + ", \"\\\">\", NULL);\n");
c_writer.write( "\t}\n");
}
private void writeDeSerializeExtensionCode() throws IOException, WrapperFault
{
if (extensionBaseAttrib != null
&& extensionBaseAttrib.getTypeName() != null)
{
CUtils.printBlockComment(c_writer, "Deserialize extension.");
if (extensionBaseAttrib.isSimpleType())
{
c_writer.write("\tvoid* pCharDataAs;\n");
String typeName = extensionBaseAttrib.getTypeName();
String xsdType = CUtils.getXSDEnumeratorForType(typeName);
c_writer.write("\tpIWSDZ->getChardataAs(&pCharDataAs, " + xsdType + ");\n");
c_writer.write("\tparam->" + extensionBaseAttrib.getParamNameAsMember() + " = ");
if (CUtils.isPointerType(typeName))
c_writer.write("(" + CUtils.sanitizeString(typeName) + ") pCharDataAs;\n");
else
{
c_writer.write(" *(" + CUtils.sanitizeString(typeName) + "*) pCharDataAs;\n");
c_writer.write("\tAxis::AxisDelete( pCharDataAs, " + xsdType + ");\n");
}
}
else
{
// TODO
throw new WrapperFault("Error : Complex content extensions is not supported. ");
}
}
else if (attribs.length == 0)
{
if (!infoMessageIssued && WSDL2Ws.c_verbose)
{
infoMessageIssued = true;
System.out.println("INFO: Class " + c_classname + " has no attributes or elements.");
}
}
}
private void writeDeSerializeGlobalMethod() throws IOException, WrapperFault
{
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* 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 */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
CUtils.printMethodComment(c_writer, "Function to deserialize an object of type "
+ c_classname + ".");
c_writer.write("int Axis_DeSerialize_" + c_classname + "(" + c_classname
+ "* param, IWrapperSoapDeSerializer* pIWSDZ)\n{\n");
//=============================================================================
// No attributes or elements to deserialize? Then deserialize extension and return.
//=============================================================================
if (attribs.length == 0)
{
writeDeSerializeExtensionCode();
c_writer.write("\treturn AXIS_SUCCESS;\n");
c_writer.write("}\n");
return;
}
// Declare variables we use
c_writer.write("\tconst char* peekedElementName;\n");
//=============================================================================
// Deserialize attributes.
// Actually, attribute deserialization takes place in same loop as elements
// in order to avoid duplication. But here, we put out a comment block.
//=============================================================================
if (attributeParamCount > 0)
CUtils.printBlockComment(c_writer, "Deserialize attributes.");
//=============================================================================
// Deserialize attributes and elements.
//=============================================================================
String arrayType = null;
boolean firstIfWritten = false;
int anyCounter = 0; //counter for any types.
int arrayCount = 0;
boolean handleAll = false;
boolean handleChoice = false;
// Tabs to ensure code alignment
String tab1 = "\t";
String tab2 = "\t";
int startingGroup=0;
int endingGroup=0;
for (int i = 0; i < attribs.length; i++)
{
if (i == attributeParamCount)
CUtils.printBlockComment(c_writer, "Deserialize elements.");
// If All, then the element order is arbitrary, so we need a loop. For both
// 'choice' and 'all', we need to do a peek.
if (attribs[i].getChoiceElement() || attribs[i].getAllElement())
{
endingGroup = i;
if (!firstIfWritten)
{
startingGroup = i;
handleChoice = attribs[i].getChoiceElement();
handleAll = attribs[i].getAllElement();
// Flag for us to know when we found element for 'choice'.
if (handleChoice)
CUtils.printComment(c_writer, "Deserialize \"choice\" group of elements.");
else if (handleAll)
{
CUtils.printComment(c_writer, "Deserialize \"all\" group of elements.");
c_writer.write("\twhile (true)\n\t{\n");
// Need to adjust tabs since we will be in a loop
tab1 = "\t\t";
tab2 = "\t\t";
}
// for choice and all, we need to do a peek.
c_writer.write(tab1 + "peekedElementName=pIWSDZ->peekNextElementName();\n");
if (handleAll)
{
c_writer.write(tab1 + "if (0x00 == *peekedElementName)\n");
c_writer.write(tab1 + "\tbreak;\n");
}
c_writer.write("\n");
c_writer.write(tab1 + "if ");
firstIfWritten = true;
}
else
{
c_writer.write(tab1 + "else if ");
if (handleAll)
tab2 = "\t\t";
else if (handleChoice)
tab2 = "\t";
}
c_writer.write("(strcmp(peekedElementName,\""
+ attribs[i].getElementNameAsSOAPString() + "\")==0)\n");
c_writer.write(tab1 + "{\n");
if (handleAll)
{
c_writer.write(tab1 + "\tif (param->" + attribs[i].getParamNameAsMember() + ")\n");
c_writer.write(tab1 + "\t\tthrow RedundantElementException(peekedElementName);\n\n");
}
}
else
{
if (firstIfWritten)
endChoiceOrAll(handleAll, handleChoice, tab1, startingGroup, endingGroup);
tab1 = "\t";
tab2 = "\t";
firstIfWritten = false;
handleAll = false;
handleChoice = false;
}
if (handleAll || handleChoice)
tab2 += "\t";
if (attribs[i].isAnyElement())
{
anyCounter += 1;
String fieldName = "any" + Integer.toString(anyCounter);
c_writer.write(tab2 + "param->" + fieldName + " = pIWSDZ->getAnyObject();\n");
}
else if (attribs[i].isArray())
{
arrayCount++;
String containedTypeArrayName = null;
if (attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
{
String baseTypeName = null;
if (!attribs[i].isSimpleType() && attribs[i].getType().isSimpleType())
baseTypeName = CUtils.getSimpleType(attribs[i].getType().getBaseType());
else
baseTypeName = attribs[i].getTypeName();
containedTypeArrayName = CUtils.getArrayNameForType(attribs[i].getTypeName());
c_writer.write(tab2 + "Axis_Array * array" + arrayCount + " = pIWSDZ->getBasicArray("
+ CUtils.getXSDEnumeratorForType(baseTypeName) + ", \""
+ attribs[i].getParamNameAsSOAPString()
+ "\",0);\n");
c_writer.write(tab2 + "if(param->" + attribs[i].getParamNameAsMember() + " == NULL)\n");
c_writer.write(tab2 + "\tparam->" + attribs[i].getParamNameAsMember() + " = new " + CUtils.sanitizeString(containedTypeArrayName) + "();\n");
c_writer.write(tab2 + "param->" + attribs[i].getParamNameAsMember() + "->clone( *array" + arrayCount + ");\n");
c_writer.write(tab2 + "Axis::AxisDelete((void*) array" + arrayCount + ", XSD_ARRAY);\n\n");
}
else
{
arrayType = CUtils.sanitizeString(attribs[i].getTypeName());
containedTypeArrayName = CUtils.getArrayNameForType(arrayType);
c_writer.write(tab2 + "if(param->" + attribs[i].getParamNameAsMember() + " == NULL)\n");
c_writer.write(tab2 + "\tparam->" + attribs[i].getParamNameAsMember() + " = new " + CUtils.sanitizeString(containedTypeArrayName) + "();\n");
c_writer.write(tab2 + "pIWSDZ->getCmplxArray(param->" + attribs[i].getParamNameAsMember()
+ ", (void*)Axis_DeSerialize_" + arrayType
+ ", (void*)Axis_Create_" + arrayType
+ ", (void*)Axis_Delete_" + arrayType
+ ", \"" + attribs[i].getElementNameAsSOAPString() + "\", Axis_URI_" + arrayType + ");\n");
}
}
else if ((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()))
{
String soapTagName = (attribs[i].isAttribute() ? attribs[i].getParamNameAsSOAPString() : attribs[i].getElementNameAsSOAPString());
Type type = attribs[i].getType();
boolean isPointerType = false;
if (type.isSimpleType())
isPointerType = CUtils.isPointerType(CUtils.getSimpleType(type.getBaseType()));
else
isPointerType = CUtils.isPointerType(attribs[i].getTypeName());
String typeName = attribs[i].getTypeName();
String baseTypeName = null;
if (type.isSimpleType())
baseTypeName = CUtils.getSimpleType (type.getBaseType ());
else
baseTypeName = typeName;
if( isPointerType)
{
c_writer.write(tab2 + CUtils.sanitizeString(typeName) + " pValue" + i + " = pIWSDZ->" +
CUtils.getDeserializerMethodName(baseTypeName, attribs[i].isAttribute()) +
"(\"" + soapTagName + "\", 0);\n");
}
else
{
c_writer.write(tab2 + CUtils.sanitizeString(typeName) + " * pValue" + i + " = pIWSDZ->" +
CUtils.getDeserializerMethodName(baseTypeName, attribs[i].isAttribute()) +
"(\"" + soapTagName + "\", 0);\n");
}
// All these fields are pointers, so we should be able to pass ownership of
// deserialized object to object instance.
if (attribs[i].isNillable() ||
isElementNillable(i) ||
isElementOptional(i) ||
attribs[i].getChoiceElement() ||
attribs[i].getAllElement() ||
attribs[i].isOptional() ||
isPointerType)
{
c_writer.write(tab2 + "param->set" + attribs[i].getMethodName()
+ "(pValue" + i + ", true, false);\n");
}
else
{
c_writer.write(tab2 + "if (pValue" + i + ")\n");
c_writer.write(tab2 + "{\n");
c_writer.write(tab2 + "\tparam->set" + attribs[i].getMethodName() + "(*pValue" + i + ");\n");
c_writer.write(tab2 + "\tAxis::AxisDelete((void *)pValue" + i
+ ", " + CUtils.getXSDEnumeratorForType( attribs[i].getTypeName()) + ");\n");
c_writer.write(tab2 + "}\n");
}
}
else
{
//if complex type
String soapTagName = attribs[i].getParamNameAsSOAPString();
c_writer.write(tab2 + "param->" + attribs[i].getParamNameAsMember()
+ " = (" + CUtils.sanitizeString(attribs[i].getTypeName())
+ "*)pIWSDZ->getCmplxObject((void*)Axis_DeSerialize_" + CUtils.sanitizeString(attribs[i].getTypeName())
+ ", (void*)Axis_Create_" + CUtils.sanitizeString(attribs[i].getTypeName())
+ ", (void*)Axis_Delete_" + CUtils.sanitizeString(attribs[i].getTypeName())
+ ", \"" + soapTagName + "\", Axis_URI_" + CUtils.sanitizeString(attribs[i].getTypeName()) + ");\n");
}
if (attribs[i].getChoiceElement() || attribs[i].getAllElement())
c_writer.write(tab1 + "}\n");
else
c_writer.write("\n");
} // end for-loop
if (firstIfWritten)
endChoiceOrAll(handleAll, handleChoice, tab1, startingGroup, endingGroup);
//=============================================================================
// Deserialize extension, if any, and return status
//=============================================================================
writeDeSerializeExtensionCode();
//=============================================================================
// Ensure there are no more elements - there should not be!
//=============================================================================
c_writer.write("\n");
// Due to partial support of extensions, we need to add this hack in not
// performing a peek - due to the fact that on empty elements the extension
// deserialization will consume the end element, and then the peek will
// return next element causing it to mistakenly throw an exception.
if (extensionBaseAttrib == null
|| extensionBaseAttrib.getTypeName() == null)
{
CUtils.printBlockComment(c_writer, "Ensure no extraneous elements.");
c_writer.write("\tpeekedElementName = pIWSDZ->peekNextElementName();\n");
c_writer.write("\tif (0x00 != *peekedElementName)\n");
c_writer.write("\t\tthrow UnknownElementException(peekedElementName);\n");
}
c_writer.write("\n");
c_writer.write("\treturn pIWSDZ->getStatus();\n");
c_writer.write("}\n");
}
private void endChoiceOrAll(boolean handleAll,
boolean handleChoice,
String tab1,
int startGroup, int endGroup) throws IOException
{
// If xsd:all xsd:choice - an unknown element check - throw exception.
if (handleAll)
{
c_writer.write(tab1 + "else\n");
c_writer.write(tab1 + "\tthrow UnknownElementException(peekedElementName);\n");
// Closes for loop
c_writer.write("\t}\n");
// Verify all fields set if possible.
boolean commentPrinted = false;
for (int j = startGroup; j <= endGroup; j++)
if (attribs[j].getAllElement() && !attribs[j].isArray()
&& !attribs[j].isOptional() && !attribs[j].isNillable()
&& attribs[j].getMinOccurs() != 0)
{
if (!commentPrinted)
{
CUtils.printComment(c_writer, "Ensure no missing elements in \"all\" group.");
commentPrinted = true;
}
c_writer.write("\tif (param->" + attribs[j].getParamNameAsMember() + " == NULL)");
c_writer.write(" throw ElementMissingException(\"" + attribs[j].getParamNameAsMember() + "\");\n");
}
}
c_writer.write("\n");
}
private void writeCreateGlobalMethod() throws IOException
{
CUtils.printMethodComment(c_writer, "Function used to create objects of type "
+ c_classname + ".");
c_writer.write("void* Axis_Create_" + c_classname + "(int nSize)\n");
c_writer.write("{\n");
c_writer.write("\tif (nSize > 0)\n");
c_writer.write("\t{\n");
c_writer.write("\t\t" + c_classname + "** pNew = new " + c_classname + "* [nSize];\n");
c_writer.write("\t\tfor (int i=0; i < nSize; ++i)\n");
c_writer.write("\t\t\tpNew[i] = new " + c_classname + ";\n");
c_writer.write("\t\treturn pNew;\n");
c_writer.write("\t}\n");
c_writer.write("\telse\n");
c_writer.write("\t\treturn new " + c_classname + ";\n");
c_writer.write("}\n");
c_writer.write("\n");
}
private void writeDeleteGlobalMethod() throws IOException
{
CUtils.printMethodComment(c_writer, "Function used to delete objects of type "
+ c_classname + ".");
c_writer.write("void Axis_Delete_" + c_classname + "(" + c_classname + "* param, int nSize)\n");
c_writer.write("{\n");
c_writer.write("\t// If null just return.\n");
c_writer.write("\tif (!param)\n");
c_writer.write("\t\treturn;\n\n");
c_writer.write("\t// Reclaim array objects if array.\n");
c_writer.write("\tif (nSize > 0)\n");
c_writer.write("\t{\n");
c_writer.write("\t\tfor (int count = 0 ; count < nSize ; count++ )\n");
c_writer.write("\t\t{\n");
c_writer.write("\t\t\tif ( (( " + c_classname + " ** ) param)[count])\n");
c_writer.write("\t\t\t{\n");
c_writer.write("\t\t\t\tdelete (( " + c_classname + " ** ) param)[count];\n");
c_writer.write("\t\t\t\t(( " + c_classname + " ** ) param)[count] = NULL;\n");
c_writer.write("\t\t\t}\n");
c_writer.write("\t\t}\n");
c_writer.write("\t\tdelete [] ( " + c_classname + " ** ) param;\n");
c_writer.write("\t}\n");
c_writer.write("\telse\n");
c_writer.write("\t\tdelete param;\n");
c_writer.write("}\n");
}
/*
* (non-Javadoc)
*
* @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeConstructors()
*/
protected void writeConstructors() throws WrapperFault
{
try
{
// Write default constructor
CUtils.printMethodComment(c_writer, "Constructor for class " + c_classname + ".");
c_writer.write(c_classname + "::\n" + c_classname + "()\n{\n");
writeReset(true);
c_writer.write("}\n");
// Write copy constructor
writeCopyConstructor();
// Write reset method
writeReset(false);
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
/**
* @throws IOException
*/
private void writeCopyConstructor() throws WrapperFault
{
try
{
//write copy constructor
CUtils.printMethodComment(c_writer, "Copy constructor for class " + c_classname + ".");
c_writer.write(c_classname + "::\n" + c_classname + "(const " + c_classname + " & original)\n{\n");
writeReset(true);
c_writer.write("\n");
// AXISCPP-918 patch provided by Franz Fehringer
if (extensionBaseAttrib != null && extensionBaseAttrib.getTypeName() != null)
{
if (extensionBaseAttrib.isSimpleType())
c_writer.write("\t" + extensionBaseAttrib.getParamNameAsMember() + " = " + "original." + extensionBaseAttrib.getParamNameAsMember() + ";\n");
else
{
// TODO
}
}
// End of AXISCPP-918
// Set fields in SoapFaultException parent class if fault
if (type.isFault())
{
c_writer.write("\tsetFaultCode(original.getFaultCode());\n");
c_writer.write("\tsetFaultString(original.getFaultString());\n");
c_writer.write("\tsetFaultActor(original.getFaultActor());\n");
}
int anyCounter = 0;
for (int i = 0 ; i < attribs.length ; i++)
{
if (i != 0)
c_writer.write("\n");
if (attribs[i].isAnyElement())
{
anyCounter += 1;
String fieldName = "any" + Integer.toString(anyCounter);
c_writer.write("\tif (original." + fieldName + " != NULL)\n");
c_writer.write("\t\t" + fieldName + " = new " + CUtils.sanitizeString(attribs[i].getTypeName()) + "(*(original." + fieldName + "));\n");
}
else if (attribs[i].isArray())
{
c_writer.write("\tif (original." + attribs[i].getParamNameAsMember() + " != NULL)\n");
c_writer.write("\t\t" + attribs[i].getParamNameAsMember() + " = new "
+ CUtils.sanitizeString(CUtils.getArrayNameForType(attribs[i].getTypeName())) + "(*original."
+ attribs[i].getParamNameAsMember() + ");\n");
}
else
{
Type type = attribs[i].getType();
boolean isPointerType = false;
if (type.isSimpleType())
isPointerType = CUtils.isPointerType(CUtils.getSimpleType(type.getBaseType()));
else
isPointerType = CUtils.isPointerType(attribs[i].getTypeName());
if ((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()) && (isPointerType || attribs[i].isOptional() || attribs[i].isNillable() || attribs[i].getChoiceElement() || attribs[i].getAllElement()))
c_writer.write("\tset" + attribs[i].getMethodName() + "(original." + attribs[i].getParamNameAsMember() + ", original.__axis_deepcopy_" + attribs[i].getParamNameAsMember() + ");\n");
else if (attribs[i].isSimpleType())
{
c_writer.write("\t" + attribs[i].getParamNameAsMember() + " = original."
+ attribs[i].getParamNameAsMember() + ";\n");
}
else
{
c_writer.write("\tif (original." + attribs[i].getParamNameAsMember() + " != NULL)\n");
c_writer.write("\t\t" + attribs[i].getParamNameAsMember() + " = new "
+ CUtils.sanitizeString(attribs[i].getTypeName()) + "(*(original."
+ attribs[i].getParamNameAsMember() + "));\n");
}
}
}
c_writer.write("}\n");
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
/*
* (non-Javadoc)
*
* @see
*/
protected void writeReset(boolean forConstructor) throws WrapperFault
{
try
{
if (!forConstructor)
{
CUtils.printMethodComment(c_writer, "Method to initialize objects of class " + c_classname + ".");
c_writer.write("void " + c_classname + "::\nreset()\n{\n");
}
int anyCounter = 0;
for(int i = 0; i< attribs.length;i++)
{
String name = attribs[i].getParamNameAsMember();
String typename = attribs[i].getTypeName();
Type type = attribs[i].getType();
boolean isPointerType = false;
if (type.isSimpleType())
isPointerType = CUtils.isPointerType(CUtils.getSimpleType(type.getBaseType()));
else
isPointerType = CUtils.isPointerType(typename);
if (attribs[i].isAnyElement())
{
anyCounter += 1;
name = "any" + Integer.toString(anyCounter);
// TODO remove and replace with simple delete!
if (!forConstructor)
{
c_writer.write("\tif ("+name+") \n\t{\n");
c_writer.write("\t\tfor (int i=0; i<"+name+"->_size; i++)\n");
c_writer.write("\t\t\tdelete [] "+name+"->_array[i];\n");
c_writer.write("\t\tdelete "+name+";\n");
c_writer.write("\t}\n");
}
c_writer.write("\t" + name + "= NULL;\n\n");
}
else if(attribs[i].isArray())
{
if (!forConstructor)
c_writer.write("\tdelete " + name + ";\n");
c_writer.write("\t"+ name + " = NULL;\n\n");
}
else if (!(attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()))
{
if (!forConstructor)
c_writer.write("\tdelete " + name + ";\n");
c_writer.write("\t" + name + "= NULL;\n\n");
}
else if (isPointerType || isElementNillable(i) || isElementOptional(i)
|| attribs[i].getChoiceElement() || attribs[i].getAllElement())
{
if (!forConstructor)
{
c_writer.write("\tif(__axis_deepcopy_" + name + ")\n");
c_writer.write("\t\tdelete ");
if (isPointerType)
c_writer.write("[] ");
c_writer.write(name + ";\n");
}
c_writer.write("\t" + name + " = NULL;\n");
c_writer.write("\t__axis_deepcopy_" + name + " = false;\n\n");
}
}
if (!forConstructor)
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 class " + c_classname + ".");
if (type.isFault())
c_writer.write(c_classname + "::\n~" + c_classname + "() throw ()\n{\n");
else
c_writer.write(c_classname + "::\n~" + c_classname + "()\n{\n");
c_writer.write("\treset();\n");
c_writer.write("}\n");
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
protected void writeRestrictionCheckerFunction() throws WrapperFault
{
//TODO write code to check the restrictions.
try
{
CUtils.printMethodComment(c_writer, "Function used to check whether object has allowed values. Not implemented yet.");
boolean isPtrType = CUtils.isPointerType( CUtils.getSimpleType( type.getBaseType()));
c_writer.write("int Check_Restrictions_" + c_classname + "(" + c_classname + " value)\n");
c_writer.write("{\n");
Iterator i = type.getEnumerationdata().iterator();
if (i.hasNext())
{
// The first entry is the base type...consume it.
i.next();
int iIndex=0;
while( i.hasNext())
{
if( iIndex == 0)
{
c_writer.write( "//\tif (");
iIndex++;
}
else
c_writer.write( " ||\n//\t ");
QName qnElement = (QName) i.next();
if (isPtrType)
c_writer.write( "!strcmp( value, " + c_classname+ "_" + qnElement.getNamespaceURI() + ")");
else
c_writer.write( "value == ENUM" + c_classname.toUpperCase()+ "_" + qnElement.getNamespaceURI());
}
if (iIndex != 0)
{
c_writer.write( "//)\n//\t{\n");
c_writer.write( "//\t\treturn 1;\n");
c_writer.write( "//\t}\n");
}
}
c_writer.write( "\n\treturn 0;\n");
c_writer.write("}\n");
}
catch (IOException e)
{
throw new WrapperFault(e);
}
}
}