private void writeDeSerializeGlobalMethod()

in src/wsdl/org/apache/axis/wsdl/wsdl2ws/cpp/BeanParamWriter.java [704:995]


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