CMS 3D CMS Logo

IgWebServiceRegistry.cc

Go to the documentation of this file.
00001 //<<<<<< INCLUDES                                                       >>>>>>
00002 
00003 #include "Iguana/WebFramework/interface/IgWebServiceRegistry.h"
00004 #include "Iguana/WebFramework/interface/IgWebServiceDB.h"
00005 #include "Iguana/WebFramework/interface/IgWebServiceProxy.h"
00006 #include "Iguana/WebFramework/interface/IgWebService.h"
00007 #include "Iguana/WebFramework/interface/IgSessionManager.h"
00008 #include "Iguana/Framework/interface/IgState.h"
00009 #include "Iguana/Framework/interface/IgPluginFactory.h"
00010 #include <classlib/utils/StringOps.h>
00011 #include <classlib/utils/DebugAids.h>
00012 #include <classlib/utils/Log.h>
00013 #include <qdatastream.h>
00014 #include <qsocket.h>
00015 #include <iostream>
00016 
00017 //<<<<<< PRIVATE DEFINES                                                >>>>>>
00018 //<<<<<< PRIVATE CONSTANTS                                              >>>>>>
00019 
00020 lat::logflag LFweb = { 0, "web", true, -1 };
00021 
00022 //<<<<<< PRIVATE TYPES                                                  >>>>>>
00023 //<<<<<< PRIVATE VARIABLE DEFINITIONS                                   >>>>>>
00024 //<<<<<< PUBLIC VARIABLE DEFINITIONS                                    >>>>>>
00025 //<<<<<< CLASS STRUCTURE INITIALIZATION                                 >>>>>>
00026 IG_DEFINE_STATE_ELEMENT (IgWebServiceRegistry, "WebServices");
00027 
00028 //<<<<<< PRIVATE FUNCTION DEFINITIONS                                   >>>>>>
00029 //<<<<<< PUBLIC FUNCTION DEFINITIONS                                    >>>>>>
00030 //<<<<<< MEMBER FUNCTION DEFINITIONS                                    >>>>>>
00031 
00032 
00033 
00034 IgWebServiceRegistry::IgWebServiceRegistry (IgState *state)
00035      : m_state (state)
00036 {
00037     LOG (0, trace, LFweb, 
00038          "Creating and registering services." << lat::indent << std::endl;);
00039     
00040     using namespace lat;
00041     
00042     state->put (s_key, this);
00043     IgWebServiceDB *db = IgWebServiceDB::get ();    
00044     ASSERT (db);
00045     if (db->begin () == db->end ())
00046     {
00047         LOG (0, trace, LFweb, 
00048              "Warning: no web services registered" << lat::undent << std::endl);
00049         return; 
00050     }
00051     
00052     for (IgWebServiceDB::Iterator i = db->begin ();
00053          i != db->end ();
00054          i ++)
00055     {
00056         IgWebServiceProxy *service = new IgWebServiceProxy (state, *i);
00057         StringList pluginInfo = StringOps::split ((*i)->name (),"?");   
00058         StringList aliases = StringOps::split (pluginInfo [0], ";");
00059         for (StringList::iterator j = aliases.begin (); 
00060              j != aliases.end ();
00061              j++)
00062         {
00063             LOG (0, trace, LFweb, lat::indent 
00064                  << "Registering service: " << *j << " " 
00065                  << service << lat::undent << std::endl);
00066             this->registerService (*j, service);
00067         }
00068     }
00069     LOG (0, trace, LFweb, lat::undent);
00070 }
00071 
00072 IgWebServiceRegistry::~IgWebServiceRegistry (void)
00073 {
00074     m_state->detach (s_key);
00075 }
00076 
00077 void
00078 IgWebServiceRegistry::registerService (const std::string &alias, IgWebServiceProxy *service)
00079 {
00080     m_serviceMap.insert (std::pair <std::string, IgWebServiceProxy *> (alias,
00081                                                                   service));
00082 }
00083 
00084 IgWebService *
00085 IgWebServiceRegistry::getService (const char *label)
00086 {
00087     WebServiceMap::iterator i = m_serviceMap.find (label);
00088     if (i == m_serviceMap.end ())
00089         return 0;
00090     return i->second->webService ();    
00091 }
00092 
00093 bool
00094 IgWebServiceRegistry::executeURL (QSocket &socket, 
00095                                   const std::string &url, 
00096                                   const std::string &idCookie,
00097                                   QByteArray bodyData)
00098 {
00099     
00100     LOG (0, trace, LFweb, "Executing URL: " << url << std::endl);
00101     
00102     using namespace lat;
00103     StringList split1 = StringOps::split (url, "?");
00104     if (split1.empty ())        
00105     {
00106         LOG (0, trace, LFweb, "Empty URL!" << std::endl);       
00107         return false;
00108     }
00109     
00110     if (split1.size () > 2)
00111     {
00112         LOG (0, trace, LFweb, "More than two '?'!" << std::endl);       
00113         return false;
00114     }
00115     
00116     LOG (0, trace, LFweb, "Web path:" << split1[0] << std::endl);
00117     
00118     StringList servicePath = StringOps::split (split1[0], "/", 
00119                                                StringOps::TrimEmpty);
00120     
00121     if (servicePath.empty ())
00122     {
00123         LOG (0, trace, LFweb, "No path" << std::endl);
00124         return false;
00125     }
00126     
00127     std::string serviceName = "Studio";
00128     std::string methodName = "login";
00129         
00130     if (servicePath.size () < 2)
00131     {
00132         LOG (0, trace, LFweb, "Not enough elements in the path." << std::endl);
00133         return false;
00134     }
00135     else
00136     {
00137         serviceName = servicePath[servicePath.size () - 2];
00138         methodName = servicePath[servicePath.size () - 1];
00139     }
00140     
00141     LOG (0, trace, LFweb, "Service: " << serviceName << " Method: " << methodName << std::endl);
00142         
00143     IgWebService::ArgumentsMap arguments;
00144     if (split1.size () == 2)
00145     {
00146         LOG (0, trace, LFweb, "CGI arguments: " << split1[1] << std::endl << lat::indent);      
00147         StringList args = StringOps::split (split1[1], "&");
00148         for (StringList::iterator i = args.begin ();
00149              i != args.end ();
00150              i++)
00151         {           
00152             LOG (0, trace, LFweb, "Parsing argument: " << *i << std::endl);
00153             
00154             StringList keyAndValue = StringOps::split (*i, "=");
00155 
00156             if (keyAndValue.empty ())
00157             {
00158                 LOG (0, trace, LFweb, "Empty argument string!" << std::endl << lat::undent << lat::undent);             
00159                 return false;
00160             }
00161 
00162             if (keyAndValue.size () > 2)
00163             {
00164                 LOG (0, trace, LFweb, "More then one '=' !" << std::endl << lat::undent << lat::undent);                
00165                 return false;
00166             }
00167             
00168             if (keyAndValue.size () == 1)
00169                 arguments.insert (std::pair<std::string, std::string> (keyAndValue[0], 
00170                                                                        ""));
00171             
00172             if (keyAndValue.size () == 2)
00173             {
00174                 std::string key = keyAndValue[0];
00175                 std::string value = StringOps::replace (keyAndValue[1], "%20", " ");
00176                 value = StringOps::replace (value, "%3A", ":");
00177                 value = StringOps::replace (value, "%7B", "{");
00178                 value = StringOps::replace (value, "%7D", "}");
00179                 arguments.insert (std::pair<std::string, std::string> (key, value));
00180             }
00181             
00182             LOG (0, trace, LFweb, "Key: " << keyAndValue[0]
00183                  << " Value: " << keyAndValue[1] << std::endl << lat::undent);                      
00184         }
00185     }
00186 
00187     WebServiceMap::iterator i = m_serviceMap.find (serviceName);
00188     if (i == m_serviceMap.end ())
00189     {
00190         LOG (0, trace, LFweb, "Webservice " << serviceName << " not found " 
00191              << std::endl);
00192         for (WebServiceMap::iterator i = m_serviceMap.begin ();
00193              i != m_serviceMap.end ();
00194              i++)
00195         {
00196             LOG (0, trace, LFweb, "Registered web service: *" 
00197                  << i->first << "*" << i->second << std::endl);     
00198         }
00199         
00200         return false;
00201     }
00202 
00203     IgSessionManager *sm = IgSessionManager::get (m_state);
00204     ASSERT (sm);
00205     
00206     IgState *state = sm->getSession (idCookie);
00207 
00208     if (!state)
00209     {
00210         state = sm->createSession (idCookie, m_state);  
00211     }
00212 
00213     LOG (0, trace, LFweb, "User state:" << state << std::endl);    
00214     ASSERT (state);
00215     
00216     IgWebService *service = i->second->webService ();
00217     IgWebService::Arguments args (state, 
00218                                   &socket, 
00219                                   &arguments, 
00220                                   idCookie,
00221                                   bodyData);    
00222     IgWebService::WebServiceCallback callback 
00223         = service->callback (methodName);
00224     
00225     
00226     if ( ((bool) callback) == false)
00227     { 
00228         LOG (0, trace, LFweb, "Method " << methodName << " not available" 
00229              << std::endl);         
00230         return false;   
00231     }
00232     
00233     callback (&args);
00234     
00235     
00236     return true;    
00237 }

Generated on Tue Jun 9 17:39:05 2009 for CMSSW by  doxygen 1.5.4