blob: 77ba67a2e302e1c89b7cd5acb72ba29988584d5a [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.
*
* @author Sanjaya Singharage
* @author Susantha Kumara (skumara@virtusa.com, susantha@opensource.lk)
*
*/
// !!! This include file must be first thing in file !!!
#include "../platforms/PlatformAutoSense.hpp"
#include "WSDDService.h"
#include "../common/AxisTrace.h"
AXIS_CPP_NAMESPACE_START
WSDDService::WSDDService()
{
m_RequestHandlers = NULL;
m_ResponseHandlers = NULL;
m_Provider = UNKNOWN_PROVIDER;
}
WSDDService::~WSDDService()
{
WSDDHandlerList::iterator iter;
if(m_RequestHandlers)
{
for(iter=m_RequestHandlers->begin();iter!=m_RequestHandlers->end();
iter++)
{
delete (*iter);
}
delete m_RequestHandlers;
}
if(m_ResponseHandlers)
{
for(iter=m_ResponseHandlers->begin();iter!=m_ResponseHandlers->end();
iter++)
{
delete (*iter);
}
delete m_ResponseHandlers;
}
}
void WSDDService::setProvider(const AxisChar* sProvider)
{
if (0 == strcmp(sProvider, "CPP:RPC"))
{
m_Provider = CPP_RPC_PROVIDER;
}
else if (0 == strcmp(sProvider, "C:RPC"))
{
m_Provider = C_RPC_PROVIDER;
}
else if (0 == strcmp(sProvider, "CPP:DOCUMENT"))
{
m_Provider = CPP_DOC_PROVIDER;
}
else if (0 == strcmp(sProvider, "C:DOCUMENT"))
{
m_Provider = C_DOC_PROVIDER;
}
else if (0 == strcmp(sProvider, "MS:COM"))
{
m_Provider = COM_PROVIDER;
}
else
{
m_Provider = UNKNOWN_PROVIDER;
}
}
PROVIDERTYPE WSDDService::getProvider() const
{
return m_Provider;
}
const AxisChar* WSDDService::getServiceName() const
{
return m_sName.c_str();
}
void WSDDService::addAllowedMethod(const AxisChar* sMethodName)
{
m_AllowedMethods.push_back(sMethodName);
}
bool WSDDService::isAllowedMethod(const AxisChar* sServiceName) const
{
if (m_AllowedMethods.size() == 0) //no allowedMethods mentioned in wsdd, hence assume all are allowed
return true; // assume that the method is allowd if allowedMethods missing
list<AxisString>::const_iterator iter;
iter = m_AllowedMethods.begin();
if ((*iter) == "*")
{
return true;
}
for(iter = m_AllowedMethods.begin();iter != m_AllowedMethods.end();iter++)
{
if((*iter) == sServiceName)
{
return true;
}
}
return false;
}
const WSDDHandlerList* WSDDService::getRequestFlowHandlers() const
{
return m_RequestHandlers;
}
const WSDDHandlerList* WSDDService::getResponseFlowHandlers() const
{
return m_ResponseHandlers;
}
void WSDDService::addAllowedRole(const AxisChar* sRole)
{
m_AllowedRoles.push_back(sRole);
}
const list<AxisString>& WSDDService::getAllowedRoles()
{
return m_AllowedRoles;
}
void WSDDService::addHandler(bool bRequestFlow, WSDDHandler* pHandler)
{
if (bRequestFlow)
{
if (!m_RequestHandlers) m_RequestHandlers = new WSDDHandlerList;
m_RequestHandlers->push_back(pHandler);
}
else
{
if (!m_ResponseHandlers) m_ResponseHandlers = new WSDDHandlerList;
m_ResponseHandlers->push_back(pHandler);
}
}
/*
* This method removes the service specific handler of this service. But the entry
* in WSDDDeployment's <LibId, LibName> is not removed because the same handler may
* be in use by other services.
*/
int WSDDService::removeHandler(bool bRequestFlow, WSDDHandler* pHandler)
{
WSDDHandlerList* pTempList =
bRequestFlow ? m_RequestHandlers : m_ResponseHandlers;
if (!pTempList) return AXIS_NO_SUCH_HANDLER;
for (WSDDHandlerList::iterator itr = pTempList->begin();
itr != pTempList->end(); itr++)
{
if (strcmp((*itr)->getLibName(), pHandler->getLibName()) == 0)
{
pTempList->remove(*itr);
delete (*itr);
delete pHandler;
return AXIS_SUCCESS;
}
}
return AXIS_NO_SUCH_HANDLER;
}
const list<AxisString> WSDDService::getAllowedMethods() const
{
return m_AllowedMethods;
}
int WSDDService::updateWSDD(FILE* wsddfile, int tabcount)
{
m_file = wsddfile;
printTabs(tabcount); *this << "<service name=\"" <<
m_sName.c_str() << "\" provider=\"" << getProviderString() <<
"\" description=\"" << m_sDescription.c_str() << "\">\n";
if (m_Params)
{
map<AxisString, AxisString>::iterator itr;
for (itr = m_Params->begin(); itr != m_Params->end(); itr++)
{
printTabs(tabcount+1); *this << "<parameter name=\"" <<
(*itr).first.c_str() << "\" value=\"" <<
(*itr).second.c_str() << "\" />";
}
}
WSDDHandlerList::iterator iter;
if(m_RequestHandlers)
{
*this << "\t\t<requestFlow>\n";
for(iter=m_RequestHandlers->begin(); iter!=m_RequestHandlers->end();
iter++)
{
(*iter)->updateWSDD(wsddfile, 3);
}
*this << "\t\t</requestFlow>\n";
}
if(m_ResponseHandlers)
{
*this << "\t\t<responseFlow>\n";
for(iter=m_ResponseHandlers->begin(); iter!=m_ResponseHandlers->end();
iter++)
{
(*iter)->updateWSDD(wsddfile, 3);
}
*this << "\t\t</responseFlow>\n";
}
printTabs(tabcount+1); *this <<
"<parameter name=\"allowedMethods\" value=\"";
/* for looop */
for (list<AxisString>::iterator itrs = m_AllowedMethods.begin();
itrs != m_AllowedMethods.end(); itrs++)
{
*this << (*itrs).c_str() << " ";
}
*this << "\"/>\n";
printTabs(tabcount+1); *this << "<parameter name=\"className\" value=\""
<< m_sLibName.c_str();
*this << "\" />\n";
printTabs(tabcount); *this << "</service>\n";
m_file = 0;
return AXIS_SUCCESS;
}
const char* WSDDService::getProviderString()
{
switch(m_Provider)
{
case C_RPC_PROVIDER: return "C:RPC";
case C_DOC_PROVIDER: return "C:DOCUMENT";
case CPP_RPC_PROVIDER: return "CPP:RPC";
case CPP_DOC_PROVIDER: return "CPP:DOCUMENT";
case COM_PROVIDER: return "COM";
default: return "unknown";
}
return 0;
}
AXIS_CPP_NAMESPACE_END