blob: decf4ae2cf4f44e5cdc61655d4c4d191fd8005ab [file] [log] [blame]
/*
* Copyright 2003-2004 The Apache Software Foundation.
*
* 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.
*/
/*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*
*
*
* @author Roshan Weerasuriya (roshanw@jkcsworld.com, roshan@opensource.lk)
* @author Samisa Abeysinghe (sabeysinghe@virtusa.com)
*
*/
/*
* Revision 1.1 2004/05/25 samisa
* Added copy constructure and clone for copy constructing derived classes
*/
/*
* Revision 1.2 2004/07/01 roshan
* Added code to addChild(BasicNode *pBasicNode) method to deal with NULL
* values.
*/
/* ComplexElement.cpp: implementation of the ComplexElement class. */
#include "ComplexElement.h"
#include "SoapSerializer.h"
#include <axis/server/GDefine.h>
ComplexElement::ComplexElement()
{
m_pachPrefix = '\0';
m_pachLocalName = '\0';
m_pachURI = '\0';
m_iNodeType= ELEMENT_NODE;
iNoOfChildren = 0;
}
ComplexElement::ComplexElement(AxisChar *pachLocalName, AxisChar *pachPrefix,
AxisChar *pachUri)
{
m_pachLocalName = (AxisChar*) malloc(strlen(pachLocalName)+1);
strcpy(m_pachLocalName, pachLocalName);
m_pachPrefix = (AxisChar*) malloc(strlen(pachPrefix)+1);
strcpy(m_pachPrefix, pachPrefix);
m_pachURI = (AxisChar*) malloc(strlen(pachUri)+1);
strcpy(m_pachURI, pachUri);
}
ComplexElement::ComplexElement(const ComplexElement& rCopy)
:BasicNode(rCopy), m_pachPrefix(NULL), m_pachLocalName(NULL), m_pachURI(NULL)
{
this->iNoOfChildren = rCopy.iNoOfChildren;
list<BasicNode*>::const_iterator itCurrBasicNode= rCopy.m_children.begin();
while(itCurrBasicNode != rCopy.m_children.end())
{
this->m_children.push_back((*itCurrBasicNode)->clone());
itCurrBasicNode++;
}
if(rCopy.m_pachPrefix)
this->m_pachPrefix = strdup(rCopy.m_pachPrefix);
if(rCopy.m_pachLocalName)
this->m_pachLocalName = strdup(rCopy.m_pachLocalName);
if(rCopy.m_pachURI)
this->m_pachURI = strdup(rCopy.m_pachURI);
}
BasicNode* ComplexElement::clone()
{
return new ComplexElement(*this);
}
ComplexElement::~ComplexElement()
{
free(m_pachPrefix);
free(m_pachLocalName);
free(m_pachURI);
/* Clear the children */
list<BasicNode*>::iterator itCurrChild= m_children.begin();
while(itCurrChild != m_children.end())
{
delete (*itCurrChild);
itCurrChild++;
}
m_children.clear();
}
int ComplexElement::setPrefix(const AxisChar* pachPrefix)
{
m_pachPrefix = (AxisChar*) malloc(strlen(pachPrefix)+1);
strcpy(m_pachPrefix, pachPrefix);
return AXIS_SUCCESS;
}
int ComplexElement::setLocalName(const AxisChar* pachLocalName)
{
m_pachLocalName = (AxisChar*) malloc(strlen(pachLocalName)+1);
strcpy(m_pachLocalName, pachLocalName);
return AXIS_SUCCESS;
}
int ComplexElement::addChild(BasicNode *pBasicNode)
{
if (pBasicNode)
{
m_children.push_back(pBasicNode);
iNoOfChildren++;
return AXIS_SUCCESS;
}
else
{
return AXIS_FAIL;
}
}
int ComplexElement::serialize(SoapSerializer& pSZ)
{
int iStatus= AXIS_SUCCESS;
do
{
if(isSerializable())
{
pSZ.serialize("<", NULL);
if(strlen(m_pachPrefix) != 0)
{
pSZ.serialize(m_pachPrefix, ":", NULL);
}
pSZ.serialize(m_pachLocalName, NULL);
if((strlen(m_pachPrefix) != 0) && (strlen(m_pachURI) != 0))
{
pSZ.serialize(" xmlns:", m_pachPrefix, "=\"", m_pachURI, "\"",
NULL);
}
pSZ.serialize(">", NULL);
iStatus= serializeChildren(pSZ);
if(iStatus==AXIS_FAIL)
{
break;
}
pSZ.serialize("</", NULL);
if(strlen(m_pachPrefix) != 0)
{
pSZ.serialize(m_pachPrefix, ":", NULL);
}
pSZ.serialize(m_pachLocalName, ">", NULL);
iStatus= AXIS_SUCCESS;
}
else
{
iStatus= AXIS_FAIL;
}
} while(0);
return iStatus;
}
int ComplexElement::serialize(SoapSerializer& pSZ,
list<AxisChar*>& lstTmpNameSpaceStack)
{
int iStatus= AXIS_SUCCESS;
do
{
if(isSerializable())
{
bool blnIsNewNamespace = false;
pSZ.serialize("<", NULL);
if( (m_pachPrefix != NULL) && (strlen(m_pachPrefix) != 0))
{
pSZ.serialize(m_pachPrefix, ":", NULL);
}
else if ( (m_pachURI != NULL) && (strlen(m_pachURI) != 0))
{
const AxisChar* pachTmp = pSZ.getNamespacePrefix(m_pachURI,
blnIsNewNamespace);
m_pachPrefix = (AxisChar*) malloc(strlen(pachTmp)+1);
strcpy(m_pachPrefix , pachTmp);
if (blnIsNewNamespace)
{
lstTmpNameSpaceStack.push_back(m_pachURI);
}
pSZ.serialize(m_pachPrefix, ":", NULL);
}
pSZ.serialize(m_pachLocalName, NULL);
if(((m_pachPrefix != NULL) && (strlen(m_pachPrefix) != 0)) &&
( (m_pachURI != NULL) && (strlen(m_pachURI) != 0)) &&
(blnIsNewNamespace))
{
pSZ.serialize(" xmlns:", m_pachPrefix, "=\"", m_pachURI, "\"",
NULL);
}
pSZ.serialize(">", NULL);
iStatus= serializeChildren(pSZ, lstTmpNameSpaceStack);
if(iStatus==AXIS_FAIL)
{
break;
}
pSZ.serialize("</", NULL);
if((m_pachPrefix!=NULL) && (strlen(m_pachPrefix) != 0))
{
pSZ.serialize(m_pachPrefix, ":", NULL);
}
pSZ.serialize(m_pachLocalName, ">", NULL);
iStatus= AXIS_SUCCESS;
}
else
{
iStatus= AXIS_FAIL;
}
} while(0);
return iStatus;
}
bool ComplexElement::isSerializable()
{
bool bStatus= true;
do
{
if(strlen(m_pachLocalName) == 0)
{
bStatus= false;
break;
}
}while(0);
return bStatus;
}
int ComplexElement::setURI(const AxisChar* pachURI)
{
m_pachURI = (AxisChar*) malloc(strlen(pachURI)+1);
strcpy(m_pachURI, pachURI);
return AXIS_SUCCESS;
}
int ComplexElement::serializeChildren(SoapSerializer& pSZ)
{
list<BasicNode*>::iterator itCurrBasicNode= m_children.begin();
while(itCurrBasicNode != m_children.end())
{
(*itCurrBasicNode)->serialize(pSZ);
itCurrBasicNode++;
}
return AXIS_SUCCESS;
}
int ComplexElement::serializeChildren(SoapSerializer& pSZ,
list<AxisChar*>& lstTmpNameSpaceStack)
{
list<BasicNode*>::iterator itCurrBasicNode= m_children.begin();
while(itCurrBasicNode != m_children.end())
{
if ((*itCurrBasicNode)->getNodeType() == ELEMENT_NODE)
{
(*itCurrBasicNode)->serialize(pSZ, lstTmpNameSpaceStack);
}
else
{
/* for CHARACTER_NODE */
(*itCurrBasicNode)->serialize(pSZ);
}
itCurrBasicNode++;
}
return AXIS_SUCCESS;
}
NODE_TYPE ComplexElement::getNodeType() const
{
return m_iNodeType;
}
const BasicNode* ComplexElement::getFirstChild() const
{
list<BasicNode*>::const_iterator itCurrChild= m_children.begin();
if (itCurrChild != m_children.end())
{
return (*itCurrChild);
}
return NULL;
}
const BasicNode* ComplexElement::getLastChild() const
{
list<BasicNode*>::const_reverse_iterator ritCurrChild= m_children.rbegin();
if (ritCurrChild != m_children.rend())
{
return (*ritCurrChild);
}
return NULL;
}
const BasicNode* ComplexElement::getChild(int iChildPosition) const
{
if (iChildPosition > iNoOfChildren)
{
return NULL;
}
else
{
list<BasicNode*>::const_iterator itCurrChild= m_children.begin();
/* The following is done since the previous line already takes the
* iterator one step forward
*/
iChildPosition--;
/* Takes the iterator to the relavent positon */
for (int i=0; i<iChildPosition; i++)
{
itCurrChild++;
}
if (itCurrChild != m_children.end())
{
return *itCurrChild;
}
else
{
return NULL;
}
}
}
int ComplexElement::getNoOfChildren()
{
return iNoOfChildren;
}