From 510c77d0eaa1cda885541463bdce249b65f95bbf Mon Sep 17 00:00:00 2001 From: randomdan Date: Fri, 29 Jul 2011 23:56:27 +0000 Subject: Strip out some useless wrappers Add support for plugable session containers --- project2/appEngine.cpp | 2 +- project2/cgi/cgiAppEngine.cpp | 23 ++++++++++------------- project2/cgi/cgiAppEngine.h | 2 ++ project2/cgi/cgiEnvironment.cpp | 2 ++ project2/cgi/cgiEnvironment.h | 1 + project2/cgi/cgiStageDefaultError.cpp | 4 ++-- project2/cgi/cgiStageDefaultNotFound.cpp | 2 +- project2/commonObjects.cpp | 2 +- project2/environment.cpp | 20 ++------------------ project2/environment.h | 6 ++---- project2/sessionContainer.cpp | 3 ++- project2/sessionContainer.h | 21 +++++++++++++++++++-- project2/sessionXml.cpp | 10 +--------- project2/sessionXml.h | 5 +++-- project2/xmlObjectLoader.cpp | 2 +- project2/xmlPresenter.cpp | 4 ++-- 16 files changed, 52 insertions(+), 57 deletions(-) diff --git a/project2/appEngine.cpp b/project2/appEngine.cpp index 9abe834..d8c097b 100644 --- a/project2/appEngine.cpp +++ b/project2/appEngine.cpp @@ -32,7 +32,7 @@ void ApplicationEngine::addCoreAppData(const Presenter * p) const { // Message log - p->pushSub("messages", env()->getXmlPrefix()); + p->pushSub("messages", env()->xmlPrefix); BOOST_FOREACH(const Messages::value_type & m, appMessages) { p->pushSub("message"); p->addAttr("group", m->group); diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index ee19331..d601670 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -6,7 +6,6 @@ #include "../logger.h" #include #include -#include "../sessionXml.h" #include "../ostreamWrapper.h" #include #include @@ -15,13 +14,12 @@ const std::string SESSIONID = "sessionID"; typedef UUID SIDKey; typedef std::string SValue; -SessionContainer * sessionsContainer = new SessionContainerXml(); - SimpleMessageException(UnknownDomain); CgiApplicationEngine::CgiApplicationEngine(const CgiEnvironment * e, std::ostream & io) : ApplicationEngine("web/host"), _env(e), + sessionsContainer(LoaderBase::getLoader(e->sessionModule)->open()), IO(io) { BOOST_FOREACH(const cgicc::HTTPCookie c, e->getCookieList()) { @@ -34,7 +32,6 @@ CgiApplicationEngine::CgiApplicationEngine(const CgiEnvironment * e, std::ostrea CgiApplicationEngine::~CgiApplicationEngine() { - sessionsContainer->CleanUp(); } const Environment * @@ -124,20 +121,20 @@ void CgiApplicationEngine::addEnvData(const Presenter * p) const { // These were for debug... but why not pass them on? - p->addField("servername", env()->getXmlPrefix(), env()->getServerName()); - p->addField("scriptname", env()->getXmlPrefix(), env()->getScriptName()); + p->addField("servername", env()->xmlPrefix, env()->getServerName()); + p->addField("scriptname", env()->xmlPrefix, env()->getScriptName()); // URL elements - p->pushSub("uriElems", env()->getXmlPrefix()); + p->pushSub("uriElems", env()->xmlPrefix); BOOST_FOREACH(std::string s, _env->elems) { - p->addField("uriElem", env()->getXmlPrefix(), s); + p->addField("uriElem", env()->xmlPrefix, s); } p->popSub(); // Parameters - p->pushSub("params", env()->getXmlPrefix()); + p->pushSub("params", env()->xmlPrefix); BOOST_FOREACH(cgicc::FormEntry fe, _env->cgi->getElements()) { - p->pushSub("param", env()->getXmlPrefix()); + p->pushSub("param", env()->xmlPrefix); p->addAttr("name", fe.getName()); p->addAttr("value", fe.getValue()); p->popSub(); @@ -151,11 +148,11 @@ CgiApplicationEngine::addAppData(const Presenter * p) const addCoreAppData(p); // Sessions variables if (!sessionID.is_nil()) { - p->pushSub("session", env()->getXmlPrefix()); + p->pushSub("session", env()->xmlPrefix); p->addField("id", sessionID.str()); Session::Values session(sessionsContainer->GetSession(sessionID)->GetValuesCopy()); BOOST_FOREACH(Session::Values::value_type sv, session) { - p->pushSub("var", env()->getXmlPrefix()); + p->pushSub("var", env()->xmlPrefix); p->addAttr("value", sv.second); p->addAttr("name", sv.first); p->popSub(); @@ -164,7 +161,7 @@ CgiApplicationEngine::addAppData(const Presenter * p) const } // Timing info - p->pushSub("timing", env()->getXmlPrefix()); + p->pushSub("timing", env()->xmlPrefix); p->addAttr("start", startTime); if (!endTime.is_not_a_date_time()) { p->addAttr("end", endTime); diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h index 8482181..2109a31 100644 --- a/project2/cgi/cgiAppEngine.h +++ b/project2/cgi/cgiAppEngine.h @@ -10,6 +10,7 @@ #include "../viewHost.h" #include "../transform.h" #include "../xmlPresenter.h" +#include "../sessionContainer.h" #include #include @@ -46,6 +47,7 @@ class CgiApplicationEngine : public ApplicationEngine, public TransformChainLink mutable DomainPlatforms domplat; bool checkDomain(const DomainPlatforms::value_type & i) const; void loadEngineSection(const xmlpp::Element *) const; + SessionContainerPtr sessionsContainer; public: class Stage; diff --git a/project2/cgi/cgiEnvironment.cpp b/project2/cgi/cgiEnvironment.cpp index e88dbc1..1382709 100644 --- a/project2/cgi/cgiEnvironment.cpp +++ b/project2/cgi/cgiEnvironment.cpp @@ -57,6 +57,8 @@ CgiEnvironment::addOptions(boost::program_options::positional_options_descriptio "The present script to use when the requested script (or child) fails") ("dumpdatadoc", boost::program_options::value(&dumpdatadoc), "Write a copy of the data document before sending it to the web server") + ("sessionModule", boost::program_options::value(&sessionModule)->default_value("xml"), + "The module with which to implement session management") ; return cgi; } diff --git a/project2/cgi/cgiEnvironment.h b/project2/cgi/cgiEnvironment.h index abfe78e..db39da8 100644 --- a/project2/cgi/cgiEnvironment.h +++ b/project2/cgi/cgiEnvironment.h @@ -37,6 +37,7 @@ class CgiEnvironment : public Environment, public cgicc::CgiEnvironment { std::string notFoundPresent; std::string onErrorPresent; std::string defaultPresenter; + std::string sessionModule; }; #endif diff --git a/project2/cgi/cgiStageDefaultError.cpp b/project2/cgi/cgiStageDefaultError.cpp index 767a634..1843905 100644 --- a/project2/cgi/cgiStageDefaultError.cpp +++ b/project2/cgi/cgiStageDefaultError.cpp @@ -28,8 +28,8 @@ CgiApplicationEngine::DefaultErrorStage::getHeader() const CgiApplicationEngine::NextStage CgiApplicationEngine::DefaultErrorStage::run() { - pres->addField("error-type", e->getXmlPrefix(), buf); - pres->addField("error-what", e->getXmlPrefix(), what.c_str()); + pres->addField("error-type", e->xmlPrefix, buf); + pres->addField("error-what", e->xmlPrefix, what.c_str()); return NextStage(NULL, this, pres.get(), pres.get()); } diff --git a/project2/cgi/cgiStageDefaultNotFound.cpp b/project2/cgi/cgiStageDefaultNotFound.cpp index 2e7acb1..8359aa7 100644 --- a/project2/cgi/cgiStageDefaultNotFound.cpp +++ b/project2/cgi/cgiStageDefaultNotFound.cpp @@ -22,7 +22,7 @@ CgiApplicationEngine::DefaultNotFoundStage::getHeader() const CgiApplicationEngine::NextStage CgiApplicationEngine::DefaultNotFoundStage::run() { - pres->addField("missing-resource", e->getXmlPrefix(), nf.what()); + pres->addField("missing-resource", e->xmlPrefix, nf.what()); return NextStage(NULL, this, pres.get(), pres.get()); } diff --git a/project2/commonObjects.cpp b/project2/commonObjects.cpp index 63d4d1d..e811fe7 100644 --- a/project2/commonObjects.cpp +++ b/project2/commonObjects.cpp @@ -21,7 +21,7 @@ CommonObjects::DataSources::const_iterator CommonObjects::loadDataSource(const std::string & name) const { XmlScriptParser xml(Environment::getCurrent()->resolveScript( - Environment::getCurrent()->getDatasourceRoot(), name), true); + Environment::getCurrent()->datasourceRoot, name), true); LoaderBase loader(true); loader.supportedStorers.insert(Storer::into(&datasources)); diff --git a/project2/environment.cpp b/project2/environment.cpp index 8a03af9..bdbc8f5 100644 --- a/project2/environment.cpp +++ b/project2/environment.cpp @@ -37,6 +37,8 @@ Environment::init() "The XML namespace to use for Project2 components and responses") ("xmlprefix", boost::program_options::value(&xmlPrefix)->default_value("project2"), "The XML namespace prefix to use for the Project2 XML namespace") + ("sessionTimeOut", boost::program_options::value(&sessionTimeOut)->default_value(3600), + "The time after which idle sessions are forgetten") ; allOptions.add(common).add(addOptions(posOptions)); optionsBuilt = true; @@ -68,24 +70,6 @@ Environment::~Environment() Logger()->clear(); } -const std::string & -Environment::getDatasourceRoot() const -{ - return datasourceRoot; -} - -const Glib::ustring & -Environment::getXmlNamespace() const -{ - return xmlNamespace; -} - -const Glib::ustring & -Environment::getXmlPrefix() const -{ - return xmlPrefix; -} - const Environment * Environment::getCurrent() { diff --git a/project2/environment.h b/project2/environment.h index 6a822c7..681a80c 100644 --- a/project2/environment.h +++ b/project2/environment.h @@ -16,10 +16,6 @@ class Environment { static const Environment * getCurrent(); - const std::string & getDatasourceRoot() const; - const Glib::ustring & getXmlNamespace() const; - const Glib::ustring & getXmlPrefix() const; - virtual Glib::ustring getParamUri(unsigned int idx) const = 0; virtual Glib::ustring getParamQuery(const std::string & idx) const = 0; @@ -44,9 +40,11 @@ class Environment { static int clLevel; static int slLevel; + public: std::string datasourceRoot; Glib::ustring xmlNamespace; Glib::ustring xmlPrefix; + time_t sessionTimeOut; }; #endif diff --git a/project2/sessionContainer.cpp b/project2/sessionContainer.cpp index 9028515..635889b 100644 --- a/project2/sessionContainer.cpp +++ b/project2/sessionContainer.cpp @@ -1,4 +1,5 @@ #include "sessionContainer.h" +#include "environment.h" SessionContainer::SessionContainer() { @@ -12,7 +13,7 @@ SessionPtr SessionContainer::GetSession(UUID & id) { SessionPtr s = getSession(id); - s->ExpiryTime(time(NULL) + 3600); + s->ExpiryTime(time(NULL) + Environment::getCurrent()->sessionTimeOut); return s; } diff --git a/project2/sessionContainer.h b/project2/sessionContainer.h index 6163200..fcad4b9 100644 --- a/project2/sessionContainer.h +++ b/project2/sessionContainer.h @@ -3,18 +3,35 @@ #include "uuid.h" #include "session.h" +#include -class SessionContainer { +class SessionContainer : public IntrusivePtrBase { public: SessionContainer(); virtual ~SessionContainer() = 0; SessionPtr GetSession(UUID & sid); - virtual void CleanUp() { } protected: virtual SessionPtr getSession(UUID & sid) = 0; }; +typedef boost::intrusive_ptr SessionContainerPtr; + +/// Base class to implement session container imlpementations +class SessionContainerLoader : public ComponentLoader { + public: + virtual SessionContainerPtr open() const = 0; +}; + +/// Helper implemention for specific container types +template +class SessionContainerLoaderImpl : public SessionContainerLoader { + public: + virtual SessionContainerPtr open() const + { + return new SCType(); + } +}; #endif diff --git a/project2/sessionXml.cpp b/project2/sessionXml.cpp index 03b48bc..fc552a9 100644 --- a/project2/sessionXml.cpp +++ b/project2/sessionXml.cpp @@ -30,23 +30,15 @@ class SessionXml : public Session { friend class SessionContainerXml; }; -typedef boost::intrusive_ptr SessionXmlPtr; - const char * xmlFile = "/tmp/project2sessions.xml"; -SessionXmlPtr currentSession; +DECLARE_COMPONENT_LOADER("xml", SessionContainerXml, SessionContainerLoader); SessionContainerXml::SessionContainerXml() { } SessionContainerXml::~SessionContainerXml() -{ - CleanUp(); -} - -void -SessionContainerXml::CleanUp() { if (currentSession) { xmlpp::DomParser parser; diff --git a/project2/sessionXml.h b/project2/sessionXml.h index 8086990..d8bc8aa 100644 --- a/project2/sessionXml.h +++ b/project2/sessionXml.h @@ -4,15 +4,16 @@ #include "sessionContainer.h" #include +class SessionXml; class SessionContainerXml : public SessionContainer { public: SessionContainerXml(); ~SessionContainerXml(); - void CleanUp(); - protected: SessionPtr getSession(UUID & sid); + typedef boost::intrusive_ptr SessionXmlPtr; + SessionXmlPtr currentSession; }; #endif diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index c41b0c0..faa5b2a 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -27,7 +27,7 @@ typedef std::set > ComponentLoaderSet; LoaderBase::LoaderBase(bool r) : recursive(r), - ns(Environment::getCurrent()->getXmlNamespace()) + ns(Environment::getCurrent()->xmlNamespace) { supportedStorers.insert(Storer::into(&libraries)); } diff --git a/project2/xmlPresenter.cpp b/project2/xmlPresenter.cpp index c6bb04d..b9e433c 100644 --- a/project2/xmlPresenter.cpp +++ b/project2/xmlPresenter.cpp @@ -28,8 +28,8 @@ void XmlPresenter::createDoc(const Glib::ustring & responseRootNodeName, const Glib::ustring & responseStyle) const { nodeStack.push_back(responseDoc->create_root_node(responseRootNodeName)); - declareNamespace(Environment::getCurrent()->getXmlPrefix(), - Environment::getCurrent()->getXmlNamespace()); + declareNamespace(Environment::getCurrent()->xmlPrefix, + Environment::getCurrent()->xmlNamespace); // XSLT Style char * buf; if (!responseStyle.empty() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", -- cgit v1.2.3