blob: 703f422670acf67145f36b5209065dc9a54f012b [file] [log] [blame]
/* -*- C++ -*- */
/*
* 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 Susantha Kumara (skumara@virtusa.com)
*
*/
// !!! This include file must be first thing in file !!!
#include "../platforms/PlatformAutoSense.hpp"
#include <axis/AxisException.hpp>
#include "HandlerPool.h"
#include "AppScopeHandlerPool.h"
#include "RequestScopeHandlerPool.h"
#include "SessionScopeHandlerPool.h"
#include "../wsdd/WSDDDeployment.h"
#include "../common/AxisTrace.h"
extern AXIS_CPP_NAMESPACE_PREFIX AppScopeHandlerPool* g_pAppScopeHandlerPool;
extern AXIS_CPP_NAMESPACE_PREFIX RequestScopeHandlerPool* g_pRequestScopeHandlerPool;
extern AXIS_CPP_NAMESPACE_PREFIX SessionScopeHandlerPool* g_pSessionScopeHandlerPool;
extern AXIS_CPP_NAMESPACE_PREFIX WSDDDeployment* g_pWSDDDeployment;
AXIS_CPP_NAMESPACE_START
HandlerPool::
HandlerPool ()
{
}
HandlerPool::
~HandlerPool ()
{
logEntryEngine("HandlerPool::~HandlerPool")
for (list <HandlerChain*>::iterator it = m_ChainStore.begin (); it != m_ChainStore.end (); it++)
{
delete (*it);
}
logExit()
}
int HandlerPool::
getHandler (BasicHandler** ppHandler, string & sSessionId, int nScope, int nLibId)
{
logEntryEngine("HandlerPool::getHandler")
*ppHandler = NULL;
int Status = AXIS_FAIL;
switch (nScope)
{
case AH_APPLICATION:
do
{
Status = g_pAppScopeHandlerPool->getInstance (ppHandler, nLibId);
if (AXIS_SUCCESS == Status)
break;
else if (Status == SERVER_ENGINE_HANDLER_BEING_USED)
{
//block this thread not this object
PLATFORM_SLEEP(0);
}
else
break;
}
while (Status == SERVER_ENGINE_HANDLER_BEING_USED);
break;
case AH_SESSION:
Status = g_pSessionScopeHandlerPool->getInstance (sSessionId, ppHandler, nLibId);
break;
case AH_REQUEST:
Status = g_pRequestScopeHandlerPool->getInstance (ppHandler, nLibId);
break;
}
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
poolHandler (string &sSessionId, BasicHandler* pHandler, int nScope, int nLibId, bool bWebService)
{
logEntryEngine("HandlerPool::poolHandler")
switch (nScope)
{
case AH_APPLICATION:
g_pAppScopeHandlerPool->putInstance (pHandler, nLibId);
break;
case AH_SESSION:
g_pSessionScopeHandlerPool->putInstance (sSessionId, pHandler, nLibId);
break;
case AH_REQUEST:
g_pRequestScopeHandlerPool->putInstance (pHandler, nLibId, bWebService);
break;
}
logExitWithReturnCode(AXIS_SUCCESS)
return AXIS_SUCCESS;
}
int HandlerPool::
getGlobalRequestFlowHandlerChain (HandlerChain** ppChain, string & sSessionId)
{
logEntryEngine("HandlerPool::getGlobalRequestFlowHandlerChain")
int Status = AXIS_SUCCESS;
const WSDDHandlerList* pHandlerList = g_pWSDDDeployment->getGlobalRequestFlowHandlers ();
if (pHandlerList)
Status = getHandlerChain (sSessionId, ppChain, pHandlerList);
else
*ppChain = NULL;
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
getGlobalResponseFlowHandlerChain (HandlerChain** ppChain, string &sSessionId)
{
logEntryEngine("HandlerPool::getGlobalResponseFlowHandlerChain")
int Status = AXIS_SUCCESS;
const WSDDHandlerList *pHandlerList = g_pWSDDDeployment->getGlobalResponseFlowHandlers ();
if (pHandlerList)
Status = getHandlerChain (sSessionId, ppChain, pHandlerList);
else
*ppChain = NULL;
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
getTransportRequestFlowHandlerChain (HandlerChain** ppChain, string &sSessionId, AXIS_PROTOCOL_TYPE Protocol)
{
logEntryEngine("HandlerPool::getTransportRequestFlowHandlerChain")
int Status = AXIS_SUCCESS;
const WSDDHandlerList* pHandlerList = g_pWSDDDeployment->getTransportRequestFlowHandlers (Protocol);
if (pHandlerList)
Status = getHandlerChain (sSessionId, ppChain, pHandlerList);
else
*ppChain = NULL;
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
getTransportResponseFlowHandlerChain (HandlerChain** ppChain, string & sSessionId, AXIS_PROTOCOL_TYPE Protocol)
{
logEntryEngine("HandlerPool::getTransportResponseFlowHandlerChain")
int Status = AXIS_SUCCESS;
const WSDDHandlerList* pHandlerList = g_pWSDDDeployment->getTransportResponseFlowHandlers (Protocol);
if (pHandlerList)
Status = getHandlerChain (sSessionId, ppChain, pHandlerList);
else
*ppChain = NULL;
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
getRequestFlowHandlerChain (HandlerChain** ppChain, string &sSessionId, const WSDDService* pService)
{
logEntryEngine("HandlerPool::getRequestFlowHandlerChain")
int Status = AXIS_SUCCESS;
const WSDDHandlerList* pHandlerList = pService->getRequestFlowHandlers ();
if (pHandlerList)
Status = getHandlerChain (sSessionId, ppChain, pHandlerList);
else
*ppChain = NULL;
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
getResponseFlowHandlerChain (HandlerChain** ppChain, string &sSessionId, const WSDDService* pService)
{
logEntryEngine("HandlerPool::getResponseFlowHandlerChain")
int Status = AXIS_SUCCESS;
const WSDDHandlerList* pHandlerList = pService->getResponseFlowHandlers ();
if (pHandlerList)
Status = getHandlerChain (sSessionId, ppChain, pHandlerList);
else
*ppChain = NULL;
logExitWithReturnCode(Status)
return Status;
}
int HandlerPool::
getHandlerChain (string &sSessionId, HandlerChain** ppChain, const WSDDHandlerList* pHandlerList)
{
logEntryEngine("HandlerPool::getHandlerChain")
Lock l(this);
*ppChain = NULL;
HandlerChain* pChain = NULL;
// check m_ChainStore to get a HandlerChain
if (!m_ChainStore.empty ())
{
pChain = m_ChainStore.front ();
m_ChainStore.pop_front ();
pChain->init ();
}
else
pChain = new HandlerChain ();
WSDDHandler* pWSDDH = NULL;
BasicHandler* pBH = NULL;
int Status = AXIS_SUCCESS;
for (WSDDHandlerList::const_iterator it = pHandlerList->begin (); it != pHandlerList->end (); it++)
{
pWSDDH = (*it);
if ((Status = getHandler (&pBH, sSessionId, pWSDDH->getScope (), pWSDDH->getLibId ())) == AXIS_SUCCESS)
{
if (0 != pBH->_functions)
{
/* C Handler */
}
else if (0 != pBH->_object)
{
if (NORMAL_HANDLER == ((Handler*) (pBH->_object))->getType ())
{
((Handler*) (pBH->_object))-> setOptionList (pWSDDH->getParameterList ());
pChain->addHandler (pBH, pWSDDH->getScope (), pWSDDH->getLibId ());
}
else
{
Status = SERVER_ENGINE_WRONG_HANDLER_TYPE;
break;
}
}
}
else
break;
}
if (Status != AXIS_SUCCESS) //some failure so undo whatever done here
{
string nosession = SESSIONLESSHANDLERS;
for (pChain->m_itCurrHandler = pChain->m_HandlerList.begin ();
pChain->m_itCurrHandler != pChain->m_HandlerList.end ();
pChain->m_itCurrHandler++)
{
if ((*pChain->m_itCurrHandler).m_pHandler != NULL)
{
poolHandler (nosession, (*pChain->m_itCurrHandler).m_pHandler,
(*pChain->m_itCurrHandler).m_nScope,
(*pChain->m_itCurrHandler).m_nLibId);
}
}
pChain->fini ();
m_ChainStore.push_back (pChain);
}
else
*ppChain = pChain;
logExitWithReturnCode(Status)
return Status;
}
void HandlerPool::
poolHandlerChain (HandlerChain* pChain, string &sSessionId)
{
logEntryEngine("HandlerPool::poolHandlerChain")
for (pChain->m_itCurrHandler = pChain->m_HandlerList.begin ();
pChain->m_itCurrHandler != pChain->m_HandlerList.end ();
pChain->m_itCurrHandler++)
{
if ((*pChain->m_itCurrHandler).m_pHandler != NULL)
{
poolHandler (sSessionId, (*pChain->m_itCurrHandler).m_pHandler,
(*pChain->m_itCurrHandler).m_nScope,
(*pChain->m_itCurrHandler).m_nLibId);
}
}
pChain->fini ();
Lock l(this);
m_ChainStore.push_back (pChain);
logExit()
}
int HandlerPool::
getWebService( BasicHandler ** ppHandler, string & sSessionId, const WSDDHandler * pService)
{
logEntryEngine("HandlerPool::getWebService")
int Status = getHandler( ppHandler, sSessionId, pService->getScope(), pService->getLibId());
if( Status == AXIS_SUCCESS)
{
if( NULL != (*ppHandler)->_functions)
// C web service
{
/*if (AXIS_SUCCESS !=
(Status =
(*ppHandler)->_functions->init ((*ppHandler)->_object)))
{
(*ppHandler)->_functions->fini ((*ppHandler)->_object);
poolHandler (sSessionId, *ppHandler, pService->getScope (),
pService->getLibId ());
*ppHandler = NULL;
}*/
}
else if( NULL == (*ppHandler)->_object)
{
Status = AXIS_FAIL;
}
else
// C++ web service
{
/*if (AXIS_SUCCESS !=
(Status =
((HandlerBase *) (*ppHandler)->_object)->init ()))
{
((HandlerBase *) (*ppHandler)->_object)->fini ();
poolHandler (sSessionId, *ppHandler, pService->getScope (),
pService->getLibId ());
*ppHandler = NULL;
}*/
}
}
logExitWithReturnCode(Status)
return Status;
}
void HandlerPool::
poolWebService (string &sSessionId, BasicHandler* pHandler, const WSDDHandler * pHandlerInfo)
{
logEntryEngine("HandlerPool::poolWebService")
poolHandler (sSessionId, pHandler, pHandlerInfo->getScope (), pHandlerInfo->getLibId (), true);
logExit()
}
AXIS_CPP_NAMESPACE_END