00001
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
00018
00019
00020 lat::logflag LFweb = { 0, "web", true, -1 };
00021
00022
00023
00024
00025
00026 IG_DEFINE_STATE_ELEMENT (IgWebServiceRegistry, "WebServices");
00027
00028
00029
00030
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 }