private void writeSerializeGlobalMethod()

in src/wsdl/org/apache/axis/wsdl/wsdl2ws/c/BeanParamWriter.java [102:400]


    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");
    }