You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by su...@apache.org on 2003/08/13 16:07:47 UTC

cvs commit: xml-axis/c/src/engine SharedObject.h SharedObject.cpp SessionScopeHandlerPool.h SessionScopeHandlerPool.cpp SerializerPool.h SerializerPool.cpp RequestScopeHandlerPool.h RequestScopeHandlerPool.cpp DeserializerPool.h DeserializerPool.cpp AppScopeHandlerPool.h AppScopeHandlerPool.cpp Main.c HandlerPool.h HandlerPool.cpp HandlerLoader.h HandlerLoader.cpp HandlerChain.h HandlerChain.cpp AxisEngine.h AxisEngine.cpp Axis.cpp

susantha    2003/08/13 07:07:47

  Modified:    c/src/engine Main.c HandlerPool.h HandlerPool.cpp
                        HandlerLoader.h HandlerLoader.cpp HandlerChain.h
                        HandlerChain.cpp AxisEngine.h AxisEngine.cpp
                        Axis.cpp
  Added:       c/src/engine SharedObject.h SharedObject.cpp
                        SessionScopeHandlerPool.h
                        SessionScopeHandlerPool.cpp SerializerPool.h
                        SerializerPool.cpp RequestScopeHandlerPool.h
                        RequestScopeHandlerPool.cpp DeserializerPool.h
                        DeserializerPool.cpp AppScopeHandlerPool.h
                        AppScopeHandlerPool.cpp
  Log:
  After making code base thread safe. Also changed Module writing API accordingly. WSDD module too improved.
  
  Revision  Changes    Path
  1.6       +13 -12    xml-axis/c/src/engine/Main.c
  
  Index: Main.c
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/Main.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Main.c	5 Aug 2003 12:28:09 -0000	1.5
  +++ Main.c	13 Aug 2003 14:07:47 -0000	1.6
  @@ -68,10 +68,10 @@
   #include <malloc.h>
   #include "../common/Packet.h"
   
  -extern int process_request(soapstream *);
  +extern int process_request(Ax_soapstream *str);
   
   //soap request with headers
  -char* ip = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope \
  +//char* ip = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope \
   			xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" \
   			xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \
   			xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"> \
  @@ -79,7 +79,7 @@
   			soapenv:mustUnderstand=\"true\" >Hello Req Header Val</t:Transaction></soapenv:Header> \
   			<soapenv:Body><add soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><op1 xsi:type=\"xsd:int\">3</op1><op2 xsi:type=\"xsd:int\">4</op2></add></soapenv:Body></soapenv:Envelope>";
   
  -//char* ip = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><add soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><op1 xsi:type=\"xsd:int\">3</op1><op2 xsi:type=\"xsd:int\">4</op2></add></soapenv:Body></soapenv:Envelope>";
  +char* ip = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><add soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><op1 xsi:type=\"xsd:int\">3</op1><op2 xsi:type=\"xsd:int\">4</op2></add></soapenv:Body></soapenv:Envelope>";
   
   //	char* ip = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><echo soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><op1 xsi:type=\"xsd:string\">Hello World!</op1></echo></soapenv:Body></soapenv:Envelope>";
   
  @@ -181,26 +181,27 @@
   		</Point>\
   		</enc:Array> </EchoPointArray></soapenv:Body></soapenv:Envelope>";
   
  -int main() {	
  -	
  -	soapstream* str = (soapstream*)malloc(sizeof(soapstream));
  +int main() 
  +{		
  +	Ax_soapstream* str = (Ax_soapstream*)malloc(sizeof(Ax_soapstream));
   	str->trtype = APTHTTP;
  +	str->sessionid = "somesessionid";
  +	str->so.http.ip_method = AXIS_HTTP_POST;
   
  -	str->so.http.ip_method=POST;
  -
  -	str->so.http.ip_headers = (header*)malloc(sizeof(header));
  +	str->so.http.ip_headers = (Ax_header*)malloc(sizeof(Ax_header));
   	str->so.http.ip_headers->headername = SOAPACTIONHEADER;
  -	str->so.http.ip_headers->headervalue = "\"Maths\"";	
  +	str->so.http.ip_headers->headervalue = "\"CalculatorService\"";	
   	str->so.http.ip_headercount = 1;
   
   	printf("soap request :\n %s\n", ip);
   
  +	initialize_module();
   	process_request(str);	
   
   	return 0;
   }
   
  -int send_response_bytes(char * res) {
  +int send_response_bytes(char * res, void* pOutputStream) {
   
   	printf("sending SOAP response : \n%s\n", res);
   
  @@ -218,7 +219,7 @@
   	return 0;
   }
   
  -int send_transport_information(soapstream* sSoapstream) {
  +int send_transport_information(Ax_soapstream* sSoapstream) {
   
   	return 0;
   }
  
  
  
  1.2       +18 -40    xml-axis/c/src/engine/HandlerPool.h
  
  Index: HandlerPool.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/HandlerPool.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HandlerPool.h	25 Jun 2003 05:13:45 -0000	1.1
  +++ HandlerPool.h	13 Aug 2003 14:07:47 -0000	1.2
  @@ -64,6 +64,7 @@
   // HandlerPool.h: interface for the HandlerPool class.
   //
   //////////////////////////////////////////////////////////////////////
  +#pragma warning (disable : 4503)
   
   #if !defined(AFX_HANDLERPOOL_H__6C2A4C96_7115_43C6_9EFA_CDAC9247D109__INCLUDED_)
   #define AFX_HANDLERPOOL_H__6C2A4C96_7115_43C6_9EFA_CDAC9247D109__INCLUDED_
  @@ -77,8 +78,9 @@
   #include "../common/BasicHandler.h"
   #include "HandlerLoader.h"
   #include "HandlerChain.h"
  +#include "SharedObject.h"
   
  -#include <map>
  +#include <list>
   #include <string>
   
   using namespace std;
  @@ -87,52 +89,28 @@
    *
    *
    */
  -class HandlerPool  
  +class HandlerPool : protected SharedObject
   {
   private:
  -	class LoadedHandler {
  -	public:
  -		HandlerLoader* m_DL;
  -		BasicHandler* m_Handler;
  -		LoadedHandler(string &sFile, int nOptions=0);
  -		~LoadedHandler();
  -	};
  +	int GetHandler(BasicHandler** ppHandler, string& sSessionId, int nScope, int nLibId);
  +	int PoolHandler(string& sSessionId, BasicHandler* pHandler, int nScope, int nLibId);
  +	int GetHandlerChain(string& sSessionId, HandlerChain** pChain, const WSDDHandlerList* pHandlerList);
   public:
  -	void UnloadWebService(WSDDService* pService);
  -	BasicHandler* LoadWebService(WSDDService* pService);
  -	void UnLoadServiceRequestFlowHandlers(WSDDHandlerList *pHandlerList);
  -	void UnLoadServiceResponseFlowHandlers(WSDDHandlerList *pHandlerList);
  -	int LoadServiceResponseFlowHandlers(WSDDHandlerList* pHandlerList);
  -	int LoadServiceRequestFlowHandlers(WSDDHandlerList* pHandlerList);
  -	HandlerChain* GetTransportRequestFlowHandlerChain(AXIS_PROTOCOL_TYPE Protocol);
  -	HandlerChain* GetTransportResponseFlowHandlerChain(AXIS_PROTOCOL_TYPE Protocol);
  -	HandlerChain* GetGlobalResponseFlowHandlerChain();
  -	HandlerChain* GetGlobalRequestFlowHandlerChain();
  -	HandlerChain* GetServiceRequestFlowHandlerChain();
  -	HandlerChain* GetServiceResponseFlowHandlerChain();
  -	//Following will load handlers and keep them in private members.
  -	int LoadTransportRequestFlowHandlers(AXIS_PROTOCOL_TYPE Protocol, WSDDHandlerList* pHandlerList);
  -	int LoadTransportResponseFlowHandlers(AXIS_PROTOCOL_TYPE Protocol, WSDDHandlerList* pHandlerList);
  -	int LoadGlobalResponseFlowHandlers(WSDDHandlerList* pHandlerList);
  -	int LoadGlobalRequestFlowHandlers(WSDDHandlerList* pHandlerList);
  +	int GetGlobalRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId);
  +	int GetGlobalResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId);
  +	int GetTransportRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, AXIS_PROTOCOL_TYPE Protocol);
  +	int GetTransportResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, AXIS_PROTOCOL_TYPE Protocol);
  +	int GetRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, const WSDDService* pService);
  +	int GetResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, const WSDDService* pService);
  +	void PoolHandlerChain(HandlerChain* pChain, string& sSessionId);
  +
  +	int GetWebService(BasicHandler** ppHandler, string& sSessionId, const WSDDHandler* pService);
  +	void PoolWebService(string& sSessionId, BasicHandler* pHandler, const WSDDHandler* pHandlerInfo);
   
   	HandlerPool();
   	virtual ~HandlerPool();
   private:
  -	BasicHandler* GetHandler(WSDDHandler* pHandlerInfo);
  -	int UnLoadHandler(WSDDHandler* pHandlerInfo);
  -	BasicHandler* LoadHandler(WSDDHandler* pHandlerInfo);
  -
  -private:
  -	void UnloadHandlerList(WSDDHandlerList *pHandlerList);
  -	HandlerChain* LoadHandlerChain(WSDDHandlerList* pHandlerList);
  -	map<string, LoadedHandler*> m_Handlers; //all handlers will be retained here
  -	HandlerChain* m_pGReqFChain; //Global Handler chain(Request)
  -	HandlerChain* m_pGResFChain; //Global Handler chain(Response)
  -	HandlerChain* m_pServiceReqFChain; //Service specific Handler chain(Request)
  -	HandlerChain* m_pServiceResFChain; //Service specific Handler chain(Response)
  -	map<AXIS_PROTOCOL_TYPE, HandlerChain*> m_TReqFChains; //Transport Handler chains (Request)
  -	map<AXIS_PROTOCOL_TYPE, HandlerChain*> m_TResFChains; //Transport Handler chains (Response)
  +	list<HandlerChain*> m_ChainStore;
   };
   
   #endif // !defined(AFX_HANDLERPOOL_H__6C2A4C96_7115_43C6_9EFA_CDAC9247D109__INCLUDED_)
  
  
  
  1.6       +177 -197  xml-axis/c/src/engine/HandlerPool.cpp
  
  Index: HandlerPool.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/HandlerPool.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- HandlerPool.cpp	5 Aug 2003 05:48:37 -0000	1.5
  +++ HandlerPool.cpp	13 Aug 2003 14:07:47 -0000	1.6
  @@ -66,279 +66,259 @@
   //////////////////////////////////////////////////////////////////////
   
   #include "HandlerPool.h"
  -
  +#include "AppScopeHandlerPool.h"
  +#include "RequestScopeHandlerPool.h"
  +#include "SessionScopeHandlerPool.h"
  +#include "../wsdd/WSDDDeployment.h"
   //////////////////////////////////////////////////////////////////////
   // Construction/Destruction
   //////////////////////////////////////////////////////////////////////
   #include "../common/Debug.h"
   
  +extern AppScopeHandlerPool g_AppScopeHandlerPool;
  +extern RequestScopeHandlerPool g_RequestScopeHandlerPool;
  +extern SessionScopeHandlerPool g_SessionScopeHandlerPool;
  +extern WSDDDeployment g_WSDDDeployment;
  +
   HandlerPool::HandlerPool()
   {
  -	m_pGReqFChain = NULL;
  -	m_pGResFChain = NULL;
  -	m_pServiceReqFChain = NULL;
  -	m_pServiceResFChain = NULL;	
   }
   
   HandlerPool::~HandlerPool()
   {
  -	//unload all the handlers
  -	LoadedHandler* pLh = NULL;
  -	for (map<string, LoadedHandler*>::iterator it = m_Handlers.begin();
  -	it != m_Handlers.end(); it++)
  -	{
  -		pLh = (*it).second;
  -		pLh->m_DL->Finalize();
  -		delete pLh;
  -	}
  -	m_Handlers.clear();
  -
  -	//delete all handlers and chains etc
  -	if(m_pGReqFChain) delete m_pGReqFChain;
  -	if(m_pGResFChain) delete m_pGResFChain;
  -	if(m_pServiceReqFChain) delete m_pServiceReqFChain;
  -	if(m_pServiceResFChain) delete m_pServiceResFChain;
  -
  -	map<AXIS_PROTOCOL_TYPE, HandlerChain*>::iterator it1;
  -	for (it1 = m_TReqFChains.begin();it1 != m_TReqFChains.end(); it1++)
  -	{
  -		delete (*it1).second;
  -	}
  -	for (it1 = m_TResFChains.begin();it1 != m_TResFChains.end(); it1++)
  -	{
  -		delete (*it1).second;
  -	}
  -}
  -
  -HandlerPool::LoadedHandler::LoadedHandler(string &sFile, int nOptions)
  -{
  -	m_DL = new HandlerLoader(sFile, nOptions);
  -	m_Handler = NULL;
   }
   
  -HandlerPool::LoadedHandler::~LoadedHandler()
  +int HandlerPool::GetHandler(BasicHandler** ppHandler, string& sSessionId, int nScope, int nLibId)
   {
  -	delete m_DL;
  -}
  +	*ppHandler = NULL;
  +	int Status = FAIL;
   
  -BasicHandler* HandlerPool::LoadHandler(WSDDHandler *pHandlerInfo)
  -{
  -	LoadedHandler* pLh = NULL;
  -	if (pHandlerInfo) 
  +	switch (nScope)
   	{
  -    
  -		pLh = new LoadedHandler(pHandlerInfo->GetLibName(), RTLD_LAZY);
  -
  -		if (SUCCESS == pLh->m_DL->Initialize())
  -		{
  -
  -			BasicHandler* pBh = pLh->m_DL->GetHandler();
  -      //BasicHandler* pBh = NULL;
  -			if (pBh) 
  +	case AH_APPLICATION:
  +		do {
  +			if ((Status = g_AppScopeHandlerPool.GetInstance(ppHandler, nLibId)) == SUCCESS)
   			{
  -				pLh->m_Handler = pBh;
  -				//Add to m_Handlers - place holder
  -				m_Handlers[pHandlerInfo->GetLibName()] = pLh;
  -				return pBh;
  +				return Status;
  +			}
  +			else if (Status == HANDLER_BEING_USED)
  +			{ //block this thread not this object
  +				#ifdef WIN32
  +				Sleep(0);
  +				#else
  +				sleep(0);
  +				#endif
   			}
   			else
   			{
  -				//something wrong
  -        return NULL;
  +				return Status;
   			}
  -		}
  -		else
  -		{
  -			//Uninitialize, unload and delete pLh
  -		}
  +		} while (Status == HANDLER_BEING_USED);
  +		break;
  +	case AH_SESSION:
  +		return g_SessionScopeHandlerPool.GetInstance(sSessionId, ppHandler, nLibId);
  +	case AH_REQUEST:
  +		return g_RequestScopeHandlerPool.GetInstance(ppHandler, nLibId);
   	}
  -	return NULL;
  +	return Status;
   }
   
  -int HandlerPool::UnLoadHandler(WSDDHandler *pHandlerInfo)
  +int HandlerPool::PoolHandler(string& sSessionId, BasicHandler* pHandler, int nScope, int nLibId)
   {
  -	LoadedHandler* pLh = NULL;
  -	if (m_Handlers.find(pHandlerInfo->GetLibName()) != m_Handlers.end())
  +	switch (nScope)
   	{
  -		pLh = m_Handlers[pHandlerInfo->GetLibName()];
  -		pLh->m_DL->Finalize();
  -		m_Handlers.erase(pHandlerInfo->GetLibName());
  -		delete pLh;
  -		return SUCCESS;
  +	case AH_APPLICATION:
  +		g_AppScopeHandlerPool.PutInstance(pHandler, nLibId);
  +		break;
  +	case AH_SESSION:
  +		g_SessionScopeHandlerPool.PutInstance(sSessionId, pHandler, nLibId);
  +		break;
  +	case AH_REQUEST:
  +		g_RequestScopeHandlerPool.PutInstance(pHandler, nLibId);
  +		break;
   	}
  -	return FAIL;
  +	return SUCCESS;
   }
   
  -BasicHandler* HandlerPool::GetHandler(WSDDHandler *pHandlerInfo)
  +int HandlerPool::GetGlobalRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId)
   {
  -	if (m_Handlers.find(pHandlerInfo->GetLibName()) != m_Handlers.end())
  +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetGlobalRequestFlowHandlers();
  +	if (pHandlerList)
   	{
  -		return m_Handlers[pHandlerInfo->GetLibName()]->m_Handler;
  +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
   	}
  -	return NULL;
  -}
  -
  -HandlerChain* HandlerPool::GetGlobalRequestFlowHandlerChain()
  -{
  -	return m_pGReqFChain;
  -}
  -
  -HandlerChain* HandlerPool::GetGlobalResponseFlowHandlerChain()
  -{
  -	return m_pGResFChain;
  -}
  -
  -HandlerChain* HandlerPool::GetTransportRequestFlowHandlerChain(AXIS_PROTOCOL_TYPE Protocol)
  -{
  -	if (m_TReqFChains.find(Protocol) != m_TReqFChains.end())
  -		return m_TReqFChains[Protocol];
  -	return NULL;
  -}
  -
  -HandlerChain* HandlerPool::GetTransportResponseFlowHandlerChain(AXIS_PROTOCOL_TYPE Protocol)
  -{
  -	if (m_TReqFChains.find(Protocol) != m_TReqFChains.end())
  -		return m_TResFChains[Protocol];
  -	return NULL;
  -}
  -
  -HandlerChain* HandlerPool::GetServiceRequestFlowHandlerChain()
  -{
  -	return m_pServiceReqFChain;
  -}
  -
  -HandlerChain* HandlerPool::GetServiceResponseFlowHandlerChain()
  -{
  -	return m_pServiceResFChain;
  -}
  -
  -int HandlerPool::LoadTransportRequestFlowHandlers(AXIS_PROTOCOL_TYPE Protocol, WSDDHandlerList* pHandlerList)
  -{
  -	HandlerChain* pHc = LoadHandlerChain(pHandlerList);
  -	if (pHc)
  +	else
   	{
  -		m_TReqFChains[Protocol] = pHc;
  -		return SUCCESS;
  +		*ppChain = NULL;
  +		return SUCCESS; //NO_HANDLERS_CONFIGURED
   	}
  -	return FAIL;
   }
   
  -int HandlerPool::LoadTransportResponseFlowHandlers(AXIS_PROTOCOL_TYPE Protocol, WSDDHandlerList* pHandlerList)
  +int HandlerPool::GetGlobalResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId)
   {
  -	HandlerChain* pHc = LoadHandlerChain(pHandlerList);
  -	if (pHc)
  +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetGlobalResponseFlowHandlers();
  +	if (pHandlerList)
  +	{
  +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
  +	}
  +	else
   	{
  -		m_TResFChains[Protocol] = pHc;
  -		return SUCCESS;
  +		*ppChain = NULL;
  +		return SUCCESS; //NO_HANDLERS_CONFIGURED
   	}
  -	return FAIL;
   }
   
  -int HandlerPool::LoadGlobalResponseFlowHandlers(WSDDHandlerList* pHandlerList)
  +int HandlerPool::GetTransportRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, AXIS_PROTOCOL_TYPE Protocol)
   {
  -	m_pGResFChain = LoadHandlerChain(pHandlerList);
  -	return (m_pGResFChain != NULL) ? SUCCESS:FAIL;
  +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetTransportRequestFlowHandlers(Protocol);
  +	if (pHandlerList)
  +	{
  +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
  +	}
  +	else
  +	{
  +		*ppChain = NULL;
  +		return SUCCESS; //NO_HANDLERS_CONFIGURED
  +	}
   }
   
  -int HandlerPool::LoadGlobalRequestFlowHandlers(WSDDHandlerList* pHandlerList)
  +int HandlerPool::GetTransportResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, AXIS_PROTOCOL_TYPE Protocol)
   {
  -	m_pGReqFChain = LoadHandlerChain(pHandlerList);
  -	return (m_pGReqFChain != NULL) ? SUCCESS:FAIL;
  +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetTransportResponseFlowHandlers(Protocol);
  +	if (pHandlerList)
  +	{
  +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
  +	}
  +	else
  +	{
  +		*ppChain = NULL;
  +		return SUCCESS; //NO_HANDLERS_CONFIGURED
  +	}
   }
   
  -int HandlerPool::LoadServiceRequestFlowHandlers(WSDDHandlerList *pHandlerList)
  +int HandlerPool::GetRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, const WSDDService* pService)
   {
  -	m_pServiceReqFChain = LoadHandlerChain(pHandlerList);
  -	return (m_pServiceReqFChain != NULL) ? SUCCESS:FAIL;
  +	const WSDDHandlerList* pHandlerList = pService->GetRequestFlowHandlers();
  +	if (pHandlerList)
  +	{
  +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
  +	}
  +	else
  +	{
  +		*ppChain = NULL;
  +		return SUCCESS; //NO_HANDLERS_CONFIGURED
  +	}
   }
   
  -int HandlerPool::LoadServiceResponseFlowHandlers(WSDDHandlerList *pHandlerList)
  +int HandlerPool::GetResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, const WSDDService* pService)
   {
  -	m_pServiceResFChain = LoadHandlerChain(pHandlerList);
  -	return (m_pServiceResFChain != NULL) ? SUCCESS:FAIL;
  +	const WSDDHandlerList* pHandlerList = pService->GetResponseFlowHandlers();
  +	if (pHandlerList)
  +	{
  +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
  +	}
  +	else
  +	{
  +		*ppChain = NULL;
  +		return SUCCESS; //NO_HANDLERS_CONFIGURED
  +	}
   }
   
  -void HandlerPool::UnLoadServiceRequestFlowHandlers(WSDDHandlerList *pHandlerList)
  +int HandlerPool::GetHandlerChain(string& sSessionId, HandlerChain** ppChain, const WSDDHandlerList *pHandlerList)
   {
  -	UnloadHandlerList(pHandlerList);
  -	delete m_pServiceReqFChain;
  -	m_pServiceReqFChain = NULL;
  -}
  +	lock();
  +	*ppChain = NULL;
  +	HandlerChain* pChain;
  +	//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();
  +	}
   
  -void HandlerPool::UnLoadServiceResponseFlowHandlers(WSDDHandlerList *pHandlerList)
  -{
  -	UnloadHandlerList(pHandlerList);
  -	delete m_pServiceResFChain;
  -	m_pServiceResFChain = NULL;
  -}
  +	WSDDHandler* pWSDDH;
  +	BasicHandler* pBH;
  +	int Status = SUCCESS;
   
  -HandlerChain* HandlerPool::LoadHandlerChain(WSDDHandlerList *pHandlerList)
  -{
  -	DEBUG1("HandlerPool::LoadHandlerChain");
  -	int nLoaded = 0;
  -	HandlerChain* pHc = NULL;
  -	if (pHandlerList && !pHandlerList->empty())
  +	for (WSDDHandlerList::const_iterator it = pHandlerList->begin(); it != pHandlerList->end(); it++)
   	{
  -		pHc = new HandlerChain();
  -		//BasicHandler* pBh = NULL;;
  -		Handler* pH = NULL;
  -		for (WSDDHandlerList::iterator it=pHandlerList->begin(); it != pHandlerList->end(); it++)
  +		pWSDDH = (*it);
  +		if ((Status = GetHandler(&pBH, sSessionId, pWSDDH->GetScope(),pWSDDH->GetLibId())) == SUCCESS)
   		{
  -			//if ((pBh = LoadHandler(*it)) != NULL)
  -			DEBUG1("BEFORE BasicHandler *pBh = LoadHandler(*it);");
  -			BasicHandler *pBh = LoadHandler(*it);
  -			DEBUG1("AFTER BasicHandler *pBh = LoadHandler(*it);");
  -			if (pBh)
  +			if (NORMAL_HANDLER == pBH->GetType())
   			{
  -				DEBUG1("BEFORE pH = static_cast<Handler*>(pBh);");
  -				if (pBh->GetType() == NORMAL_HANDLER)
  -					pH = static_cast<Handler*>(pBh);
  -				else
  -					pH = NULL;
  -				DEBUG1("AFTER pH = static_cast<Handler*>(pBh);");
  -				if (pH)
  -				{          
  -					DEBUG1("if (pH)");
  -					pH->SetOptionList((*it)->GetOptionList());
  -					nLoaded++;
  -					pHc->AddHandler(pH);
  -				}
  -				else
  -				{
  -					return NULL;
  -				}
  +				pChain->AddHandler(static_cast<Handler*>(pBH), pWSDDH->GetScope(), pWSDDH->GetLibId());
  +			}
  +			else
  +			{
  +				Status = WRONG_HANDLER_TYPE;
  +				break;
   			}
   		}
  -		if (0!=nLoaded) 
  +		else
   		{
  -			return pHc;
  +			break;
   		}
  -		else 
  +	}
  +	if (Status != 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++)
   		{
  -			delete pHc;
  -			return NULL;
  +			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);
  +		unlock();
  +		return Status;
  +	}
  +	else
  +	{
  +		*ppChain = pChain;
  +		unlock();
  +		return Status;
   	}
  -	return NULL;
   }
   
  -void HandlerPool::UnloadHandlerList(WSDDHandlerList *pHandlerList)
  +void HandlerPool::PoolHandlerChain(HandlerChain* pChain, string& sSessionId)
   {
  -	if (pHandlerList && !pHandlerList->empty()) {
  -		for (WSDDHandlerList::iterator it=pHandlerList->begin();
  -		it != pHandlerList->end(); it++)
  +	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)
   		{
  -			UnLoadHandler(*it);
  +			PoolHandler(sSessionId, (*pChain->m_itCurrHandler).m_pHandler, (*pChain->m_itCurrHandler).m_nScope, (*pChain->m_itCurrHandler).m_nLibId);
   		}
   	}
  +	pChain->Fini();
  +	lock();
  +	m_ChainStore.push_back(pChain);
  +	unlock();
   }
   
  -BasicHandler* HandlerPool::LoadWebService(WSDDService* pService)
  +int HandlerPool::GetWebService(BasicHandler** ppHandler, string& sSessionId, const WSDDHandler* pService)
   {
  -	return LoadHandler(pService);
  +	int Status;
  +	if ((Status = GetHandler(ppHandler, sSessionId, pService->GetScope(), pService->GetLibId())) == SUCCESS)
  +	{
  +		if (SUCCESS != (Status = (*ppHandler)->Init()))
  +		{
  +			(*ppHandler)->Fini();
  +			PoolHandler(sSessionId, *ppHandler, pService->GetScope(), pService->GetLibId());
  +			*ppHandler = NULL;
  +		}
  +	}
  +	return Status;
   }
   
  -void HandlerPool::UnloadWebService(WSDDService* pService)
  +void HandlerPool::PoolWebService(string& sSessionId, BasicHandler* pHandler, const WSDDHandler *pHandlerInfo)
   {
  -	UnLoadHandler(pService);
  +	PoolHandler(sSessionId, pHandler, pHandlerInfo->GetScope(), pHandlerInfo->GetLibId());
   }
  
  
  
  1.2       +32 -17    xml-axis/c/src/engine/HandlerLoader.h
  
  Index: HandlerLoader.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/HandlerLoader.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HandlerLoader.h	25 Jun 2003 05:13:45 -0000	1.1
  +++ HandlerLoader.h	13 Aug 2003 14:07:47 -0000	1.2
  @@ -67,7 +67,9 @@
   #include "../common/MessageData.h"
   #include "../common/GDefine.h"
   #include "../common/WrapperClassHandler.h"
  +#include "SharedObject.h"
   
  +#include <map>
   #include <string>
   
   using namespace std;
  @@ -85,29 +87,42 @@
   #else //Linux
   #include <dlfcn.h>
   #define DLHandler void*
  -
   #endif
   
  -class HandlerLoader {
  +//status codes
  +#define HANDLER_INIT_FAIL	1
  +#define CREATION_FAILED		2
  +#define LOADLIBRARY_FAILED	3
  +#define LIBRARY_PATH_EMPTY	4
  +#define HANDLER_NOT_LOADED	5
  +#define HANDLER_BEING_USED	6
  +#define GET_HANDLER_FAILED	7
  +#define WRONG_HANDLER_TYPE	8
  +#define NO_HANDLERS_CONFIGURED	9
  +
  +class HandlerLoader : protected SharedObject
  +{
   private:
  -	BasicHandler* m_pClass;
  -	string m_sLib;
  -	int m_nLoadOptions;
  -	DLHandler m_Handler;
  -	CREATE_OBJECT m_Create;
  -	DELETE_OBJECT m_Delete;
  +	typedef struct HandlerInformation
  +	{
  +		string m_sLib;
  +		int m_nLoadOptions;
  +		DLHandler m_Handler;
  +		CREATE_OBJECT m_Create;
  +		DELETE_OBJECT m_Delete;
  +		int m_nObjCount;
  +	} HandlerInformation;
  +
  +	map<int, HandlerInformation*> m_HandlerInfoList;
  +
   public:
  -	BasicHandler* GetHandler();
  -	HandlerLoader(string &sFile, int nOptions=RTLD_LAZY);
  +	int CreateHandler(BasicHandler** pHandler, int nLibId);
  +	int DeleteHandler(BasicHandler* pHandler, int nLibId);
  +	HandlerLoader();
   	~HandlerLoader();
  -	int Initialize();
  -	int Invoke(MessageData *pMsg);
  -	int Finalize();
   private:
  -	int LoadLib();
  -	CREATE_OBJECT GetCreate();
  -	DELETE_OBJECT GetDelete();
  -	int UnloadLib();
  +	int LoadLib(HandlerInformation* pHandlerInfo);
  +	int UnloadLib(HandlerInformation* pHandlerInfo);
   };
   
   
  
  
  
  1.4       +102 -91   xml-axis/c/src/engine/HandlerLoader.cpp
  
  Index: HandlerLoader.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/HandlerLoader.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HandlerLoader.cpp	4 Aug 2003 06:36:43 -0000	1.3
  +++ HandlerLoader.cpp	13 Aug 2003 14:07:47 -0000	1.4
  @@ -64,125 +64,136 @@
   #include "HandlerLoader.h"
   #include <stdio.h>
   #include "../common/Debug.h"
  +#include "../wsdd/WSDDDeployment.h"
   
  -HandlerLoader::HandlerLoader(string &sFile, int nOptions)
  -{
  -	m_sLib = sFile.c_str();
  -	m_nLoadOptions = nOptions;
  -	m_Handler = 0;
  -	m_pClass = NULL;
  -}
  +extern WSDDDeployment g_WSDDDeployment;
   
  -HandlerLoader::~HandlerLoader()
  +HandlerLoader::HandlerLoader()
   {
  -	if (m_pClass)
  -		m_Delete(m_pClass);
  -	if (m_Handler != 0)
  -		UnloadLib(); 
   }
   
  -int HandlerLoader::Initialize()
  +HandlerLoader::~HandlerLoader()
   {
  -	if (0 == m_Handler)
  -	{    
  -    DEBUG1("if (0 == m_Handler):HandlerLoader::Initialize()");
  -            
  -		if (LoadLib())
  -		{      
  -//			printf("LoadLib success\n");
  -			m_Create = GetCreate();
  -			m_Delete = GetDelete();
  -			if (!m_Create || !m_Delete)
  -			{
  -//				printf("could not get function pointers\n");
  -				UnloadLib();
  -				m_Handler = 0;
  -				return FAIL;
  -			}
  -			m_Create(&m_pClass);
  -			return SUCCESS;
  -		}
  -		else 
  -		{
  -//			printf("LoadLib failed\n");
  -			return FAIL;
  -		}
  +	lock();
  +	HandlerInformation* pHandlerInfo = NULL;
  +	for (map<int, HandlerInformation*>::iterator it = m_HandlerInfoList.begin(); it != m_HandlerInfoList.end(); it++)
  +	{
  +		pHandlerInfo = (*it).second;
  +		if (pHandlerInfo->m_nObjCount != 0); //it seems that some objects created have not been deleted - unexpected
  +		UnloadLib(pHandlerInfo);
  +		delete pHandlerInfo;
   	}
  -	return SUCCESS;
  +	unlock();
   }
   
  -int HandlerLoader::Invoke(MessageData *pMsg)
  +int HandlerLoader::DeleteHandler(BasicHandler* pHandler, int nLibId)
   {
  -	if (m_pClass)
  +	lock();
  +	if (m_HandlerInfoList.find(nLibId) != m_HandlerInfoList.end())
   	{
  -		return m_pClass->Invoke(pMsg);
  +		HandlerInformation* pHandlerInfo = m_HandlerInfoList[nLibId];
  +		pHandlerInfo->m_nObjCount--;
  +		pHandlerInfo->m_Delete(pHandler);
  +		if (pHandlerInfo->m_nObjCount == 0); //time to unload the DLL
  +		unlock();
  +		return SUCCESS;
   	}
  -	return FAIL;
  -}
  -
  -int HandlerLoader::Finalize()
  -{
  -	m_Delete(m_pClass);
  -	m_pClass = NULL;
  -	UnloadLib();
  -	m_Handler = 0;
  -	return SUCCESS;
  -}
  -
  -int HandlerLoader::LoadLib()
  -{
  -  
  -  DEBUG2("in HandlerLoader::LoadLib(), Lib is :", m_sLib.c_str());
  -   	
  -#ifdef WIN32
  -	m_Handler = LoadLibrary(m_sLib.c_str());
  -#else //Linux
  -  
  -	m_Handler = dlopen(m_sLib.c_str(), m_nLoadOptions);
  -  
  -  DEBUG1("after m_Handler = dlopen(m_sLib.c_str(), m_nLoadOptions);");
  -   
  -  
  -      	if (!m_Handler)
  +	else
   	{
  -    
  -//		printf("Error is :%s\n",dlerror());
  +		unlock();
  +		return HANDLER_NOT_LOADED;
   	}
  -  
  -#endif
  -	return (m_Handler != 0);
  -}
  -
  -CREATE_OBJECT HandlerLoader::GetCreate()
  -{
  -#ifdef WIN32
  -	return (CREATE_OBJECT)GetProcAddress(m_Handler,CREATE_FUNCTION);
  -#else //Linux
  -	return (CREATE_OBJECT)dlsym(m_Handler,CREATE_FUNCTION);
  -#endif
   }
   
  -DELETE_OBJECT HandlerLoader::GetDelete()
  +int HandlerLoader::LoadLib(HandlerInformation* pHandlerInfo)
   {
  +	DEBUG2("in HandlerLoader::LoadLib(), Lib is :", pHandlerInfo->m_sLib.c_str());
   #ifdef WIN32
  -	return (DELETE_OBJECT)GetProcAddress(m_Handler,DELETE_FUNCTION);
  +	pHandlerInfo->m_Handler = LoadLibrary(pHandlerInfo->m_sLib.c_str());
   #else //Linux
  -	return (DELETE_OBJECT)dlsym(m_Handler,DELETE_FUNCTION);
  +	pHandlerInfo->m_Handler = dlopen(pHandlerInfo->m_sLib.c_str(), pHandlerInfo->m_nLoadOptions);
  +	DEBUG1("after m_Handler = dlopen(pHandlerInfo->m_sLib.c_str(), pHandlerInfo->m_nLoadOptions);");  
   #endif
  +	return (pHandlerInfo->m_Handler != 0)?SUCCESS:FAIL;
   }
   
  -int HandlerLoader::UnloadLib()
  +int HandlerLoader::UnloadLib(HandlerInformation* pHandlerInfo)
   {
   #ifdef WIN32
  -	FreeLibrary(m_Handler);
  +	FreeLibrary(pHandlerInfo->m_Handler);
   #else //Linux
  -	dlclose(m_Handler);
  +	dlclose(pHandlerInfo->m_Handler);
   #endif
   	return SUCCESS;
   }
   
  -BasicHandler* HandlerLoader::GetHandler()
  +int HandlerLoader::CreateHandler(BasicHandler** pHandler, int nLibId)
   {
  -	BasicHandler* pH = m_pClass;
  -	return pH;
  +	lock();
  +	*pHandler = NULL;
  +	HandlerInformation* pHandlerInfo = NULL;
  +	if (m_HandlerInfoList.find(nLibId) == m_HandlerInfoList.end())
  +	{
  +		HandlerInformation* pHandlerInfo = new HandlerInformation();
  +		pHandlerInfo->m_sLib = g_WSDDDeployment.GetLibName(nLibId);
  +		if (pHandlerInfo->m_sLib.empty())
  +		{
  +			delete pHandlerInfo;
  +			unlock();
  +			return LIBRARY_PATH_EMPTY;
  +		}
  +		pHandlerInfo->m_nLoadOptions = RTLD_LAZY;
  +		if (SUCCESS == LoadLib(pHandlerInfo))
  +		{  
  +			#ifdef WIN32
  +			pHandlerInfo->m_Create = (CREATE_OBJECT)GetProcAddress(pHandlerInfo->m_Handler,CREATE_FUNCTION);
  +			pHandlerInfo->m_Delete = (DELETE_OBJECT)GetProcAddress(pHandlerInfo->m_Handler,DELETE_FUNCTION);
  +			#else //Linux
  +			pHandlerInfo->m_Create = (CREATE_OBJECT)dlsym(pHandlerInfo->m_Handler,CREATE_FUNCTION);
  +			pHandlerInfo->m_Delete = (DELETE_OBJECT)dlsym(pHandlerInfo->m_Handler,DELETE_FUNCTION);
  +			#endif		
  +			if (!pHandlerInfo->m_Create || !pHandlerInfo->m_Delete)
  +			{
  +				UnloadLib(pHandlerInfo);
  +				delete pHandlerInfo;
  +				unlock();
  +				return LOADLIBRARY_FAILED;
  +			}
  +			else //success
  +			{
  +				m_HandlerInfoList[nLibId] = pHandlerInfo;
  +			}
  +		}
  +		else 
  +		{
  +			unlock();
  +			return LOADLIBRARY_FAILED;
  +		}
  +	}
  +	
  +	pHandlerInfo = m_HandlerInfoList[nLibId];
  +	BasicHandler* pBH = NULL;
  +	pHandlerInfo->m_Create(&pBH);
  +	if (pBH)
  +	{
  +		if (SUCCESS == pBH->Init())
  +		{
  +			pHandlerInfo->m_nObjCount++;
  +			*pHandler = pBH;
  +			unlock();
  +			return SUCCESS;
  +		}
  +		else
  +		{
  +			pBH->Fini();
  +			delete pBH;
  +			unlock();
  +			return HANDLER_INIT_FAIL;
  +		}
  +	}
  +	else
  +	{
  +		unlock();
  +		return CREATION_FAILED;
  +	}
   }
  
  
  
  1.5       +13 -4     xml-axis/c/src/engine/HandlerChain.h
  
  Index: HandlerChain.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/HandlerChain.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- HandlerChain.h	4 Aug 2003 06:36:43 -0000	1.4
  +++ HandlerChain.h	13 Aug 2003 14:07:47 -0000	1.5
  @@ -80,18 +80,27 @@
   
   class HandlerChain : public BasicHandler  
   {
  +	friend class HandlerPool;
  +private:
  +	typedef struct ChainItem
  +	{
  +		Handler* m_pHandler;
  +		int m_nScope;
  +		int m_nLibId;
  +	} ChainItem;
   public:
  -	int AddHandler(Handler* pHandler);
  +	int AddHandler(Handler* pHandler, int nScope, int nLibId);
   	HandlerChain();
   	virtual ~HandlerChain();
  -
   	int Invoke(IMessageData* pMsg);
   	void OnFault(IMessageData* pMsg);
   	int GetType(){return CHAIN_HANDLER;};
  +	int Init();
  +	int Fini();
   
   private:
  -	list<Handler*> m_HandlerList;
  -  list<Handler*>::iterator m_itCurrHandler;
  +	list<ChainItem> m_HandlerList;
  +	list<ChainItem>::iterator m_itCurrHandler;
   };
   
   #endif // !defined(AFX_HANDLERCHAIN_H__675E51BF_2FD7_4860_B3DE_F8B5A978EB99__INCLUDED_)
  
  
  
  1.5       +21 -10    xml-axis/c/src/engine/HandlerChain.cpp
  
  Index: HandlerChain.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/HandlerChain.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- HandlerChain.cpp	15 Jul 2003 05:38:03 -0000	1.4
  +++ HandlerChain.cpp	13 Aug 2003 14:07:47 -0000	1.5
  @@ -84,17 +84,13 @@
   
   int HandlerChain::Invoke(IMessageData* pMsg)
   {
  -  
  -  DEBUG1("HandlerChain::Invoke(IMessageData* pMsg)");
  -  
  +	DEBUG1("HandlerChain::Invoke(IMessageData* pMsg)");
   	m_itCurrHandler = m_HandlerList.begin();
   	while (m_itCurrHandler != m_HandlerList.end())
   	{
  -    DEBUG1("while (m_itCurrHandler != m_HandlerList.end())");
  -		if (SUCCESS == (*m_itCurrHandler)->Invoke(pMsg))
  +		if (SUCCESS == (*m_itCurrHandler).m_pHandler->Invoke(pMsg))
   		{
   			m_itCurrHandler++;
  -      DEBUG1("if (SUCCESS == (*m_itCurrHandler)->Invoke(pMsg))");
   		}
   		else
   		{
  @@ -102,7 +98,7 @@
   			return FAIL;
   		}
   	}
  -  DEBUG1("HandlerChain::Invoke end");
  +	DEBUG1("HandlerChain::Invoke end");
   	return SUCCESS;
   }
   
  @@ -110,14 +106,29 @@
   {
   	while (m_itCurrHandler != m_HandlerList.begin())
   	{
  -		(*m_itCurrHandler)->OnFault(pMsg);
  +		(*m_itCurrHandler).m_pHandler->OnFault(pMsg);
   		m_itCurrHandler--;
   	}
   }
   
  -int HandlerChain::AddHandler(Handler *pHandler)
  +int HandlerChain::AddHandler(Handler* pHandler, int nScope, int nLibId)
   {
  -	m_HandlerList.push_back(pHandler);
  +	ChainItem item;
  +	item.m_pHandler = pHandler;
  +	item.m_nScope = nScope;
  +	item.m_nLibId = nLibId;
  +	m_HandlerList.push_back(item);
  +	return SUCCESS;
  +}
   
  +int HandlerChain::Init()
  +{
  +	m_HandlerList.clear();
   	return SUCCESS;
  +}
  +
  +int HandlerChain::Fini()
  +{
  +	m_HandlerList.clear();
  +	return SUCCESS;	
   }
  
  
  
  1.5       +18 -19    xml-axis/c/src/engine/AxisEngine.h
  
  Index: AxisEngine.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/AxisEngine.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AxisEngine.h	27 Jul 2003 09:59:47 -0000	1.4
  +++ AxisEngine.h	13 Aug 2003 14:07:47 -0000	1.5
  @@ -67,36 +67,35 @@
   #define __AXISENGINE_INCLUDED__
   
   #include "../common/GDefine.h"
  -#include "../common/BasicHandler.h"
  -#include "../wsdd/WSDDDeployment.h"
  -#include "HandlerPool.h"
  -
   #include "../common/Packet.h"
  +#include "../soap/SoapSerializer.h"
  +#include "../soap/SoapDeSerializer.h"
  +#include "../common/BasicHandler.h"
  +#include "../common/MessageData.h"
  +#include "HandlerChain.h"
   
  -class AxisEngine // : public BasicHandler
  +class AxisEngine 
   {
   private:	
  -	static AxisEngine* m_pObject; //Singleton object.
   	SoapSerializer* m_pSZ;
   	SoapDeSerializer* m_pDZ;
  -	WSDDDeployment* m_pWSDD;
  -	HandlerPool* m_pHandlerPool;
  -//  string m_sResponse;
  -private:
  +	HandlerChain* m_pGReqFChain;
  +	HandlerChain* m_pGResFChain;
  +	HandlerChain* m_pTReqFChain;
  +	HandlerChain* m_pTResFChain;
  +	HandlerChain* m_pSReqFChain;
  +	HandlerChain* m_pSResFChain;
   	BasicHandler* m_pWebService;
  -	int Initialize();
  -	void UnInitialize();
  -	AxisEngine();
  -
   public:
  +	AxisEngine();
   	~AxisEngine();
  -
  +	int Process(Ax_soapstream* soap);
  +private:
   	int Invoke(MessageData* pMsg);
   	void OnFault(MessageData* pMsg);
  -
  -	static AxisEngine* GetAxisEngine();
  -	int Process(soapstream* soap);
  -	WSDDDeployment* getWSDDDeployment();
  +	int Initialize();
  +	int InitializeHandlers(string& sSessionId, AXIS_PROTOCOL_TYPE protocol);
  +	void UnInitialize();
   };
   
   #endif
  
  
  
  1.14      +238 -349  xml-axis/c/src/engine/AxisEngine.cpp
  
  Index: AxisEngine.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/AxisEngine.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- AxisEngine.cpp	1 Aug 2003 07:05:02 -0000	1.13
  +++ AxisEngine.cpp	13 Aug 2003 14:07:47 -0000	1.14
  @@ -64,21 +64,12 @@
   #include <stdio.h>
   #include "AxisEngine.h"
   #include "../common/AxisException.h"
  -#include "../common/MessageData.h"
  -#include "../soap/SoapSerializer.h"
  -#include "../soap/SoapDeSerializer.h"
  -#include "../soap/SoapFaults.h"
  -#include "../soap/URIMapping.h"
   #include "../common/Debug.h"
   #include "../common/Packet.h"
  -
  -
  -#ifdef WIN32
  -//#define WSDDFILEPATH "./Axis/conf/server.wsdd"
  -#define WSDDFILEPATH "C:/Apache/Axis/server.wsdd"
  -#else //For linux
  -#define WSDDFILEPATH "/usr/local/axiscpp/axis/server.wsdd"
  -#endif
  +#include "../wsdd/WSDDDeployment.h"
  +#include "HandlerPool.h"
  +#include "DeserializerPool.h"
  +#include "SerializerPool.h"
   
   //extern int send_response_bytes(char * res);
   
  @@ -86,344 +77,253 @@
   
   //extern int send_transport_information(soapstream *);
   
  -
  -AxisEngine* AxisEngine::m_pObject = NULL;
  +extern DeserializerPool g_DeserializerPool;
  +extern SerializerPool g_SerializerPool;
  +extern HandlerPool g_HandlerPool;
  +extern WSDDDeployment g_WSDDDeployment;
   
   AxisEngine::AxisEngine()
   {
  -	//Create Serializer and Deserializer
  -	m_pSZ = new SoapSerializer();
  -	m_pDZ = new SoapDeSerializer();  
  -	m_pWSDD = new WSDDDeployment();
  -	m_pHandlerPool = new HandlerPool();
  +	m_pSZ = NULL;
  +	m_pDZ = NULL;  
  +	m_pGReqFChain = NULL;
  +	m_pGResFChain = NULL;
  +	m_pTReqFChain = NULL;
  +	m_pTResFChain = NULL;
  +	m_pSReqFChain = NULL;
  +	m_pSResFChain = NULL;
   	m_pWebService = NULL;
  -  
  -  //printf("Done WSDD\n");
   }
   
   AxisEngine::~AxisEngine()
   {
  -	delete m_pSZ;
  -	delete m_pDZ;
  -	delete m_pWSDD;
  -	delete m_pHandlerPool;
  -	//unload xerces DLL
  -	XMLPlatformUtils::Terminate();
  -}
  -
  -WSDDDeployment * AxisEngine::getWSDDDeployment()
  -{
  -	if(m_pWSDD)
  -	{
  -		return m_pWSDD; 
  -	}
  -	return NULL;
   }
   
  -AxisEngine* AxisEngine::GetAxisEngine()
  +int AxisEngine::Process(Ax_soapstream* soap) 
   {
  -	if (!m_pObject)
  -	{
  -		try
  -		{
  -      DEBUG1("AxisEngine::GetAxisEngine()");
  -			XMLPlatformUtils::Initialize();
  -			m_pObject = new AxisEngine();
  -			if (!m_pObject) return NULL;
  -			if(SUCCESS != m_pObject->Initialize())
  -			{
  -				m_pObject->UnInitialize();
  -				delete m_pObject;
  -				m_pObject = NULL;
  -				return NULL;
  +	int Status;
  +	AXIS_TRY
  +		DEBUG1("AxisEngine::Process");
  +		MessageData* pMsg = NULL;
  +		const WSDDService* pService = NULL;
  +		string sSessionId = soap->sessionid;
  +		int nSoapVersion;
  +
  +		do {
  +			//create and populate MessageData
  +			if (SUCCESS != Initialize())
  +			{
  +				nSoapVersion = m_pDZ->GetVersion();
  +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
  +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADSRV));
  +				break; //do .. while(0)
  +			}
  +			pMsg = new MessageData();
  +			pMsg->m_Protocol = soap->trtype;
  +			pMsg->SetSerializer(m_pSZ);
  +			pMsg->SetDeSerializer(m_pDZ);
  +    
  +			if (SUCCESS != m_pDZ->SetInputStream(soap->str.ip_stream))
  +			{
  +				nSoapVersion = m_pDZ->GetVersion();
  +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
  +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPCONTENTERROR));
  +				break; //do .. while(0)
   			}
  -		}
  -		catch (...)
  -		{
  -			return NULL;
  -		}	
  -	}
  -	return m_pObject;
  -}
   
  -int AxisEngine::Process(soapstream* soap) 
  -{
  +			char* cService= getheader(soap, SOAPACTIONHEADER);
  +			string service = (cService == NULL)? "" : cService;
  +		  
  +			DEBUG2("string service = ",service.c_str());
  +     
  +			if (service.empty()) 
  +			{
  +				nSoapVersion = pMsg->m_pDZ->GetVersion();
  +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
  +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPACTIONEMPTY));
  +				break; //do .. while(0)
  +			}
  +			if (service.find('\"') != string::npos) //if there are quotes remove them.
  +			{
  +				service = service.substr(1, service.length() - 2);
  +			}
   
  -  try
  -  {
  -    DEBUG1("AxisEngine::Process");
  - 
  -	  MessageData* pMsg = NULL;
  -	  MemBufInputSource* pSoapInput = NULL;
  -	  WSDDHandlerList* pHandlerList = NULL;
  -	  WSDDService* pService = NULL;
  -	  do {
  -		  //Initialize Serializer and Deserializer objects
  -		  m_pSZ->init();
  -		  m_pDZ->Init();
  -		  //create and populate MessageData
  -		  pMsg = new MessageData();
  -		  pMsg->m_Protocol = soap->trtype;
  -		  pMsg->SetSerializer(m_pSZ);
  -		  pMsg->SetDeSerializer(m_pDZ);
  -    
  -		  //Adding SoapEnvelop and SoapBody to Serializer
  -		  SoapEnvelope* pEnv = new SoapEnvelope();
  -		  pMsg->m_pSZ->setSoapEnvelope(pEnv);
  -		  pMsg->m_pSZ->setSoapBody(new SoapBody());
  -
  -		  //---------------------start--------------------------
  -
  -		  //Deserialize
  -		  //---------START XERCES SAX2 SPCIFIC CODE---------//
  -          //a huge buffer to store the whole soap request stream
  -		  char hugebuffer[10000];
  -         //to store the number of chars returned by get_request_bytes
  -		  int nChars = 0;
  -          //request a huge number of bytes to get the whole soap request
  -          //when pull parsing is used this should change
  -		  get_request_bytes(hugebuffer, 10000, &nChars);
  -		  DEBUG1(hugebuffer);      
  -          //if no soap then quit
  -		  if (nChars <= 0) break;
  -		  pSoapInput = new MemBufInputSource((const unsigned char*)hugebuffer, nChars ,"bufferid",false);
  -
  -		  if (SUCCESS != m_pDZ->SetStream(pSoapInput)) //this parses the full soap request.
  -		  {
  -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPCONTENTERROR));
  -			  break; //do .. while(0)
  -		  }
  -		  //---------END XERCES SAX2 SPCIFIC CODE---------//
  +			//get service description object from the WSDD
  +			pService = g_WSDDDeployment.GetService(service);
  +			if (!pService) 
  +			{
  +				nSoapVersion = pMsg->m_pDZ->GetVersion();
  +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
  +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SERVICENOTFOUND));
  +				break; //do .. while(0)
  +			}
   
  -		  int nSoapVersion = pMsg->m_pDZ->GetVersion();
  +			pMsg->SetService(pService);
  +			
  +			//check for soap version in the request and decide whether we support it or not
  +			//if we do not support send a soapfault with version mismatch.		  
  +			nSoapVersion = pMsg->m_pDZ->GetVersion();
  +			if (nSoapVersion == VERSION_LAST) //version not supported
  +			{
  +				m_pSZ->setSoapVersion(SOAP_VER_1_2);
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_VERSION_MISMATCH));
  +				break; //do .. while(0)		
  +			}		  
   
  -		  //Set Soap version in the Serializer
  -		  pMsg->m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
   
  -		  //---------------------end--------------------------
  -		  
  +			//Set Soap version in the Serializer and the envelope
  +			if (SUCCESS != m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion))
  +			{
  +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPCONTENTERROR));
  +			  break; //do .. while(0)
  +			}
   
  -		  char* cService= getheader(soap, SOAPACTIONHEADER);
  -			string service;
  -		  if(cService==NULL) {
  -				service="";
  -		  }else {
  -				service= cService;
  -		  }
  -		  
  -		  DEBUG2("string service = Maths :",service.c_str());
  -     
  -		  if (service.empty()) 
  -		  {
  -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPACTIONEMPTY));
  +			SoapMethod* pSm = m_pDZ->GetMethod();
  +			if (pSm) 
  +			{
  +				string method = pSm->getMethodName();
  +				DEBUG2("pSm->getMethodName(); :", method.c_str());
  +				if (!method.empty())
  +				{
  +					if (pService->IsAllowedMethod(method))
  +					{          
  +						//load actual web service handler
  +						if (SUCCESS != g_HandlerPool.GetWebService(&m_pWebService, sSessionId, pService))
  +						{
  +            				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADSRV));
  +							//Error couldnot load web service
  +							break; //do .. while(0)
  +						}
  +					}
  +					else
  +					{
  +						m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_METHODNOTALLOWED));
  +						//method is not an exposed allowed method
  +						break; //do .. while(0)
  +					}
  +				}
  +				else
  +				{
  +					m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_NOSOAPMETHOD));
  +					//no method to be invoked
  +					break; //do .. while(0)
  +				}
  +			}
  +			//Get Global and Transport Handlers
  +			if(SUCCESS != (Status = InitializeHandlers(sSessionId, soap->trtype)))
  +			{
  +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
   			  break; //do .. while(0)
  -		  }
  -		  service = service.substr(1, service.length() - 2);
  -		  pService = m_pWSDD->GetService(service);
  -		  if (!pService) {
  -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SERVICENOTFOUND));
  +			}
  +    		//Get Service specific Handlers from the pool if configured any
  +			if(SUCCESS != (Status = g_HandlerPool.GetRequestFlowHandlerChain(&m_pSReqFChain, sSessionId, pService)))
  +			{        
  +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
   			  break; //do .. while(0)
  -		  }
  -
  -      pMsg->SetService(pService);
  -
  -			
  -		  //check for soap version in the request and decide whether we support it or not
  -		  //if we do not support send a soapfault with version mismatch.		  
  -		  if (nSoapVersion == VERSION_LAST) //version not supported
  -		  {
  -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_VERSION_MISMATCH));
  -			  break; //do .. while(0)		
  -		  }		  
  -
  -		  //add namespace URIs of the SoapEnvelope of the response corresponding to the soap version.
  -		  Attribute* pNS = new Attribute(g_sObjSoapEnvVersionsStruct[nSoapVersion].pchEnvelopePrefix,
  -			  "xmlns","",g_sObjSoapEnvVersionsStruct[nSoapVersion].pchEnvelopeNamespaceUri);
  -		  pEnv->addNamespaceDecl(pNS);
  -		  //add namespace URIs for xsd and xsi
  -		  pNS = new Attribute("xsd","xmlns","","http://www.w3.org/2001/XMLSchema");
  -		  pEnv->addNamespaceDecl(pNS);
  -		  pNS = new Attribute("xsi","xmlns","","http://www.w3.org/2001/XMLSchema-instance");
  -		  pEnv->addNamespaceDecl(pNS);
  -
  -		  SoapMethod* pSm = m_pDZ->GetMethod();
  -		  if (pSm) 
  -		  {
  -			  string method = pSm->getMethodName();
  -      
  -        DEBUG2("pSm->getMethodName(); :", method.c_str());
  -          
  -			  if (!method.empty())
  -			  {
  -				  //this is done here when we use SAX parser
  -				  //if we use XML pull parser this check is done within the invoke method of the wrapper class
  -				  if (pService->IsAllowedMethod(method))
  -				  {          
  -					  //load actual web service handler
  -         
  -					  m_pWebService = m_pHandlerPool->LoadWebService(pService);
  -
  -                    
  -					  if (!m_pWebService)
  -					  {
  -            
  -						  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADSRV));
  -						  //Error couldnot load web service
  -						  break; //do .. while(0)
  -					  }
  -				  }
  -				  else
  -				  {
  -					  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_METHODNOTALLOWED));
  -					  //method is not an exposed allowed method
  -					  break; //do .. while(0)
  -				  }
  -			  }
  -			  else
  -			  {
  -				  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_NOSOAPMETHOD));
  -				  //no method to be invoked
  -				  break; //do .. while(0)
  -			  }
  -		  }
  -		  //create any service specific handlers
  -    
  -		  pHandlerList = pService->GetRequestFlowHandlers();
  +			}
  +			if(SUCCESS != (Status = g_HandlerPool.GetResponseFlowHandlerChain(&m_pSResFChain, sSessionId, pService)))
  +			{        
  +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
  +			  break; //do .. while(0)
  +			}
   
  -      DEBUG1("after pService->GetRequestFlowHandlers();");
  -       
  -		  if (pHandlerList)
  -		  {
  -
  -			  if(SUCCESS != m_pHandlerPool->LoadServiceRequestFlowHandlers(pHandlerList))
  -			  {        
  -				  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
  -				  break; //do .. while(0)
  -			  }
  -		  }
  -    
  -		  pHandlerList = pService->GetResponseFlowHandlers();
  -    
  -		  if (pHandlerList)
  -		  {
  -			  if(SUCCESS != m_pHandlerPool->LoadServiceResponseFlowHandlers(pHandlerList))
  -			  {
  -				  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
  -				  break; //do .. while(0)
  -			  }
  -		  }
  -		  Invoke(pMsg); //we generate response in the same way even if this has failed
  -	  }
  -	  while(0);
  -	  //and handlers may add headers to the Serializer.
  -	  //Invoke all handlers including the webservice
  -	  //in case of failure coresponding soap fault message will be sent
  -	  if (pMsg) delete pMsg; //MessageData is no longer needed
  -	  if (pSoapInput) delete pSoapInput; //this should not be done if we use progressive parsing
  -	  //set soap version to the serializer.
  -	  //Serialize
  -	  send_transport_information(soap);
  -	  int iStatus= m_pSZ->getStream();
  -      
  -	  //soap->so.http.op_soap = new char(sResponse.length() + 1); 
  -	  //strcpy(soap->so.http.op_soap, sResponse.c_str());
  -  #ifndef _DEBUG //this caused program to crash in debug mode
  -	  m_pSZ->init();
  -  #endif 
  -	//unload webservice handler
  -  #ifndef WIN32 //this crashes in Win32 at stl map::find(..) function - I cannot find what is wrong.
  -	  if (m_pWebService) m_pHandlerPool->UnloadWebService(pService);
  -	  //Unload service specific handlers
  -	  pHandlerList = pService->GetRequestFlowHandlers();
  -	  if (pHandlerList)
  -		  m_pHandlerPool->UnLoadServiceRequestFlowHandlers(pHandlerList);
  -	  pHandlerList = pService->GetResponseFlowHandlers();
  -	  if (pHandlerList)
  -		  m_pHandlerPool->UnLoadServiceResponseFlowHandlers(pHandlerList);
  -  #endif
  -	  return SUCCESS;
  - }
  - catch(exception* e)
  - {
  -   //todo
  -   /*
  -    An exception derived from exception which is not handled will be handled here.
  -    You can call a method in AxisModule which may unload the AxisEngine
  -    from the webserver and report the error. You can also write this
  -    in a logfile specific to axis.
  -   */
  -   DEBUG1(e->what());   
  -   delete(e);
  - }
  - catch(...)
  - {
  -   //todo
  -   /*
  -    An unknown exception which is not handled will be handled here.
  -    You can call a method in AxisModule which may unload the AxisEngine
  -    from the webserver and report the error. You can also write this
  -    in a logfile specific to axis.
  -   */
  -   DEBUG1("UNKNOWN EXCEPTION");
  - }
  +			//and handlers may add headers to the Serializer.
  +			//Invoke all handlers including the webservice
  +			//in case of failure coresponding soap fault message will be set
  +			Status = Invoke(pMsg); //we generate response in the same way even if this has failed
  +		}
  +		while(0);
  +		if (pMsg) delete pMsg; //MessageData is no longer needed
  +		//send any transoport information like http headers first
  +		send_transport_information(soap);
  +		//Serialize
  +		m_pSZ->SetOutputStream(soap->str.ip_stream);
  +
  +		//Pool back the Service specific handlers
  +		if (m_pSReqFChain) g_HandlerPool.PoolHandlerChain(m_pSReqFChain, sSessionId);
  +		if (m_pSResFChain) g_HandlerPool.PoolHandlerChain(m_pSResFChain, sSessionId);
  +		//Pool back the webservice
  +		if (m_pWebService) g_HandlerPool.PoolWebService(sSessionId, m_pWebService, pService); 
  +		return Status;
  +	AXIS_CATCH(exception* e)
  +		//todo
  +		/*
  +		An exception derived from exception which is not handled will be handled here.
  +		You can call a method in AxisModule which may unload the AxisEngine
  +		from the webserver and report the error. You can also write this
  +		in a logfile specific to axis.
  +		*/
  +		#ifdef _DEBUG
  +		DEBUG1(e->what());   
  +		delete(e);
  +		#endif
  +	AXIS_CATCH(...)
  +		//todo
  +		/*
  +		An unknown exception which is not handled will be handled here.
  +		You can call a method in AxisModule which may unload the AxisEngine
  +		from the webserver and report the error. You can also write this
  +		in a logfile specific to axis.
  +		*/
  +		DEBUG1("UNKNOWN EXCEPTION");
  +	AXIS_ENDCATCH
  +	return Status;
   }
   
   int AxisEngine::Invoke(MessageData* pMsg)
   {
   	enum AE_LEVEL {AE_START=1, AE_TRH, AE_GLH, AE_SERH, AE_SERV};
  -	HandlerChain* pChain;
  -	int ret = FAIL;
  +	int Status = FAIL;
   	int level = AE_START;
   	do
   	{
   		//invoke transport request handlers
  -		pChain = m_pHandlerPool->GetTransportRequestFlowHandlerChain(pMsg->m_Protocol);
  -		if (pChain) {
  -			if(SUCCESS != pChain->Invoke(pMsg))
  +		if (m_pTReqFChain) {
  +			if(SUCCESS != (Status = m_pTReqFChain->Invoke(pMsg)))
   			{
  -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
   				break; //do .. while (0)
   			}
   
   		}
  -    DEBUG1("AFTER pChain = m_pHandlerPool->GetTransportRequestFlowHandlerChain");
  +		DEBUG1("AFTER invoke transport request handlers");
   		level++; // AE_TRH
   		//invoke global request handlers
  -		pChain = m_pHandlerPool->GetGlobalRequestFlowHandlerChain();
  -		if (pChain)
  +		if (m_pGReqFChain)
   		{
  -			if(SUCCESS != pChain->Invoke(pMsg))
  +			if(SUCCESS != (Status = m_pGReqFChain->Invoke(pMsg)))
   			{
  -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
   				break; //do .. while (0)
   			}		
   		}
  -    DEBUG1("AFTER pChain = m_pHandlerPool->GetGlobalRequestFlowHandlerChain();");
  +		DEBUG1("AFTER invoke global request handlers");
   		level++; //AE_GLH
   		//invoke service specific request handlers
  -		pChain = m_pHandlerPool->GetServiceRequestFlowHandlerChain();
  -		if (pChain)
  +		if (m_pSReqFChain)
   		{
  -			if(SUCCESS != pChain->Invoke(pMsg))
  +			if(SUCCESS != (Status = m_pSReqFChain->Invoke(pMsg)))
   			{
  -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
   				break; //do .. while (0)
   			}
  -      DEBUG1("if(SUCCESS == pChain->Invoke(pMsg))");
   		}
  -    DEBUG1("AFTER pChain = m_pHandlerPool->GetServiceRequestFlowHandlerChain();");
  +		DEBUG1("AFTER invoke service specific request handlers");
   		level++; //AE_SERH
   		//call actual web service handler
  -
   		if (m_pWebService)
  -			if (SUCCESS != m_pWebService->Invoke(pMsg))
  +		{
  +			if (SUCCESS != (Status = m_pWebService->Invoke(pMsg)))
   			{
  -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_WEBSERVICEFAILED));
  +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_WEBSERVICEFAILED));
   				break;
  -			}
  -
  -    DEBUG1("if (m_pWebService)");      
  -         
  +			}        
  +		}
  +		DEBUG1("AFTER call actual web service handler");
   		level++; //AE_SERV
   	}
   	while(0);
  @@ -433,37 +333,32 @@
   	switch (level)
   	{
   	case AE_SERV: //everything success
  -    ret = SUCCESS;
  -		//invoke service specific response handlers
  +		Status = SUCCESS;
   		//no break;
   	case AE_SERH: //actual web service handler has failed
   		//invoke web service specific response handlers
  -    pChain = m_pHandlerPool->GetServiceResponseFlowHandlerChain();
  -		if (pChain)
  +		if (m_pSResFChain)
   		{
  -			pChain->Invoke(pMsg);
  -      
  +			m_pSResFChain->Invoke(pMsg);
   		}
   		//no break;
   	case AE_GLH: //web service specific handlers have failed
   		//invoke global response handlers
  -		pChain = m_pHandlerPool->GetGlobalResponseFlowHandlerChain();
  -		if (pChain)
  +		if (m_pGResFChain)
   		{
  -			pChain->Invoke(pMsg);
  +			m_pGResFChain->Invoke(pMsg);
   		}
   		//no break;
   	case AE_TRH: //global handlers have failed
  -		pChain = m_pHandlerPool->GetTransportResponseFlowHandlerChain(pMsg->m_Protocol);
  -		if (pChain) 
  +		if (m_pTResFChain) 
   		{
  -			pChain->Invoke(pMsg);
  +			m_pTResFChain->Invoke(pMsg);
   		}
   		//no break;
   	case AE_START:;//transport handlers have failed
   	};
  -  DEBUG1("end axisengine process()");
  -	return ret;
  +	DEBUG1("end axisengine process()");
  +	return Status;
   }
   
   void AxisEngine::OnFault(MessageData* pMsg)
  @@ -473,44 +368,21 @@
   
   int AxisEngine::Initialize()
   {
  -	string str(WSDDFILEPATH);
  -	TypeMapping::Initialize();
  -	URIMapping::Initialize();
  -	SoapFault::initialize();
  -  
  -  DEBUG1("AxisEngine::Initialize()");
  -      
  -	if (SUCCESS != m_pWSDD->LoadWSDD(str)) return FAIL;
  -  
  -	//Load Global Handlers to the pool if configured any
  -	WSDDHandlerList* pHandlerList = m_pWSDD->GetGlobalRequestFlowHandlers();
  -	if (pHandlerList)
  -		if(SUCCESS != m_pHandlerPool->LoadGlobalRequestFlowHandlers(pHandlerList))
  -			return FAIL;
  -	pHandlerList = m_pWSDD->GetGlobalResponseFlowHandlers();
  -	if (pHandlerList)
  -		if(SUCCESS != m_pHandlerPool->LoadGlobalResponseFlowHandlers(pHandlerList))
  -			return FAIL;
  -
  -	//Load Transport Handlers to the pool if configured any
  -	WSDDTransport* pTransport = m_pWSDD->GetTransport();
  -	if (pTransport) {
  -		//HTTP
  -		pHandlerList = pTransport->GetRequestFlowHandlers(APTHTTP);
  -		if (pHandlerList)
  -			if(SUCCESS != m_pHandlerPool->LoadTransportRequestFlowHandlers(APTHTTP, pHandlerList))
  -				return FAIL;
  -		//FTP
  -		pHandlerList = pTransport->GetRequestFlowHandlers(APTFTP);
  -		if (pHandlerList)
  -			if(SUCCESS != m_pHandlerPool->LoadTransportRequestFlowHandlers(APTFTP, pHandlerList))
  -				return FAIL;
  -		//SMTP
  -		pHandlerList = pTransport->GetRequestFlowHandlers(APTSMTP);
  -		if (pHandlerList)
  -			if(SUCCESS != m_pHandlerPool->LoadTransportRequestFlowHandlers(APTSMTP, pHandlerList))
  -				return FAIL;
  +	int Status;
  +	//Create and initialize Serializer and Deserializer objects
  +	if (SUCCESS != (Status = g_SerializerPool.GetInstance(&m_pSZ))) return Status;
  +	if (SUCCESS != (Status = m_pSZ->Init()))
  +	{
  +		g_SerializerPool.PutInstance(m_pSZ);
  +		return Status;
  +	}
  +	if (SUCCESS != (Status = g_DeserializerPool.GetInstance(&m_pDZ))) return Status;
  +	if (SUCCESS != (Status = m_pDZ->Init()))
  +	{
  +		g_DeserializerPool.PutInstance(m_pDZ);
  +		return Status;
   	}
  +
   	return SUCCESS;
   }
   
  @@ -518,4 +390,21 @@
   {
   	//nothing to do with m_pWSDD because its destructor deletes its objects
   	//nothing to do with m_pHandlerPool because its destructor deletes its objects
  -}
  \ No newline at end of file
  +}
  +
  +int AxisEngine::InitializeHandlers(string &sSessionId, AXIS_PROTOCOL_TYPE protocol)
  +{
  +	int Status = SUCCESS;  
  +	//Get Global Handlers from the pool if configured any
  +	if(SUCCESS != (Status = g_HandlerPool.GetGlobalRequestFlowHandlerChain(&m_pGReqFChain, sSessionId)))
  +		return Status;
  +	if(SUCCESS != (Status = g_HandlerPool.GetGlobalResponseFlowHandlerChain(&m_pGResFChain, sSessionId)))
  +		return Status;
  +
  +	//Get Transport Handlers from the pool if configured any
  +	if(SUCCESS != (Status = g_HandlerPool.GetTransportRequestFlowHandlerChain(&m_pTReqFChain, sSessionId, protocol)))
  +		return Status;
  +	if(SUCCESS != (Status = g_HandlerPool.GetTransportResponseFlowHandlerChain(&m_pTResFChain, sSessionId, protocol)))
  +		return Status;
  +	return Status;
  +}
  
  
  
  1.6       +95 -57    xml-axis/c/src/engine/Axis.cpp
  
  Index: Axis.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/engine/Axis.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Axis.cpp	27 Jul 2003 10:03:33 -0000	1.5
  +++ Axis.cpp	13 Aug 2003 14:07:47 -0000	1.6
  @@ -1,3 +1,5 @@
  +#pragma warning (disable : 4503)
  +
   #include "AxisEngine.h"
   #include "../common/Debug.h"
   #include <stdio.h>
  @@ -7,51 +9,81 @@
   #include <string>
   #include <map>
   
  -#define res(X); send_response_bytes(X);
  +#include "../soap/SoapFaults.h"
  +#include "../soap/URIMapping.h"
  +#include "HandlerLoader.h"
  +#include "AppScopeHandlerPool.h"
  +#include "RequestScopeHandlerPool.h"
  +#include "SessionScopeHandlerPool.h"
  +#include "HandlerPool.h"
  +#include "SerializerPool.h"
  +#include "DeserializerPool.h"
  +#include "../wsdd/WSDDDeployment.h"
  +
  +#define BYTESTOREAD 64
  +//the relative location of the wsdl files hardcoded
  +#define WSDLDIRECTORY	"./Axis/wsdl/"
  +
  +#ifdef WIN32
  +#ifdef AXIS_APACHE1_3
  +#define WSDDFILEPATH "./Axis/conf/server.wsdd"
  +#else
  +#define WSDDFILEPATH "C:/Axis/conf/server.wsdd"
  +#endif
  +#else //For linux
  +#ifdef AXIS_APACHE1_3
  +#define WSDDFILEPATH "./Axis/conf/server.wsdd"
  +#else
  +#define WSDDFILEPATH "/usr/local/axiscpp/axis/server.wsdd"
  +#endif
  +#endif
   
  +//define all global variables of the axisengine
  +#ifdef _DEBUG
   unsigned char chEBuf[1024];
  +#endif
   
  -extern "C" int process_request(soapstream *str)
  -{
  -DEBUG1("in axis.cpp");	
  -	AxisEngine* engine = AxisEngine::GetAxisEngine();	
  -	int ret = FAIL;
  -	char * wsdlloc = NULL;
  -	char * uri = NULL;
  -	int pos=0;
  -	int slashcount=0;
  -	int len = 0;
  -
  -	FILE * outfile;
  -	const int bytestoread = 6;
  -	char oneword [bytestoread];
  -	oneword[bytestoread-1] = '\0';
  +//synchronized global variables.
  +HandlerLoader g_HandlerLoader;
  +AppScopeHandlerPool g_AppScopeHandlerPool;
  +RequestScopeHandlerPool g_RequestScopeHandlerPool;
  +SessionScopeHandlerPool g_SessionScopeHandlerPool;
  +DeserializerPool g_DeserializerPool;
  +SerializerPool g_SerializerPool;
  +HandlerPool g_HandlerPool;
  +//un synchronized read-only global variables.
  +WSDDDeployment g_WSDDDeployment;
   
  +extern "C" int process_request(Ax_soapstream *str)
  +{
  +	DEBUG1("in axis.cpp");	
  +	int Status = FAIL;
  +	FILE * WsddFile;
  +	char ReadBuffer[BYTESTOREAD];
  +	ReadBuffer[0] = '\0';
   
  -	const WSDDServiceMap * svsmap = NULL;
  +	const WSDDServiceMap* pSrvMap = NULL;
   	WSDDServiceMap::const_iterator iter;
  -	WSDDService * svs = NULL;
  -	//the location of the wsdl files hardcoded
  -	string svr("./Axis/wsdl/");
  +	WSDDService* pService = NULL;
   
  -	switch(str->trtype)
  +	switch (str->trtype)
   	{
   		case APTHTTP:
   			//Handle the POST method
  -			if(str->so.http.ip_method==POST)
  +			if (str->so.http.ip_method == AXIS_HTTP_POST)
   			{
  -DEBUG1("method is POST");                
  +				DEBUG1("method is POST");
  +				AxisEngine* engine = new AxisEngine();	
   				if (engine)
   				{
  -					ret = engine->Process(str);
  -					DEBUG1("ret = engine->Process(str);");
  +					Status = engine->Process(str);
  +					DEBUG1("Status = engine->Process(str);");
   				    DEBUG1("are we successful?");            
  -					ret = SUCCESS;
  +					Status = SUCCESS;
   				}
   			}
  -
   			//Handler the GET method
  -			if(str->so.http.ip_method==GET)
  +			if (str->so.http.ip_method == AXIS_HTTP_GET)
   			{
   				//get the uri path
   				//i.e "/abc/xyz/" part of http://somehost/abc/xyz/
  @@ -68,64 +100,70 @@
   				{	
   					bNoSlash = true;
   				}
  +
   				if (sUriWOAxis.empty())
   				{
  -					svsmap = engine->getWSDDDeployment()->GetWSDDServiceMap();
  -					//dep = engine->getWSDDDeployment();
  -					//svsmap = depGetWSDDServiceMap();
  -					res("<html><body>\
  +					pSrvMap = g_WSDDDeployment.GetWSDDServiceMap();
  +					send_response_bytes("<html><body>\
   						<h1 align=\"center\">Welcome to Axis C++</h1>\
   						<br>\
   						<h2>List of Deployed Web services<br></h2>\
   						<h3>click on the links to view the WSDL</h3>\
   						<br>\
  -						<table width=\"400\">");
  +						<table width=\"400\">", str->str.op_stream);
   
  -					for (iter=svsmap->begin();iter!=svsmap->end();iter++)
  +					for (iter = pSrvMap->begin();iter != pSrvMap->end();iter++)
   					{
  -						svs = iter->second;
  -						res("<tr><td width=\"200\">");
  -						res((char *)svs->GetServiceName().c_str());
  -						res("</td><td width=\"200\"><a href=\"./");
  -						if (bNoSlash) send_response_bytes("axis/"); 
  -						send_response_bytes((char *)svs->GetServiceName().c_str());
  -						send_response_bytes("?wsdl");
  -						send_response_bytes("\">wsdl</a></td>");
  -						res("</tr>");
  +						pService = iter->second;
  +						send_response_bytes("<tr><td width=\"200\">", str->str.op_stream);
  +						send_response_bytes((char *)pService->GetServiceName().c_str(), str->str.op_stream);
  +						send_response_bytes("</td><td width=\"200\"><a href=\"./", str->str.op_stream);
  +						if (bNoSlash) send_response_bytes("axis/", str->str.op_stream); 
  +						send_response_bytes((char *)pService->GetServiceName().c_str(), str->str.op_stream);
  +						send_response_bytes("?wsdl", str->str.op_stream);
  +						send_response_bytes("\">wsdl</a></td>", str->str.op_stream);
  +						send_response_bytes("</tr>", str->str.op_stream);
   					}
  -					res("</table></body></html>");
  +					send_response_bytes("</table></body></html>", str->str.op_stream);
   				}
   				else 
   				{
  -					sServiceName = "./Axis/wsdl/" + sUriWOAxis + ".wsdl";
  +					sServiceName = WSDLDIRECTORY + sUriWOAxis + ".wsdl";
   					//check whether wsdl file is available
  -					if((outfile = fopen(sServiceName.c_str(),"r"))==NULL)
  +					if((WsddFile = fopen(sServiceName.c_str(),"r"))==NULL)
   					{
  -						send_response_bytes("<h3>Url not available</h3>");
  +						send_response_bytes("<h3>Url not available</h3>", str->str.op_stream);
   						//handle the error
   					}
   					else
   					{
   						int charcount = 0;
  -						int acc = 0;	
  -						while((charcount=fread(oneword,1,bytestoread-1, outfile)) != 0)
  +						while((charcount = fread(ReadBuffer, 1, BYTESTOREAD-1, WsddFile)) != 0)
   						{
  -							*(oneword+charcount) = '\0';
  -							send_response_bytes(oneword);
  +							*(ReadBuffer + charcount) = '\0';
  +							send_response_bytes(ReadBuffer, str->str.op_stream);
     						}
  -						ret = SUCCESS;
  -						fclose(outfile);
  +						Status = SUCCESS;
  +						fclose(WsddFile);
   					}
   				}
   			}
   		break;
   
   		default:
  -			send_response_bytes("Unknown Protocol");
  +			send_response_bytes("Unknown Protocol", str->str.op_stream);
   		break;
   	}
  -	svsmap = NULL;
  -	svs =NULL;
  -	return ret;
  +	return Status;
   }
   
  +extern "C" int initialize_module()
  +{
  +	TypeMapping::Initialize();
  +	URIMapping::Initialize();
  +	SoapFault::initialize();
  +	XMLPlatformUtils::Initialize();
  +	string ConfFile = WSDDFILEPATH;
  +	if (SUCCESS != g_WSDDDeployment.LoadWSDD(ConfFile)) return FAIL;
  +	return SUCCESS;
  +}
  
  
  
  1.1                  xml-axis/c/src/engine/SharedObject.h
  
  Index: SharedObject.h
  ===================================================================
  // SharedObject.h: interface for the SharedObject class.
  //
  //////////////////////////////////////////////////////////////////////
  #pragma warning (disable : 4786)
  
  #if !defined(AFX_SHAREDOBJECT_H__0805D25C_2F7E_4B19_BECE_0A8BFE9F0830__INCLUDED_)
  #define AFX_SHAREDOBJECT_H__0805D25C_2F7E_4B19_BECE_0A8BFE9F0830__INCLUDED_
  
  #if _MSC_VER > 1000
  #pragma once
  #endif // _MSC_VER > 1000
  
  class SharedObject  
  {
  public:
  	SharedObject();
  	virtual ~SharedObject();
  protected:
  	int unlock();
  	int lock();
  private:
  	volatile bool m_bLocked;
  };
  
  #endif // !defined(AFX_SHAREDOBJECT_H__0805D25C_2F7E_4B19_BECE_0A8BFE9F0830__INCLUDED_)
  
  
  
  1.1                  xml-axis/c/src/engine/SharedObject.cpp
  
  Index: SharedObject.cpp
  ===================================================================
  // SharedObject.cpp: implementation of the SharedObject class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #include "SharedObject.h"
  #ifdef WIN32
  #include <Windows.h>
  #else
  
  #endif
  //////////////////////////////////////////////////////////////////////
  // Construction/Destruction
  //////////////////////////////////////////////////////////////////////
  
  SharedObject::SharedObject()
  {
  	m_bLocked = false;
  }
  
  SharedObject::~SharedObject()
  {
  
  }
  //Following functions should be improved to avoid chances of failure
  //using platform specific mechanisms
  int SharedObject::lock()
  {
  	while (m_bLocked)
  	{
  #ifdef WIN32
  		Sleep(0);
  #else
  		sleep(0);
  #endif
  	}
  	m_bLocked = true;
  	return 0;
  }
  
  int SharedObject::unlock()
  {
  	m_bLocked = false;
  	return 0;
  }
  
  
  
  1.1                  xml-axis/c/src/engine/SessionScopeHandlerPool.h
  
  Index: SessionScopeHandlerPool.h
  ===================================================================
  // SessionScopeHandlerPool.h: interface for the SessionScopeHandlerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #if !defined(AFX_SESSIONSCOPEHANDLERPOOL_H__8F0188D8_B30B_43F9_8F06_8E209D7B8ABE__INCLUDED_)
  #define AFX_SESSIONSCOPEHANDLERPOOL_H__8F0188D8_B30B_43F9_8F06_8E209D7B8ABE__INCLUDED_
  
  #if _MSC_VER > 1000
  #pragma once
  #endif // _MSC_VER > 1000
  
  #define SESSIONLESSHANDLERS	"0aaaaa"
  
  #include "SharedObject.h"
  #include "../common/BasicHandler.h"
  
  #include <map>
  #include <list>
  #include <string>
  
  using namespace std;
  
  class SessionScopeHandlerPool : protected SharedObject  
  {
  public:
  	SessionScopeHandlerPool();
  	virtual ~SessionScopeHandlerPool();
  private:
  	typedef map<string, list<BasicHandler*> > SessionHandlers;
  	map<int, SessionHandlers*> m_Handlers;
  public:
  	int GetInstance(string& sSessionId, BasicHandler** pHandler, int nLibId);
  	int PutInstance(string& sSessionId, BasicHandler* pHandler, int nLibId);
  	void EndSession(string& sSessionId);
  };
  
  #endif // !defined(AFX_SESSIONSCOPEHANDLERPOOL_H__8F0188D8_B30B_43F9_8F06_8E209D7B8ABE__INCLUDED_)
  
  
  
  1.1                  xml-axis/c/src/engine/SessionScopeHandlerPool.cpp
  
  Index: SessionScopeHandlerPool.cpp
  ===================================================================
  // SessionScopeHandlerPool.cpp: implementation of the SessionScopeHandlerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  #pragma warning (disable : 4503)
  
  #include "SessionScopeHandlerPool.h"
  #include "HandlerLoader.h"
  
  //////////////////////////////////////////////////////////////////////
  // Construction/Destruction
  //////////////////////////////////////////////////////////////////////
  extern HandlerLoader g_HandlerLoader;
  
  SessionScopeHandlerPool::SessionScopeHandlerPool()
  {
  
  }
  
  SessionScopeHandlerPool::~SessionScopeHandlerPool()
  {
  
  }
  
  int SessionScopeHandlerPool::GetInstance(string& sSessionId, BasicHandler** pHandler, int nLibId)
  {
  	lock();
  	int Status;
  	if (m_Handlers.find(nLibId) != m_Handlers.end()) 
  	{
  		SessionHandlers* pSesHandlers = m_Handlers[nLibId];
  		if (pSesHandlers->find(sSessionId) != pSesHandlers->end())
  		{
  			list<BasicHandler*> &HandlerList = ((*pSesHandlers)[sSessionId]);
  			if (HandlerList.empty())
  			{
  				//check in the store for reuse
  				if ((*pSesHandlers)[SESSIONLESSHANDLERS].empty())
  				{
  					unlock();
  					return g_HandlerLoader.CreateHandler(pHandler, nLibId);
  				}
  				else
  				{
  					*pHandler = (*pSesHandlers)[SESSIONLESSHANDLERS].front();
  					(*pSesHandlers)[SESSIONLESSHANDLERS].pop_front();
  					unlock();
  					return SUCCESS;
  				}
  			}
  			else
  			{
  				*pHandler = HandlerList.front();
  				HandlerList.pop_front();
  				unlock();
  				return SUCCESS;
  			}
  			unlock();
  			return g_HandlerLoader.CreateHandler(pHandler, nLibId);
  		}
  		else //no handler list for this session id
  		{
  			//check in the store for reuse
  			if ((*pSesHandlers)[SESSIONLESSHANDLERS].empty())
  			{
  				unlock();
  				return g_HandlerLoader.CreateHandler(pHandler, nLibId);
  			}
  			else
  			{
  				*pHandler = (*pSesHandlers)[SESSIONLESSHANDLERS].front();
  				(*pSesHandlers)[SESSIONLESSHANDLERS].pop_front();
  				unlock();
  				return SUCCESS;
  			}
  		}
  	}
  	else //not even the handler DLL loaded
  	{
  		Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
  		if (SUCCESS == Status)
  		{
  			//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
  			SessionHandlers* pNewSH = new SessionHandlers;
  			pNewSH->clear();
  			m_Handlers[nLibId] = pNewSH;	
  		}
  		unlock();
  		return Status;
  	}
  }
  
  int SessionScopeHandlerPool::PutInstance(string& sSessionId, BasicHandler* pHandler, int nLibId)
  {
  	lock();
  	SessionHandlers* pSesHandlers;
  	if (m_Handlers.find(nLibId) != m_Handlers.end())
  	{
  		pSesHandlers = m_Handlers[nLibId];
  	}
  	else // this is unexpected situation. anyway do it
  	{
  		pSesHandlers = new SessionHandlers;
  		pSesHandlers->clear();
  		m_Handlers[nLibId] = pSesHandlers;	
  	}
  	list<BasicHandler*> &HandlerList = ((*pSesHandlers)[sSessionId]);
  	HandlerList.push_back(pHandler);
  	unlock();
  	return SUCCESS;
  }
  
  void SessionScopeHandlerPool::EndSession(string& sSessionId)
  {
  	//traverse all the lists and remove corresponding handlers if any and put to SESSIONLESSHANDLERS	
  }
  
  
  
  1.1                  xml-axis/c/src/engine/SerializerPool.h
  
  Index: SerializerPool.h
  ===================================================================
  // SerializerPool.h: interface for the SerializerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #if !defined(AFX_SERIALIZERPOOL_H__45283A27_9196_4ACF_952F_88C564A4BD40__INCLUDED_)
  #define AFX_SERIALIZERPOOL_H__45283A27_9196_4ACF_952F_88C564A4BD40__INCLUDED_
  
  #if _MSC_VER > 1000
  #pragma once
  #endif // _MSC_VER > 1000
  
  #include "SharedObject.h"
  #include "../soap/SoapSerializer.h"
  #include "../common/GDefine.h"
  #include <list>
  
  using namespace std;
  
  class SerializerPool : protected SharedObject  
  {
  public:
  	SerializerPool();
  	virtual ~SerializerPool();
  private:
  	list<SoapSerializer*> m_SZList;
  public:
  	int GetInstance(SoapSerializer** ppSZ);
  	int PutInstance(SoapSerializer* pSZ);
  };
  
  #endif // !defined(AFX_SERIALIZERPOOL_H__45283A27_9196_4ACF_952F_88C564A4BD40__INCLUDED_)
  
  
  
  1.1                  xml-axis/c/src/engine/SerializerPool.cpp
  
  Index: SerializerPool.cpp
  ===================================================================
  // SerializerPool.cpp: implementation of the SerializerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #include "SerializerPool.h"
  
  //////////////////////////////////////////////////////////////////////
  // Construction/Destruction
  //////////////////////////////////////////////////////////////////////
  
  SerializerPool::SerializerPool()
  {
  
  }
  
  SerializerPool::~SerializerPool()
  {
  
  }
  
  //pooling should be implemented
  int SerializerPool::GetInstance(SoapSerializer** ppSZ)
  {
  	//TODO
  	*ppSZ = new SoapSerializer();
  	return SUCCESS;
  }
  
  int SerializerPool::PutInstance(SoapSerializer* pSZ)
  {
  	//TODO
  	delete pSZ;
  	return SUCCESS;
  }
  
  
  
  1.1                  xml-axis/c/src/engine/RequestScopeHandlerPool.h
  
  Index: RequestScopeHandlerPool.h
  ===================================================================
  // RequestScopeHandlerPool.h: interface for the RequestScopeHandlerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #if !defined(AFX_REQUESTSCOPEHANDLERPOOL_H__310FD607_517E_4644_8922_0B1CFDE9E5BE__INCLUDED_)
  #define AFX_REQUESTSCOPEHANDLERPOOL_H__310FD607_517E_4644_8922_0B1CFDE9E5BE__INCLUDED_
  
  #if _MSC_VER > 1000
  #pragma once
  #endif // _MSC_VER > 1000
  
  #include "SharedObject.h"
  #include "../common/BasicHandler.h"
  
  #include <map>
  #include <list>
  #include <string>
  
  using namespace std;
  
  class RequestScopeHandlerPool : protected SharedObject  
  {
  public:
  	RequestScopeHandlerPool();
  	virtual ~RequestScopeHandlerPool();
  private:
  	map<int, list<BasicHandler*> > m_Handlers;
  public:
  	int GetInstance(BasicHandler** pHandler, int nLibId);
  	int PutInstance(BasicHandler* pHandler, int nLibId);
  };
  
  #endif // !defined(AFX_REQUESTSCOPEHANDLERPOOL_H__310FD607_517E_4644_8922_0B1CFDE9E5BE__INCLUDED_)
  
  
  
  1.1                  xml-axis/c/src/engine/RequestScopeHandlerPool.cpp
  
  Index: RequestScopeHandlerPool.cpp
  ===================================================================
  // RequestScopeHandlerPool.cpp: implementation of the RequestScopeHandlerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #include "RequestScopeHandlerPool.h"
  #include "HandlerLoader.h"
  
  //////////////////////////////////////////////////////////////////////
  // Construction/Destruction
  //////////////////////////////////////////////////////////////////////
  extern HandlerLoader g_HandlerLoader;
  
  RequestScopeHandlerPool::RequestScopeHandlerPool()
  {
  
  }
  
  RequestScopeHandlerPool::~RequestScopeHandlerPool()
  {
  
  }
  
  int RequestScopeHandlerPool::GetInstance(BasicHandler** pHandler, int nLibId)
  {
  	lock();
  	int Status;
  	if (m_Handlers.find(nLibId) != m_Handlers.end()) 
  	{
  		if (m_Handlers[nLibId].empty())
  		{
  			Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
  			if (SUCCESS == Status)
  			{
  				//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
  				m_Handlers[nLibId].clear();	
  			}
  			unlock();
  			return Status;
  		}
  		else
  		{
  			*pHandler = m_Handlers[nLibId].front();
  			m_Handlers[nLibId].pop_front();
  			unlock();
  			return SUCCESS;
  		}
  	}
  	else //not even the handler DLL loaded
  	{
  		Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
  		if (SUCCESS == Status)
  		{
  			//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
  			m_Handlers[nLibId].clear();	
  		}
  		unlock();
  		return Status;
  	}
  }
  
  int RequestScopeHandlerPool::PutInstance(BasicHandler* pHandler, int nLibId)
  {
  	lock();
  	m_Handlers[nLibId].push_back(pHandler);
  	unlock();
  	return SUCCESS;
  }
  
  
  
  1.1                  xml-axis/c/src/engine/DeserializerPool.h
  
  Index: DeserializerPool.h
  ===================================================================
  // DeserializerPool.h: interface for the DeserializerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #if !defined(AFX_DESERIALIZERPOOL_H__702116EF_3134_4ED4_8252_BEC1FC30E825__INCLUDED_)
  #define AFX_DESERIALIZERPOOL_H__702116EF_3134_4ED4_8252_BEC1FC30E825__INCLUDED_
  
  #if _MSC_VER > 1000
  #pragma once
  #endif // _MSC_VER > 1000
  
  #include "SharedObject.h"
  #include "../soap/SoapDeSerializer.h"
  #include "../common/GDefine.h"
  #include <list>
  
  using namespace std;
  
  class DeserializerPool : protected SharedObject  
  {
  public:
  	DeserializerPool();
  	virtual ~DeserializerPool();
  private:
  	list<SoapDeSerializer*> m_DZList;
  public:
  	int GetInstance(SoapDeSerializer** ppDZ);
  	int PutInstance(SoapDeSerializer* pDZ);
  };
  
  #endif // !defined(AFX_DESERIALIZERPOOL_H__702116EF_3134_4ED4_8252_BEC1FC30E825__INCLUDED_)
  
  
  
  1.1                  xml-axis/c/src/engine/DeserializerPool.cpp
  
  Index: DeserializerPool.cpp
  ===================================================================
  // DeserializerPool.cpp: implementation of the DeserializerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #include "DeserializerPool.h"
  
  //////////////////////////////////////////////////////////////////////
  // Construction/Destruction
  //////////////////////////////////////////////////////////////////////
  
  DeserializerPool::DeserializerPool()
  {
  
  }
  
  DeserializerPool::~DeserializerPool()
  {
  
  }
  
  int DeserializerPool::GetInstance(SoapDeSerializer** ppSZ)
  {
  	//TODO
  	*ppSZ = new SoapDeSerializer();
  	return SUCCESS;
  }
  
  int DeserializerPool::PutInstance(SoapDeSerializer* pSZ)
  {
  	//TODO
  	delete pSZ;
  	return SUCCESS;
  }
  
  
  
  1.1                  xml-axis/c/src/engine/AppScopeHandlerPool.h
  
  Index: AppScopeHandlerPool.h
  ===================================================================
  // AppScopeHandlerPool.h: interface for the AppScopeHandlerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #if !defined(AFX_APPSCOPEHANDLERPOOL_H__A94BE166_F35A_40B9_8B17_9ED3D1886503__INCLUDED_)
  #define AFX_APPSCOPEHANDLERPOOL_H__A94BE166_F35A_40B9_8B17_9ED3D1886503__INCLUDED_
  
  #if _MSC_VER > 1000
  #pragma once
  #endif // _MSC_VER > 1000
  
  #include "SharedObject.h"
  #include "../common/BasicHandler.h"
  
  #include <map>
  #include <list>
  #include <string>
  
  using namespace std;
  
  class AppScopeHandlerPool : protected SharedObject 
  {
  public:
  	AppScopeHandlerPool();
  	virtual ~AppScopeHandlerPool();
  private:
  	map<int, list<BasicHandler*> > m_Handlers;
  public:
  	int GetInstance(BasicHandler** pHandler, int nLibId);
  	int PutInstance(BasicHandler* pHandler, int nLibId);
  };
  
  #endif // !defined(AFX_APPSCOPEHANDLERPOOL_H__A94BE166_F35A_40B9_8B17_9ED3D1886503__INCLUDED_)
  
  
  
  1.1                  xml-axis/c/src/engine/AppScopeHandlerPool.cpp
  
  Index: AppScopeHandlerPool.cpp
  ===================================================================
  // AppScopeHandlerPool.cpp: implementation of the AppScopeHandlerPool class.
  //
  //////////////////////////////////////////////////////////////////////
  
  #include "AppScopeHandlerPool.h"
  #include "HandlerLoader.h"
  
  //////////////////////////////////////////////////////////////////////
  // Construction/Destruction
  //////////////////////////////////////////////////////////////////////
  extern HandlerLoader g_HandlerLoader;
  
  //this class does not do the object level blocking. Instead expects the 
  //thread level blocking and waiting by the caller thread.
  AppScopeHandlerPool::AppScopeHandlerPool()
  {
  
  }
  
  AppScopeHandlerPool::~AppScopeHandlerPool()
  {
  
  }
  
  //this method does not block the object. Instead expects that the calling thread 
  //MUST block itself and wait if the requested handler is not found.
  int AppScopeHandlerPool::GetInstance(BasicHandler** pHandler, int nLibId)
  {
  	lock();
  	int Status;
  	if (m_Handlers.find(nLibId) != m_Handlers.end()) 
  	{
  		if (m_Handlers[nLibId].empty()) 
  		// this means that the object is being used by some other thread
  		// but we cannot create any more objects because this is an application
  		// scope object. So just return HANDLER_BEING_USED
  		{
  			unlock();
  			return HANDLER_BEING_USED;
  		}
  		else
  		{
  			*pHandler = m_Handlers[nLibId].front();
  			m_Handlers[nLibId].pop_front();
  			unlock();
  			return SUCCESS;
  		}
  	}
  	else //not even the handler DLL loaded
  	{
  		Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
  		if (SUCCESS == Status)
  		{
  			//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
  			m_Handlers[nLibId].clear();	
  		}
  		unlock();
  		return Status;
  	}
  }
  
  int AppScopeHandlerPool::PutInstance(BasicHandler* pHandler, int nLibId)
  {
  	lock();
  	m_Handlers[nLibId].push_back(pHandler);
  	unlock();
  	return SUCCESS;
  }
  
  
  

c++ portability (was: Re: cvs commit: xml-axis/c/src/engine SharedObject.h ...)

Posted by Sanjiva Weerawarana <sa...@watson.ibm.com>.
"Steve Loughran" <st...@iseran.com> writes:
> 
> I am +1 for x-platform code standards, but IMO the Mozilla ones are 
> outdated or driven by support for obscure platforms & C++ compilers. 
> Things have improved, not least because gcc is the defacto standard for 
> everything but Windows.
> 
> My windows-linux-macosX code works with
> -modern ISO C++: wchar_t is a type, for(int i=0) {} scopes I to the 
> forloop, etc.
> -unicode everywhere
> -namespaces
> -no C style casts. dynamic_cast, reinterpret_cast, const_cast, etc.
> -STL datastructures. The VS.net 2003 is still buggy here *of course*
> -all exceptions derive from std::exception
> 
> I'd drop 1,3,4,5,19 from the list, retain the rest, even #2, which is 
> not as critical as it used to be, but still good practice -as you cannot 
> predict the order things get constructed.
> 
> http://www.iseran.com/Win32/Articles/walkthrough.html

While you're right that portability has indeed improved with latest 
versions of operating systems, many people who are C++ types end up
having to run code that requires quite a bit of legacy. As a result,
they don't have the freedom to update operating systems and compilers
as often as they may like to. This is especially true in workhorse
scientific computing systems - once things work well and highly 
efficiently, there is little reason to "upgrade" the underlying 
platform.

So, I'm +1 to following a rigourous set of rules for portability. 
Usually it means that you may have to do a bit more work (as some
cool new features would have to be avoided) but its worth the cost
if one of the desires is to support legacy integration, especially
in cross-language environments.

Sanjiva.



Re: cvs commit: xml-axis/c/src/engine SharedObject.h SharedObject.cpp SessionScopeHandlerPool.h SessionScopeHandlerPool.cpp SerializerPool.h SerializerPool.cpp RequestScopeHandlerPool.h RequestScopeHandlerPool.cpp DeserializerPool.h DeserializerPool.cpp AppScopeHandlerPool.h AppScopeHandlerPool.cpp Main.c HandlerPool.h HandlerPool.cpp HandlerLoader.h HandlerLoader.cpp HandlerChain.h HandlerChain.cpp AxisEngine.h AxisEngine.cpp Axis.cpp

Posted by Steve Loughran <st...@iseran.com>.
Sam Lang wrote:
> During the compile process for AxisC++, I'm getting a bunch of warnings
> from the headers:
> 
> warning: no newline at end of file
> 
> g++ gives this warning, but VC++ doesn't.  Because C++ compilers can
> differ dramatically across platforms, it might be worthwhile to have a
> set of C++ coding guidelines, to ensure this kind of problem doesn't
> happen.  The mozilla project has a set of guidelines for this purpose:
> 
> http://www.mozilla.org/hacking/portable-cpp.html
> 
> which addresses the above problem:
> 
> --snip--
> 10. Put a new line at end-of-file
> 
> Not having a new-line char at the end of file breaks .h files with the
> Sun WorkShop compiler and it breaks .cpp files on HP.
> --snip--
> 
> I would recommend adopting their guidelines, or coming up with your own.


I am +1 for x-platform code standards, but IMO the Mozilla ones are 
outdated or driven by support for obscure platforms & C++ compilers. 
Things have improved, not least because gcc is the defacto standard for 
everything but Windows.

My windows-linux-macosX code works with
-modern ISO C++: wchar_t is a type, for(int i=0) {} scopes I to the 
forloop, etc.
-unicode everywhere
-namespaces
-no C style casts. dynamic_cast, reinterpret_cast, const_cast, etc.
-STL datastructures. The VS.net 2003 is still buggy here *of course*
-all exceptions derive from std::exception

I'd drop 1,3,4,5,19 from the list, retain the rest, even #2, which is 
not as critical as it used to be, but still good practice -as you cannot 
predict the order things get constructed.

http://www.iseran.com/Win32/Articles/walkthrough.html


Re: cvs commit: xml-axis/c/src/engine SharedObject.h SharedObject.cpp SessionScopeHandlerPool.h SessionScopeHandlerPool.cpp SerializerPool.h SerializerPool.cpp RequestScopeHandlerPool.h RequestScopeHa

Posted by Kenneth Chiu <ch...@cs.indiana.edu>.
On Fri, 15 Aug 2003 susantha@opensource.lk wrote:

> On 14 Aug 2003 12:47:19 -0500, Sam Lang wrote
> > During the compile process for AxisC++, I'm getting a bunch of warnings
> > from the headers:
> >
> > warning: no newline at end of file
> >
> this happens when we develop in both VC++ and Linux. As you know in Windows
> we have CR+LF instead of newline charactor. For the time being running
> dos2unix on all the source will work.
> Anyway we will solve this immediatly.

Technically speaking, this is not really a CR+LF vs. LF
issue.  If you put a CR+LF at the end, g++ will still
compile it happily.  Here's a file with CR+LF that compiles
without warning with g++.  I first dump the file in binary
to show that it has CR+LF for line endings:

    $ od -t cx1 eol.cpp
    0000000   i   n   t       m   a   i   n   (   )       {  \r  \n
	    69 6e 74 20 6d 61 69 6e 28 29 20 7b 0d 0a 20 20
    0000020           r   e   t   u   r   n       0   ;  \r  \n   }  \r  \n
	    20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a
    0000040
    $ g++ eol.cpp
    $ g++ --version
    g++ (GCC) 3.2
    Copyright (C) 2002 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Here's the same file with LF as line endings, but no final line ending:

    $ od -t cx1 noeol.cpp
    0000000   i   n   t       m   a   i   n   (   )       {  \n
	    69 6e 74 20 6d 61 69 6e 28 29 20 7b 0a 20 20 20
    0000020       r   e   t   u   r   n       0   ;  \n   }
	    20 72 65 74 75 72 6e 20 30 3b 0a 7d
    0000034
    $ g++ noeol.cpp
    noeol.cpp:3:2: warning: no newline at end of file

g++ complains about it.

> > g++ gives this warning, but VC++ doesn't.  Because C++ compilers can
> > differ dramatically across platforms, it might be worthwhile to have
> > a set of C++ coding guidelines, to ensure this kind of problem
> > doesn't happen.  The mozilla project has a set of guidelines for
> > this purpose:
> >
> > http://www.mozilla.org/hacking/portable-cpp.html
>
> We are going through this and we find we have to do small changes to comply
> with this.
>
> >
> > which addresses the above problem:
> >
> > --snip--
> > 10. Put a new line at end-of-file
> >
> > Not having a new-line char at the end of file breaks .h files with
> > the Sun WorkShop compiler and it breaks .cpp files on HP. --snip--
> >
> > I would recommend adopting their guidelines, or coming up with your own.
> >
> > Also, In the following code (HandlerPool.cpp), when WIN32 is not defined
> >
> > (on unix platforms), 'sleep' goes undefined because unistd.h isn't being
> > #included.  So right now this doesn't compile on linux with g++.
> >
> > Instead of using system calls directly here to wait for the handler,
> > it would be nice if there were an AX_wait function that could be overridden
> > by application developers that want to use other threading models.  This
> > would allow them to plugin their own implementations of wait.
>
> Exactly, I will do it today.
>
> >
> > -slang
> >
>
> Thanks,
>
> Susantha.
>
> --
> Lanka Software Foundation (http://www.opensource.lk)
> Promoting Open-Source Development in Sri Lanka
>

Re: cvs commit: xml-axis/c/src/engine SharedObject.h SharedObject.cpp SessionScopeHandlerPool.h SessionScopeHandlerPool.cpp SerializerPool.h SerializerPool.cpp RequestScopeHandlerPool.h RequestScopeHandlerPool.cpp DeserializerPool.h DeserializerPool.cpp AppScopeHandlerPool.h AppScopeHandlerPool.cpp Main.c HandlerPool.h HandlerPool.cpp HandlerLoader.h HandlerLoader.cpp HandlerChain.h HandlerChain.cpp AxisEngine.h AxisEngine.cpp Axis.cpp

Posted by su...@opensource.lk.
On 14 Aug 2003 12:47:19 -0500, Sam Lang wrote
> During the compile process for AxisC++, I'm getting a bunch of warnings
> from the headers:
> 
> warning: no newline at end of file
> 
this happens when we develop in both VC++ and Linux. As you know in Windows 
we have CR+LF instead of newline charactor. For the time being running 
dos2unix on all the source will work.
Anyway we will solve this immediatly.

> g++ gives this warning, but VC++ doesn't.  Because C++ compilers can
> differ dramatically across platforms, it might be worthwhile to have 
> a set of C++ coding guidelines, to ensure this kind of problem 
> doesn't happen.  The mozilla project has a set of guidelines for 
> this purpose:
> 
> http://www.mozilla.org/hacking/portable-cpp.html

We are going through this and we find we have to do small changes to comply 
with this.

> 
> which addresses the above problem:
> 
> --snip--
> 10. Put a new line at end-of-file
> 
> Not having a new-line char at the end of file breaks .h files with 
> the Sun WorkShop compiler and it breaks .cpp files on HP. --snip--
> 
> I would recommend adopting their guidelines, or coming up with your own.
> 
> Also, In the following code (HandlerPool.cpp), when WIN32 is not defined
> 
> (on unix platforms), 'sleep' goes undefined because unistd.h isn't being
> #included.  So right now this doesn't compile on linux with g++.
> 
> Instead of using system calls directly here to wait for the handler, 
> it would be nice if there were an AX_wait function that could be overridden
> by application developers that want to use other threading models.  This
> would allow them to plugin their own implementations of wait.

Exactly, I will do it today.

> 
> -slang
> 

Thanks,

Susantha.

--
Lanka Software Foundation (http://www.opensource.lk)
Promoting Open-Source Development in Sri Lanka


Re: cvs commit: xml-axis/c/src/engine SharedObject.h SharedObject.cpp SessionScopeHandlerPool.h SessionScopeHandlerPool.cpp SerializerPool.h SerializerPool.cpp RequestScopeHandlerPool.h RequestScopeHandlerPool.cpp DeserializerPool.h DeserializerPool.cpp AppScopeHandlerPool.h AppScopeHandlerPool.cpp Main.c HandlerPool.h HandlerPool.cpp HandlerLoader.h HandlerLoader.cpp HandlerChain.h HandlerChain.cpp AxisEngine.h AxisEngine.cpp Axis.cpp

Posted by Sam Lang <sl...@anl.gov>.
During the compile process for AxisC++, I'm getting a bunch of warnings
from the headers:

warning: no newline at end of file

g++ gives this warning, but VC++ doesn't.  Because C++ compilers can
differ dramatically across platforms, it might be worthwhile to have a
set of C++ coding guidelines, to ensure this kind of problem doesn't
happen.  The mozilla project has a set of guidelines for this purpose:

http://www.mozilla.org/hacking/portable-cpp.html

which addresses the above problem:

--snip--
10. Put a new line at end-of-file

Not having a new-line char at the end of file breaks .h files with the
Sun WorkShop compiler and it breaks .cpp files on HP.
--snip--

I would recommend adopting their guidelines, or coming up with your own.

Also, In the following code (HandlerPool.cpp), when WIN32 is not defined
(on unix platforms), 'sleep' goes undefined because unistd.h isn't being
#included.  So right now this doesn't compile on linux with g++.

Instead of using system calls directly here to wait for the handler, it
would be nice if there were an AX_wait function that could be overridden
by application developers that want to use other threading models.  This
would allow them to plugin their own implementations of wait.

-slang

>   +	case AH_APPLICATION:
>   +		do {
>   +			if ((Status = g_AppScopeHandlerPool.GetInstance(ppHandler, nLibId)) == SUCCESS)
>    			{
>   -				pLh->m_Handler = pBh;
>   -				//Add to m_Handlers - place holder
>   -				m_Handlers[pHandlerInfo->GetLibName()] = pLh;
>   -				return pBh;
>   +				return Status;
>   +			}
>   +			else if (Status == HANDLER_BEING_USED)
>   +			{ //block this thread not this object
>   +				#ifdef WIN32
>   +				Sleep(0);
>   +				#else
>   +				sleep(0);
>   +				#endif
>    			}
>    			else
>    			{
>   -				//something wrong
>   -        return NULL;
>   +				return Status;
>    			}
>   -		}
>   -		else
>   -		{
>   -			//Uninitialize, unload and delete pLh
>   -		}
>   +		} while (Status == HANDLER_BEING_USED);
>   +		break;
>   +	case AH_SESSION:
>   +		return g_SessionScopeHandlerPool.GetInstance(sSessionId, ppHandler, nLibId);
>   +	case AH_REQUEST:
>   +		return g_RequestScopeHandlerPool.GetInstance(ppHandler, nLibId);
>    	}
>   -	return NULL;
>   +	return Status;
>    }
>    
>   -int HandlerPool::UnLoadHandler(WSDDHandler *pHandlerInfo)
>   +int HandlerPool::PoolHandler(string& sSessionId, BasicHandler* pHandler, int nScope, int nLibId)
>    {
>   -	LoadedHandler* pLh = NULL;
>   -	if (m_Handlers.find(pHandlerInfo->GetLibName()) != m_Handlers.end())
>   +	switch (nScope)
>    	{
>   -		pLh = m_Handlers[pHandlerInfo->GetLibName()];
>   -		pLh->m_DL->Finalize();
>   -		m_Handlers.erase(pHandlerInfo->GetLibName());
>   -		delete pLh;
>   -		return SUCCESS;
>   +	case AH_APPLICATION:
>   +		g_AppScopeHandlerPool.PutInstance(pHandler, nLibId);
>   +		break;
>   +	case AH_SESSION:
>   +		g_SessionScopeHandlerPool.PutInstance(sSessionId, pHandler, nLibId);
>   +		break;
>   +	case AH_REQUEST:
>   +		g_RequestScopeHandlerPool.PutInstance(pHandler, nLibId);
>   +		break;
>    	}
>   -	return FAIL;
>   +	return SUCCESS;
>    }
>    
>   -BasicHandler* HandlerPool::GetHandler(WSDDHandler *pHandlerInfo)
>   +int HandlerPool::GetGlobalRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId)
>    {
>   -	if (m_Handlers.find(pHandlerInfo->GetLibName()) != m_Handlers.end())
>   +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetGlobalRequestFlowHandlers();
>   +	if (pHandlerList)
>    	{
>   -		return m_Handlers[pHandlerInfo->GetLibName()]->m_Handler;
>   +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
>    	}
>   -	return NULL;
>   -}
>   -
>   -HandlerChain* HandlerPool::GetGlobalRequestFlowHandlerChain()
>   -{
>   -	return m_pGReqFChain;
>   -}
>   -
>   -HandlerChain* HandlerPool::GetGlobalResponseFlowHandlerChain()
>   -{
>   -	return m_pGResFChain;
>   -}
>   -
>   -HandlerChain* HandlerPool::GetTransportRequestFlowHandlerChain(AXIS_PROTOCOL_TYPE Protocol)
>   -{
>   -	if (m_TReqFChains.find(Protocol) != m_TReqFChains.end())
>   -		return m_TReqFChains[Protocol];
>   -	return NULL;
>   -}
>   -
>   -HandlerChain* HandlerPool::GetTransportResponseFlowHandlerChain(AXIS_PROTOCOL_TYPE Protocol)
>   -{
>   -	if (m_TReqFChains.find(Protocol) != m_TReqFChains.end())
>   -		return m_TResFChains[Protocol];
>   -	return NULL;
>   -}
>   -
>   -HandlerChain* HandlerPool::GetServiceRequestFlowHandlerChain()
>   -{
>   -	return m_pServiceReqFChain;
>   -}
>   -
>   -HandlerChain* HandlerPool::GetServiceResponseFlowHandlerChain()
>   -{
>   -	return m_pServiceResFChain;
>   -}
>   -
>   -int HandlerPool::LoadTransportRequestFlowHandlers(AXIS_PROTOCOL_TYPE Protocol, WSDDHandlerList* pHandlerList)
>   -{
>   -	HandlerChain* pHc = LoadHandlerChain(pHandlerList);
>   -	if (pHc)
>   +	else
>    	{
>   -		m_TReqFChains[Protocol] = pHc;
>   -		return SUCCESS;
>   +		*ppChain = NULL;
>   +		return SUCCESS; //NO_HANDLERS_CONFIGURED
>    	}
>   -	return FAIL;
>    }
>    
>   -int HandlerPool::LoadTransportResponseFlowHandlers(AXIS_PROTOCOL_TYPE Protocol, WSDDHandlerList* pHandlerList)
>   +int HandlerPool::GetGlobalResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId)
>    {
>   -	HandlerChain* pHc = LoadHandlerChain(pHandlerList);
>   -	if (pHc)
>   +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetGlobalResponseFlowHandlers();
>   +	if (pHandlerList)
>   +	{
>   +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
>   +	}
>   +	else
>    	{
>   -		m_TResFChains[Protocol] = pHc;
>   -		return SUCCESS;
>   +		*ppChain = NULL;
>   +		return SUCCESS; //NO_HANDLERS_CONFIGURED
>    	}
>   -	return FAIL;
>    }
>    
>   -int HandlerPool::LoadGlobalResponseFlowHandlers(WSDDHandlerList* pHandlerList)
>   +int HandlerPool::GetTransportRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, AXIS_PROTOCOL_TYPE Protocol)
>    {
>   -	m_pGResFChain = LoadHandlerChain(pHandlerList);
>   -	return (m_pGResFChain != NULL) ? SUCCESS:FAIL;
>   +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetTransportRequestFlowHandlers(Protocol);
>   +	if (pHandlerList)
>   +	{
>   +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
>   +	}
>   +	else
>   +	{
>   +		*ppChain = NULL;
>   +		return SUCCESS; //NO_HANDLERS_CONFIGURED
>   +	}
>    }
>    
>   -int HandlerPool::LoadGlobalRequestFlowHandlers(WSDDHandlerList* pHandlerList)
>   +int HandlerPool::GetTransportResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, AXIS_PROTOCOL_TYPE Protocol)
>    {
>   -	m_pGReqFChain = LoadHandlerChain(pHandlerList);
>   -	return (m_pGReqFChain != NULL) ? SUCCESS:FAIL;
>   +	const WSDDHandlerList* pHandlerList = g_WSDDDeployment.GetTransportResponseFlowHandlers(Protocol);
>   +	if (pHandlerList)
>   +	{
>   +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
>   +	}
>   +	else
>   +	{
>   +		*ppChain = NULL;
>   +		return SUCCESS; //NO_HANDLERS_CONFIGURED
>   +	}
>    }
>    
>   -int HandlerPool::LoadServiceRequestFlowHandlers(WSDDHandlerList *pHandlerList)
>   +int HandlerPool::GetRequestFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, const WSDDService* pService)
>    {
>   -	m_pServiceReqFChain = LoadHandlerChain(pHandlerList);
>   -	return (m_pServiceReqFChain != NULL) ? SUCCESS:FAIL;
>   +	const WSDDHandlerList* pHandlerList = pService->GetRequestFlowHandlers();
>   +	if (pHandlerList)
>   +	{
>   +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
>   +	}
>   +	else
>   +	{
>   +		*ppChain = NULL;
>   +		return SUCCESS; //NO_HANDLERS_CONFIGURED
>   +	}
>    }
>    
>   -int HandlerPool::LoadServiceResponseFlowHandlers(WSDDHandlerList *pHandlerList)
>   +int HandlerPool::GetResponseFlowHandlerChain(HandlerChain** ppChain, string& sSessionId, const WSDDService* pService)
>    {
>   -	m_pServiceResFChain = LoadHandlerChain(pHandlerList);
>   -	return (m_pServiceResFChain != NULL) ? SUCCESS:FAIL;
>   +	const WSDDHandlerList* pHandlerList = pService->GetResponseFlowHandlers();
>   +	if (pHandlerList)
>   +	{
>   +		return GetHandlerChain(sSessionId, ppChain, pHandlerList);
>   +	}
>   +	else
>   +	{
>   +		*ppChain = NULL;
>   +		return SUCCESS; //NO_HANDLERS_CONFIGURED
>   +	}
>    }
>    
>   -void HandlerPool::UnLoadServiceRequestFlowHandlers(WSDDHandlerList *pHandlerList)
>   +int HandlerPool::GetHandlerChain(string& sSessionId, HandlerChain** ppChain, const WSDDHandlerList *pHandlerList)
>    {
>   -	UnloadHandlerList(pHandlerList);
>   -	delete m_pServiceReqFChain;
>   -	m_pServiceReqFChain = NULL;
>   -}
>   +	lock();
>   +	*ppChain = NULL;
>   +	HandlerChain* pChain;
>   +	//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();
>   +	}
>    
>   -void HandlerPool::UnLoadServiceResponseFlowHandlers(WSDDHandlerList *pHandlerList)
>   -{
>   -	UnloadHandlerList(pHandlerList);
>   -	delete m_pServiceResFChain;
>   -	m_pServiceResFChain = NULL;
>   -}
>   +	WSDDHandler* pWSDDH;
>   +	BasicHandler* pBH;
>   +	int Status = SUCCESS;
>    
>   -HandlerChain* HandlerPool::LoadHandlerChain(WSDDHandlerList *pHandlerList)
>   -{
>   -	DEBUG1("HandlerPool::LoadHandlerChain");
>   -	int nLoaded = 0;
>   -	HandlerChain* pHc = NULL;
>   -	if (pHandlerList && !pHandlerList->empty())
>   +	for (WSDDHandlerList::const_iterator it = pHandlerList->begin(); it != pHandlerList->end(); it++)
>    	{
>   -		pHc = new HandlerChain();
>   -		//BasicHandler* pBh = NULL;;
>   -		Handler* pH = NULL;
>   -		for (WSDDHandlerList::iterator it=pHandlerList->begin(); it != pHandlerList->end(); it++)
>   +		pWSDDH = (*it);
>   +		if ((Status = GetHandler(&pBH, sSessionId, pWSDDH->GetScope(),pWSDDH->GetLibId())) == SUCCESS)
>    		{
>   -			//if ((pBh = LoadHandler(*it)) != NULL)
>   -			DEBUG1("BEFORE BasicHandler *pBh = LoadHandler(*it);");
>   -			BasicHandler *pBh = LoadHandler(*it);
>   -			DEBUG1("AFTER BasicHandler *pBh = LoadHandler(*it);");
>   -			if (pBh)
>   +			if (NORMAL_HANDLER == pBH->GetType())
>    			{
>   -				DEBUG1("BEFORE pH = static_cast<Handler*>(pBh);");
>   -				if (pBh->GetType() == NORMAL_HANDLER)
>   -					pH = static_cast<Handler*>(pBh);
>   -				else
>   -					pH = NULL;
>   -				DEBUG1("AFTER pH = static_cast<Handler*>(pBh);");
>   -				if (pH)
>   -				{          
>   -					DEBUG1("if (pH)");
>   -					pH->SetOptionList((*it)->GetOptionList());
>   -					nLoaded++;
>   -					pHc->AddHandler(pH);
>   -				}
>   -				else
>   -				{
>   -					return NULL;
>   -				}
>   +				pChain->AddHandler(static_cast<Handler*>(pBH), pWSDDH->GetScope(), pWSDDH->GetLibId());
>   +			}
>   +			else
>   +			{
>   +				Status = WRONG_HANDLER_TYPE;
>   +				break;
>    			}
>    		}
>   -		if (0!=nLoaded) 
>   +		else
>    		{
>   -			return pHc;
>   +			break;
>    		}
>   -		else 
>   +	}
>   +	if (Status != 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++)
>    		{
>   -			delete pHc;
>   -			return NULL;
>   +			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);
>   +		unlock();
>   +		return Status;
>   +	}
>   +	else
>   +	{
>   +		*ppChain = pChain;
>   +		unlock();
>   +		return Status;
>    	}
>   -	return NULL;
>    }
>    
>   -void HandlerPool::UnloadHandlerList(WSDDHandlerList *pHandlerList)
>   +void HandlerPool::PoolHandlerChain(HandlerChain* pChain, string& sSessionId)
>    {
>   -	if (pHandlerList && !pHandlerList->empty()) {
>   -		for (WSDDHandlerList::iterator it=pHandlerList->begin();
>   -		it != pHandlerList->end(); it++)
>   +	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)
>    		{
>   -			UnLoadHandler(*it);
>   +			PoolHandler(sSessionId, (*pChain->m_itCurrHandler).m_pHandler, (*pChain->m_itCurrHandler).m_nScope, (*pChain->m_itCurrHandler).m_nLibId);
>    		}
>    	}
>   +	pChain->Fini();
>   +	lock();
>   +	m_ChainStore.push_back(pChain);
>   +	unlock();
>    }
>    
>   -BasicHandler* HandlerPool::LoadWebService(WSDDService* pService)
>   +int HandlerPool::GetWebService(BasicHandler** ppHandler, string& sSessionId, const WSDDHandler* pService)
>    {
>   -	return LoadHandler(pService);
>   +	int Status;
>   +	if ((Status = GetHandler(ppHandler, sSessionId, pService->GetScope(), pService->GetLibId())) == SUCCESS)
>   +	{
>   +		if (SUCCESS != (Status = (*ppHandler)->Init()))
>   +		{
>   +			(*ppHandler)->Fini();
>   +			PoolHandler(sSessionId, *ppHandler, pService->GetScope(), pService->GetLibId());
>   +			*ppHandler = NULL;
>   +		}
>   +	}
>   +	return Status;
>    }
>    
>   -void HandlerPool::UnloadWebService(WSDDService* pService)
>   +void HandlerPool::PoolWebService(string& sSessionId, BasicHandler* pHandler, const WSDDHandler *pHandlerInfo)
>    {
>   -	UnLoadHandler(pService);
>   +	PoolHandler(sSessionId, pHandler, pHandlerInfo->GetScope(), pHandlerInfo->GetLibId());
>    }
>   
>   
>   
>   1.2       +32 -17    xml-axis/c/src/engine/HandlerLoader.h
>   
>   Index: HandlerLoader.h
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/HandlerLoader.h,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   -- HandlerLoader.h	25 Jun 2003 05:13:45 -0000	1.1
>   +++ HandlerLoader.h	13 Aug 2003 14:07:47 -0000	1.2
>   @@ -67,7 +67,9 @@
>    #include "../common/MessageData.h"
>    #include "../common/GDefine.h"
>    #include "../common/WrapperClassHandler.h"
>   +#include "SharedObject.h"
>    
>   +#include <map>
>    #include <string>
>    
>    using namespace std;
>   @@ -85,29 +87,42 @@
>    #else //Linux
>    #include <dlfcn.h>
>    #define DLHandler void*
>   -
>    #endif
>    
>   -class HandlerLoader {
>   +//status codes
>   +#define HANDLER_INIT_FAIL	1
>   +#define CREATION_FAILED		2
>   +#define LOADLIBRARY_FAILED	3
>   +#define LIBRARY_PATH_EMPTY	4
>   +#define HANDLER_NOT_LOADED	5
>   +#define HANDLER_BEING_USED	6
>   +#define GET_HANDLER_FAILED	7
>   +#define WRONG_HANDLER_TYPE	8
>   +#define NO_HANDLERS_CONFIGURED	9
>   +
>   +class HandlerLoader : protected SharedObject
>   +{
>    private:
>   -	BasicHandler* m_pClass;
>   -	string m_sLib;
>   -	int m_nLoadOptions;
>   -	DLHandler m_Handler;
>   -	CREATE_OBJECT m_Create;
>   -	DELETE_OBJECT m_Delete;
>   +	typedef struct HandlerInformation
>   +	{
>   +		string m_sLib;
>   +		int m_nLoadOptions;
>   +		DLHandler m_Handler;
>   +		CREATE_OBJECT m_Create;
>   +		DELETE_OBJECT m_Delete;
>   +		int m_nObjCount;
>   +	} HandlerInformation;
>   +
>   +	map<int, HandlerInformation*> m_HandlerInfoList;
>   +
>    public:
>   -	BasicHandler* GetHandler();
>   -	HandlerLoader(string &sFile, int nOptions=RTLD_LAZY);
>   +	int CreateHandler(BasicHandler** pHandler, int nLibId);
>   +	int DeleteHandler(BasicHandler* pHandler, int nLibId);
>   +	HandlerLoader();
>    	~HandlerLoader();
>   -	int Initialize();
>   -	int Invoke(MessageData *pMsg);
>   -	int Finalize();
>    private:
>   -	int LoadLib();
>   -	CREATE_OBJECT GetCreate();
>   -	DELETE_OBJECT GetDelete();
>   -	int UnloadLib();
>   +	int LoadLib(HandlerInformation* pHandlerInfo);
>   +	int UnloadLib(HandlerInformation* pHandlerInfo);
>    };
>    
>    
>   
>   
>   
>   1.4       +102 -91   xml-axis/c/src/engine/HandlerLoader.cpp
>   
>   Index: HandlerLoader.cpp
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/HandlerLoader.cpp,v
>   retrieving revision 1.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   -- HandlerLoader.cpp	4 Aug 2003 06:36:43 -0000	1.3
>   +++ HandlerLoader.cpp	13 Aug 2003 14:07:47 -0000	1.4
>   @@ -64,125 +64,136 @@
>    #include "HandlerLoader.h"
>    #include <stdio.h>
>    #include "../common/Debug.h"
>   +#include "../wsdd/WSDDDeployment.h"
>    
>   -HandlerLoader::HandlerLoader(string &sFile, int nOptions)
>   -{
>   -	m_sLib = sFile.c_str();
>   -	m_nLoadOptions = nOptions;
>   -	m_Handler = 0;
>   -	m_pClass = NULL;
>   -}
>   +extern WSDDDeployment g_WSDDDeployment;
>    
>   -HandlerLoader::~HandlerLoader()
>   +HandlerLoader::HandlerLoader()
>    {
>   -	if (m_pClass)
>   -		m_Delete(m_pClass);
>   -	if (m_Handler != 0)
>   -		UnloadLib(); 
>    }
>    
>   -int HandlerLoader::Initialize()
>   +HandlerLoader::~HandlerLoader()
>    {
>   -	if (0 == m_Handler)
>   -	{    
>   -    DEBUG1("if (0 == m_Handler):HandlerLoader::Initialize()");
>   -            
>   -		if (LoadLib())
>   -		{      
>   -//			printf("LoadLib success\n");
>   -			m_Create = GetCreate();
>   -			m_Delete = GetDelete();
>   -			if (!m_Create || !m_Delete)
>   -			{
>   -//				printf("could not get function pointers\n");
>   -				UnloadLib();
>   -				m_Handler = 0;
>   -				return FAIL;
>   -			}
>   -			m_Create(&m_pClass);
>   -			return SUCCESS;
>   -		}
>   -		else 
>   -		{
>   -//			printf("LoadLib failed\n");
>   -			return FAIL;
>   -		}
>   +	lock();
>   +	HandlerInformation* pHandlerInfo = NULL;
>   +	for (map<int, HandlerInformation*>::iterator it = m_HandlerInfoList.begin(); it != m_HandlerInfoList.end(); it++)
>   +	{
>   +		pHandlerInfo = (*it).second;
>   +		if (pHandlerInfo->m_nObjCount != 0); //it seems that some objects created have not been deleted - unexpected
>   +		UnloadLib(pHandlerInfo);
>   +		delete pHandlerInfo;
>    	}
>   -	return SUCCESS;
>   +	unlock();
>    }
>    
>   -int HandlerLoader::Invoke(MessageData *pMsg)
>   +int HandlerLoader::DeleteHandler(BasicHandler* pHandler, int nLibId)
>    {
>   -	if (m_pClass)
>   +	lock();
>   +	if (m_HandlerInfoList.find(nLibId) != m_HandlerInfoList.end())
>    	{
>   -		return m_pClass->Invoke(pMsg);
>   +		HandlerInformation* pHandlerInfo = m_HandlerInfoList[nLibId];
>   +		pHandlerInfo->m_nObjCount--;
>   +		pHandlerInfo->m_Delete(pHandler);
>   +		if (pHandlerInfo->m_nObjCount == 0); //time to unload the DLL
>   +		unlock();
>   +		return SUCCESS;
>    	}
>   -	return FAIL;
>   -}
>   -
>   -int HandlerLoader::Finalize()
>   -{
>   -	m_Delete(m_pClass);
>   -	m_pClass = NULL;
>   -	UnloadLib();
>   -	m_Handler = 0;
>   -	return SUCCESS;
>   -}
>   -
>   -int HandlerLoader::LoadLib()
>   -{
>   -  
>   -  DEBUG2("in HandlerLoader::LoadLib(), Lib is :", m_sLib.c_str());
>   -   	
>   -#ifdef WIN32
>   -	m_Handler = LoadLibrary(m_sLib.c_str());
>   -#else //Linux
>   -  
>   -	m_Handler = dlopen(m_sLib.c_str(), m_nLoadOptions);
>   -  
>   -  DEBUG1("after m_Handler = dlopen(m_sLib.c_str(), m_nLoadOptions);");
>   -   
>   -  
>   -      	if (!m_Handler)
>   +	else
>    	{
>   -    
>   -//		printf("Error is :%s\n",dlerror());
>   +		unlock();
>   +		return HANDLER_NOT_LOADED;
>    	}
>   -  
>   -#endif
>   -	return (m_Handler != 0);
>   -}
>   -
>   -CREATE_OBJECT HandlerLoader::GetCreate()
>   -{
>   -#ifdef WIN32
>   -	return (CREATE_OBJECT)GetProcAddress(m_Handler,CREATE_FUNCTION);
>   -#else //Linux
>   -	return (CREATE_OBJECT)dlsym(m_Handler,CREATE_FUNCTION);
>   -#endif
>    }
>    
>   -DELETE_OBJECT HandlerLoader::GetDelete()
>   +int HandlerLoader::LoadLib(HandlerInformation* pHandlerInfo)
>    {
>   +	DEBUG2("in HandlerLoader::LoadLib(), Lib is :", pHandlerInfo->m_sLib.c_str());
>    #ifdef WIN32
>   -	return (DELETE_OBJECT)GetProcAddress(m_Handler,DELETE_FUNCTION);
>   +	pHandlerInfo->m_Handler = LoadLibrary(pHandlerInfo->m_sLib.c_str());
>    #else //Linux
>   -	return (DELETE_OBJECT)dlsym(m_Handler,DELETE_FUNCTION);
>   +	pHandlerInfo->m_Handler = dlopen(pHandlerInfo->m_sLib.c_str(), pHandlerInfo->m_nLoadOptions);
>   +	DEBUG1("after m_Handler = dlopen(pHandlerInfo->m_sLib.c_str(), pHandlerInfo->m_nLoadOptions);");  
>    #endif
>   +	return (pHandlerInfo->m_Handler != 0)?SUCCESS:FAIL;
>    }
>    
>   -int HandlerLoader::UnloadLib()
>   +int HandlerLoader::UnloadLib(HandlerInformation* pHandlerInfo)
>    {
>    #ifdef WIN32
>   -	FreeLibrary(m_Handler);
>   +	FreeLibrary(pHandlerInfo->m_Handler);
>    #else //Linux
>   -	dlclose(m_Handler);
>   +	dlclose(pHandlerInfo->m_Handler);
>    #endif
>    	return SUCCESS;
>    }
>    
>   -BasicHandler* HandlerLoader::GetHandler()
>   +int HandlerLoader::CreateHandler(BasicHandler** pHandler, int nLibId)
>    {
>   -	BasicHandler* pH = m_pClass;
>   -	return pH;
>   +	lock();
>   +	*pHandler = NULL;
>   +	HandlerInformation* pHandlerInfo = NULL;
>   +	if (m_HandlerInfoList.find(nLibId) == m_HandlerInfoList.end())
>   +	{
>   +		HandlerInformation* pHandlerInfo = new HandlerInformation();
>   +		pHandlerInfo->m_sLib = g_WSDDDeployment.GetLibName(nLibId);
>   +		if (pHandlerInfo->m_sLib.empty())
>   +		{
>   +			delete pHandlerInfo;
>   +			unlock();
>   +			return LIBRARY_PATH_EMPTY;
>   +		}
>   +		pHandlerInfo->m_nLoadOptions = RTLD_LAZY;
>   +		if (SUCCESS == LoadLib(pHandlerInfo))
>   +		{  
>   +			#ifdef WIN32
>   +			pHandlerInfo->m_Create = (CREATE_OBJECT)GetProcAddress(pHandlerInfo->m_Handler,CREATE_FUNCTION);
>   +			pHandlerInfo->m_Delete = (DELETE_OBJECT)GetProcAddress(pHandlerInfo->m_Handler,DELETE_FUNCTION);
>   +			#else //Linux
>   +			pHandlerInfo->m_Create = (CREATE_OBJECT)dlsym(pHandlerInfo->m_Handler,CREATE_FUNCTION);
>   +			pHandlerInfo->m_Delete = (DELETE_OBJECT)dlsym(pHandlerInfo->m_Handler,DELETE_FUNCTION);
>   +			#endif		
>   +			if (!pHandlerInfo->m_Create || !pHandlerInfo->m_Delete)
>   +			{
>   +				UnloadLib(pHandlerInfo);
>   +				delete pHandlerInfo;
>   +				unlock();
>   +				return LOADLIBRARY_FAILED;
>   +			}
>   +			else //success
>   +			{
>   +				m_HandlerInfoList[nLibId] = pHandlerInfo;
>   +			}
>   +		}
>   +		else 
>   +		{
>   +			unlock();
>   +			return LOADLIBRARY_FAILED;
>   +		}
>   +	}
>   +	
>   +	pHandlerInfo = m_HandlerInfoList[nLibId];
>   +	BasicHandler* pBH = NULL;
>   +	pHandlerInfo->m_Create(&pBH);
>   +	if (pBH)
>   +	{
>   +		if (SUCCESS == pBH->Init())
>   +		{
>   +			pHandlerInfo->m_nObjCount++;
>   +			*pHandler = pBH;
>   +			unlock();
>   +			return SUCCESS;
>   +		}
>   +		else
>   +		{
>   +			pBH->Fini();
>   +			delete pBH;
>   +			unlock();
>   +			return HANDLER_INIT_FAIL;
>   +		}
>   +	}
>   +	else
>   +	{
>   +		unlock();
>   +		return CREATION_FAILED;
>   +	}
>    }
>   
>   
>   
>   1.5       +13 -4     xml-axis/c/src/engine/HandlerChain.h
>   
>   Index: HandlerChain.h
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/HandlerChain.h,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   -- HandlerChain.h	4 Aug 2003 06:36:43 -0000	1.4
>   +++ HandlerChain.h	13 Aug 2003 14:07:47 -0000	1.5
>   @@ -80,18 +80,27 @@
>    
>    class HandlerChain : public BasicHandler  
>    {
>   +	friend class HandlerPool;
>   +private:
>   +	typedef struct ChainItem
>   +	{
>   +		Handler* m_pHandler;
>   +		int m_nScope;
>   +		int m_nLibId;
>   +	} ChainItem;
>    public:
>   -	int AddHandler(Handler* pHandler);
>   +	int AddHandler(Handler* pHandler, int nScope, int nLibId);
>    	HandlerChain();
>    	virtual ~HandlerChain();
>   -
>    	int Invoke(IMessageData* pMsg);
>    	void OnFault(IMessageData* pMsg);
>    	int GetType(){return CHAIN_HANDLER;};
>   +	int Init();
>   +	int Fini();
>    
>    private:
>   -	list<Handler*> m_HandlerList;
>   -  list<Handler*>::iterator m_itCurrHandler;
>   +	list<ChainItem> m_HandlerList;
>   +	list<ChainItem>::iterator m_itCurrHandler;
>    };
>    
>    #endif // !defined(AFX_HANDLERCHAIN_H__675E51BF_2FD7_4860_B3DE_F8B5A978EB99__INCLUDED_)
>   
>   
>   
>   1.5       +21 -10    xml-axis/c/src/engine/HandlerChain.cpp
>   
>   Index: HandlerChain.cpp
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/HandlerChain.cpp,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   -- HandlerChain.cpp	15 Jul 2003 05:38:03 -0000	1.4
>   +++ HandlerChain.cpp	13 Aug 2003 14:07:47 -0000	1.5
>   @@ -84,17 +84,13 @@
>    
>    int HandlerChain::Invoke(IMessageData* pMsg)
>    {
>   -  
>   -  DEBUG1("HandlerChain::Invoke(IMessageData* pMsg)");
>   -  
>   +	DEBUG1("HandlerChain::Invoke(IMessageData* pMsg)");
>    	m_itCurrHandler = m_HandlerList.begin();
>    	while (m_itCurrHandler != m_HandlerList.end())
>    	{
>   -    DEBUG1("while (m_itCurrHandler != m_HandlerList.end())");
>   -		if (SUCCESS == (*m_itCurrHandler)->Invoke(pMsg))
>   +		if (SUCCESS == (*m_itCurrHandler).m_pHandler->Invoke(pMsg))
>    		{
>    			m_itCurrHandler++;
>   -      DEBUG1("if (SUCCESS == (*m_itCurrHandler)->Invoke(pMsg))");
>    		}
>    		else
>    		{
>   @@ -102,7 +98,7 @@
>    			return FAIL;
>    		}
>    	}
>   -  DEBUG1("HandlerChain::Invoke end");
>   +	DEBUG1("HandlerChain::Invoke end");
>    	return SUCCESS;
>    }
>    
>   @@ -110,14 +106,29 @@
>    {
>    	while (m_itCurrHandler != m_HandlerList.begin())
>    	{
>   -		(*m_itCurrHandler)->OnFault(pMsg);
>   +		(*m_itCurrHandler).m_pHandler->OnFault(pMsg);
>    		m_itCurrHandler--;
>    	}
>    }
>    
>   -int HandlerChain::AddHandler(Handler *pHandler)
>   +int HandlerChain::AddHandler(Handler* pHandler, int nScope, int nLibId)
>    {
>   -	m_HandlerList.push_back(pHandler);
>   +	ChainItem item;
>   +	item.m_pHandler = pHandler;
>   +	item.m_nScope = nScope;
>   +	item.m_nLibId = nLibId;
>   +	m_HandlerList.push_back(item);
>   +	return SUCCESS;
>   +}
>    
>   +int HandlerChain::Init()
>   +{
>   +	m_HandlerList.clear();
>    	return SUCCESS;
>   +}
>   +
>   +int HandlerChain::Fini()
>   +{
>   +	m_HandlerList.clear();
>   +	return SUCCESS;	
>    }
>   
>   
>   
>   1.5       +18 -19    xml-axis/c/src/engine/AxisEngine.h
>   
>   Index: AxisEngine.h
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/AxisEngine.h,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   -- AxisEngine.h	27 Jul 2003 09:59:47 -0000	1.4
>   +++ AxisEngine.h	13 Aug 2003 14:07:47 -0000	1.5
>   @@ -67,36 +67,35 @@
>    #define __AXISENGINE_INCLUDED__
>    
>    #include "../common/GDefine.h"
>   -#include "../common/BasicHandler.h"
>   -#include "../wsdd/WSDDDeployment.h"
>   -#include "HandlerPool.h"
>   -
>    #include "../common/Packet.h"
>   +#include "../soap/SoapSerializer.h"
>   +#include "../soap/SoapDeSerializer.h"
>   +#include "../common/BasicHandler.h"
>   +#include "../common/MessageData.h"
>   +#include "HandlerChain.h"
>    
>   -class AxisEngine // : public BasicHandler
>   +class AxisEngine 
>    {
>    private:	
>   -	static AxisEngine* m_pObject; //Singleton object.
>    	SoapSerializer* m_pSZ;
>    	SoapDeSerializer* m_pDZ;
>   -	WSDDDeployment* m_pWSDD;
>   -	HandlerPool* m_pHandlerPool;
>   -//  string m_sResponse;
>   -private:
>   +	HandlerChain* m_pGReqFChain;
>   +	HandlerChain* m_pGResFChain;
>   +	HandlerChain* m_pTReqFChain;
>   +	HandlerChain* m_pTResFChain;
>   +	HandlerChain* m_pSReqFChain;
>   +	HandlerChain* m_pSResFChain;
>    	BasicHandler* m_pWebService;
>   -	int Initialize();
>   -	void UnInitialize();
>   -	AxisEngine();
>   -
>    public:
>   +	AxisEngine();
>    	~AxisEngine();
>   -
>   +	int Process(Ax_soapstream* soap);
>   +private:
>    	int Invoke(MessageData* pMsg);
>    	void OnFault(MessageData* pMsg);
>   -
>   -	static AxisEngine* GetAxisEngine();
>   -	int Process(soapstream* soap);
>   -	WSDDDeployment* getWSDDDeployment();
>   +	int Initialize();
>   +	int InitializeHandlers(string& sSessionId, AXIS_PROTOCOL_TYPE protocol);
>   +	void UnInitialize();
>    };
>    
>    #endif
>   
>   
>   
>   1.14      +238 -349  xml-axis/c/src/engine/AxisEngine.cpp
>   
>   Index: AxisEngine.cpp
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/AxisEngine.cpp,v
>   retrieving revision 1.13
>   retrieving revision 1.14
>   diff -u -r1.13 -r1.14
>   -- AxisEngine.cpp	1 Aug 2003 07:05:02 -0000	1.13
>   +++ AxisEngine.cpp	13 Aug 2003 14:07:47 -0000	1.14
>   @@ -64,21 +64,12 @@
>    #include <stdio.h>
>    #include "AxisEngine.h"
>    #include "../common/AxisException.h"
>   -#include "../common/MessageData.h"
>   -#include "../soap/SoapSerializer.h"
>   -#include "../soap/SoapDeSerializer.h"
>   -#include "../soap/SoapFaults.h"
>   -#include "../soap/URIMapping.h"
>    #include "../common/Debug.h"
>    #include "../common/Packet.h"
>   -
>   -
>   -#ifdef WIN32
>   -//#define WSDDFILEPATH "./Axis/conf/server.wsdd"
>   -#define WSDDFILEPATH "C:/Apache/Axis/server.wsdd"
>   -#else //For linux
>   -#define WSDDFILEPATH "/usr/local/axiscpp/axis/server.wsdd"
>   -#endif
>   +#include "../wsdd/WSDDDeployment.h"
>   +#include "HandlerPool.h"
>   +#include "DeserializerPool.h"
>   +#include "SerializerPool.h"
>    
>    //extern int send_response_bytes(char * res);
>    
>   @@ -86,344 +77,253 @@
>    
>    //extern int send_transport_information(soapstream *);
>    
>   -
>   -AxisEngine* AxisEngine::m_pObject = NULL;
>   +extern DeserializerPool g_DeserializerPool;
>   +extern SerializerPool g_SerializerPool;
>   +extern HandlerPool g_HandlerPool;
>   +extern WSDDDeployment g_WSDDDeployment;
>    
>    AxisEngine::AxisEngine()
>    {
>   -	//Create Serializer and Deserializer
>   -	m_pSZ = new SoapSerializer();
>   -	m_pDZ = new SoapDeSerializer();  
>   -	m_pWSDD = new WSDDDeployment();
>   -	m_pHandlerPool = new HandlerPool();
>   +	m_pSZ = NULL;
>   +	m_pDZ = NULL;  
>   +	m_pGReqFChain = NULL;
>   +	m_pGResFChain = NULL;
>   +	m_pTReqFChain = NULL;
>   +	m_pTResFChain = NULL;
>   +	m_pSReqFChain = NULL;
>   +	m_pSResFChain = NULL;
>    	m_pWebService = NULL;
>   -  
>   -  //printf("Done WSDD\n");
>    }
>    
>    AxisEngine::~AxisEngine()
>    {
>   -	delete m_pSZ;
>   -	delete m_pDZ;
>   -	delete m_pWSDD;
>   -	delete m_pHandlerPool;
>   -	//unload xerces DLL
>   -	XMLPlatformUtils::Terminate();
>   -}
>   -
>   -WSDDDeployment * AxisEngine::getWSDDDeployment()
>   -{
>   -	if(m_pWSDD)
>   -	{
>   -		return m_pWSDD; 
>   -	}
>   -	return NULL;
>    }
>    
>   -AxisEngine* AxisEngine::GetAxisEngine()
>   +int AxisEngine::Process(Ax_soapstream* soap) 
>    {
>   -	if (!m_pObject)
>   -	{
>   -		try
>   -		{
>   -      DEBUG1("AxisEngine::GetAxisEngine()");
>   -			XMLPlatformUtils::Initialize();
>   -			m_pObject = new AxisEngine();
>   -			if (!m_pObject) return NULL;
>   -			if(SUCCESS != m_pObject->Initialize())
>   -			{
>   -				m_pObject->UnInitialize();
>   -				delete m_pObject;
>   -				m_pObject = NULL;
>   -				return NULL;
>   +	int Status;
>   +	AXIS_TRY
>   +		DEBUG1("AxisEngine::Process");
>   +		MessageData* pMsg = NULL;
>   +		const WSDDService* pService = NULL;
>   +		string sSessionId = soap->sessionid;
>   +		int nSoapVersion;
>   +
>   +		do {
>   +			//create and populate MessageData
>   +			if (SUCCESS != Initialize())
>   +			{
>   +				nSoapVersion = m_pDZ->GetVersion();
>   +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
>   +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADSRV));
>   +				break; //do .. while(0)
>   +			}
>   +			pMsg = new MessageData();
>   +			pMsg->m_Protocol = soap->trtype;
>   +			pMsg->SetSerializer(m_pSZ);
>   +			pMsg->SetDeSerializer(m_pDZ);
>   +    
>   +			if (SUCCESS != m_pDZ->SetInputStream(soap->str.ip_stream))
>   +			{
>   +				nSoapVersion = m_pDZ->GetVersion();
>   +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
>   +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPCONTENTERROR));
>   +				break; //do .. while(0)
>    			}
>   -		}
>   -		catch (...)
>   -		{
>   -			return NULL;
>   -		}	
>   -	}
>   -	return m_pObject;
>   -}
>    
>   -int AxisEngine::Process(soapstream* soap) 
>   -{
>   +			char* cService= getheader(soap, SOAPACTIONHEADER);
>   +			string service = (cService == NULL)? "" : cService;
>   +		  
>   +			DEBUG2("string service = ",service.c_str());
>   +     
>   +			if (service.empty()) 
>   +			{
>   +				nSoapVersion = pMsg->m_pDZ->GetVersion();
>   +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
>   +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPACTIONEMPTY));
>   +				break; //do .. while(0)
>   +			}
>   +			if (service.find('\"') != string::npos) //if there are quotes remove them.
>   +			{
>   +				service = service.substr(1, service.length() - 2);
>   +			}
>    
>   -  try
>   -  {
>   -    DEBUG1("AxisEngine::Process");
>   - 
>   -	  MessageData* pMsg = NULL;
>   -	  MemBufInputSource* pSoapInput = NULL;
>   -	  WSDDHandlerList* pHandlerList = NULL;
>   -	  WSDDService* pService = NULL;
>   -	  do {
>   -		  //Initialize Serializer and Deserializer objects
>   -		  m_pSZ->init();
>   -		  m_pDZ->Init();
>   -		  //create and populate MessageData
>   -		  pMsg = new MessageData();
>   -		  pMsg->m_Protocol = soap->trtype;
>   -		  pMsg->SetSerializer(m_pSZ);
>   -		  pMsg->SetDeSerializer(m_pDZ);
>   -    
>   -		  //Adding SoapEnvelop and SoapBody to Serializer
>   -		  SoapEnvelope* pEnv = new SoapEnvelope();
>   -		  pMsg->m_pSZ->setSoapEnvelope(pEnv);
>   -		  pMsg->m_pSZ->setSoapBody(new SoapBody());
>   -
>   -		  //--start--
>   -
>   -		  //Deserialize
>   -		  //--START XERCES SAX2 SPCIFIC CODE--//
>   -          //a huge buffer to store the whole soap request stream
>   -		  char hugebuffer[10000];
>   -         //to store the number of chars returned by get_request_bytes
>   -		  int nChars = 0;
>   -          //request a huge number of bytes to get the whole soap request
>   -          //when pull parsing is used this should change
>   -		  get_request_bytes(hugebuffer, 10000, &nChars);
>   -		  DEBUG1(hugebuffer);      
>   -          //if no soap then quit
>   -		  if (nChars <= 0) break;
>   -		  pSoapInput = new MemBufInputSource((const unsigned char*)hugebuffer, nChars ,"bufferid",false);
>   -
>   -		  if (SUCCESS != m_pDZ->SetStream(pSoapInput)) //this parses the full soap request.
>   -		  {
>   -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPCONTENTERROR));
>   -			  break; //do .. while(0)
>   -		  }
>   -		  //--END XERCES SAX2 SPCIFIC CODE--//
>   +			//get service description object from the WSDD
>   +			pService = g_WSDDDeployment.GetService(service);
>   +			if (!pService) 
>   +			{
>   +				nSoapVersion = pMsg->m_pDZ->GetVersion();
>   +				nSoapVersion = (nSoapVersion == VERSION_LAST) ? SOAP_VER_1_2 : nSoapVersion;
>   +				m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SERVICENOTFOUND));
>   +				break; //do .. while(0)
>   +			}
>    
>   -		  int nSoapVersion = pMsg->m_pDZ->GetVersion();
>   +			pMsg->SetService(pService);
>   +			
>   +			//check for soap version in the request and decide whether we support it or not
>   +			//if we do not support send a soapfault with version mismatch.		  
>   +			nSoapVersion = pMsg->m_pDZ->GetVersion();
>   +			if (nSoapVersion == VERSION_LAST) //version not supported
>   +			{
>   +				m_pSZ->setSoapVersion(SOAP_VER_1_2);
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_VERSION_MISMATCH));
>   +				break; //do .. while(0)		
>   +			}		  
>    
>   -		  //Set Soap version in the Serializer
>   -		  pMsg->m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion);
>    
>   -		  //--end--
>   -		  
>   +			//Set Soap version in the Serializer and the envelope
>   +			if (SUCCESS != m_pSZ->setSoapVersion((SOAP_VERSION)nSoapVersion))
>   +			{
>   +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPCONTENTERROR));
>   +			  break; //do .. while(0)
>   +			}
>    
>   -		  char* cService= getheader(soap, SOAPACTIONHEADER);
>   -			string service;
>   -		  if(cService==NULL) {
>   -				service="";
>   -		  }else {
>   -				service= cService;
>   -		  }
>   -		  
>   -		  DEBUG2("string service = Maths :",service.c_str());
>   -     
>   -		  if (service.empty()) 
>   -		  {
>   -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SOAPACTIONEMPTY));
>   +			SoapMethod* pSm = m_pDZ->GetMethod();
>   +			if (pSm) 
>   +			{
>   +				string method = pSm->getMethodName();
>   +				DEBUG2("pSm->getMethodName(); :", method.c_str());
>   +				if (!method.empty())
>   +				{
>   +					if (pService->IsAllowedMethod(method))
>   +					{          
>   +						//load actual web service handler
>   +						if (SUCCESS != g_HandlerPool.GetWebService(&m_pWebService, sSessionId, pService))
>   +						{
>   +            				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADSRV));
>   +							//Error couldnot load web service
>   +							break; //do .. while(0)
>   +						}
>   +					}
>   +					else
>   +					{
>   +						m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_METHODNOTALLOWED));
>   +						//method is not an exposed allowed method
>   +						break; //do .. while(0)
>   +					}
>   +				}
>   +				else
>   +				{
>   +					m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_NOSOAPMETHOD));
>   +					//no method to be invoked
>   +					break; //do .. while(0)
>   +				}
>   +			}
>   +			//Get Global and Transport Handlers
>   +			if(SUCCESS != (Status = InitializeHandlers(sSessionId, soap->trtype)))
>   +			{
>   +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
>    			  break; //do .. while(0)
>   -		  }
>   -		  service = service.substr(1, service.length() - 2);
>   -		  pService = m_pWSDD->GetService(service);
>   -		  if (!pService) {
>   -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_SERVICENOTFOUND));
>   +			}
>   +    		//Get Service specific Handlers from the pool if configured any
>   +			if(SUCCESS != (Status = g_HandlerPool.GetRequestFlowHandlerChain(&m_pSReqFChain, sSessionId, pService)))
>   +			{        
>   +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
>    			  break; //do .. while(0)
>   -		  }
>   -
>   -      pMsg->SetService(pService);
>   -
>   -			
>   -		  //check for soap version in the request and decide whether we support it or not
>   -		  //if we do not support send a soapfault with version mismatch.		  
>   -		  if (nSoapVersion == VERSION_LAST) //version not supported
>   -		  {
>   -			  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_VERSION_MISMATCH));
>   -			  break; //do .. while(0)		
>   -		  }		  
>   -
>   -		  //add namespace URIs of the SoapEnvelope of the response corresponding to the soap version.
>   -		  Attribute* pNS = new Attribute(g_sObjSoapEnvVersionsStruct[nSoapVersion].pchEnvelopePrefix,
>   -			  "xmlns","",g_sObjSoapEnvVersionsStruct[nSoapVersion].pchEnvelopeNamespaceUri);
>   -		  pEnv->addNamespaceDecl(pNS);
>   -		  //add namespace URIs for xsd and xsi
>   -		  pNS = new Attribute("xsd","xmlns","","http://www.w3.org/2001/XMLSchema");
>   -		  pEnv->addNamespaceDecl(pNS);
>   -		  pNS = new Attribute("xsi","xmlns","","http://www.w3.org/2001/XMLSchema-instance");
>   -		  pEnv->addNamespaceDecl(pNS);
>   -
>   -		  SoapMethod* pSm = m_pDZ->GetMethod();
>   -		  if (pSm) 
>   -		  {
>   -			  string method = pSm->getMethodName();
>   -      
>   -        DEBUG2("pSm->getMethodName(); :", method.c_str());
>   -          
>   -			  if (!method.empty())
>   -			  {
>   -				  //this is done here when we use SAX parser
>   -				  //if we use XML pull parser this check is done within the invoke method of the wrapper class
>   -				  if (pService->IsAllowedMethod(method))
>   -				  {          
>   -					  //load actual web service handler
>   -         
>   -					  m_pWebService = m_pHandlerPool->LoadWebService(pService);
>   -
>   -                    
>   -					  if (!m_pWebService)
>   -					  {
>   -            
>   -						  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADSRV));
>   -						  //Error couldnot load web service
>   -						  break; //do .. while(0)
>   -					  }
>   -				  }
>   -				  else
>   -				  {
>   -					  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_METHODNOTALLOWED));
>   -					  //method is not an exposed allowed method
>   -					  break; //do .. while(0)
>   -				  }
>   -			  }
>   -			  else
>   -			  {
>   -				  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_NOSOAPMETHOD));
>   -				  //no method to be invoked
>   -				  break; //do .. while(0)
>   -			  }
>   -		  }
>   -		  //create any service specific handlers
>   -    
>   -		  pHandlerList = pService->GetRequestFlowHandlers();
>   +			}
>   +			if(SUCCESS != (Status = g_HandlerPool.GetResponseFlowHandlerChain(&m_pSResFChain, sSessionId, pService)))
>   +			{        
>   +			  m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
>   +			  break; //do .. while(0)
>   +			}
>    
>   -      DEBUG1("after pService->GetRequestFlowHandlers();");
>   -       
>   -		  if (pHandlerList)
>   -		  {
>   -
>   -			  if(SUCCESS != m_pHandlerPool->LoadServiceRequestFlowHandlers(pHandlerList))
>   -			  {        
>   -				  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
>   -				  break; //do .. while(0)
>   -			  }
>   -		  }
>   -    
>   -		  pHandlerList = pService->GetResponseFlowHandlers();
>   -    
>   -		  if (pHandlerList)
>   -		  {
>   -			  if(SUCCESS != m_pHandlerPool->LoadServiceResponseFlowHandlers(pHandlerList))
>   -			  {
>   -				  pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_COULDNOTLOADHDL));
>   -				  break; //do .. while(0)
>   -			  }
>   -		  }
>   -		  Invoke(pMsg); //we generate response in the same way even if this has failed
>   -	  }
>   -	  while(0);
>   -	  //and handlers may add headers to the Serializer.
>   -	  //Invoke all handlers including the webservice
>   -	  //in case of failure coresponding soap fault message will be sent
>   -	  if (pMsg) delete pMsg; //MessageData is no longer needed
>   -	  if (pSoapInput) delete pSoapInput; //this should not be done if we use progressive parsing
>   -	  //set soap version to the serializer.
>   -	  //Serialize
>   -	  send_transport_information(soap);
>   -	  int iStatus= m_pSZ->getStream();
>   -      
>   -	  //soap->so.http.op_soap = new char(sResponse.length() + 1); 
>   -	  //strcpy(soap->so.http.op_soap, sResponse.c_str());
>   -  #ifndef _DEBUG //this caused program to crash in debug mode
>   -	  m_pSZ->init();
>   -  #endif 
>   -	//unload webservice handler
>   -  #ifndef WIN32 //this crashes in Win32 at stl map::find(..) function - I cannot find what is wrong.
>   -	  if (m_pWebService) m_pHandlerPool->UnloadWebService(pService);
>   -	  //Unload service specific handlers
>   -	  pHandlerList = pService->GetRequestFlowHandlers();
>   -	  if (pHandlerList)
>   -		  m_pHandlerPool->UnLoadServiceRequestFlowHandlers(pHandlerList);
>   -	  pHandlerList = pService->GetResponseFlowHandlers();
>   -	  if (pHandlerList)
>   -		  m_pHandlerPool->UnLoadServiceResponseFlowHandlers(pHandlerList);
>   -  #endif
>   -	  return SUCCESS;
>   - }
>   - catch(exception* e)
>   - {
>   -   //todo
>   -   /*
>   -    An exception derived from exception which is not handled will be handled here.
>   -    You can call a method in AxisModule which may unload the AxisEngine
>   -    from the webserver and report the error. You can also write this
>   -    in a logfile specific to axis.
>   -   */
>   -   DEBUG1(e->what());   
>   -   delete(e);
>   - }
>   - catch(...)
>   - {
>   -   //todo
>   -   /*
>   -    An unknown exception which is not handled will be handled here.
>   -    You can call a method in AxisModule which may unload the AxisEngine
>   -    from the webserver and report the error. You can also write this
>   -    in a logfile specific to axis.
>   -   */
>   -   DEBUG1("UNKNOWN EXCEPTION");
>   - }
>   +			//and handlers may add headers to the Serializer.
>   +			//Invoke all handlers including the webservice
>   +			//in case of failure coresponding soap fault message will be set
>   +			Status = Invoke(pMsg); //we generate response in the same way even if this has failed
>   +		}
>   +		while(0);
>   +		if (pMsg) delete pMsg; //MessageData is no longer needed
>   +		//send any transoport information like http headers first
>   +		send_transport_information(soap);
>   +		//Serialize
>   +		m_pSZ->SetOutputStream(soap->str.ip_stream);
>   +
>   +		//Pool back the Service specific handlers
>   +		if (m_pSReqFChain) g_HandlerPool.PoolHandlerChain(m_pSReqFChain, sSessionId);
>   +		if (m_pSResFChain) g_HandlerPool.PoolHandlerChain(m_pSResFChain, sSessionId);
>   +		//Pool back the webservice
>   +		if (m_pWebService) g_HandlerPool.PoolWebService(sSessionId, m_pWebService, pService); 
>   +		return Status;
>   +	AXIS_CATCH(exception* e)
>   +		//todo
>   +		/*
>   +		An exception derived from exception which is not handled will be handled here.
>   +		You can call a method in AxisModule which may unload the AxisEngine
>   +		from the webserver and report the error. You can also write this
>   +		in a logfile specific to axis.
>   +		*/
>   +		#ifdef _DEBUG
>   +		DEBUG1(e->what());   
>   +		delete(e);
>   +		#endif
>   +	AXIS_CATCH(...)
>   +		//todo
>   +		/*
>   +		An unknown exception which is not handled will be handled here.
>   +		You can call a method in AxisModule which may unload the AxisEngine
>   +		from the webserver and report the error. You can also write this
>   +		in a logfile specific to axis.
>   +		*/
>   +		DEBUG1("UNKNOWN EXCEPTION");
>   +	AXIS_ENDCATCH
>   +	return Status;
>    }
>    
>    int AxisEngine::Invoke(MessageData* pMsg)
>    {
>    	enum AE_LEVEL {AE_START=1, AE_TRH, AE_GLH, AE_SERH, AE_SERV};
>   -	HandlerChain* pChain;
>   -	int ret = FAIL;
>   +	int Status = FAIL;
>    	int level = AE_START;
>    	do
>    	{
>    		//invoke transport request handlers
>   -		pChain = m_pHandlerPool->GetTransportRequestFlowHandlerChain(pMsg->m_Protocol);
>   -		if (pChain) {
>   -			if(SUCCESS != pChain->Invoke(pMsg))
>   +		if (m_pTReqFChain) {
>   +			if(SUCCESS != (Status = m_pTReqFChain->Invoke(pMsg)))
>    			{
>   -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
>    				break; //do .. while (0)
>    			}
>    
>    		}
>   -    DEBUG1("AFTER pChain = m_pHandlerPool->GetTransportRequestFlowHandlerChain");
>   +		DEBUG1("AFTER invoke transport request handlers");
>    		level++; // AE_TRH
>    		//invoke global request handlers
>   -		pChain = m_pHandlerPool->GetGlobalRequestFlowHandlerChain();
>   -		if (pChain)
>   +		if (m_pGReqFChain)
>    		{
>   -			if(SUCCESS != pChain->Invoke(pMsg))
>   +			if(SUCCESS != (Status = m_pGReqFChain->Invoke(pMsg)))
>    			{
>   -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
>    				break; //do .. while (0)
>    			}		
>    		}
>   -    DEBUG1("AFTER pChain = m_pHandlerPool->GetGlobalRequestFlowHandlerChain();");
>   +		DEBUG1("AFTER invoke global request handlers");
>    		level++; //AE_GLH
>    		//invoke service specific request handlers
>   -		pChain = m_pHandlerPool->GetServiceRequestFlowHandlerChain();
>   -		if (pChain)
>   +		if (m_pSReqFChain)
>    		{
>   -			if(SUCCESS != pChain->Invoke(pMsg))
>   +			if(SUCCESS != (Status = m_pSReqFChain->Invoke(pMsg)))
>    			{
>   -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_HANDLERFAILED));
>    				break; //do .. while (0)
>    			}
>   -      DEBUG1("if(SUCCESS == pChain->Invoke(pMsg))");
>    		}
>   -    DEBUG1("AFTER pChain = m_pHandlerPool->GetServiceRequestFlowHandlerChain();");
>   +		DEBUG1("AFTER invoke service specific request handlers");
>    		level++; //AE_SERH
>    		//call actual web service handler
>   -
>    		if (m_pWebService)
>   -			if (SUCCESS != m_pWebService->Invoke(pMsg))
>   +		{
>   +			if (SUCCESS != (Status = m_pWebService->Invoke(pMsg)))
>    			{
>   -				pMsg->m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_WEBSERVICEFAILED));
>   +				m_pSZ->setSoapFault(SoapFault::getSoapFault(SF_WEBSERVICEFAILED));
>    				break;
>   -			}
>   -
>   -    DEBUG1("if (m_pWebService)");      
>   -         
>   +			}        
>   +		}
>   +		DEBUG1("AFTER call actual web service handler");
>    		level++; //AE_SERV
>    	}
>    	while(0);
>   @@ -433,37 +333,32 @@
>    	switch (level)
>    	{
>    	case AE_SERV: //everything success
>   -    ret = SUCCESS;
>   -		//invoke service specific response handlers
>   +		Status = SUCCESS;
>    		//no break;
>    	case AE_SERH: //actual web service handler has failed
>    		//invoke web service specific response handlers
>   -    pChain = m_pHandlerPool->GetServiceResponseFlowHandlerChain();
>   -		if (pChain)
>   +		if (m_pSResFChain)
>    		{
>   -			pChain->Invoke(pMsg);
>   -      
>   +			m_pSResFChain->Invoke(pMsg);
>    		}
>    		//no break;
>    	case AE_GLH: //web service specific handlers have failed
>    		//invoke global response handlers
>   -		pChain = m_pHandlerPool->GetGlobalResponseFlowHandlerChain();
>   -		if (pChain)
>   +		if (m_pGResFChain)
>    		{
>   -			pChain->Invoke(pMsg);
>   +			m_pGResFChain->Invoke(pMsg);
>    		}
>    		//no break;
>    	case AE_TRH: //global handlers have failed
>   -		pChain = m_pHandlerPool->GetTransportResponseFlowHandlerChain(pMsg->m_Protocol);
>   -		if (pChain) 
>   +		if (m_pTResFChain) 
>    		{
>   -			pChain->Invoke(pMsg);
>   +			m_pTResFChain->Invoke(pMsg);
>    		}
>    		//no break;
>    	case AE_START:;//transport handlers have failed
>    	};
>   -  DEBUG1("end axisengine process()");
>   -	return ret;
>   +	DEBUG1("end axisengine process()");
>   +	return Status;
>    }
>    
>    void AxisEngine::OnFault(MessageData* pMsg)
>   @@ -473,44 +368,21 @@
>    
>    int AxisEngine::Initialize()
>    {
>   -	string str(WSDDFILEPATH);
>   -	TypeMapping::Initialize();
>   -	URIMapping::Initialize();
>   -	SoapFault::initialize();
>   -  
>   -  DEBUG1("AxisEngine::Initialize()");
>   -      
>   -	if (SUCCESS != m_pWSDD->LoadWSDD(str)) return FAIL;
>   -  
>   -	//Load Global Handlers to the pool if configured any
>   -	WSDDHandlerList* pHandlerList = m_pWSDD->GetGlobalRequestFlowHandlers();
>   -	if (pHandlerList)
>   -		if(SUCCESS != m_pHandlerPool->LoadGlobalRequestFlowHandlers(pHandlerList))
>   -			return FAIL;
>   -	pHandlerList = m_pWSDD->GetGlobalResponseFlowHandlers();
>   -	if (pHandlerList)
>   -		if(SUCCESS != m_pHandlerPool->LoadGlobalResponseFlowHandlers(pHandlerList))
>   -			return FAIL;
>   -
>   -	//Load Transport Handlers to the pool if configured any
>   -	WSDDTransport* pTransport = m_pWSDD->GetTransport();
>   -	if (pTransport) {
>   -		//HTTP
>   -		pHandlerList = pTransport->GetRequestFlowHandlers(APTHTTP);
>   -		if (pHandlerList)
>   -			if(SUCCESS != m_pHandlerPool->LoadTransportRequestFlowHandlers(APTHTTP, pHandlerList))
>   -				return FAIL;
>   -		//FTP
>   -		pHandlerList = pTransport->GetRequestFlowHandlers(APTFTP);
>   -		if (pHandlerList)
>   -			if(SUCCESS != m_pHandlerPool->LoadTransportRequestFlowHandlers(APTFTP, pHandlerList))
>   -				return FAIL;
>   -		//SMTP
>   -		pHandlerList = pTransport->GetRequestFlowHandlers(APTSMTP);
>   -		if (pHandlerList)
>   -			if(SUCCESS != m_pHandlerPool->LoadTransportRequestFlowHandlers(APTSMTP, pHandlerList))
>   -				return FAIL;
>   +	int Status;
>   +	//Create and initialize Serializer and Deserializer objects
>   +	if (SUCCESS != (Status = g_SerializerPool.GetInstance(&m_pSZ))) return Status;
>   +	if (SUCCESS != (Status = m_pSZ->Init()))
>   +	{
>   +		g_SerializerPool.PutInstance(m_pSZ);
>   +		return Status;
>   +	}
>   +	if (SUCCESS != (Status = g_DeserializerPool.GetInstance(&m_pDZ))) return Status;
>   +	if (SUCCESS != (Status = m_pDZ->Init()))
>   +	{
>   +		g_DeserializerPool.PutInstance(m_pDZ);
>   +		return Status;
>    	}
>   +
>    	return SUCCESS;
>    }
>    
>   @@ -518,4 +390,21 @@
>    {
>    	//nothing to do with m_pWSDD because its destructor deletes its objects
>    	//nothing to do with m_pHandlerPool because its destructor deletes its objects
>   -}
>   \ No newline at end of file
>   +}
>   +
>   +int AxisEngine::InitializeHandlers(string &sSessionId, AXIS_PROTOCOL_TYPE protocol)
>   +{
>   +	int Status = SUCCESS;  
>   +	//Get Global Handlers from the pool if configured any
>   +	if(SUCCESS != (Status = g_HandlerPool.GetGlobalRequestFlowHandlerChain(&m_pGReqFChain, sSessionId)))
>   +		return Status;
>   +	if(SUCCESS != (Status = g_HandlerPool.GetGlobalResponseFlowHandlerChain(&m_pGResFChain, sSessionId)))
>   +		return Status;
>   +
>   +	//Get Transport Handlers from the pool if configured any
>   +	if(SUCCESS != (Status = g_HandlerPool.GetTransportRequestFlowHandlerChain(&m_pTReqFChain, sSessionId, protocol)))
>   +		return Status;
>   +	if(SUCCESS != (Status = g_HandlerPool.GetTransportResponseFlowHandlerChain(&m_pTResFChain, sSessionId, protocol)))
>   +		return Status;
>   +	return Status;
>   +}
>   
>   
>   
>   1.6       +95 -57    xml-axis/c/src/engine/Axis.cpp
>   
>   Index: Axis.cpp
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/c/src/engine/Axis.cpp,v
>   retrieving revision 1.5
>   retrieving revision 1.6
>   diff -u -r1.5 -r1.6
>   -- Axis.cpp	27 Jul 2003 10:03:33 -0000	1.5
>   +++ Axis.cpp	13 Aug 2003 14:07:47 -0000	1.6
>   @@ -1,3 +1,5 @@
>   +#pragma warning (disable : 4503)
>   +
>    #include "AxisEngine.h"
>    #include "../common/Debug.h"
>    #include <stdio.h>
>   @@ -7,51 +9,81 @@
>    #include <string>
>    #include <map>
>    
>   -#define res(X); send_response_bytes(X);
>   +#include "../soap/SoapFaults.h"
>   +#include "../soap/URIMapping.h"
>   +#include "HandlerLoader.h"
>   +#include "AppScopeHandlerPool.h"
>   +#include "RequestScopeHandlerPool.h"
>   +#include "SessionScopeHandlerPool.h"
>   +#include "HandlerPool.h"
>   +#include "SerializerPool.h"
>   +#include "DeserializerPool.h"
>   +#include "../wsdd/WSDDDeployment.h"
>   +
>   +#define BYTESTOREAD 64
>   +//the relative location of the wsdl files hardcoded
>   +#define WSDLDIRECTORY	"./Axis/wsdl/"
>   +
>   +#ifdef WIN32
>   +#ifdef AXIS_APACHE1_3
>   +#define WSDDFILEPATH "./Axis/conf/server.wsdd"
>   +#else
>   +#define WSDDFILEPATH "C:/Axis/conf/server.wsdd"
>   +#endif
>   +#else //For linux
>   +#ifdef AXIS_APACHE1_3
>   +#define WSDDFILEPATH "./Axis/conf/server.wsdd"
>   +#else
>   +#define WSDDFILEPATH "/usr/local/axiscpp/axis/server.wsdd"
>   +#endif
>   +#endif
>    
>   +//define all global variables of the axisengine
>   +#ifdef _DEBUG
>    unsigned char chEBuf[1024];
>   +#endif
>    
>   -extern "C" int process_request(soapstream *str)
>   -{
>   -DEBUG1("in axis.cpp");	
>   -	AxisEngine* engine = AxisEngine::GetAxisEngine();	
>   -	int ret = FAIL;
>   -	char * wsdlloc = NULL;
>   -	char * uri = NULL;
>   -	int pos=0;
>   -	int slashcount=0;
>   -	int len = 0;
>   -
>   -	FILE * outfile;
>   -	const int bytestoread = 6;
>   -	char oneword [bytestoread];
>   -	oneword[bytestoread-1] = '\0';
>   +//synchronized global variables.
>   +HandlerLoader g_HandlerLoader;
>   +AppScopeHandlerPool g_AppScopeHandlerPool;
>   +RequestScopeHandlerPool g_RequestScopeHandlerPool;
>   +SessionScopeHandlerPool g_SessionScopeHandlerPool;
>   +DeserializerPool g_DeserializerPool;
>   +SerializerPool g_SerializerPool;
>   +HandlerPool g_HandlerPool;
>   +//un synchronized read-only global variables.
>   +WSDDDeployment g_WSDDDeployment;
>    
>   +extern "C" int process_request(Ax_soapstream *str)
>   +{
>   +	DEBUG1("in axis.cpp");	
>   +	int Status = FAIL;
>   +	FILE * WsddFile;
>   +	char ReadBuffer[BYTESTOREAD];
>   +	ReadBuffer[0] = '\0';
>    
>   -	const WSDDServiceMap * svsmap = NULL;
>   +	const WSDDServiceMap* pSrvMap = NULL;
>    	WSDDServiceMap::const_iterator iter;
>   -	WSDDService * svs = NULL;
>   -	//the location of the wsdl files hardcoded
>   -	string svr("./Axis/wsdl/");
>   +	WSDDService* pService = NULL;
>    
>   -	switch(str->trtype)
>   +	switch (str->trtype)
>    	{
>    		case APTHTTP:
>    			//Handle the POST method
>   -			if(str->so.http.ip_method==POST)
>   +			if (str->so.http.ip_method == AXIS_HTTP_POST)
>    			{
>   -DEBUG1("method is POST");                
>   +				DEBUG1("method is POST");
>   +				AxisEngine* engine = new AxisEngine();	
>    				if (engine)
>    				{
>   -					ret = engine->Process(str);
>   -					DEBUG1("ret = engine->Process(str);");
>   +					Status = engine->Process(str);
>   +					DEBUG1("Status = engine->Process(str);");
>    				    DEBUG1("are we successful?");            
>   -					ret = SUCCESS;
>   +					Status = SUCCESS;
>    				}
>    			}
>   -
>    			//Handler the GET method
>   -			if(str->so.http.ip_method==GET)
>   +			if (str->so.http.ip_method == AXIS_HTTP_GET)
>    			{
>    				//get the uri path
>    				//i.e "/abc/xyz/" part of http://somehost/abc/xyz/
>   @@ -68,64 +100,70 @@
>    				{	
>    					bNoSlash = true;
>    				}
>   +
>    				if (sUriWOAxis.empty())
>    				{
>   -					svsmap = engine->getWSDDDeployment()->GetWSDDServiceMap();
>   -					//dep = engine->getWSDDDeployment();
>   -					//svsmap = depGetWSDDServiceMap();
>   -					res("<html><body>\
>   +					pSrvMap = g_WSDDDeployment.GetWSDDServiceMap();
>   +					send_response_bytes("<html><body>\
>    						<h1 align=\"center\">Welcome to Axis C++</h1>\
>    						<br>\
>    						<h2>List of Deployed Web services<br></h2>\
>    						<h3>click on the links to view the WSDL</h3>\
>    						<br>\
>   -						<table width=\"400\">");
>   +						<table width=\"400\">", str->str.op_stream);
>    
>   -					for (iter=svsmap->begin();iter!=svsmap->end();iter++)
>   +					for (iter = pSrvMap->begin();iter != pSrvMap->end();iter++)
>    					{
>   -						svs = iter->second;
>   -						res("<tr><td width=\"200\">");
>   -						res((char *)svs->GetServiceName().c_str());
>   -						res("</td><td width=\"200\"><a href=\"./");
>   -						if (bNoSlash) send_response_bytes("axis/"); 
>   -						send_response_bytes((char *)svs->GetServiceName().c_str());
>   -						send_response_bytes("?wsdl");
>   -						send_response_bytes("\">wsdl</a></td>");
>   -						res("</tr>");
>   +						pService = iter->second;
>   +						send_response_bytes("<tr><td width=\"200\">", str->str.op_stream);
>   +						send_response_bytes((char *)pService->GetServiceName().c_str(), str->str.op_stream);
>   +						send_response_bytes("</td><td width=\"200\"><a href=\"./", str->str.op_stream);
>   +						if (bNoSlash) send_response_bytes("axis/", str->str.op_stream); 
>   +						send_response_bytes((char *)pService->GetServiceName().c_str(), str->str.op_stream);
>   +						send_response_bytes("?wsdl", str->str.op_stream);
>   +						send_response_bytes("\">wsdl</a></td>", str->str.op_stream);
>   +						send_response_bytes("</tr>", str->str.op_stream);
>    					}
>   -					res("</table></body></html>");
>   +					send_response_bytes("</table></body></html>", str->str.op_stream);
>    				}
>    				else 
>    				{
>   -					sServiceName = "./Axis/wsdl/" + sUriWOAxis + ".wsdl";
>   +					sServiceName = WSDLDIRECTORY + sUriWOAxis + ".wsdl";
>    					//check whether wsdl file is available
>   -					if((outfile = fopen(sServiceName.c_str(),"r"))==NULL)
>   +					if((WsddFile = fopen(sServiceName.c_str(),"r"))==NULL)
>    					{
>   -						send_response_bytes("<h3>Url not available</h3>");
>   +						send_response_bytes("<h3>Url not available</h3>", str->str.op_stream);
>    						//handle the error
>    					}
>    					else
>    					{
>    						int charcount = 0;
>   -						int acc = 0;	
>   -						while((charcount=fread(oneword,1,bytestoread-1, outfile)) != 0)
>   +						while((charcount = fread(ReadBuffer, 1, BYTESTOREAD-1, WsddFile)) != 0)
>    						{
>   -							*(oneword+charcount) = '\0';
>   -							send_response_bytes(oneword);
>   +							*(ReadBuffer + charcount) = '\0';
>   +							send_response_bytes(ReadBuffer, str->str.op_stream);
>      						}
>   -						ret = SUCCESS;
>   -						fclose(outfile);
>   +						Status = SUCCESS;
>   +						fclose(WsddFile);
>    					}
>    				}
>    			}
>    		break;
>    
>    		default:
>   -			send_response_bytes("Unknown Protocol");
>   +			send_response_bytes("Unknown Protocol", str->str.op_stream);
>    		break;
>    	}
>   -	svsmap = NULL;
>   -	svs =NULL;
>   -	return ret;
>   +	return Status;
>    }
>    
>   +extern "C" int initialize_module()
>   +{
>   +	TypeMapping::Initialize();
>   +	URIMapping::Initialize();
>   +	SoapFault::initialize();
>   +	XMLPlatformUtils::Initialize();
>   +	string ConfFile = WSDDFILEPATH;
>   +	if (SUCCESS != g_WSDDDeployment.LoadWSDD(ConfFile)) return FAIL;
>   +	return SUCCESS;
>   +}
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/SharedObject.h
>   
>   Index: SharedObject.h
>   ===================================================================
>   // SharedObject.h: interface for the SharedObject class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   #pragma warning (disable : 4786)
>   
>   #if !defined(AFX_SHAREDOBJECT_H__0805D25C_2F7E_4B19_BECE_0A8BFE9F0830__INCLUDED_)
>   #define AFX_SHAREDOBJECT_H__0805D25C_2F7E_4B19_BECE_0A8BFE9F0830__INCLUDED_
>   
>   #if _MSC_VER > 1000
>   #pragma once
>   #endif // _MSC_VER > 1000
>   
>   class SharedObject  
>   {
>   public:
>   	SharedObject();
>   	virtual ~SharedObject();
>   protected:
>   	int unlock();
>   	int lock();
>   private:
>   	volatile bool m_bLocked;
>   };
>   
>   #endif // !defined(AFX_SHAREDOBJECT_H__0805D25C_2F7E_4B19_BECE_0A8BFE9F0830__INCLUDED_)
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/SharedObject.cpp
>   
>   Index: SharedObject.cpp
>   ===================================================================
>   // SharedObject.cpp: implementation of the SharedObject class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #include "SharedObject.h"
>   #ifdef WIN32
>   #include <Windows.h>
>   #else
>   
>   #endif
>   //////////////////////////////////////////////////////////////////////
>   // Construction/Destruction
>   //////////////////////////////////////////////////////////////////////
>   
>   SharedObject::SharedObject()
>   {
>   	m_bLocked = false;
>   }
>   
>   SharedObject::~SharedObject()
>   {
>   
>   }
>   //Following functions should be improved to avoid chances of failure
>   //using platform specific mechanisms
>   int SharedObject::lock()
>   {
>   	while (m_bLocked)
>   	{
>   #ifdef WIN32
>   		Sleep(0);
>   #else
>   		sleep(0);
>   #endif
>   	}
>   	m_bLocked = true;
>   	return 0;
>   }
>   
>   int SharedObject::unlock()
>   {
>   	m_bLocked = false;
>   	return 0;
>   }
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/SessionScopeHandlerPool.h
>   
>   Index: SessionScopeHandlerPool.h
>   ===================================================================
>   // SessionScopeHandlerPool.h: interface for the SessionScopeHandlerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #if !defined(AFX_SESSIONSCOPEHANDLERPOOL_H__8F0188D8_B30B_43F9_8F06_8E209D7B8ABE__INCLUDED_)
>   #define AFX_SESSIONSCOPEHANDLERPOOL_H__8F0188D8_B30B_43F9_8F06_8E209D7B8ABE__INCLUDED_
>   
>   #if _MSC_VER > 1000
>   #pragma once
>   #endif // _MSC_VER > 1000
>   
>   #define SESSIONLESSHANDLERS	"0aaaaa"
>   
>   #include "SharedObject.h"
>   #include "../common/BasicHandler.h"
>   
>   #include <map>
>   #include <list>
>   #include <string>
>   
>   using namespace std;
>   
>   class SessionScopeHandlerPool : protected SharedObject  
>   {
>   public:
>   	SessionScopeHandlerPool();
>   	virtual ~SessionScopeHandlerPool();
>   private:
>   	typedef map<string, list<BasicHandler*> > SessionHandlers;
>   	map<int, SessionHandlers*> m_Handlers;
>   public:
>   	int GetInstance(string& sSessionId, BasicHandler** pHandler, int nLibId);
>   	int PutInstance(string& sSessionId, BasicHandler* pHandler, int nLibId);
>   	void EndSession(string& sSessionId);
>   };
>   
>   #endif // !defined(AFX_SESSIONSCOPEHANDLERPOOL_H__8F0188D8_B30B_43F9_8F06_8E209D7B8ABE__INCLUDED_)
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/SessionScopeHandlerPool.cpp
>   
>   Index: SessionScopeHandlerPool.cpp
>   ===================================================================
>   // SessionScopeHandlerPool.cpp: implementation of the SessionScopeHandlerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   #pragma warning (disable : 4503)
>   
>   #include "SessionScopeHandlerPool.h"
>   #include "HandlerLoader.h"
>   
>   //////////////////////////////////////////////////////////////////////
>   // Construction/Destruction
>   //////////////////////////////////////////////////////////////////////
>   extern HandlerLoader g_HandlerLoader;
>   
>   SessionScopeHandlerPool::SessionScopeHandlerPool()
>   {
>   
>   }
>   
>   SessionScopeHandlerPool::~SessionScopeHandlerPool()
>   {
>   
>   }
>   
>   int SessionScopeHandlerPool::GetInstance(string& sSessionId, BasicHandler** pHandler, int nLibId)
>   {
>   	lock();
>   	int Status;
>   	if (m_Handlers.find(nLibId) != m_Handlers.end()) 
>   	{
>   		SessionHandlers* pSesHandlers = m_Handlers[nLibId];
>   		if (pSesHandlers->find(sSessionId) != pSesHandlers->end())
>   		{
>   			list<BasicHandler*> &HandlerList = ((*pSesHandlers)[sSessionId]);
>   			if (HandlerList.empty())
>   			{
>   				//check in the store for reuse
>   				if ((*pSesHandlers)[SESSIONLESSHANDLERS].empty())
>   				{
>   					unlock();
>   					return g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   				}
>   				else
>   				{
>   					*pHandler = (*pSesHandlers)[SESSIONLESSHANDLERS].front();
>   					(*pSesHandlers)[SESSIONLESSHANDLERS].pop_front();
>   					unlock();
>   					return SUCCESS;
>   				}
>   			}
>   			else
>   			{
>   				*pHandler = HandlerList.front();
>   				HandlerList.pop_front();
>   				unlock();
>   				return SUCCESS;
>   			}
>   			unlock();
>   			return g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   		}
>   		else //no handler list for this session id
>   		{
>   			//check in the store for reuse
>   			if ((*pSesHandlers)[SESSIONLESSHANDLERS].empty())
>   			{
>   				unlock();
>   				return g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   			}
>   			else
>   			{
>   				*pHandler = (*pSesHandlers)[SESSIONLESSHANDLERS].front();
>   				(*pSesHandlers)[SESSIONLESSHANDLERS].pop_front();
>   				unlock();
>   				return SUCCESS;
>   			}
>   		}
>   	}
>   	else //not even the handler DLL loaded
>   	{
>   		Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   		if (SUCCESS == Status)
>   		{
>   			//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
>   			SessionHandlers* pNewSH = new SessionHandlers;
>   			pNewSH->clear();
>   			m_Handlers[nLibId] = pNewSH;	
>   		}
>   		unlock();
>   		return Status;
>   	}
>   }
>   
>   int SessionScopeHandlerPool::PutInstance(string& sSessionId, BasicHandler* pHandler, int nLibId)
>   {
>   	lock();
>   	SessionHandlers* pSesHandlers;
>   	if (m_Handlers.find(nLibId) != m_Handlers.end())
>   	{
>   		pSesHandlers = m_Handlers[nLibId];
>   	}
>   	else // this is unexpected situation. anyway do it
>   	{
>   		pSesHandlers = new SessionHandlers;
>   		pSesHandlers->clear();
>   		m_Handlers[nLibId] = pSesHandlers;	
>   	}
>   	list<BasicHandler*> &HandlerList = ((*pSesHandlers)[sSessionId]);
>   	HandlerList.push_back(pHandler);
>   	unlock();
>   	return SUCCESS;
>   }
>   
>   void SessionScopeHandlerPool::EndSession(string& sSessionId)
>   {
>   	//traverse all the lists and remove corresponding handlers if any and put to SESSIONLESSHANDLERS	
>   }
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/SerializerPool.h
>   
>   Index: SerializerPool.h
>   ===================================================================
>   // SerializerPool.h: interface for the SerializerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #if !defined(AFX_SERIALIZERPOOL_H__45283A27_9196_4ACF_952F_88C564A4BD40__INCLUDED_)
>   #define AFX_SERIALIZERPOOL_H__45283A27_9196_4ACF_952F_88C564A4BD40__INCLUDED_
>   
>   #if _MSC_VER > 1000
>   #pragma once
>   #endif // _MSC_VER > 1000
>   
>   #include "SharedObject.h"
>   #include "../soap/SoapSerializer.h"
>   #include "../common/GDefine.h"
>   #include <list>
>   
>   using namespace std;
>   
>   class SerializerPool : protected SharedObject  
>   {
>   public:
>   	SerializerPool();
>   	virtual ~SerializerPool();
>   private:
>   	list<SoapSerializer*> m_SZList;
>   public:
>   	int GetInstance(SoapSerializer** ppSZ);
>   	int PutInstance(SoapSerializer* pSZ);
>   };
>   
>   #endif // !defined(AFX_SERIALIZERPOOL_H__45283A27_9196_4ACF_952F_88C564A4BD40__INCLUDED_)
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/SerializerPool.cpp
>   
>   Index: SerializerPool.cpp
>   ===================================================================
>   // SerializerPool.cpp: implementation of the SerializerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #include "SerializerPool.h"
>   
>   //////////////////////////////////////////////////////////////////////
>   // Construction/Destruction
>   //////////////////////////////////////////////////////////////////////
>   
>   SerializerPool::SerializerPool()
>   {
>   
>   }
>   
>   SerializerPool::~SerializerPool()
>   {
>   
>   }
>   
>   //pooling should be implemented
>   int SerializerPool::GetInstance(SoapSerializer** ppSZ)
>   {
>   	//TODO
>   	*ppSZ = new SoapSerializer();
>   	return SUCCESS;
>   }
>   
>   int SerializerPool::PutInstance(SoapSerializer* pSZ)
>   {
>   	//TODO
>   	delete pSZ;
>   	return SUCCESS;
>   }
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/RequestScopeHandlerPool.h
>   
>   Index: RequestScopeHandlerPool.h
>   ===================================================================
>   // RequestScopeHandlerPool.h: interface for the RequestScopeHandlerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #if !defined(AFX_REQUESTSCOPEHANDLERPOOL_H__310FD607_517E_4644_8922_0B1CFDE9E5BE__INCLUDED_)
>   #define AFX_REQUESTSCOPEHANDLERPOOL_H__310FD607_517E_4644_8922_0B1CFDE9E5BE__INCLUDED_
>   
>   #if _MSC_VER > 1000
>   #pragma once
>   #endif // _MSC_VER > 1000
>   
>   #include "SharedObject.h"
>   #include "../common/BasicHandler.h"
>   
>   #include <map>
>   #include <list>
>   #include <string>
>   
>   using namespace std;
>   
>   class RequestScopeHandlerPool : protected SharedObject  
>   {
>   public:
>   	RequestScopeHandlerPool();
>   	virtual ~RequestScopeHandlerPool();
>   private:
>   	map<int, list<BasicHandler*> > m_Handlers;
>   public:
>   	int GetInstance(BasicHandler** pHandler, int nLibId);
>   	int PutInstance(BasicHandler* pHandler, int nLibId);
>   };
>   
>   #endif // !defined(AFX_REQUESTSCOPEHANDLERPOOL_H__310FD607_517E_4644_8922_0B1CFDE9E5BE__INCLUDED_)
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/RequestScopeHandlerPool.cpp
>   
>   Index: RequestScopeHandlerPool.cpp
>   ===================================================================
>   // RequestScopeHandlerPool.cpp: implementation of the RequestScopeHandlerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #include "RequestScopeHandlerPool.h"
>   #include "HandlerLoader.h"
>   
>   //////////////////////////////////////////////////////////////////////
>   // Construction/Destruction
>   //////////////////////////////////////////////////////////////////////
>   extern HandlerLoader g_HandlerLoader;
>   
>   RequestScopeHandlerPool::RequestScopeHandlerPool()
>   {
>   
>   }
>   
>   RequestScopeHandlerPool::~RequestScopeHandlerPool()
>   {
>   
>   }
>   
>   int RequestScopeHandlerPool::GetInstance(BasicHandler** pHandler, int nLibId)
>   {
>   	lock();
>   	int Status;
>   	if (m_Handlers.find(nLibId) != m_Handlers.end()) 
>   	{
>   		if (m_Handlers[nLibId].empty())
>   		{
>   			Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   			if (SUCCESS == Status)
>   			{
>   				//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
>   				m_Handlers[nLibId].clear();	
>   			}
>   			unlock();
>   			return Status;
>   		}
>   		else
>   		{
>   			*pHandler = m_Handlers[nLibId].front();
>   			m_Handlers[nLibId].pop_front();
>   			unlock();
>   			return SUCCESS;
>   		}
>   	}
>   	else //not even the handler DLL loaded
>   	{
>   		Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   		if (SUCCESS == Status)
>   		{
>   			//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
>   			m_Handlers[nLibId].clear();	
>   		}
>   		unlock();
>   		return Status;
>   	}
>   }
>   
>   int RequestScopeHandlerPool::PutInstance(BasicHandler* pHandler, int nLibId)
>   {
>   	lock();
>   	m_Handlers[nLibId].push_back(pHandler);
>   	unlock();
>   	return SUCCESS;
>   }
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/DeserializerPool.h
>   
>   Index: DeserializerPool.h
>   ===================================================================
>   // DeserializerPool.h: interface for the DeserializerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #if !defined(AFX_DESERIALIZERPOOL_H__702116EF_3134_4ED4_8252_BEC1FC30E825__INCLUDED_)
>   #define AFX_DESERIALIZERPOOL_H__702116EF_3134_4ED4_8252_BEC1FC30E825__INCLUDED_
>   
>   #if _MSC_VER > 1000
>   #pragma once
>   #endif // _MSC_VER > 1000
>   
>   #include "SharedObject.h"
>   #include "../soap/SoapDeSerializer.h"
>   #include "../common/GDefine.h"
>   #include <list>
>   
>   using namespace std;
>   
>   class DeserializerPool : protected SharedObject  
>   {
>   public:
>   	DeserializerPool();
>   	virtual ~DeserializerPool();
>   private:
>   	list<SoapDeSerializer*> m_DZList;
>   public:
>   	int GetInstance(SoapDeSerializer** ppDZ);
>   	int PutInstance(SoapDeSerializer* pDZ);
>   };
>   
>   #endif // !defined(AFX_DESERIALIZERPOOL_H__702116EF_3134_4ED4_8252_BEC1FC30E825__INCLUDED_)
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/DeserializerPool.cpp
>   
>   Index: DeserializerPool.cpp
>   ===================================================================
>   // DeserializerPool.cpp: implementation of the DeserializerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #include "DeserializerPool.h"
>   
>   //////////////////////////////////////////////////////////////////////
>   // Construction/Destruction
>   //////////////////////////////////////////////////////////////////////
>   
>   DeserializerPool::DeserializerPool()
>   {
>   
>   }
>   
>   DeserializerPool::~DeserializerPool()
>   {
>   
>   }
>   
>   int DeserializerPool::GetInstance(SoapDeSerializer** ppSZ)
>   {
>   	//TODO
>   	*ppSZ = new SoapDeSerializer();
>   	return SUCCESS;
>   }
>   
>   int DeserializerPool::PutInstance(SoapDeSerializer* pSZ)
>   {
>   	//TODO
>   	delete pSZ;
>   	return SUCCESS;
>   }
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/AppScopeHandlerPool.h
>   
>   Index: AppScopeHandlerPool.h
>   ===================================================================
>   // AppScopeHandlerPool.h: interface for the AppScopeHandlerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #if !defined(AFX_APPSCOPEHANDLERPOOL_H__A94BE166_F35A_40B9_8B17_9ED3D1886503__INCLUDED_)
>   #define AFX_APPSCOPEHANDLERPOOL_H__A94BE166_F35A_40B9_8B17_9ED3D1886503__INCLUDED_
>   
>   #if _MSC_VER > 1000
>   #pragma once
>   #endif // _MSC_VER > 1000
>   
>   #include "SharedObject.h"
>   #include "../common/BasicHandler.h"
>   
>   #include <map>
>   #include <list>
>   #include <string>
>   
>   using namespace std;
>   
>   class AppScopeHandlerPool : protected SharedObject 
>   {
>   public:
>   	AppScopeHandlerPool();
>   	virtual ~AppScopeHandlerPool();
>   private:
>   	map<int, list<BasicHandler*> > m_Handlers;
>   public:
>   	int GetInstance(BasicHandler** pHandler, int nLibId);
>   	int PutInstance(BasicHandler* pHandler, int nLibId);
>   };
>   
>   #endif // !defined(AFX_APPSCOPEHANDLERPOOL_H__A94BE166_F35A_40B9_8B17_9ED3D1886503__INCLUDED_)
>   
>   
>   
>   1.1                  xml-axis/c/src/engine/AppScopeHandlerPool.cpp
>   
>   Index: AppScopeHandlerPool.cpp
>   ===================================================================
>   // AppScopeHandlerPool.cpp: implementation of the AppScopeHandlerPool class.
>   //
>   //////////////////////////////////////////////////////////////////////
>   
>   #include "AppScopeHandlerPool.h"
>   #include "HandlerLoader.h"
>   
>   //////////////////////////////////////////////////////////////////////
>   // Construction/Destruction
>   //////////////////////////////////////////////////////////////////////
>   extern HandlerLoader g_HandlerLoader;
>   
>   //this class does not do the object level blocking. Instead expects the 
>   //thread level blocking and waiting by the caller thread.
>   AppScopeHandlerPool::AppScopeHandlerPool()
>   {
>   
>   }
>   
>   AppScopeHandlerPool::~AppScopeHandlerPool()
>   {
>   
>   }
>   
>   //this method does not block the object. Instead expects that the calling thread 
>   //MUST block itself and wait if the requested handler is not found.
>   int AppScopeHandlerPool::GetInstance(BasicHandler** pHandler, int nLibId)
>   {
>   	lock();
>   	int Status;
>   	if (m_Handlers.find(nLibId) != m_Handlers.end()) 
>   	{
>   		if (m_Handlers[nLibId].empty()) 
>   		// this means that the object is being used by some other thread
>   		// but we cannot create any more objects because this is an application
>   		// scope object. So just return HANDLER_BEING_USED
>   		{
>   			unlock();
>   			return HANDLER_BEING_USED;
>   		}
>   		else
>   		{
>   			*pHandler = m_Handlers[nLibId].front();
>   			m_Handlers[nLibId].pop_front();
>   			unlock();
>   			return SUCCESS;
>   		}
>   	}
>   	else //not even the handler DLL loaded
>   	{
>   		Status = g_HandlerLoader.CreateHandler(pHandler, nLibId);
>   		if (SUCCESS == Status)
>   		{
>   			//this just creates the entry in m_Handlers so that next time we know that the DLL is loaded
>   			m_Handlers[nLibId].clear();	
>   		}
>   		unlock();
>   		return Status;
>   	}
>   }
>   
>   int AppScopeHandlerPool::PutInstance(BasicHandler* pHandler, int nLibId)
>   {
>   	lock();
>   	m_Handlers[nLibId].push_back(pHandler);
>   	unlock();
>   	return SUCCESS;
>   }
>   
>   
>   
> 
>