Package org.apache.axis.wsdl.wsdl2ws.cpp.literal

Source Code of org.apache.axis.wsdl.wsdl2ws.cpp.literal.BeanParamWriter

/*
*   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)
* @author Chinthana Dinapala(cdinapala@virtusa.com)
*/

package org.apache.axis.wsdl.wsdl2ws.cpp.literal;

import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axis.wsdl.symbolTable.BaseType;
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
{
    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
        {
            HashSet typeSet = new HashSet();
            String typeName;
            for (int i = 0; i < attribs.length; i++)
            {
                if (!(attribs[i].isSimpleType() || attribs[i].isAnyType()))
                {
                    typeSet.add(attribs[i].getTypeName());
                }
            }
            Iterator itr = typeSet.iterator();
            while (itr.hasNext())
            {
                /*
                 * Needed for self referenced array. <xsd:complexType
                 * name="Type1"> <xsd:sequence> <xsd:element name="followings"
                 * maxOccurs="unbounded" minOccurs="0" type="tns:Type1" />
                 * <xsd:element name="kind" type="xsd:string" /> <xsd:element
                 * name="index" type="xsd:int" /> </xsd:sequence> <xsd:attribute
                 * name="att_kind" type="tns:Kind" /> </xsd:complexType>
                 */
                typeName = itr.next().toString();
                if (!typeName.equals(type.getName().getLocalPart()))
                {
                    writer.write("extern int Axis_DeSerialize_" + typeName
                            + "(" + typeName
                            + "* param, IWrapperSoapDeSerializer* pDZ);\n");
                    writer.write("extern void* Axis_Create_" + typeName + "("
                            + typeName
                            + "* pObj, bool bArray = false, int nSize=0);\n");
                    writer.write("extern void Axis_Delete_" + typeName + "("
                            + typeName
                            + "* param, bool bArray = false, int nSize=0);\n");
                    writer.write("extern int Axis_Serialize_"
                            + typeName
                            + "("
                            + typeName
                            + "* param, IWrapperSoapSerializer* pSZ, bool bArray = false);\n");
                    writer.write("extern int Axis_GetSize_" + typeName
                            + "();\n\n");
                }
                else
                {
                    writer.write("int Axis_DeSerialize_" + typeName + "("
                            + typeName
                            + "* param, IWrapperSoapDeSerializer* pDZ);\n");
                    writer.write("void* Axis_Create_" + typeName + "("
                            + typeName + "* pObj, bool bArray, int nSize);\n");
                    writer.write("void Axis_Delete_" + typeName + "("
                            + typeName + "* param, bool bArray, int nSize);\n");
                    writer.write("int Axis_Serialize_"
                                    + typeName
                                    + "("
                                    + typeName
                                    + "* param, IWrapperSoapSerializer* pSZ, bool bArray);\n");
                    writer.write("int Axis_GetSize_" + typeName + "();\n\n");
                }
            }

            writeGetSetMethods();
            writeSerializeGlobalMethod();
            writeDeSerializeGlobalMethod();
            writeCreateGlobalMethod();
            writeDeleteGlobalMethod();
            writeGetSizeGlobalMethod();
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /**
     * Dushshantha: following method writes getters and setters for the
     * attributes
     */

    private void writeGetSetMethods() throws WrapperFault
    {
        /**
         * Dushshantha: writing getter
         */
        int anyCounter = 0;
        if (type.isArray())
        {
            return;
        }
        try
        {
            for (int i = 0; i < attribs.length; i++)
            {
                attribs[i].setParamName( CUtils.sanitiseAttributeName( classname, attribs[i].getParamName()));

              String methodName = attribs[i].getParamNameWithoutSymbols();
                String parameterName = methodName;
                String properParamName = getCorrectParmNameConsideringArraysAndComplexTypes(attribs[i]);
                String type = attribs[i].getTypeName();

                if( methodName.endsWith( "_"))
                {
                    String localMethodName = methodName.substring( 0, methodName.length() - 1);
                   
                    if( localMethodName.equals( classname))
                    {
                        methodName = localMethodName;
                    }
                }
               
                if (attribs[i].isArray())
                {
                    String parameterTypeName = properParamName;
                    if (!parameterTypeName.endsWith("*"))
                    {
                        parameterTypeName += " *";
                    }
                    writer.write("\n" + parameterTypeName + " " + classname
                            + "::get" + methodName + "()\n{\n");

                    writer.write("\t" + "return " + parameterName + " ; \n}\n");

                    writer.write("\n" + "void " + classname + "::set"
                            + methodName + "(" + parameterTypeName
                            + " pInValue)\n{\n");

                    writer.write("\tif(" + parameterName + " == NULL)\n");
                    writer.write("\t{\n");
                    if (attribs[i].getChoiceElement()||attribs[i].getAllElement())
                    {
                        // This is the 'choice' or 'all' route in the code
                      writer.write("\t\t// This object is a 'choice' or 'all', so need to ensure that any\n");
                      writer.write("\t\t// other objects belonging to this union of elements are empty.\n");
                      writer.write("\t\t// NB: Hasn't been implemented yet!\n");
                      writer.write("\t\t" + parameterName + " = new " + type + "_Array();\n");
                    }
                    else
                    {
                        writer.write("\t\t" + parameterName + " = new " + properParamName + "();\n");
                    }
                   
                    writer.write("\t}\n");
                    if (attribs[i].getChoiceElement()||attribs[i].getAllElement())
                    {
                        // This is the 'choice' or 'all' route in the code
                      writer.write("\t" + parameterName + "->clone( *pInValue);\n");
                    }
                    else
                    {
                      writer.write("\t" + parameterName + "->clone( *pInValue);\n");
                    }
                    writer.write("}\n");
                }
                else
                {
                  // FJP Nillable vv
                  if (isElementNillable(i|| isElementOptional(i))
                  {
                      if (attribs[i].isAnyType())
                      {                     
                        anyCounter += 1;
                        parameterName = parameterName + Integer.toString(anyCounter);
                      }
                      if(attribs[i].getAllElement() || attribs[i].getChoiceElement() )
                      {
                        if (isElementNillable(i))
                          writer.write("\n" + properParamName + " * " + classname
                                + "::get" + methodName + "()\n{\n");
                        else
                          writer.write("\n" + properParamName + " " + classname
                                  + "::get" + methodName + "()\n{\n");
                      }
                     
                      else
                      {
                        writer.write("\n" + properParamName + " * " + classname
                                + "::get" + methodName + "()\n{\n");
                      }
                     
                      writer.write("\t" + "return " + parameterName + " ; \n}\n");
 
                      if(attribs[i].getAllElement() || attribs[i].getChoiceElement())
                      {
                        if (isElementNillable(i))
                          writer.write("\n" + "void " + classname + "::set"
                                  + methodName + "(" + properParamName
                                  + " * pInValue, bool deep)\n{\n");
                        else
                          writer.write("\n" + "void " + classname + "::set"
                                + methodName + "(" + properParamName
                                + " pInValue, bool deep)\n{\n");
                      }
                      else
                      {
                        writer.write("\n" + "void " + classname + "::set"
                                + methodName + "(" + properParamName
                                + " * pInValue, bool deep)\n{\n");
                      }
                     
 
                      writer.write("\tif (" + parameterName + " != NULL)\n");
                        writer.write("\t{\n");
                        writer.write("\t\tif (__axis_deepcopy_" + parameterName + ")\n");
                        writer.write("\t\t{\n");
                        writer.write("\t\t\tdelete " + parameterName + ";\n");
                        writer.write("\t\t}\n");
                        writer.write("\t\t" + parameterName + " = NULL;\n");
                        writer.write("\t}\n");
                        writer.write("\tif (pInValue != NULL)\n");
                        writer.write("\t{\n");
                        writer.write("\t\tif (deep)\n");
                        writer.write("\t\t{\n");
                        if(attribs[i].getAllElement() || attribs[i].getChoiceElement())
                        {
                          if (isElementNillable(i))
                            writer.write("\t\t\t" + parameterName + " = new " + type + "*();\n");
                          else
                            writer.write("\t\t\t" + parameterName + " = new " + type + "();\n");
                        }
                        else
                        {
                          writer.write("\t\t\t" + parameterName + " = new " + properParamName + "();\n");
                        }
                        writer.write("\t\t\t*" + parameterName + " = *pInValue;\n");
                        writer.write("\t\t}\n");
                        writer.write("\t\telse\n");
                        writer.write("\t\t{\n");
                        writer.write("\t\t\t" + parameterName + " = pInValue;\n");
                        writer.write("\t\t}\n");
                        writer.write("\t}\n");
                        writer.write("\telse\n");
                        writer.write("\t{\n");
                        writer.write("\t\t" + parameterName + " = NULL;\n");
                        writer.write("\t}\n");
                        writer.write("\t__axis_deepcopy_" + parameterName + " = deep;\n");

 
                      if (attribs[i].getChoiceElement())
                      {
                          for (int j = 0; j < attribs.length; j++)
                          {
                              if ((attribs[j].getChoiceElement()) && (j != i))
                              {
                                  writer.write("\t"
                                          + attribs[j].getParamNameWithoutSymbols()
                                          + " = NULL ; \n");
                              }
                          }
                      }
                      if (attribs[i].getAllElement())
                      {
                          for (int j = 0; j < attribs.length; j++)
                          {
                              if ((attribs[j].getAllElement()) && (j != i))
                              {
                                  writer.write("\t"
                                          + attribs[j].getParamNameWithoutSymbols()
                                          + " = NULL ; \n");
                              }
                          }
                      }
 
                      writer.write("}\n");
                  }
                  else
                  {
                      // FJP Nillable ^^
 
                      /**
                       * Dushshantha: Write getter
                       */
 

                   
                      if (attribs[i].isAnyType())
                      {                     
                        anyCounter += 1;
                        parameterName = parameterName + Integer.toString(anyCounter);
                        methodName = methodName + Integer.toString(anyCounter);
                      }
 
                      writer.write("\n"
                              + properParamName
                              + " " + classname + "::get"
                              + methodName
                              + "()\n{\n");
 
                      writer.write("\t" + "return "
                              + parameterName
                              + " ; \n}\n");
 
                      /**
                       * Dushshantha: Write setter
                       */
 
                      writer.write("\n"
                              + "void "
                              + classname
                              + "::set"
                              + methodName
                              + "("
                              + properParamName
                              + " InValue");
                      Type attributeType = attribs[i].getType();
              boolean isPointerType = false;
              if (attributeType.isSimpleType())
              {
                  isPointerType = CUtils.isPointerType(CUtils.getclass4qname(attributeType.getBaseType()));
              }
              else
              {
                  isPointerType = CUtils.isPointerType(getCorrectParmNameConsideringArraysAndComplexTypes(attribs[i]));
              }
                      if((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()) && (isPointerType || attribs[i].getAllElement() || attribs[i].getChoiceElement()))
                      {
                          writer.write(", bool deep");
                      }
                      writer.write(")\n{\n");
                     
                      if(isPointerType)
                      {
                          writer.write("\tif (" + parameterName + " != NULL)\n");
                          writer.write("\t{\n");
                          writer.write("\t\tif (__axis_deepcopy_" + parameterName + ")\n");
                          writer.write("\t\t{\n");
                          writer.write("\t\t\tdelete [] " + parameterName + ";\n");
                          writer.write("\t\t}\n");
                          writer.write("\t\t" + parameterName + " = NULL;\n");
                          writer.write("\t}\n\n");
                          writer.write("\tif(InValue != NULL)\n");
                          writer.write("\t{\n");
                          writer.write("\t\tif (deep)\n");
                          writer.write("\t\t{\n");
                          writer.write("\t\t\t" + parameterName + " = new char[strlen(InValue) + 1];\n");
                          writer.write("\t\t\tstrcpy(" + parameterName + ", InValue);\n");
                          writer.write("\t\t}\n");
                          writer.write("\t\telse\n");
                          writer.write("\t\t{\n");
                          writer.write("\t\t\t" + parameterName + " = InValue;\n");
                          writer.write("\t\t}\n");
                          writer.write("\t}\n");
                          writer.write("\telse\n");
                          writer.write("\t{\n");
                          writer.write("\t\t" + parameterName + " = NULL;\n");
                          writer.write("\t}\n");
                          writer.write("\t__axis_deepcopy_" + parameterName + " = deep;\n");
                      }
                      else if ((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()) && (attribs[i].getAllElement() || attribs[i].getChoiceElement()))
                      {
                            writer.write("\tif (" + parameterName + " != NULL)\n");
                            writer.write("\t{\n");
                            writer.write("\t\tif (__axis_deepcopy_" + parameterName + ")\n");
                            writer.write("\t\t{\n");
                            writer.write("\t\t\tdelete " + parameterName + ";\n");
                            writer.write("\t\t}\n");
                            writer.write("\t\t" + parameterName + " = NULL;\n");
                            writer.write("\t}\n");
                            writer.write("\tif (InValue != NULL)\n");
                            writer.write("\t{\n");
                            writer.write("\t\tif (deep)\n");
                            writer.write("\t\t{\n");
                          writer.write("\t\t\t" + parameterName + " = new " + type + "();\n");
                            writer.write("\t\t\t*" + parameterName + " = *InValue;\n");
                            writer.write("\t\t}\n");
                            writer.write("\t\telse\n");
                            writer.write("\t\t{\n");
                            writer.write("\t\t\t" + parameterName + " = InValue;\n");
                            writer.write("\t\t}\n");
                            writer.write("\t}\n");
                            writer.write("\telse\n");
                            writer.write("\t{\n");
                            writer.write("\t\t" + parameterName + " = NULL;\n");
                            writer.write("\t}\n");
                            writer.write("\t__axis_deepcopy_" + parameterName + " = deep;\n");
                      }
                      else
                      {
                      writer.write("\t" + parameterName
                                + " = InValue ; \n");
                      }
 
                      if (attribs[i].getChoiceElement())
                      {
                          for (int j = 0; j < attribs.length; j++)
                          {

                             
                             
                              if ((attribs[j].getChoiceElement()) && (j != i))
                              {
                                  writer.write("\t"
                                          + attribs[j].getParamNameWithoutSymbols()
                                          + " = NULL ; \n");
                              }
                          }
                      }
 
                      writer.write("}\n");
                  }
                }
            }
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }

    }

    private void writeGetSizeGlobalMethod() throws IOException
    {
        writer.write("/*\n");
        writer.write(" * This static method gives the size of " + classname
                + " type of object\n");
        writer.write(" */\n");
        writer.write("int Axis_GetSize_" + classname
                + "()\n{\n\treturn sizeof(" + classname + ");\n}\n");
    }

    private void writeSerializeGlobalMethod() throws IOException, WrapperFault
    {
        writer.write("/*\n");
        writer.write(" * This static method serialize a " + classname
                + " type of object\n");
        writer.write(" */\n");
        writer.write("int Axis_Serialize_"
                        + classname
                        + "("
                        + classname
                        + "* param, IWrapperSoapSerializer* pSZ, bool bArray = false)\n{\n");

        if (attribs.length == 0)
        {
            writer.write("\tpSZ->serialize(\">\", NULL);\n");

            if (extensionBaseAttrib != null)
            {
                String typeName = extensionBaseAttrib.getTypeName();
                writer.write("\tpSZ->serializeAsChardata((void*)");
                if (!CUtils.isPointerType(typeName))
                {
                    writer.write("&");
                }
                writer.write("(param->"
                        + extensionBaseAttrib.getParamNameAsMember()
                        + "), "
                        + CUtils.getXSDTypeForBasicType(typeName) + ");\n");
            }
            else
            {
                System.out.println("Possible error in class " + classname
                        + ": class with no attributes....................");
            }
            writer.write("\treturn AXIS_SUCCESS;\n");
            writer.write("}\n\n");
            return;
        }

        String arrayType;
        /*
         * A type does not know whether it is used as a nillable parameter So
         * this may not be the appropriate place to do this
         */
        writer.write("\tif ( param == NULL )\n\t{\n");
        writer.write("\t\tpSZ->serializeAsAttribute( \"xsi:nil\", 0, (void*)&(xsd_boolean_true), XSD_BOOLEAN);\n");
        writer.write("\t\tpSZ->serialize( \">\", NULL);\n");
        writer.write("\t\treturn AXIS_SUCCESS;\n");
        writer.write("\t}\n\n");
       
        writer.write("\tbool blnIsNewPrefix = false;\n");
        writer.write("\tif (!bArray)\n\t{\n");
        writer.write("\t\tconst AxisChar* sPrefix = pSZ->getNamespacePrefix(Axis_URI_" + classname + ", blnIsNewPrefix);\n");
        writer.write("\t\tif (blnIsNewPrefix)\n\t\t{\n");
        writer.write("\t\t\tpSZ->serialize(\" xmlns:\", sPrefix, \"=\\\"\",\n");
        writer.write("\t\t\t\tAxis_URI_" + classname + ", \"\\\"\", NULL );\n");
        writer.write("\t\t}\n");
        writer.write("\t}\n");
       
       
        writer.write("\t/* If there are any attributes serialize them. If there aren't then close the tag */\n");
        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");
            }
            else
            {
                //Samisa
                //remove _Ref sufix and _ prefix in SOAP tag name
                String soapTagName = attribs[i].getParamName();
                if (soapTagName.lastIndexOf("_Ref") > -1)
                {
                    soapTagName = soapTagName.substring(0, soapTagName.lastIndexOf("_Ref"));
                }
               
                if (soapTagName.charAt(0) == '_')
                {
                    soapTagName = soapTagName.substring(1, soapTagName.length());
                }
                //end remove _Ref sufix and _ prefix in SOAP tag name
                Type type = attribs[i].getType();
        boolean isPointerType = false;
        String basicType = null;
        if (!attribs[i].isSimpleType() && type.isSimpleType())
        {
            basicType = CUtils.getclass4qname(attribs[i].getType().getBaseType());
            isPointerType = CUtils.isPointerType(CUtils.getclass4qname(type.getBaseType()));
        }
        else
        {
            basicType = attribs[i].getTypeName();
            isPointerType = CUtils.isPointerType(attribs[i].getTypeName());
        }
                if (isPointerType)
                {
                    writer.write("\tif (0 != param->"
                            + attribs[i].getParamNameAsMember() + ")\n");
                    writer.write("\t\tpSZ->serializeAsAttribute(\""
                            + soapTagName
                            + "\", 0, (void*)(param->"
                            + attribs[i].getParamNameAsMember()
                            + "), "
                            + CUtils.getXSDTypeForBasicType(basicType) + ");\n");
                }
                else
                {
                    writer.write("\t\tpSZ->serializeAsAttribute(\""
                            + soapTagName
                            + "\", 0, (void*)&(param->"
                            + attribs[i].getParamNameAsMember()
                            + "), "
                            + CUtils.getXSDTypeForBasicType(attribs[i].getTypeName()) + ");\n");
                }
                if (!attribs[i].isOptional())
                {
                    /* This avoid segmentation fault at runtime */
                    /*
                     * writer.write("\telse\n");
                     * writer.write("\t\tAXISTRACE1(\"The mandatory attribute
                     * "+attribs[i].getParamName()+" is not set\",
                     * CRITICAL);\n");
                     */
                }
            }
        }
        if (type.isFault())
        {
          writer.write("\tif(Axis_URI_" + classname + ")\n\t{\n");
          writer.write("\t\tbool blnIsNewPrefix = false;\n");
          writer.write("\t\tconst AxisChar* sPrefix = pSZ->getNamespacePrefix(Axis_URI_"
            + classname + ", blnIsNewPrefix);\n");
          writer.write("\t\tpSZ->serialize(\" xmlns:\", sPrefix, \"=\\\"\",");
          writer.write("Axis_URI_" + classname + ", \" " + " \\\"\"");
          writer.write(", NULL);\n\t}\n");
        }              
       
        writer.write("\tpSZ->serialize( \">\", 0);\n");
        if (extensionBaseAttrib != null)
        {
            String typeName = extensionBaseAttrib.getTypeName();
            if( typeName != null)
          {
              writer.write("\tpSZ->serializeAsChardata((void*)");
              if (!CUtils.isPointerType(typeName))
              {
                  writer.write("&");
              }
              writer.write("(param->"
                      + extensionBaseAttrib.getParamNameAsMember()
                      + "), "
                      + CUtils.getXSDTypeForBasicType(typeName) + ");\n");
          }
        }

        writer.write("\n\t/* then serialize elements if any*/\n");

        boolean firstIfWritten = false;
        int anyCounter = 0; //counter for any types.
       
       
        for (int i = attributeParamCount; i < attribs.length; i++)
        {
            String namespace = "";
            if (attribs[i].getNsQualified())
            {
                namespace = "Axis_URI_" + classname;
            }
            else
            {
                namespace = "NULL";
            }
           
            // Dushshantha:
        // if the attribute is a choice following should do
            if (attribs[i].getChoiceElement())
            {
                if (!firstIfWritten)
                {
                    writer.write("\tif");
                    firstIfWritten = true;
                }
                else
                {
                    writer.write("\telse if");
                }

                writer.write("(param->" + attribs[i].getParamNameAsMember()
                        + ")\n\t{\n\t");
            }
            //Chinthana:
            //if the attribute is a 'all' following should do

            if (attribs[i].getAllElement())
            {
                if (attribs[i].getMinOccurs() == 0)
                {
                    writer.write("\tif(param->"
                            + attribs[i].getParamNameAsMember() + ")\n\t{\n\t");
                }
            }
            
            if (attribs[i].isAnyType())
            {
                anyCounter += 1;
              writer.write("\tpSZ->serializeAnyObject(param->any" + Integer.toString(anyCounter) +");\n");
            }
            else if (attribs[i].isArray())
            {
                //if Array
                if (attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
                {
                    String baseTypeName = null;
                    if (!attribs[i].isSimpleType() && attribs[i].getType().isSimpleType())
                    {
                        baseTypeName = CUtils.getclass4qname(attribs[i].getType().getBaseType());
                    }
                    else
                    {
                        baseTypeName = attribs[i].getTypeName();;
                    }
                writer.write("\tpSZ->serializeBasicArray(param->"
                        + attribs[i].getParamName()
                        + ", "
                        + namespace
                        + ","
                        + CUtils.getXSDTypeForBasicType(baseTypeName)
                        + ", \""
                        + attribs[i].getParamNameAsSOAPElement()
                        + "\");\n");
                }
                else
                {
                    arrayType = attribs[i].getTypeName();
                    if (attribs[i].getNsQualified())
                    {
                        namespace = "Axis_URI_" + arrayType;
                    }
                    else
                    {
                        namespace = "NULL";
                    }
                    writer.write("\tpSZ->serializeCmplxArray(param->"
                                    + attribs[i].getParamNameAsMember()
                                    + ",\n");
                    writer.write("\t\t\t\t\t\t (void*) Axis_Serialize_"
                            + arrayType + ",\n");
                    writer.write("\t\t\t\t\t\t (void*) Axis_Delete_"
                            + arrayType + ",\n");
                    writer.write("\t\t\t\t\t\t (void*) Axis_GetSize_"
                            + arrayType + ",\n");
                    writer.write("\t\t\t\t\t\t \""
                            + attribs[i].getElementNameAsString() + "\", "
                            + 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.getclass4qname (attribs[i].getType().getBaseType ());
                }
                else
                {
                    baseTypeName = typeName;
                }
               
                if (attribs[i].isOptional())
                {
                    writer.write("\tif (param->" + attribs[i].getParamNameWithoutSymbols() + " != NULL)\n\t\t{\n\t");
                }
               
                if (CUtils.isPointerType(baseTypeName))
                {
                    writer.write("\t\tpSZ->serializeAsElement(\""
                            + attribs[i].getSOAPElementNameAsString()
                            + "\", "
                            + namespace
                            + ", (void*)(param->"
                            + attribs[i].getParamNameWithoutSymbols()
                            + "), "
                            + CUtils.getXSDTypeForBasicType(baseTypeName) + ");\n");
                }
                else
                {
                    /**
                     * Dushshantha: If the simple type is a choice it is handled
                     * as a pointer variable. These variables should be defined
                     * as pointers in the header file. Chinthana: This is the
                     * same in 'all' element
                     */
                  if (attribs[i].getChoiceElement()
                            || attribs[i].getAllElement()
                            || isElementNillable(i) || isElementOptional(i))
                  {
                   
                    if (((attribs[i].getChoiceElement())&&(isElementNillable(i)))&& !(attribs[i].getTypeName().equals("xsd__string")) )
                    {
                      writer.write("\t\tpSZ->serializeAsElement(\""
                                    + attribs[i].getSOAPElementNameAsString()
                                    + "\", "
                                    + namespace
                                    + ", (void*)(*(param->"
                                    + attribs[i].getParamNameWithoutSymbols()
                                    + ")), "
                                    + CUtils.getXSDTypeForBasicType(baseTypeName) + ");\n");
                    }
                    else
                    {
                        writer.write("\t\tpSZ->serializeAsElement(\""
                                    + attribs[i].getSOAPElementNameAsString()
                                    + "\", "
                                    + namespace
                                    + ", (void*)(param->"
                                    + attribs[i].getParamNameWithoutSymbols()
                                    + "), "
                                    + CUtils.getXSDTypeForBasicType(baseTypeName) + ");\n");
                   
                    }                      
                    else
                    {
                        writer.write("\tpSZ->serializeAsElement(\""
                                + attribs[i].getSOAPElementNameAsString()
                                + "\", "
                                + namespace
                                + ", (void*)&(param->"
                                + attribs[i].getParamNameWithoutSymbols()
                                + "), "
                                + CUtils.getXSDTypeForBasicType(baseTypeName) + ");\n");
                    }
                }
               
                if (attribs[i].isOptional())
                {
                    writer.write("\t\t}\n");
                }
            }
            else
            {
                //if complex type
                String elm = attribs[i].getParamName();
                if (elm.lastIndexOf("_Ref") > -1)
                {
                    elm = elm.substring(0, elm.lastIndexOf("_Ref"));
                }

                if (elm.charAt(0) == '_')
                {
                    elm = elm.substring(1, elm.length());
                }
               
                if (attribs[i].isReference())
                {
                    elm = attribs[i].getTypeName();
                }
               
                if (attribs[i].isOptional())
                {
                    writer.write("\tif (param->" + attribs[i].getParamName() + " != NULL)\n\t{\n");
                }
               
                if (attribs[i].getNsQualified())
                {
                    writer.write("\tpSZ->serialize(\"<\", pSZ->getNamespacePrefix(\""
                                  + type.getName().getNamespaceURI()
                                  + "\"), \":\", \"" + elm + "\", 0);\n");
                  writer.write("\tAxis_Serialize_" + attribs[i].getTypeName()
                          + "(param->" + attribs[i].getParamName() + ", pSZ);\n");
                  writer.write("\tpSZ->serialize(\"</\", pSZ->getNamespacePrefix(\""
                                  + type.getName().getNamespaceURI()
                                  + "\"), \":\", \"" + elm + "\", \">\", 0);\n");
                }
                else
                {
                    writer.write("\tpSZ->serialize(\"<" + elm + "\", 0);\n");
                writer.write("\tAxis_Serialize_" + attribs[i].getTypeName()
                        + "(param->" + attribs[i].getParamName() + ", pSZ);\n");
                writer.write("\tpSZ->serialize(\"</" + elm + "\", \">\", 0);\n");
                }
               
                if (attribs[i].isOptional())
                {
                    writer.write("\t}\n");
                }

            }
            //Dushshantha:
            //end if choice element

            if (attribs[i].getChoiceElement())
            {
                writer.write("\t}\n");
            }
           
            //Chinthana: end if
            if (attribs[i].getAllElement())
            {
                if (attribs[i].getMinOccurs() == 0)
                {
                    writer.write("\t}\n");
                }
            }
        }

      writer.write("\n\tif (!bArray && blnIsNewPrefix)\n");
        writer.write("\t{\n");
        writer.write("\t\tpSZ->removeNamespacePrefix(Axis_URI_"
            + classname + ");\n");
        writer.write("\t}\n\n");

       
        writer.write("\treturn AXIS_SUCCESS;\n");
        writer.write("}\n\n");
    }

    private void writeDeSerializeGlobalMethod() throws IOException, WrapperFault
    {
        int arrayCount = 0;
        writer.write("/*\n");
        writer.write(" * This static method deserialize a " + classname
                + " type of object\n");
        writer.write(" */\n");
        writer.write("int Axis_DeSerialize_" + classname + "(" + classname
                + "* param, IWrapperSoapDeSerializer* pIWSDZ)\n{\n");

        if (attribs.length == 0)
        {
            if (extensionBaseAttrib != null)
            {
                writer.write("\tpIWSDZ->getChardataAs((void*)&(param->"
                        + extensionBaseAttrib.getParamNameAsMember()
                        + "), "
                        + CUtils.getXSDTypeForBasicType(extensionBaseAttrib.getTypeName()) + ");\n");
            }
            else
            {
                System.out.println("Possible error in class " + classname
                        + ": class with no attributes....................");
            }
            writer.write("\treturn AXIS_SUCCESS;\n");
            writer.write("}\n\n");
            return;
        }
        String arrayType = null;
        boolean peekCalled = false;
        boolean firstIfWritten = false;
        boolean foundAll = false;
        int anyCounter = 0; //counter for any types.
       
        for (int i = 0; i < attribs.length; i++)
        {
            //Dushshantha:
            //if the attribute is a 'choice' construct we have to peek and make
            // the choice

            if (attribs[i].getChoiceElement())
            {
                if (!peekCalled)
                {
                    writer.write("\tconst char* choiceName=pIWSDZ->peekNextElementName();\n");
                    peekCalled = true;
                }

                if (!firstIfWritten)
                {
                    writer.write("\tif");
                    firstIfWritten = true;
                }
                else
                {
                    writer.write("\telse if");
                }

                writer.write("(strcmp(choiceName,\""
                        + attribs[i].getElementNameAsString()
                        + "\")==0)\n\t{\n\t");
            }

            //Chinthana:
            //if the attribute is a 'all' construct we have to check Min
            // occures
            if (attribs[i].getAllElement())
            {
                if (attribs[i].getMinOccurs() == 0)
                {
                    if (!foundAll)
                    {
                        writer.write("\tconst char* allName = NULL;\n");
                        writer.write("\tbool peekCalled = false;\n");
                        foundAll = true;
                    }

                    writer.write("\n\tif(!peekCalled)\n\t{\n\t");
                    writer.write("\tallName=pIWSDZ->peekNextElementName();\n");
                    writer.write("\t\tpeekCalled = true;\n");
                    writer.write("\t}\n");
                    writer.write("\tif(strcmp(allName,\""
                            + attribs[i].getParamNameAsMember()
                            + "\")==0)\n\t{\n\t");
                    writer.write("\tpeekCalled = false;\n\t");
                }
            }
           
            if (attribs[i].isAnyType())
            {
              anyCounter +=1;
              writer.write("\tparam->any" + Integer.toString(anyCounter)+ " = pIWSDZ->getAnyObject();\n");
            }
            else if (attribs[i].isArray())
            {
                arrayCount++;
                //if Array
                if (attribs[i].isSimpleType() || attribs[i].getType().isSimpleType())
                {
                    String baseTypeName = null;
                    if (!attribs[i].isSimpleType() && attribs[i].getType().isSimpleType())
                    {
                        baseTypeName = CUtils.getclass4qname(attribs[i].getType().getBaseType());
                    }
                    else
                    {
                        baseTypeName = attribs[i].getTypeName();;
                    }
                    writer.write("\tAxis_Array * array" + arrayCount + " = pIWSDZ->getBasicArray("
                            + CUtils.getXSDTypeForBasicType(baseTypeName) + ", \""
                            + attribs[i].getParamNameAsSOAPElement()
                            + "\",0);\n");
                    writer.write("\tif(param->" + attribs[i].getParamNameAsMember() + " == NULL)\n");
                    writer.write("\t{\n");
                  writer.write("\t\tparam->" + attribs[i].getParamNameAsMember() + " = new " + attribs[i].getTypeName() + "_Array();\n");
                    writer.write("\t}\n");
                  writer.write("\tparam->" + attribs[i].getParamNameAsMember() + "->clone( *array" + arrayCount + ");\n");
                    writer.write("\tAxis::AxisDelete((void*) array" + arrayCount + ", XSD_ARRAY);\n\n");
                }
                else
                {
                    arrayType = attribs[i].getTypeName();
                    writer.write("\tpIWSDZ->getCmplxArray(param->" + attribs[i].getParamNameAsMember() + ", (void*)Axis_DeSerialize_"
                                    + arrayType
                                    + ",\n"
                                    + "\t\t\t\t\t\t\t\t  (void*)Axis_Create_"
                                    + arrayType
                                    + ",\n"
                                    + "\t\t\t\t\t\t\t\t  (void*)Axis_Delete_"
                                    + arrayType
                                    + ",\n"
                                    + "\t\t\t\t\t\t\t\t  (void*)Axis_GetSize_"
                                    + arrayType
                                    + ",\n"
                                    + "\t\t\t\t\t\t\t\t  \""
                                    + attribs[i].getElementNameAsString()
                                    + "\", Axis_URI_" + arrayType + ");\n\n");
                   
                }
            }
            else if ((attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()))
            {
                //TODO handle optional attributes
                //Samisa
                //remove _Ref sufix and _ prefix in SOAP tag name
                String soapTagName = (attribs[i].isAttribute() ? attribs[i].getParamName() : attribs[i].getElementNameAsString());
               
                if (soapTagName.lastIndexOf("_Ref") > -1)
                {
                    soapTagName = soapTagName.substring(0, soapTagName.lastIndexOf("_Ref"));
                }

                if (soapTagName.charAt(0) == '_')
                {
                    soapTagName = soapTagName.substring(1, soapTagName.length());
                }
               
                //end remove _Ref sufix and _ prefix in SOAP tag name
               
                if (attribs[i].isOptional())
                {
                    writer.write("\tconst char* elementName" + i + " = pIWSDZ->peekNextElementName();\n");
                    writer.write("\t\tif(strcmp(elementName" + i + ", \"" + soapTagName + "\") == 0)\n");
                    writer.write("\t\t{\n");
                }
               
                Type type = attribs[i].getType();
        boolean isPointerType = false;
        if (type.isSimpleType())
        {
            isPointerType = CUtils.isPointerType(CUtils.getclass4qname(type.getBaseType()));
        }
        else
        {
            isPointerType = CUtils.isPointerType(attribs[i].getTypeName());
        }
                if (attribs[i].isNillable() ||
                        isElementNillable(i) ||
                        isElementOptional(i) ||
                        isPointerType)
                {
                  if (attribs[i].getChoiceElement() && isElementNillable(i) && !isPointerType)
                  {
                    writer.write("\tparam->"
                        + attribs[i].getParamNameAsMember()
                        + " = ("
                        + attribs[i].getTypeName()
                        + "**)("
                        + attribs[i].getTypeName()
                        +"*)new "
                        +attribs[i].getTypeName()
                        + ";\n");
                   
                    writer.write("\t\t*(param->"
                                + attribs[i].getParamNameAsMember()
                                + ") = pIWSDZ->"
                                + CUtils.getParameterGetValueMethodName(
                                        attribs[i].getTypeName(), attribs[i].isAttribute()) + "( \""
                                + soapTagName + "\",0);\n");
                    }
                  else
                  {
                    String typeName = attribs[i].getTypeName();
                    String baseTypeName = null;
                        if (type.isSimpleType())
                        {
                            baseTypeName = CUtils.getclass4qname (type.getBaseType ());;
                        }
                        else
                        {
                            baseTypeName = typeName;
                        }
                    String elementName = attribs[i].getParamNameAsMember();
                   
                   
                   
                    if( isPointerType)
                    {
                        writer.write("\t" + typeName + "  pValue" + i + " = pIWSDZ->" +
                              CUtils.getParameterGetValueMethodName(baseTypeName, attribs[i].isAttribute()) +
                              "( \"" + soapTagName + "\", 0);\n\n");
                    }
                    else
                    {
                        writer.write("\t\t\t" + typeName + " *  pValue" + i + " = pIWSDZ->" +
                              CUtils.getParameterGetValueMethodName(baseTypeName, attribs[i].isAttribute()) +
                              "( \"" + soapTagName + "\", 0);\n\n");
                    }
                   
                    writer.write( "\t\t\tif( pValue" + i + " == NULL)\n");
                    writer.write( "\t\t\t{\n");
                    writer.write("\t\t\t\tparam->" + elementName + " = NULL;\n");
                    writer.write( "\t\t\t}\n");
                    writer.write( "\t\t\telse\n");
                    writer.write( "\t\t\t{\n");
                   
                      String localElemName = elementName;
                      if( elementName.endsWith( "_"))
                            {
                                localElemName = elementName.substring( 0, elementName.length() - 1);
                                                               
                            }
                     
                      writer.write("\t\t\t\tparam->set" + localElemName + " (pValue" + i + ");\n");
                   
                    writer.write("\t\t\t\tAxis::AxisDelete( (void *) pValue" + i + ", " + CUtils.getXSDTypeForBasicType( baseTypeName) + ");\n\n");

                    writer.write( "\t\t\t}\n");
                  }
                }
                else
                {
                    /**
                     * Dushshantha: If the simple type is a choice it is handled
                     * as a pointer variable. These variables should be defined
                     * as pointers in the header file.
                     * Chinthana: This is the
                     * same in 'all' element
                     */
                    if (attribs[i].getChoiceElement()
                            || attribs[i].getAllElement())
                    {
                        writer.write("\tparam->"
                                + attribs[i].getParamNameAsMember()
                                + " = pIWSDZ->"
                                + CUtils.getParameterGetValueMethodName(
                                        attribs[i].getTypeName(), attribs[i].isAttribute()) + "( \""
                                + soapTagName + "\",0);\n");
                    }
                    else
                    {
                        String elementNameToSearchFor = attribs[i].isAttribute()? attribs[i].getParamNameAsMember():attribs[i].getSOAPElementNameAsString();
                       
                        writer.write("\t" + attribs[i].getTypeName() + " * "
                                + attribs[i].getParamNameAsMember()
                                + " = NULL;\n\n");
                        writer.write("\tif (("
                                + attribs[i].getParamNameAsMember()
                                + " = pIWSDZ->"
                                + CUtils.getParameterGetValueMethodName(
                                        attribs[i].getTypeName(), attribs[i].isAttribute()) + "( \""
                                + elementNameToSearchFor + "\",0)) != NULL)\n\t{\n");
                       
                        String localElemName = attribs[i].getParamNameAsMember();
                  if( localElemName.endsWith( "_"))
                        {
                    localElemName = localElemName.substring( 0, localElemName.length() - 1);
                                                           
                        }
                        writer.write("\t\tparam->set"
                                + localElemName + "(* "
                                + attribs[i].getParamNameAsMember() + " );\n");
                writer.write("\t\tAxis::AxisDelete( (void *) " + attribs[i].getParamNameAsMember() + ", " + CUtils.getXSDTypeForBasicType( attribs[i].getTypeName()) + ");\n");
                      writer.write("\t}\n");                     
                    }
                }
                if (attribs[i].isOptional())
                {
                    writer.write("\t\t\t}\n");
                    writer.write("\t\telse\n");
                    writer.write("\t\t{\n");
                    writer.write("\t\t\tparam->" + attribs[i].getParamNameAsMember() + " = NULL;\n");
                    writer.write("\t\t}\n\n");
                }
            }
            else
            {
                //if complex type
                //Samisa
                //remove _Ref sufix and _ prefix in SOAP tag name
                String soapTagName = attribs[i].getParamName();

                if (soapTagName.lastIndexOf("_Ref") > -1)
                {
                    soapTagName = soapTagName.substring(0, soapTagName.lastIndexOf("_Ref"));
                }

                if (soapTagName.charAt(0) == '_')
                {
                    soapTagName = soapTagName.substring(1, soapTagName.length());
                }
               
                if (attribs[i].isOptional())
                {
                    writer.write("\tconst char* elementName" + i + " = pIWSDZ->peekNextElementName();\n");
                    writer.write("\tif(strcmp(elementName" + i + ", \"" + soapTagName + "\") == 0)\n");
                    writer.write("\t{\n");
                }

                //end remove _Ref sufix and _ prefix in SOAP tag name
                writer.write("\tparam->" + attribs[i].getParamNameAsMember()
                        + " = (" + attribs[i].getTypeName()
                        + "*)pIWSDZ->getCmplxObject((void*)Axis_DeSerialize_"
                        + attribs[i].getTypeName()
                        + "\n\t\t, (void*)Axis_Create_"
                        + attribs[i].getTypeName() + ", (void*)Axis_Delete_"
                        + attribs[i].getTypeName() + "\n\t\t, \"" + soapTagName
                        + "\", Axis_URI_" + attribs[i].getTypeName() + ");\n");
               
                if (attribs[i].isOptional())
                {
                    writer.write("\t}\n");
                    writer.write("\telse\n");
                    writer.write("\t{\n");
                    writer.write("\t\tparam->" + attribs[i].getParamNameAsMember() + " = NULL;\n");
                    writer.write("\t}\n\n");
                }
            }

            //Dushshantha:
            //end if

            if (attribs[i].getChoiceElement())
            {
                writer.write("\t}\n");
            }
           
            //Chinthana: end if
            if (attribs[i].getAllElement())
            {
                if (attribs[i].getMinOccurs() == 0)
                {
                    writer.write("\t}\n");
                }
            }
        }

        if (extensionBaseAttrib != null
                && extensionBaseAttrib.getTypeName() != null)
        {
            writer.write("\tpIWSDZ->getChardataAs((void*)&(param->"
                    + extensionBaseAttrib.getParamNameAsMember()
                    + "), "
                    + CUtils.getXSDTypeForBasicType(extensionBaseAttrib.getTypeName()) + ");\n");
        }

        writer.write("\treturn pIWSDZ->getStatus();\n");
        writer.write("}\n");
    }

    private void writeCreateGlobalMethod() throws IOException
    {
        writer.write("void* Axis_Create_" + classname + "(" + classname
                + "* pObj, bool bArray = false, int nSize=0)\n{\n");
        writer.write("\tif (bArray && (nSize > 0))\n\t{\n\t\tif (pObj)\n\t\t{\n");
        writer.write("\t\t\t" + classname + "* pNew = new " + classname
                + "[nSize];\n");

        writer.write("\t\t\tsize_t i = nSize/2;\n");
        writer.write("\t\t\tfor (int ii = 0; ii < (int) i; ++ii)\n");
        writer.write("\t\t\t{\n");
        writer.write("\t\t\t\tpNew[ii] = pObj[ii];\n");
        writer.write("\t\t\t\tpObj[ii].reset();\n");
        writer.write("\t\t\t}\n");

        writer.write("\t\t\tdelete [] pObj;\n");
        writer.write("\t\t\treturn pNew;\n\t\t}\n\t\telse\n\t\t{\n");
        writer.write("\t\t\treturn new " + classname
                        + "[nSize];\n\t\t}\n\t}\n");
        writer.write("\telse\n\t\treturn new " + classname + ";\n}\n\n");
    }

    private void writeDeleteGlobalMethod() throws IOException
    {
        writer.write("/*\n");
        writer.write(" * This static method delete a " + classname
                + " type of object\n");
        writer.write(" */\n");
        writer.write("void Axis_Delete_" + classname + "(" + classname
                + "* param, bool bArray = false, int nSize=0)\n");
        writer.write("{\n");
        writer.write("\tif (bArray)\n");
        writer.write("\t{\n");
        writer.write("\t\tif (nSize > 0)\n");
        writer.write("\t\t{\n");
        writer.write("\t\t\tfor (int count = 0 ; count < nSize ; count++ )\n");
        writer.write("\t\t\t{\n");
        writer.write("\t\t\t\tif ( (( " + classname + " ** ) param)[count])\n");
        writer.write("\t\t\t\t{\n");
        writer.write("\t\t\t\t\tdelete (( " + classname + " ** ) param)[count];\n");
        writer.write("\t\t\t\t\t(( " + classname + " ** ) param)[count] = NULL;\n");
        writer.write("\t\t\t\t}\n");
        writer.write("\t\t\t}\n");
        writer.write("\t\t\tdelete [] ( " + classname + " ** ) param;\n");
        writer.write("\t\t}\n");
        writer.write("\t}\n");
        writer.write("\telse\n");
        writer.write("\t{\n");
        writer.write("\t\tdelete param;\n");
        writer.write("\t}\n");
        writer.write("\tparam = NULL;\n");
        writer.write("}\n");
    }

    /*
     * (non-Javadoc)
     *
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeConstructors()
     */
    protected void writeConstructors() throws WrapperFault
    {
        try
        {
            // Write default constructor
            writer.write("\n" + classname + "::" + classname + "()\n{\n");
            for (int i = 0 ; i < attribs.length ; i++)
            {
                if (attribs[i].isArray())
                {
                  if (attribs[i].getChoiceElement()||attribs[i].getAllElement())
                  {
                        // This is the 'choice' or 'all' route in the code
                      writer.write("\t\t// This object is a 'choice' or 'all', so need to ensure that any\n");
                      writer.write("\t\t// other objects belonging to this union of elements are empty.\n");
                      writer.write("\t\t// NB: Hasn't been implemented yet!\n");
                    writer.write("\t" + attribs[i].getParamNameAsMember() + " = new " + attribs[i].getTypeName() +"_Array();\n");
                  }
                  else
                  {
                    writer.write("\t" + attribs[i].getParamNameAsMember() + " = new " + attribs[i].getTypeName() +"_Array();\n");
                  }
                }
            }
            writer.write("\treset();\n");
            writer.write("}\n");

            //write copy constructor
            writer.write("\n" + classname + "::" + classname + "(const " + classname + " & original)\n{\n");
            int anyCounter = 0;
            for (int i = 0 ; i < attribs.length ; i++)
            {
                if (attribs[i].isArray())
                { 
                  if (attribs[i].getChoiceElement()||attribs[i].getAllElement())
                  {
                        // This is the 'choice' or 'all' route in the code
                      writer.write("\t\t// This object is a 'choice' or 'all', so need to ensure that any\n");
                      writer.write("\t\t// other objects belonging to this union of elements are empty.\n");
                      writer.write("\t\t// NB: Hasn't been implemented yet!\n");
                    writer.write("\t" + attribs[i].getParamName() + " = new " + attribs[i].getTypeName() + "_Array( *original." + attribs[i].getParamName() + ");\n");
                  }
                  else
                  {
                    writer.write("\t" + attribs[i].getParamName() + " = new " + attribs[i].getTypeName() + "_Array(*original." + attribs[i].getParamName() + ");\n");
                  }
                }
                else if (attribs[i].isAnyType())
                {
                    anyCounter++;
                    writer.write("\tif (original." + attribs[i].getParamName() + anyCounter + " != NULL)\n");
                  writer.write("\t{\n");
                  writer.write("\t\t" + attribs[i].getParamName() + anyCounter + " = new " + attribs[i].getTypeName() + "(*(original." + attribs[i].getParamName() + anyCounter + "));\n");
                  writer.write("\t}\n");
                  writer.write("\telse\n");
                  writer.write("\t{\n");
                  writer.write("\t\t" + attribs[i].getParamName() + anyCounter + " = NULL;\n");
                  writer.write("\t}\n");
                }
                else
                {
                    Type type = attribs[i].getType();
          boolean isPointerType = false;
          if (type.isSimpleType())
          {
              isPointerType = CUtils.isPointerType(CUtils.getclass4qname(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()))
                  {
                      writer.write("\t" + attribs[i].getParamName() + " = NULL;\n");
                      writer.write("\t__axis_deepcopy_" + attribs[i].getParamName() + " = false;\n");
                      String methodName = attribs[i].getParamNameWithoutSymbols();
                      if( methodName.endsWith( "_"))
                      {
                          String localMethodName = methodName.substring( 0, methodName.length() - 1);
                         
                          if( localMethodName.equals( classname))
                          {
                              methodName = localMethodName;
                          }
                      }
                      writer.write("\tset" + methodName + "(original." + attribs[i].getParamName() + ", original.__axis_deepcopy_" + attribs[i].getParamName() + ");\n\n");
                  }
                  else
                  {
                      if (attribs[i].isSimpleType())
                      {
                          writer.write("\t" + attribs[i].getParamName() + " = original." + attribs[i].getParamName() + ";\n");
                      }
                      else
                      {
                      writer.write("\tif (original." + attribs[i].getParamName() + " != NULL)\n");
                      writer.write("\t{\n");
                      writer.write("\t\t" + attribs[i].getParamName() + " = new " + attribs[i].getTypeName() + "(*(original." + attribs[i].getParamName() + "));\n");
                      writer.write("\t}\n");
                      writer.write("\telse\n");
                      writer.write("\t{\n");
                      writer.write("\t\t" + attribs[i].getParamName() + " = NULL;\n");
                      writer.write("\t}\n");
                      }
                    }
                }
            }
            writer.write("}\n");
            writeReset();
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }
   
    /*
   * (non-Javadoc)
   *
   * @see
   */
    protected void writeReset() throws WrapperFault
    {
        try
        {
            writer.write("\nvoid " + classname + "::reset()\n{\n");
            writer.write("\t/*do not allocate memory to any pointer members here\n\t because deserializer will allocate memory anyway. */\n");
           
            int anyCounter = 0;

            for (int i = 0; i < attribs.length; i++)
            {
                if (attribs[i].isArray())
                {
                  if (attribs[i].getChoiceElement()||attribs[i].getAllElement())
                  {
                      writer.write( "\t// This object is a 'choice' or 'all', so need to ensure that any\n");
                      writer.write( "\t// other objects belonging to this union of elements are empty.\n");
                      writer.write( "\t// NB: Hasn't been implemented yet!\n");

                      writer.write("\t" + attribs[i].getParamNameAsMember() + "->clear();\n");
                  }
                  else
                  {
                    writer.write("\t" + attribs[i].getParamNameAsMember() + "->clear();\n");
                  }
                }
                else if (!(attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()))
                {
                  if (attribs[i].isAnyType())
                    {
                      anyCounter += 1;
                      writer.write("\t" + attribs[i].getParamNameAsMember() + Integer.toString(anyCounter)
                                + "= NULL;\n");
                    }
                  else
                    {
                      writer.write("\t" + attribs[i].getParamNameAsMember()
                              + "= NULL;\n");
                  }
                }
                else if (isElementNillable(i) || isElementOptional(i) || attribs[i].getChoiceElement() || attribs[i].getAllElement())
                {
                    writer.write("\t" + attribs[i].getParamNameAsMember()
                            + " = NULL;\n");
                    writer.write("\t__axis_deepcopy_" + attribs[i].getParamName() + " = false;\n");
                }
                else
                {
                    Type type = attribs[i].getType();
          boolean isPointerType = false;
          if (type.isSimpleType())
          {
              isPointerType = CUtils.isPointerType(CUtils.getclass4qname(type.getBaseType()));
          }
          else
          {
              isPointerType = CUtils.isPointerType(attribs[i].getTypeName());
          }
                    if(isPointerType)
                    {
                        writer.write("\t"+ attribs[i].getParamNameAsMember() + " = NULL;\n");
                        writer.write("\t__axis_deepcopy_" + attribs[i].getParamName() + " = false;\n");
                    }
                }
            }
            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
        {
            if (type.isFault())
            {
                writer.write("\n" + classname + "::~" + classname + "() throw ()\n{\n");
            }
            else
            {
                writer.write("\n" + classname + "::~" + classname + "()\n{\n");
            }
           
            writer.write("\t/*delete any pointer and array members here*/\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.getclass4qname(type.getBaseType()));
        }
        else
        {
            isPointerType = CUtils.isPointerType(typename);
        }
               
              if(attribs[i].isArray())
                {
                    writer.write("\tif (" + name + "!= NULL)\n");
                    writer.write("\t{\n");
                    writer.write("\t\tdelete " + name + ";\n");
                    writer.write("\t\t" + name + " = NULL;\n");
                    writer.write("\t}\n");
              }
              else if (attribs[i].isAnyType())
                {
                anyCounter += 1;
                name = name + Integer.toString(anyCounter);
                writer.write("\tif ("+name+") \n\t{\n");
                writer.write("\t\tfor (int i=0; i<"+name+"->_size; i++)\n\t\t{\n");
                writer.write("\t\t\tif ("+name+"->_array[i]) delete [] "+name+"->_array[i];\n");
                writer.write("\t\t}\n");
                writer.write("\t\tdelete "+name+";\n");
                writer.write("\t}\n");
               
              }
              else if (!(attribs[i].isSimpleType() || attribs[i].getType().isSimpleType()))
                {
                    writer.write("\tif (" + name + "!= NULL)\n");
                    writer.write("\t{\n");
                    writer.write("\t\tdelete " + name + ";\n");
                    writer.write("\t\t" + name + " = NULL;\n");
                    writer.write("\t}\n");
                }
                else if (isPointerType || isElementNillable(i) || isElementOptional(i) || attribs[i].getChoiceElement() || attribs[i].getAllElement())
                {
                    // found pointer type
                    writer.write("\tif (" + name + " != NULL)\n");
                    writer.write("\t{\n");
                    writer.write("\t\tif(__axis_deepcopy_" + name + ")\n");
                    writer.write("\t\t{\n");
                    writer.write("\t\t\tdelete ");
                    if (isPointerType)
                    {
                        writer.write("[] ");
                    }
                    writer.write(name + ";\n");
                    writer.write("\t\t}\n");
                    writer.write("\t\t" + name + " = NULL;\n");
                    writer.write("\t}\n");
                }
            }
            writer.write("}\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    protected void writeRestrictionCheckerFunction() throws WrapperFault
    {
        try
        {
            writer.write("int Check_Restrictions_" + classname + "("
                    + classname + " value)\n");
           
            //TODO write code to check the restrictions.  FJP - Begun, but untested.
           
            writer.write("{\n");
           
            if( CUtils.isPointerType( CUtils.getclass4qname( type.getBaseType())))
            {
                writer.write( "// String type\n");
                writer.write( "// Number of " + classname + " elements = " + (type.getEnumerationdata().size() - 1) + "\n");
               
                Iterator i = type.getEnumerationdata().iterator();
                int iIndex = 0;
                BaseType baseTypeForArray = (BaseType) i.next();
               
                while( i.hasNext())
                {
                    if( iIndex == 0)
                    {
                        writer.write( "//\tif( ");
                    }
                    else
                    {
                        writer.write( " ||\n//\t    ");
                    }
                   
                    QName qnElement = (QName) i.next();
                   
                    writer.write( "!strcmp( value, " + classname+ "_" + qnElement.getNamespaceURI() + ")");
                   
                    iIndex++;
                }
               
                writer.write( "//)\n//\t{\n");
                writer.write( "//\t\treturn 1;\n");
                writer.write( "//\t}\n");
            }
            else
            {
                writer.write( "// Non-string type\n");
                writer.write( "// Number of " + classname + " enums = " + (type.getEnumerationdata().size() - 1) + "\n");
               
                Iterator i = type.getEnumerationdata().iterator();
                int iIndex = 0;
                BaseType baseTypeForArray = (BaseType) i.next();
               
                while( i.hasNext())
                {
                    if( iIndex == 0)
                    {
                        writer.write( "//\tif( ");
                    }
                    else
                    {
                        writer.write( " ||\n//\t    ");
                    }
                   
                    QName qnElement = (QName) i.next();
                   
                    writer.write( "value == ENUM" + classname.toUpperCase()+ "_" + qnElement.getNamespaceURI());
                   
                    iIndex++;
                }
               
                writer.write( "//)\n//\t{\n");
                writer.write( "//\t\treturn 1;\n");
                writer.write( "//\t}\n");
            }
           
            writer.write( "\n\treturn 0;\n");
            writer.write("}\n");
        }
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    protected File getFilePath(boolean useServiceName) throws WrapperFault
    {
        return null;
    }

    private boolean isNillable()
    {
        Iterator itForTypes = wscontext.getTypemap().getTypes().iterator();
        boolean nillable = false;

        while (itForTypes.hasNext() && !nillable)
        {
            Type aType = (Type) itForTypes.next();

            if (aType.getLanguageSpecificName().indexOf(">") > -1)
            {
                Iterator itForElemName = aType.getElementnames();

                while (itForElemName.hasNext() && !nillable)
                {
                    String key = (String) itForElemName.next();

                    if (aType.getElementForElementName(key).getNillable())
                    {
                        nillable = true;
                    }
                }
            }
        }

        return nillable;
    }

    private boolean isMoreThanOne()
    {
        Iterator itForTypes = wscontext.getTypemap().getTypes().iterator();
        boolean moreThanOne = false;

        while (itForTypes.hasNext() && !moreThanOne)
        {
            Type aType = (Type) itForTypes.next();

            if (aType.getLanguageSpecificName().indexOf(">") > -1)
            {
                Iterator itForElemName = aType.getElementnames();

                while (itForElemName.hasNext() && !moreThanOne)
                {
                    String key = (String) itForElemName.next();

                    if (aType.getElementForElementName(key).getNillable())
                    {
                        Iterator itForElementType = aType.getElementForElementName(key).getType().getElementnames();

                        while (itForElementType.hasNext())
                        {
                            String name = (String) itForElementType.next();

                            if ("count".equals(name))
                            {
                                moreThanOne = true;
                            }
                        }
                    }
                }
            }
        }

        return moreThanOne;
    }
}
TOP

Related Classes of org.apache.axis.wsdl.wsdl2ws.cpp.literal.BeanParamWriter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.