| /* |
| * 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) |
| */ |
| |
| package org.apache.axis.wsdl.wsdl2ws.c; |
| |
| import java.io.IOException; |
| |
| 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 ParamCFileWriter |
| { |
| boolean infoMessageIssued = false; |
| |
| public BeanParamWriter(WebServiceContext wscontext, Type type) |
| throws WrapperFault |
| { |
| super(wscontext, type); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.axis.wsdl.wsdl2ws.c.ParamCFileWriter#writeGlobalCodes() |
| */ |
| protected void writeGlobalCodes() throws WrapperFault |
| { |
| try |
| { |
| writeSerializeGlobalMethod(); |
| writeDeSerializeGlobalMethod(); |
| writeCreateGlobalMethod(); |
| writeDeleteGlobalMethod(); |
| } |
| 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("\taxiscSoapSerializerSerializeAsChardata(pSZ,(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: Structure " + c_classname + " has no attributes or elements."); |
| } |
| } |
| } |
| |
| private void writeSerializeGlobalMethod() throws IOException, WrapperFault |
| { |
| CUtils.printMethodComment(c_writer, "Function to serialize an object of type " |
| + c_classname + "."); |
| |
| c_writer.write("int Axis_Serialize_" + c_classname |
| + "(" + c_classname + "* param, AXISCHANDLE pSZ, AxiscBool 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("\taxiscSoapSerializerSerialize(pSZ,\">\", NULL);\n"); |
| |
| writeSerializeExtensionCode(); |
| |
| c_writer.write("\treturn AXISC_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. |
| //============================================================================= |
| |
| c_writer.write("\tAxiscBool blnIsNewPrefix = xsdc_boolean_false;\n"); |
| c_writer.write("\tAxiscBool blnIsNewSubElemPrefix = xsdc_boolean_false;\n"); |
| c_writer.write("\tconst AxiscChar* sPrefix;\n\n"); |
| |
| CUtils.printBlockComment(c_writer, "If null input, serialize as nil element."); |
| |
| c_writer.write("\tif ( param == NULL )\n\t{\n"); |
| c_writer.write("\t\taxiscSoapSerializerSerializeAsAttribute(pSZ, \"xsi:nil\", 0, (void*)&(xsdc_boolean_true), XSDC_BOOLEAN);\n"); |
| |
| c_writer.write("\t\taxiscSoapSerializerSerialize(pSZ, \">\", NULL);\n"); |
| c_writer.write("\t\treturn AXISC_SUCCESS;\n"); |
| c_writer.write("\t}\n"); |
| |
| //============================================================================= |
| // Serialize |
| // 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"); |
| |
| Type type = attribs[i].getType(); |
| String basicType = null; |
| |
| if (!attribs[i].isSimpleType() && type.isSimpleType()) |
| basicType = CUtils.getSimpleType(type.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("\taxiscSoapSerializerSerializeAsAttribute(pSZ,\"" |
| + attribs[i].getParamNameAsSOAPString() + "\", 0, (void*)(param->" |
| + attribs[i].getParamNameAsMember() + "), " |
| + CUtils.getXSDEnumeratorForType(basicType) + ");\n"); |
| } |
| else |
| { |
| c_writer.write("\taxiscSoapSerializerSerializeAsAttribute(pSZ,\"" |
| + attribs[i].getParamNameAsSOAPString() + "\", 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\tAxiscBool blnIsNewPrefix = xsdc_boolean_false;\n"); |
| c_writer.write("\t\tconst AxiscChar* sPrefix = axiscSoapSerializerGetNamespacePrefix(pSZ,Axis_URI_" |
| + c_classname + ", &blnIsNewPrefix);\n"); |
| c_writer.write("\t\taxiscSoapSerializerSerialize(pSZ, \" 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("\taxiscSoapSerializerSerialize(pSZ, \">\", 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\taxiscSoapSerializerSerializeAnyObject(pSZ, 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("\taxiscSoapSerializerSerializeBasicArray(pSZ, (const Axisc_Array *)param->" + attribs[i].getParamNameAsMember() |
| + ", " + namespace + "," |
| + CUtils.getXSDEnumeratorForType(baseTypeName) + ", \"" |
| + attribs[i].getParamNameAsSOAPString() + "\");\n"); |
| } |
| else |
| { |
| arrayType = attribs[i].getTypeName(); |
| |
| c_writer.write("\taxiscSoapSerializerSerializeCmplxArray(pSZ, (const Axisc_Array *)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("\taxiscSoapSerializerSerializeAsElement(pSZ, \"" |
| + 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 = axiscSoapSerializerGetNamespacePrefix(pSZ, \"" + namespace + "\", &blnIsNewSubElemPrefix);\n"); |
| c_writer.write(tab + "\taxiscSoapSerializerSerialize(pSZ, \"<\", sPrefix, \":\", \"" + elm + "\", 0);\n"); |
| c_writer.write(tab + "\tif (blnIsNewSubElemPrefix)\n"); |
| c_writer.write(tab + "\t\taxiscSoapSerializerSerialize(pSZ,\" xmlns:\", sPrefix, \"=\\\"\", \"" + namespace + "\", \"\\\"\", 0);\n"); |
| c_writer.write(tab + "\tAxis_Serialize_" + attribs[i].getTypeName() + "(param->" + attribs[i].getParamNameAsMember() + ", pSZ, 0);\n"); |
| c_writer.write(tab + "\taxiscSoapSerializerSerialize(pSZ, \"</\", sPrefix, \":\", \"" + elm + "\", \">\", 0);\n"); |
| c_writer.write(tab + "\tif (blnIsNewSubElemPrefix)\n"); |
| c_writer.write(tab + "\t\taxiscSoapSerializerRemoveNamespacePrefix(pSZ, \"" + namespace + "\");\n"); |
| } |
| else |
| { |
| c_writer.write("\taxiscSoapSerializerSerialize(pSZ, \"<" + elm + "\", 0);\n"); |
| c_writer.write(tab + "\tAxis_Serialize_" + attribs[i].getTypeName() + "(param->" + attribs[i].getParamNameAsMember() + ", pSZ, 0);\n"); |
| c_writer.write(tab + "\taxiscSoapSerializerSerialize(pSZ, \"</" + 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\taxiscSoapSerializerSerialize(pSZ, \"</\", 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\taxiscSoapSerializerRemoveNamespacePrefix(pSZ, Axis_URI_" + c_classname + ");\n"); |
| c_writer.write("\n"); |
| |
| c_writer.write("\treturn AXISC_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("\tif (!bArray)\n\t{\n"); |
| c_writer.write("\t\tsPrefix = axiscSoapSerializerGetNamespacePrefix(pSZ,Axis_URI_" + c_classname + ", &blnIsNewPrefix);\n"); |
| c_writer.write("\t\tif (blnIsNewPrefix)\n"); |
| c_writer.write("\t\t\taxiscSoapSerializerSerialize(pSZ,\" 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( "\tif( bArray)\n"); |
| c_writer.write( "\t\taxiscSoapSerializerSerialize(pSZ, \"<\", Axis_TypeName_" + c_classname + ", \">\", NULL);\n"); |
| c_writer.write( "\telse\n"); |
| c_writer.write( "\t{\n"); |
| c_writer.write( "\t\tsPrefix = axiscSoapSerializerGetNamespacePrefix(pSZ, 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\taxiscSoapSerializerSerialize(pSZ, \"<\", Axis_TypeName_" + c_classname + ", " |
| + "\" xsi:type=\\\"\", sPrefix, \":\", " |
| + "Axis_TypeName_" + c_classname + ", \"\\\">\", NULL);\n"); |
| c_writer.write( "\t\telse\n"); |
| c_writer.write( "\t\t\taxiscSoapSerializerSerialize(pSZ, \"<\", 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("\t{\n"); // ==== begin scope |
| c_writer.write("\t\tvoid* pCharDataAs;\n\n"); |
| String typeName = extensionBaseAttrib.getTypeName(); |
| String xsdType = CUtils.getXSDEnumeratorForType(typeName); |
| c_writer.write("\t\taxiscSoapDeSerializerGetChardataAs(pDZ, &pCharDataAs, " + xsdType + ");\n"); |
| c_writer.write("\t\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("\t\taxiscAxisDelete(pCharDataAs, " + xsdType + ");\n"); |
| } |
| c_writer.write("\t}\n"); // ==== end scope |
| } |
| 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: Structure " + c_classname + " has no attributes or elements."); |
| } |
| } |
| } |
| |
| private void writeDeSerializeGlobalMethod() throws IOException, WrapperFault |
| { |
| CUtils.printMethodComment(c_writer, "Function to deserialize an object of type " |
| + c_classname + "."); |
| |
| c_writer.write("int Axis_DeSerialize_" + c_classname + "(" + c_classname |
| + "* param, AXISCHANDLE pDZ)\n{\n"); |
| |
| //============================================================================= |
| // No attributes or elements to deserialize? Then deserialize extension and return. |
| //============================================================================= |
| |
| if (attribs.length == 0) |
| { |
| writeDeSerializeExtensionCode(); |
| |
| c_writer.write("\treturn AXISC_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 |
| { |
| CUtils.printComment(c_writer, "Deserialize \"all\" group of elements."); |
| |
| c_writer.write("\twhile (1)\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=axiscSoapDeSerializerPeekNextElementName(pDZ);\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\taxiscAxisGenerateRedundantElementException(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 + " = axiscSoapDeSerializerGetAnyObject(pDZ);\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(baseTypeName); |
| |
| c_writer.write(tab2 + "if (param->" + attribs[i].getParamNameAsMember() + " != NULL)\n"); |
| c_writer.write(tab2 + "{\n"); |
| c_writer.write(tab2 + "\taxiscAxisDelete(param->" + attribs[i].getParamNameAsMember() + ", XSDC_ARRAY);\n"); |
| c_writer.write(tab2 + "\tparam->" + attribs[i].getParamNameAsMember() + "= NULL;\n"); |
| c_writer.write(tab2 + "}\n"); |
| c_writer.write("\n"); |
| |
| c_writer.write(tab2 + "param->" + attribs[i].getParamNameAsMember() |
| + " = (" + containedTypeArrayName + " *)" |
| + "axiscSoapDeSerializerGetBasicArray(pDZ, " |
| + CUtils.getXSDEnumeratorForType(baseTypeName) + ", \"" |
| + attribs[i].getParamNameAsSOAPString() + "\",0);\n"); |
| } |
| else |
| { |
| arrayType = attribs[i].getTypeName(); |
| c_writer.write(tab1 + "axiscSoapDeSerializerGetCmplxArray(pDZ, (Axisc_Array *)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()); |
| |
| if (attribs[i].isNillable() || |
| isElementNillable(i) || |
| isElementOptional(i) || |
| attribs[i].getChoiceElement() || |
| attribs[i].getAllElement() || |
| attribs[i].isOptional() || |
| isPointerType) |
| { |
| c_writer.write(tab2 + "param->" |
| + attribs[i].getParamNameAsMember() + " = " |
| + "axiscSoapDeSerializer" |
| + CUtils.getDeserializerMethodName( |
| attribs[i].getTypeName(), attribs[i].isAttribute()) + "(pDZ, \"" |
| + soapTagName + "\",0);\n"); |
| } |
| else |
| { |
| String elementNameToSearchFor = attribs[i].isAttribute()? attribs[i].getParamNameAsSOAPString():attribs[i].getElementNameAsSOAPString(); |
| |
| c_writer.write(tab2 + "{\n"); // start local scope |
| |
| c_writer.write(tab2 + "\t" + attribs[i].getTypeName() + " * " |
| + attribs[i].getParamNameAsMember() + " = " |
| + "axiscSoapDeSerializer" |
| + CUtils.getDeserializerMethodName(attribs[i].getTypeName(), attribs[i].isAttribute()) |
| + "(pDZ, \"" + elementNameToSearchFor + "\",0);\n"); |
| |
| c_writer.write(tab2 + "\tif (" + attribs[i].getParamNameAsMember() + " != NULL)\n"); |
| c_writer.write(tab2 + "\t{\n"); |
| c_writer.write(tab2 + "\t\tparam->" + attribs[i].getParamNameAsMember() + " = *" |
| + attribs[i].getParamNameAsMember() + ";\n"); |
| |
| if (CUtils.getXSDEnumeratorForType( attribs[i].getTypeName()).equals("XSDC_HEXBINARY") |
| || CUtils.getXSDEnumeratorForType( attribs[i].getTypeName()).equals("XSDC_BASE64BINARY")) |
| { |
| c_writer.write(tab2 + "\t\t" + attribs[i].getParamNameAsMember() + "->__ptr = NULL;\n"); |
| } |
| |
| c_writer.write(tab2 + "\t\taxiscAxisDelete( (void *) " + attribs[i].getParamNameAsMember() |
| + ", " + CUtils.getXSDEnumeratorForType( attribs[i].getTypeName()) + ");\n"); |
| c_writer.write(tab2 + "\t}\n"); |
| |
| c_writer.write(tab2 + "}\n"); // end local scope |
| } |
| } |
| else |
| { |
| //if complex type |
| String soapTagName = attribs[i].getParamNameAsSOAPString(); |
| |
| c_writer.write(tab2 + "param->" + attribs[i].getParamNameAsMember() |
| + " = (" + attribs[i].getTypeName() |
| + "*)axiscSoapDeSerializerGetCmplxObject(pDZ,(void*)Axis_DeSerialize_" + attribs[i].getTypeName() |
| + ", (void*)Axis_Create_" + attribs[i].getTypeName() |
| + ", (void*)Axis_Delete_" + attribs[i].getTypeName() |
| + ", \"" + soapTagName + "\", Axis_URI_" + attribs[i].getTypeName() + ");\n"); |
| } |
| |
| if (attribs[i].getChoiceElement() || attribs[i].getAllElement()) |
| c_writer.write(tab1 + "}\n"); |
| |
| c_writer.write("\n"); |
| } |
| |
| 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"); |
| |
| CUtils.printBlockComment(c_writer, "Ensure no extraneous elements."); |
| c_writer.write("\tpeekedElementName = axiscSoapDeSerializerPeekNextElementName(pDZ);\n"); |
| c_writer.write("\tif (0x00 != *peekedElementName)\n"); |
| c_writer.write("\t\taxiscAxisGenerateUnknownElementException(peekedElementName);\n"); |
| |
| c_writer.write("\n"); |
| c_writer.write("\treturn axiscSoapDeSerializerGetStatus(pDZ);\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 + "\taxiscAxisGenerateUnknownElementException(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\" groups."); |
| commentPrinted = true; |
| } |
| |
| c_writer.write("\tif (param->" + attribs[j].getParamNameAsMember() + " == NULL)"); |
| c_writer.write(" axiscAxisGenerateElementMissingException(\"" + attribs[j].getParamNameAsMember() + "\");\n"); |
| } |
| } |
| |
| c_writer.write("\n"); |
| } |
| |
| /** |
| * @throws IOException |
| */ |
| 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{\n"); |
| |
| c_writer.write("\tif (nSize > 0)\n"); |
| c_writer.write("\t{\n"); |
| c_writer.write("\t\tint i;\n"); |
| c_writer.write("\t\t" + c_classname + "** pNew = (" + |
| c_classname + "**) axiscAxisNewCArray(nSize);\n"); |
| c_writer.write("\t\tfor (i=0; i < nSize; ++i)\n"); |
| c_writer.write("\t\t\tpNew[i] = (" + c_classname + "*)Axis_Create_" + c_classname + "(0);\n"); |
| c_writer.write("\t\treturn (void *)pNew;\n"); |
| c_writer.write("\t}\n"); |
| c_writer.write("\telse\n"); |
| c_writer.write("\t{\n"); |
| if (attribs.length == 0 && extensionBaseAttrib == null) |
| c_writer.write("\t\t" + c_classname + "* pTemp = (" + c_classname + " *)NULL;\n"); |
| else |
| { |
| c_writer.write("\t\t" + c_classname + "* pTemp = (" + c_classname + " *)malloc(sizeof(" + c_classname + "));\n"); |
| c_writer.write("\t\tmemset(pTemp, 0, sizeof(" + c_classname + "));\n"); |
| } |
| c_writer.write("\n"); |
| |
| boolean writeNewline = false; |
| |
| // The only items in the structure that we pre-allocate is for the container structure |
| // for arrays. All other variables and the actual element array that gets put into |
| // the container structure for arrays are created by the corresponding deserializer. |
| for (int i = 0; i < attribs.length; i++) |
| { |
| if (attribs[i].isArray() && !attribs[i].isAnyElement()) |
| { |
| writeNewline = true; |
| String containedTypeArrayName; |
| |
| // If simple type array we call the axiscAxisNew() API; otherwise, we |
| // invoke the dynamically generated Axis_Create_xxxx() function. |
| 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(baseTypeName); |
| |
| c_writer.write("\t\tpTemp->" + attribs[i].getParamNameAsMember() |
| + " = (" + containedTypeArrayName + " *)axiscAxisNew(XSDC_ARRAY, 0);\n"); |
| |
| c_writer.write("\t\tpTemp->" + attribs[i].getParamNameAsMember() + "->m_Type = " |
| + CUtils.getXSDEnumeratorForType(baseTypeName) + ";\n"); |
| } |
| else |
| { |
| containedTypeArrayName = CUtils.getArrayNameForType(attribs[i].getTypeName()); |
| |
| c_writer.write("\t\tpTemp->" + attribs[i].getParamNameAsMember() + " = " |
| + "Axis_Create_" + containedTypeArrayName + "(0);\n"); |
| } |
| } |
| } |
| |
| if (writeNewline) |
| c_writer.write("\n"); |
| c_writer.write("\t\treturn pTemp;\n"); |
| c_writer.write("\t}\n"); |
| c_writer.write("}\n"); |
| } |
| |
| /** |
| * @throws IOException |
| */ |
| 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 == NULL)\n"); |
| c_writer.write("\t\treturn;\n"); |
| c_writer.write("\n"); |
| |
| c_writer.write("\t/* Reclaim memory resources (recursion is used to reclaim arrays) */\n"); |
| c_writer.write("\tif (nSize > 0)\n"); |
| c_writer.write("\t{\n"); |
| c_writer.write("\t\tint i;\n"); |
| c_writer.write("\t\t" + c_classname + " **paramArray = (" + c_classname + " **)param;\n"); |
| c_writer.write("\t\tfor (i = 0 ; i < nSize ; i++ )\n"); |
| c_writer.write("\t\t\tif (paramArray[i])\n"); |
| c_writer.write("\t\t\t\tAxis_Delete_" + c_classname + "(paramArray[i],0);\n"); |
| c_writer.write("\t\taxiscAxisDeleteCArray((void **)param);\n"); |
| c_writer.write("\t}\n"); |
| |
| c_writer.write("\telse\n"); |
| |
| c_writer.write("\t{\n"); |
| int anyCounter = 0; |
| |
| for (int i = 0; i < attribs.length; i++) |
| { |
| if (attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()) |
| { |
| String passedInBaseType; |
| String baseTypeName = null; |
| |
| if (!attribs[i].isSimpleType() && attribs[i].getType().isSimpleType()) |
| baseTypeName = CUtils.getSimpleType(attribs[i].getType().getBaseType()); |
| else |
| baseTypeName = attribs[i].getTypeName(); |
| |
| if (CUtils.getXSDEnumeratorForType( baseTypeName).equals("XSDC_HEXBINARY") |
| || CUtils.getXSDEnumeratorForType( baseTypeName).equals("XSDC_BASE64BINARY")) |
| { |
| // need to delete the pointer |
| String dot = "."; |
| if (isElementNillable(i) || isElementOptional(i) |
| || attribs[i].getChoiceElement() || attribs[i].getAllElement()) |
| dot = "->"; |
| |
| c_writer.write("\t\tif (param->" + attribs[i].getParamNameAsMember() + dot + "__ptr != NULL)\n"); |
| c_writer.write("\t\t\taxiscAxisDelete(param->" + attribs[i].getParamNameAsMember() |
| + dot + "__ptr, XSDC_UNSIGNEDBYTE);\n"); |
| c_writer.write("\n"); |
| } |
| else if (CUtils.isPointerType(attribs[i].getTypeName()) || attribs[i].isArray() |
| || isElementNillable(i) || isElementOptional(i) |
| || attribs[i].getChoiceElement() || attribs[i].getAllElement()) |
| { |
| if (attribs[i].isArray()) |
| passedInBaseType = "XSDC_ARRAY"; |
| else |
| passedInBaseType = CUtils.getXSDEnumeratorForType(baseTypeName); |
| |
| c_writer.write("\t\tif (param->" + attribs[i].getParamNameAsMember() + " != NULL)\n"); |
| c_writer.write("\t\t\taxiscAxisDelete(param->" + attribs[i].getParamNameAsMember() |
| + "," + passedInBaseType + ");\n"); |
| c_writer.write("\n"); |
| } |
| } |
| else if (attribs[i].isAnyElement()) |
| { |
| anyCounter += 1; |
| String fieldName = "any" + Integer.toString(anyCounter); |
| |
| c_writer.write("\t\tif (param->" + fieldName + " != NULL)\n"); |
| c_writer.write("\t\t\taxiscAxisDelete(param->" + fieldName + ", XSDC_ANY);\n"); |
| } |
| else |
| { |
| c_writer.write("\t\tif (param->" + attribs[i].getParamNameAsMember() + ")\n"); |
| |
| if (attribs[i].isArray()) |
| c_writer.write("\t\t\tAxis_Delete_" |
| + CUtils.getArrayNameForType(attribs[i].getTypeName()) |
| + "(param->" + attribs[i].getParamNameAsMember() + ", 0);\n"); |
| else |
| c_writer.write("\t\t\tAxis_Delete_" + attribs[i].getTypeName() |
| + "(param->" + attribs[i].getParamNameAsMember() + ", 0);\n"); |
| } |
| } |
| |
| c_writer.write("\t\tfree(param);\n"); |
| c_writer.write("\t}\n"); |
| |
| c_writer.write("}\n"); |
| } |
| |
| /** |
| * @throws WrapperFault |
| */ |
| protected void writeRestrictionCheckerFunction() throws WrapperFault |
| { |
| try |
| { |
| CUtils.printMethodComment(c_writer, "Function used to check whether object has allowed values. Not implemented yet."); |
| |
| c_writer.write("int Check_Restrictions_" + c_classname + "(" + c_classname + " value)\n"); |
| c_writer.write("{\n"); |
| c_writer.write("\treturn 0;\n"); |
| //TODO write code to check the restrictions |
| c_writer.write("}\n"); |
| } |
| catch (IOException e) |
| { |
| throw new WrapperFault(e); |
| } |
| } |
| } |