blob: 5d624dfffe3fc34193985a768114f8ef4f3f95c6 [file] [log] [blame]
/*
* 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.
*/
// !!! This include file must be first thing in file !!!
#include "../platforms/PlatformAutoSense.hpp"
#include "Attribute.h"
#include "SoapSerializer.h"
#include "../common/AxisTrace.h"
AXIS_CPP_NAMESPACE_START
Attribute::
Attribute(list<Attribute*> attribute)
{
if (!attribute.empty())
{
list<Attribute*>::iterator itAttributeList = attribute.begin();
while( itAttributeList != attribute.end())
{
m_PrefixList.push_back( (*itAttributeList)->getPrefix());
itAttributeList++;
}
}
}
Attribute::
~Attribute()
{
m_PrefixList.clear();
}
int Attribute::
setLocalName(const AxisChar* localname)
{
if (NULL==localname)
localname="";
m_localname= localname;
return AXIS_SUCCESS;
}
int Attribute::
setPrefix(const AxisChar* prefix)
{
if( NULL == prefix)
prefix = "";
if (!m_PrefixList.empty())
{
list<const char*>::iterator itPrefixList = m_PrefixList.begin();
while( itPrefixList != m_PrefixList.end())
{
if( !strcmp( (*itPrefixList), prefix))
return AXIS_FAIL;
else
itPrefixList++;
}
}
m_prefix = prefix;
return AXIS_SUCCESS;
}
int Attribute::
setURI(const AxisChar* uri)
{
if (NULL==uri)
uri="";
if(m_prefix != "")
{
bool bPrefixFound = false;
list<Namespace*>::iterator itCurrNamespaceDecl = m_namespaceDecls.begin();
while( itCurrNamespaceDecl != m_namespaceDecls.end() && !bPrefixFound)
{
if ( !(bPrefixFound = !strcmp( (*itCurrNamespaceDecl)->getURI(), uri)))
itCurrNamespaceDecl++;
}
if( bPrefixFound)
setPrefix((*itCurrNamespaceDecl)->getPrefix());
else
setPrefix(NULL);
}
m_uri= uri;
return AXIS_SUCCESS;
}
int Attribute::
setValue(const AxisChar* value)
{
if (NULL==value)
value="";
m_value= value;
return AXIS_SUCCESS;
}
const AxisChar* Attribute::
getLocalName()
{
return m_localname.c_str();
}
const AxisChar* Attribute::
getPrefix()
{
return m_prefix.c_str();
}
const AxisChar* Attribute::
getURI()
{
return m_uri.c_str();
}
const AxisChar* Attribute::
getValue()
{
return m_value.c_str();
}
Attribute::
Attribute(list<Attribute*> attribute,
const AxisChar* localname,
const AxisChar* prefix,
const AxisChar* uri,
const AxisChar* value)
{
m_localname= localname;
m_prefix= prefix;
m_uri= uri;
if (NULL==value)
m_value = "";
else
m_value= value;
if( (void *) &attribute != NULL && !attribute.empty())
{
list<Attribute*>::iterator itAttributeList = attribute.begin();
while( itAttributeList != attribute.end())
{
m_PrefixList.push_back( (*itAttributeList)->getPrefix());
itAttributeList++;
}
}
if( prefix != NULL && strlen( prefix) > 0)
m_PrefixList.push_back( prefix);
}
Attribute::
Attribute(list<Attribute*> attribute,
const AxisChar *localname,
const AxisChar *prefix,
const AxisChar *value)
{
m_localname= localname;
m_prefix= prefix;
m_uri= "";
if (NULL==value)
m_value = "";
else
m_value= value;
if( (void *) &attribute != NULL && !attribute.empty())
{
list<Attribute*>::iterator itAttributeList = attribute.begin();
while( itAttributeList != attribute.end())
{
m_PrefixList.push_back( (*itAttributeList)->getPrefix());
itAttributeList++;
}
}
if( prefix != NULL && strlen( prefix) > 0)
m_PrefixList.push_back( prefix);
}
Attribute::
Attribute(list<Attribute*> attribute, const Attribute& rCopy)
{
this->m_localname= rCopy.m_localname;
this->m_prefix= rCopy.m_prefix;
this->m_uri= rCopy.m_uri;
this->m_value= rCopy.m_value;
if (!attribute.empty())
{
list<Attribute*>::iterator itAttributeList = attribute.begin();
while( itAttributeList != attribute.end())
{
m_PrefixList.push_back( (*itAttributeList)->getPrefix());
itAttributeList++;
}
}
if( rCopy.m_prefix.length() > 0)
m_PrefixList.push_back( rCopy.m_prefix.c_str());
}
Attribute* Attribute::
clone()
{
return new Attribute(*this);
}
int Attribute::
serialize(SoapSerializer& pSZ) const
{
int intStatus= AXIS_FAIL;
if (isSerializable())
{
pSZ.serialize(" ", NULL);
if (!m_prefix.empty())
pSZ.serialize(m_prefix.c_str(), ":", NULL);
pSZ.serialize(m_localname.c_str(), "=", PLATFORM_DOUBLE_QUOTE_S, m_value.c_str(), PLATFORM_DOUBLE_QUOTE_S, NULL);
intStatus= AXIS_SUCCESS;
}
return intStatus;
}
int Attribute::
serialize(SoapSerializer& pSZ, list<AxisChar*>& lstTmpNameSpaceStack, const AxisChar *uri)
{
int intStatus= AXIS_FAIL;
if (isSerializable())
{
pSZ.serialize(" ", NULL);
// There should be no determination if a prefix exists or not, simply because a user
// can choose to add the namespace declaration to a node after the attribute has been
// added to the node.
if (m_prefix.compare("xmlns") == 0)
{
// Namespace declaration...this code could be eliminated since next if-check takes
// care of this, but it was thought it would be good to show that the prefix
// can really be a namespace declaration.
pSZ.serialize("xmlns:", m_localname.c_str(), "=", PLATFORM_DOUBLE_QUOTE_S, m_value.c_str(), PLATFORM_DOUBLE_QUOTE_S, NULL);
intStatus= AXIS_SUCCESS;
}
else if (!m_prefix.empty())
{
// If User has provided the prefix we just have to serialize. We will
// not worry to declare the namespace at all. Because it is the user's
// responsibility to add namespace declaration separately.
pSZ.serialize(m_prefix.c_str(), ":", m_localname.c_str(), "=", PLATFORM_DOUBLE_QUOTE_S, m_value.c_str(), PLATFORM_DOUBLE_QUOTE_S, NULL);
intStatus= AXIS_SUCCESS;
}
else
{
// User hasn't provided the prefix. So if there is a URI, do the following.
// - get the prefix from the Serializer
// - if this is a new namespace, then also declare the namespace.
if (!m_uri.empty())
{
bool blnIsNewNamespace = false;
m_prefix = pSZ.getNamespacePrefix(m_uri.c_str(), blnIsNewNamespace);
if (blnIsNewNamespace)
{
lstTmpNameSpaceStack.push_back((AxisChar*)m_uri.c_str());
pSZ.serialize("xmlns:", m_prefix.c_str(), "=", PLATFORM_DOUBLE_QUOTE_S, m_uri.c_str(), PLATFORM_DOUBLE_QUOTE_S, " ", NULL);
}
pSZ.serialize(m_prefix.c_str(), ":", NULL);
}
pSZ.serialize(m_localname.c_str(), "=", PLATFORM_DOUBLE_QUOTE_S, m_value.c_str(), PLATFORM_DOUBLE_QUOTE_S, NULL);
intStatus= AXIS_SUCCESS;
}
}
return intStatus;
}
bool Attribute::
isSerializable() const
{
bool bStatus= true;
if(m_localname.empty())
bStatus= false;
return bStatus;
}
#ifdef UNIT_TESTING_ON
int Attribute::initializeForTesting()
{
m_prefix = "pr";
m_localname = "age";
m_uri = "http://myurl.com";
m_value = "25";
return AXIS_SUCCESS;
}
#endif
AXIS_CPP_NAMESPACE_END