summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2011-10-19 00:46:42 +0000
committerrandomdan <randomdan@localhost>2011-10-19 00:46:42 +0000
commit4ad3e68bd99a8e2c1e7d8e5307e18f0a567cff49 (patch)
tree69729d7f7d9f8cf050418a605d883e2bdef29456
parentAdds the JSON and CouchDB module (diff)
downloadproject2-4ad3e68bd99a8e2c1e7d8e5307e18f0a567cff49.tar.bz2
project2-4ad3e68bd99a8e2c1e7d8e5307e18f0a567cff49.tar.xz
project2-4ad3e68bd99a8e2c1e7d8e5307e18f0a567cff49.zip
Remove session implementations per container, not point
-rw-r--r--project2/cgi/cgiAppEngine.cpp18
-rw-r--r--project2/common/session.cpp39
-rw-r--r--project2/common/session.h19
-rw-r--r--project2/common/sessionContainer.cpp6
-rw-r--r--project2/common/sessionContainer.h1
-rw-r--r--project2/console/consoleAppEngine.cpp43
-rw-r--r--project2/json/couchSession.cpp61
-rw-r--r--project2/xml/sessionXml.cpp106
-rw-r--r--project2/xml/sessionXml.h1
9 files changed, 110 insertions, 184 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp
index 1cee535..0f15f89 100644
--- a/project2/cgi/cgiAppEngine.cpp
+++ b/project2/cgi/cgiAppEngine.cpp
@@ -138,6 +138,16 @@ CgiApplicationEngine::addEnvData(const Presenter * p) const
p->popSub();
}
+static
+void
+addToPresenter(const Environment * env, const Presenter * p, const Glib::ustring & name, const VariableType & value)
+{
+ p->pushSub("var", env->xmlPrefix);
+ p->addAttr("value", value);
+ p->addAttr("name", name);
+ p->popSub();
+}
+
void
CgiApplicationEngine::addAppData(const Presenter * p) const
{
@@ -145,13 +155,7 @@ CgiApplicationEngine::addAppData(const Presenter * p) const
// Sessions variables
p->pushSub("session", env()->xmlPrefix);
p->addAttr("id", cursession->ID.str());
- Session::Values session(cursession->GetValuesCopy());
- BOOST_FOREACH(Session::Values::value_type sv, session) {
- p->pushSub("var", env()->xmlPrefix);
- p->addAttr("value", sv.second);
- p->addAttr("name", sv.first);
- p->popSub();
- }
+ cursession->ForeachValue(boost::bind(addToPresenter, env(), p, _1, _2));
p->popSub();
// Timing info
diff --git a/project2/common/session.cpp b/project2/common/session.cpp
index d796f83..fcfd3ca 100644
--- a/project2/common/session.cpp
+++ b/project2/common/session.cpp
@@ -1,5 +1,6 @@
#include <pch.hpp>
#include "session.h"
+#include "safeMapFind.h"
Session::Session(const UUID & sid) :
ID(sid)
@@ -10,3 +11,41 @@ Session::~Session()
{
}
+void
+Session::ExpiryTime(time_t t)
+{
+ expires = t;
+}
+
+time_t
+Session::ExpiryTime() const
+{
+ return expires;
+}
+
+VariableType
+Session::GetValue(const Glib::ustring & name) const
+{
+ return safeMapFind<VariableNotFound>(vars, name)->second;
+}
+
+void
+Session::SetValue(const Glib::ustring & name, const VariableType & value)
+{
+ vars[name] = value;
+}
+
+void
+Session::ClearValue(const Glib::ustring & name)
+{
+ vars.erase(name);
+}
+
+void
+Session::ForeachValue(const Session::SVH & svh) const
+{
+ BOOST_FOREACH(const Values::value_type & v, vars) {
+ svh(v.first, v.second);
+ }
+}
+
diff --git a/project2/common/session.h b/project2/common/session.h
index ea72c54..6aba83c 100644
--- a/project2/common/session.h
+++ b/project2/common/session.h
@@ -5,6 +5,7 @@
#include <map>
#include <glibmm/ustring.h>
#include <boost/intrusive_ptr.hpp>
+#include <boost/function.hpp>
#include "intrusivePtrBase.h"
#include "variables.h"
#include "exceptions.h"
@@ -14,21 +15,25 @@ class Session : public virtual IntrusivePtrBase {
public:
SimpleMessageException(VariableNotFound);
typedef std::map<Glib::ustring, VariableType> Values;
+ typedef boost::function2<void, const Glib::ustring &, const VariableType &> SVH;
Session(const UUID & id);
- virtual ~Session() = 0;
+ virtual ~Session();
- virtual VariableType GetValue(const Glib::ustring & name) const = 0;
- virtual Values GetValuesCopy() const = 0;
- virtual void SetValue(const Glib::ustring & name, const VariableType & value) = 0;
- virtual void ClearValue(const Glib::ustring & name) = 0;
- virtual time_t ExpiryTime() const = 0;
+ VariableType GetValue(const Glib::ustring & name) const;
+ void ForeachValue(const SVH &) const;
+ void SetValue(const Glib::ustring & name, const VariableType & value);
+ void ClearValue(const Glib::ustring & name);
+ time_t ExpiryTime() const;
const UUID ID;
protected:
- virtual void ExpiryTime(time_t) = 0;
+ void ExpiryTime(time_t);
friend class SessionContainer;
+
+ Values vars;
+ time_t expires;
};
typedef boost::intrusive_ptr<Session> SessionPtr;
diff --git a/project2/common/sessionContainer.cpp b/project2/common/sessionContainer.cpp
index 1acd6d0..82b7ca8 100644
--- a/project2/common/sessionContainer.cpp
+++ b/project2/common/sessionContainer.cpp
@@ -18,3 +18,9 @@ SessionContainer::GetSession(const UUID & id) const
return s;
}
+SessionPtr
+SessionContainer::newSession() const
+{
+ return new Session(UUID::generate_random());
+}
+
diff --git a/project2/common/sessionContainer.h b/project2/common/sessionContainer.h
index ffbc5ed..1ee7689 100644
--- a/project2/common/sessionContainer.h
+++ b/project2/common/sessionContainer.h
@@ -15,6 +15,7 @@ class SessionContainer : public IntrusivePtrBase {
protected:
virtual SessionPtr getSession(const UUID & sid) const = 0;
+ SessionPtr newSession() const;
};
typedef boost::intrusive_ptr<SessionContainer> SessionContainerPtr;
diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp
index f2dcaa8..e49825f 100644
--- a/project2/console/consoleAppEngine.cpp
+++ b/project2/console/consoleAppEngine.cpp
@@ -10,47 +10,6 @@
SimpleMessageException(UnknownPlatformAlias);
-/// Session implementation that stores its contents locally in memory, it has no long term persistence
-class ConsoleSession : public Session {
- public:
- ConsoleSession() : Session(UUID::generate_random()), expiry(0)
- {
- }
- virtual ~ConsoleSession()
- {
- }
-
- virtual VariableType GetValue(const Glib::ustring & name) const
- {
- return safeMapFind<VariableNotFound>(vars, name)->second;
- }
- virtual Values GetValuesCopy() const
- {
- return vars;
- }
- virtual void SetValue(const Glib::ustring & name, const VariableType & value)
- {
- vars[name] = value;
- }
- virtual void ClearValue(const Glib::ustring & name)
- {
- vars.erase(name);
- }
- virtual time_t ExpiryTime() const
- {
- return expiry;
- }
-
- protected:
- virtual void ExpiryTime(time_t t)
- {
- expiry = t;
- }
- private:
- time_t expiry;
- Values vars;
-};
-
ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * env, const boost::filesystem::path & f) :
XmlScriptParser(f, false),
SourceObject(get_document()->get_root_node()),
@@ -59,7 +18,7 @@ ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * en
TaskHost(f),
ViewHost(f),
_env(env),
- runtime(new ConsoleSession())
+ runtime(new Session(UUID::generate_random()))
{
}
diff --git a/project2/json/couchSession.cpp b/project2/json/couchSession.cpp
index d2eeca2..c6a15c0 100644
--- a/project2/json/couchSession.cpp
+++ b/project2/json/couchSession.cpp
@@ -13,42 +13,6 @@
#include "conversion.h"
#include <boost/program_options.hpp>
-class CouchSession : public Session {
- public:
- CouchSession(const UUID & sid) : Session(sid) {
- }
- CouchSession(const UUID & sid, const json::Object & o) : Session(sid), obj(o) {
- }
- virtual VariableType GetValue(const Glib::ustring & name) const {
- return boost::apply_visitor(JsonToProject2(), *safeMapFind<VariableNotFound>(obj, name)->second);
- }
- virtual Values GetValuesCopy() const {
- Values vs;
- BOOST_FOREACH(const json::Object::value_type & v, obj) {
- vs.insert(Values::value_type(v.first, boost::apply_visitor(JsonToProject2(), *v.second)));
- }
- return vs;
- }
- virtual void SetValue(const Glib::ustring & name, const VariableType & v) {
- obj[name] = json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), v)));
- }
- virtual void ClearValue(const Glib::ustring & name) {
- obj.erase(name);
- }
- virtual time_t ExpiryTime() const {
- return boost::get<json::Number>(*safeMapFind<VariableNotFound>(obj, ExpiryKey)->second);
- }
- virtual void ExpiryTime(time_t t) {
- obj[ExpiryKey] = json::ValuePtr(new json::Value(json::Number(t)));
- }
- private:
- json::Object obj;
- friend class CouchSessionContainer;
- friend class CustomCouchSessionLoader;
- static const Glib::ustring ExpiryKey;
-};
-const Glib::ustring CouchSession::ExpiryKey("project2:expires");
-
class CouchDBFailure : public std::exception { };
class CouchSessionContainer : public SessionContainer {
@@ -57,21 +21,28 @@ class CouchSessionContainer : public SessionContainer {
}
virtual SessionPtr getSession(const UUID & uuid) const {
try {
- SessionPtr s = new CouchSession(uuid, getSessionFromServer(uuid));
- if (s->ExpiryTime() > time(NULL)) {
+ json::Object obj = getSessionFromServer(uuid);
+ if (boost::get<json::Number>(*safeMapFind<Session::VariableNotFound>(obj, ExpiryKey)->second) > time(NULL)) {
+ SessionPtr s = new Session(uuid);
+ BOOST_FOREACH(const json::Object::value_type & v, obj) {
+ s->SetValue(v.first, boost::apply_visitor(JsonToProject2(), *v.second));
+ }
return s;
}
}
catch (...) {
}
- return new CouchSession(UUID::generate_random());
+ return newSession();
}
virtual void SaveSession(SessionPtr s) const {
CurlPtr c = new Curl();
c->setopt(CURLOPT_UPLOAD, 1L);
c->setopt(CURLOPT_FAILONERROR, 1);
- Glib::ustring out = json::serializeObject(boost::dynamic_pointer_cast<CouchSession>(s)->obj);
+ json::Object obj;
+ s->ForeachValue(boost::bind(&CouchSessionContainer::addToObject, &obj, _1, _2));
+ obj[ExpiryKey] = json::ValuePtr(new json::Value((json::Number)s->ExpiryTime()));
+ Glib::ustring out = json::serializeObject(obj);
c->setopt(CURLOPT_INFILESIZE_LARGE, (curl_off_t)out.size());
unsigned int off = 0;
BOOST_FOREACH(const std::string & b, baseUrls) {
@@ -103,6 +74,11 @@ class CouchSessionContainer : public SessionContainer {
throw CouchDBFailure();
}
+ private:
+ static void addToObject(json::Object * obj, const Glib::ustring & name, const VariableType & value) {
+ (*obj)[name] = json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value)));
+ }
+
static size_t send(Glib::ustring * buf, unsigned int * off, char * str, size_t l) {
size_t len = std::min(buf->size() - *off, l);
memcpy(str, buf->c_str() + *off, len);
@@ -123,8 +99,11 @@ class CouchSessionContainer : public SessionContainer {
}
static std::vector<std::string> baseUrls;
+ static const Glib::ustring ExpiryKey;
+ friend class CustomCouchSessionLoader;
};
std::vector<std::string> CouchSessionContainer::baseUrls;
+const Glib::ustring CouchSessionContainer::ExpiryKey("project2:expires");
namespace po = boost::program_options;
class CustomCouchSessionLoader : public SessionContainerLoaderImpl<CouchSessionContainer> {
@@ -167,7 +146,7 @@ class CustomCouchSessionLoader : public SessionContainerLoaderImpl<CouchSessionC
json::Object map;
Buffer mapBuf;
mapBuf.appendf("function(doc) { var exp = doc['%s']; if (exp < (new Date().getTime() / 1000)) { emit(exp, doc._rev); } }",
- CouchSession::ExpiryKey.c_str());
+ CouchSessionContainer::ExpiryKey.c_str());
map["map"] = json::ValuePtr(new json::Value(mapBuf.str()));
Glib::ustring mapStr(json::serializeObject(map));
// Create the CURL handle
diff --git a/project2/xml/sessionXml.cpp b/project2/xml/sessionXml.cpp
index fc77de2..3fb925f 100644
--- a/project2/xml/sessionXml.cpp
+++ b/project2/xml/sessionXml.cpp
@@ -10,27 +10,6 @@
#include <boost/lexical_cast.hpp>
#include <boost/program_options.hpp>
-/// Session implementation that stores its contents in an XML file on the local filesystem
-class SessionXml : public Session {
- public:
- SessionXml(const UUID & sid);
- SessionXml(const xmlpp::Element *);
- virtual ~SessionXml();
-
- VariableType GetValue(const Glib::ustring & name) const;
- Values GetValuesCopy() const;
- void SetValue(const Glib::ustring & name, const VariableType & value);
- void ClearValue(const Glib::ustring & name);
- time_t ExpiryTime() const;
- void ExpiryTime(time_t);
-
- private:
- Values vars;
- time_t expires;
-
- friend class SessionContainerXml;
-};
-
namespace po = boost::program_options;
class CustomSessionContainerLoaderXml : public SessionContainerLoaderImpl<SessionContainerXml> {
public:
@@ -63,6 +42,15 @@ SessionContainerXml::~SessionContainerXml()
{
}
+static
+void
+appendToXmlNode(xmlpp::Element * sess, const Glib::ustring & name, const VariableType & value)
+{
+ xmlpp::Element * v = sess->add_child("var");
+ v->add_child_text(value);
+ v->set_attribute("name", name);
+}
+
void
SessionContainerXml::SaveSession(SessionPtr currentSession) const
{
@@ -86,11 +74,7 @@ SessionContainerXml::SaveSession(SessionPtr currentSession) const
xmlpp::Element * sess = doc->get_root_node()->add_child("session");
sess->set_attribute("id", currentSession->ID.str());
sess->set_attribute("expires", boost::lexical_cast<Glib::ustring>(currentSession->ExpiryTime()));
- BOOST_FOREACH(const Session::Values::value_type & nvp, currentSession->GetValuesCopy()) {
- xmlpp::Element * v = sess->add_child("var");
- v->add_child_text(nvp.second);
- v->set_attribute("name", nvp.first);
- }
+ currentSession->ForeachValue(boost::bind(appendToXmlNode, sess, _1, _2));
doc->write_to_file(xmlFile);
if (!parser) {
delete doc;
@@ -108,69 +92,19 @@ SessionContainerXml::getSession(const UUID & sid) const
sid.str().c_str(), time(NULL));
xmlpp::NodeSet sess = sessions.get_document()->get_root_node()->find(xpath);
if (sess.size() == 1) {
- return new SessionXml(dynamic_cast<const xmlpp::Element *>(sess[0]));
+ if (const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(sess[0])) {
+ SessionPtr s = new Session(UUID(elem->get_attribute_value("id")));
+ BOOST_FOREACH(const xmlpp::Node * n, elem->find("var")) {
+ if (const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(n)) {
+ s->SetValue(e->get_attribute_value("name"), e->get_child_text() ? e->get_child_text()->get_content() : "");
+ }
+ }
+ return s;
+ }
}
}
catch (...) {
}
- return new SessionXml(UUID::generate_random());
-}
-
-SessionXml::SessionXml(const UUID & sid) :
- Session(sid)
-{
-}
-
-SessionXml::SessionXml(const xmlpp::Element * p) :
- Session(UUID(p->get_attribute_value("id"))),
- expires(boost::lexical_cast<time_t>(p->get_attribute_value("expires")))
-{
- xmlpp::NodeSet xvars = p->find("var");
- BOOST_FOREACH(const xmlpp::Node * n, xvars) {
- const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(n);
- if (e) {
- vars[e->get_attribute_value("name")] = e->get_child_text() ? e->get_child_text()->get_content() : "";
- }
- }
-}
-
-SessionXml::~SessionXml()
-{
-}
-
-void
-SessionXml::ExpiryTime(time_t t)
-{
- expires = t;
-}
-
-time_t
-SessionXml::ExpiryTime() const
-{
- return expires;
-}
-
-VariableType
-SessionXml::GetValue(const Glib::ustring & name) const
-{
- return safeMapFind<VariableNotFound>(vars, name)->second;
-}
-
-void
-SessionXml::SetValue(const Glib::ustring & name, const VariableType & value)
-{
- vars[name] = value;
-}
-
-void
-SessionXml::ClearValue(const Glib::ustring & name)
-{
- vars.erase(name);
-}
-
-Session::Values
-SessionXml::GetValuesCopy() const
-{
- return vars;
+ return newSession();
}
diff --git a/project2/xml/sessionXml.h b/project2/xml/sessionXml.h
index 8ba6ae2..2679bff 100644
--- a/project2/xml/sessionXml.h
+++ b/project2/xml/sessionXml.h
@@ -4,7 +4,6 @@
#include "sessionContainer.h"
#include <map>
-class SessionXml;
class SessionContainerXml : public SessionContainer {
public:
SessionContainerXml();