diff options
| author | randomdan <randomdan@localhost> | 2013-06-23 15:43:32 +0000 | 
|---|---|---|
| committer | randomdan <randomdan@localhost> | 2013-06-23 15:43:32 +0000 | 
| commit | dd60be86753dcee901f3a74700d7f68f689bd5a6 (patch) | |
| tree | 47725a698f89358420499d49649d1f433f82df92 | |
| parent | Move logger initialisation and optionSource loading out of environment into t... (diff) | |
| download | project2-dd60be86753dcee901f3a74700d7f68f689bd5a6.tar.bz2 project2-dd60be86753dcee901f3a74700d7f68f689bd5a6.tar.xz project2-dd60be86753dcee901f3a74700d7f68f689bd5a6.zip  | |
Move script resolution out of environment into script reader
| -rw-r--r-- | project2/cgi/cgiAppEngine.cpp | 6 | ||||
| -rw-r--r-- | project2/cgi/cgiProgRouter.cpp | 2 | ||||
| -rw-r--r-- | project2/cgi/cgiStageInitial.cpp | 4 | ||||
| -rw-r--r-- | project2/cgi/cgiStageRequest.cpp | 2 | ||||
| -rw-r--r-- | project2/common/commonObjects.cpp | 2 | ||||
| -rw-r--r-- | project2/common/environment.cpp | 37 | ||||
| -rw-r--r-- | project2/common/environment.h | 7 | ||||
| -rw-r--r-- | project2/common/scripts.cpp | 34 | ||||
| -rw-r--r-- | project2/common/scripts.h | 8 | ||||
| -rw-r--r-- | project2/console/p2consoleMain.cpp | 3 | ||||
| -rw-r--r-- | project2/mail/sendmailTask.cpp | 2 | 
11 files changed, 53 insertions, 54 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index 0022a88..654c2ce 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -73,7 +73,7 @@ CgiApplicationEngine::process() const   			currentStage = currentStage.get<0>()->run();  		}  		catch (const CheckHost::CheckFailure & cf) { -			currentStage = NextStage(new PresentStage(_env->resolveScript(_env->presentRoot, cf.failedCheck->present(), false))); +			currentStage = NextStage(new PresentStage(ScriptReader::resolveScript(_env->presentRoot, cf.failedCheck->present(), false)));  		}  		catch (const ScriptNotFound & nf) {  			if (_env->notFoundPresent.empty() || triedNotFound) { @@ -81,7 +81,7 @@ CgiApplicationEngine::process() const  			}  			else {  				triedNotFound = true; -				currentStage = NextStage(new CustomNotFoundStage(nf, _env->resolveScript(_env->errorPresentRoot, _env->notFoundPresent, false))); +				currentStage = NextStage(new CustomNotFoundStage(nf, ScriptReader::resolveScript(_env->errorPresentRoot, _env->notFoundPresent, false)));  			}  		}  		catch (const std::exception & ex) { @@ -90,7 +90,7 @@ CgiApplicationEngine::process() const  			}  			else {  				triedNotFound = true; -				currentStage = NextStage(new CustomErrorStage(ex, _env->resolveScript(_env->errorPresentRoot, _env->onErrorPresent, false))); +				currentStage = NextStage(new CustomErrorStage(ex, ScriptReader::resolveScript(_env->errorPresentRoot, _env->onErrorPresent, false)));  			}  		}  	} while (currentStage.get<0>()); diff --git a/project2/cgi/cgiProgRouter.cpp b/project2/cgi/cgiProgRouter.cpp index 089b94f..d187de2 100644 --- a/project2/cgi/cgiProgRouter.cpp +++ b/project2/cgi/cgiProgRouter.cpp @@ -35,7 +35,7 @@ class RoutingTable {  		}  		void setRouteScript()  		{ -			routeScript = Environment::getCurrent()->resolveScript(Environment::getCurrent()->datasourceRoot, routeScriptPath, true); +			routeScript = ScriptReader::resolveScript(Environment::getCurrent()->datasourceRoot, routeScriptPath, true);  			routeScript->loader.addLoadTarget(routeScript->root(), Storer::into<ElementLoader>(&routes));  			routes.clear();  			routeScript->load(NULL, true); diff --git a/project2/cgi/cgiStageInitial.cpp b/project2/cgi/cgiStageInitial.cpp index 1fe4820..d5fe424 100644 --- a/project2/cgi/cgiStageInitial.cpp +++ b/project2/cgi/cgiStageInitial.cpp @@ -8,10 +8,10 @@ CgiApplicationEngine::InitialStage::run()  {  	const CgiEnvironment * e = env();  	if (e->getRequestMethod() == "POST") { -		return NextStage(new RequestStage(e->resolveScript(e->requestRoot, e->router->route(), false))); +		return NextStage(new RequestStage(ScriptReader::resolveScript(e->requestRoot, e->router->route(), false)));  	}  	else { -		return NextStage(new PresentStage(e->resolveScript(e->presentRoot, e->router->isDefault() ? e->defaultPresent : e->router->route(), false))); +		return NextStage(new PresentStage(ScriptReader::resolveScript(e->presentRoot, e->router->isDefault() ? e->defaultPresent : e->router->route(), false)));  	}  } diff --git a/project2/cgi/cgiStageRequest.cpp b/project2/cgi/cgiStageRequest.cpp index 8fa06bf..37faaae 100644 --- a/project2/cgi/cgiStageRequest.cpp +++ b/project2/cgi/cgiStageRequest.cpp @@ -22,7 +22,7 @@ CgiApplicationEngine::RequestStage::run()  	runChecks();  	execute();  	if (!present().isNull()) { -		return NextStage(new PresentStage(env()->resolveScript(env()->presentRoot, present(), false)), this); +		return NextStage(new PresentStage(ScriptReader::resolveScript(env()->presentRoot, present(), false)), this);  	}  	return NextStage(NULL, this);  } diff --git a/project2/common/commonObjects.cpp b/project2/common/commonObjects.cpp index 9b45baa..c18db3c 100644 --- a/project2/common/commonObjects.cpp +++ b/project2/common/commonObjects.cpp @@ -29,7 +29,7 @@ CommonObjects::getSource(const std::string & name) const  CommonObjects::DataSources::const_iterator  CommonObjects::loadDataSource(const std::string & name) const  { -	ScriptReaderPtr dbs = Environment::getCurrent()->resolveScript(Environment::getCurrent()->datasourceRoot, name, true); +	ScriptReaderPtr dbs = ScriptReader::resolveScript(Environment::getCurrent()->datasourceRoot, name, true);  	dbs->loader.addLoadTarget(dbs->root(), Storer::into<ElementLoader>(&datasources));  	dbs->load(NULL, false);  	return safeMapFind<DataSourceNotFound>(datasources, name); diff --git a/project2/common/environment.cpp b/project2/common/environment.cpp index 0b9a1fe..a996408 100644 --- a/project2/common/environment.cpp +++ b/project2/common/environment.cpp @@ -1,14 +1,6 @@  #include <pch.hpp>  #include "environment.h"  #include "optionsSource.h" -#include "logger.h" -#include "scriptLoader.h" -#include <stdio.h> -#include <fstream> -#include <boost/filesystem/convenience.hpp> -#include <boost/tuple/tuple_comparison.hpp> -#include <boost/foreach.hpp> -#include <boost/bind.hpp>  const Environment * Environment::currentEnv(NULL); @@ -44,32 +36,3 @@ Environment::getCurrent()  	return currentEnv;  } -ScriptReaderPtr -Environment::resolveScript(const std::string & group, const std::string & name, bool ii) const -{ -	typedef std::map<std::string, boost::shared_ptr<ScriptReaderLoader> > ReaderLoaders; -	boost::filesystem::path e(name); -	while (!e.empty()) { -		ScriptKey sk(group, e.string()); -		ScriptCache::const_iterator i = scriptCache.find(sk); -		if (i != scriptCache.end() && i->second->isCurrent()) { -			return i->second; -		} -		else { -			BOOST_FOREACH(const ReaderLoaders::value_type & rl, *Plugable::objLoaders<ScriptReaderLoader>()) { -				ScriptReaderPtr rs = rl.second->resolveScript(group, e.string()); -				if (rs) { -					return (scriptCache[sk] = rs); -				} -			} -		} -		e = e.parent_path(); -	} -	if (ii) { -		throw DependencyNotFound(group, name); -	} -	else { -		throw ScriptNotFound(group, name); -	} -} - diff --git a/project2/common/environment.h b/project2/common/environment.h index 7b5e976..7289bb0 100644 --- a/project2/common/environment.h +++ b/project2/common/environment.h @@ -3,7 +3,6 @@  #include <string>  #include <glibmm/ustring.h> -#include <boost/tuple/tuple.hpp>  #include "options.h"  #include "exceptions.h"  #include "scripts.h" @@ -22,16 +21,10 @@ class Environment {  		virtual std::string getServerName() const = 0;  		virtual const Glib::ustring & platform() const = 0; -		ScriptReaderPtr resolveScript(const std::string & group, const std::string & name, bool ii) const; -  		INITOPTIONS;  	private:  		static const Environment * currentEnv; -		typedef boost::tuple<const std::string, const std::string> ScriptKey; -		typedef std::map<ScriptKey, ScriptReaderPtr> ScriptCache; -		mutable ScriptCache scriptCache; -  	public:  		static std::string datasourceRoot;  		static std::string scriptNamespace; diff --git a/project2/common/scripts.cpp b/project2/common/scripts.cpp index e2f1370..cb5d035 100644 --- a/project2/common/scripts.cpp +++ b/project2/common/scripts.cpp @@ -1,5 +1,9 @@  #include "scripts.h"  #include "variables/fixed.h" +#include <boost/filesystem/convenience.hpp> +#include <boost/tuple/tuple_comparison.hpp> + +ScriptReader::ScriptCache ScriptReader::scriptCache;  ScriptNode::ScriptNode(ScriptReaderPtr s) :  	script(s) @@ -42,3 +46,33 @@ ScriptReader::load(const CommonObjects * co, bool childrenOnly) const  {  	loader.collectAll(co, childrenOnly, root());  } + +ScriptReaderPtr +ScriptReader::resolveScript(const std::string & group, const std::string & name, bool ii) +{ +	typedef std::map<std::string, boost::shared_ptr<ScriptReaderLoader> > ReaderLoaders; +	boost::filesystem::path e(name); +	while (!e.empty()) { +		ScriptKey sk(group, e.string()); +		ScriptCache::const_iterator i = scriptCache.find(sk); +		if (i != scriptCache.end() && i->second->isCurrent()) { +			return i->second; +		} +		else { +			BOOST_FOREACH(const ReaderLoaders::value_type & rl, *Plugable::objLoaders<ScriptReaderLoader>()) { +				ScriptReaderPtr rs = rl.second->resolveScript(group, e.string()); +				if (rs) { +					return (scriptCache[sk] = rs); +				} +			} +		} +		e = e.parent_path(); +	} +	if (ii) { +		throw DependencyNotFound(group, name); +	} +	else { +		throw ScriptNotFound(group, name); +	} +} + diff --git a/project2/common/scripts.h b/project2/common/scripts.h index f571d0a..ed4d9fd 100644 --- a/project2/common/scripts.h +++ b/project2/common/scripts.h @@ -3,6 +3,7 @@  #include "intrusivePtrBase.h"  #include <boost/intrusive_ptr.hpp> +#include <boost/tuple/tuple.hpp>  #include <boost/function.hpp>  #include <boost/optional.hpp>  #include "scriptLoader.h" @@ -58,8 +59,15 @@ class ScriptReader : public virtual IntrusivePtrBase {  		virtual time_t modifiedTime() const = 0;  		mutable LoaderBase loader; +		static ScriptReaderPtr resolveScript(const std::string & group, const std::string & name, bool ii); +  		friend class SourceObject;  		mutable std::map<std::string, SourceObject *> namedComponents; + +	private: +		typedef boost::tuple<const std::string, const std::string> ScriptKey; +		typedef std::map<ScriptKey, ScriptReaderPtr> ScriptCache; +		static ScriptCache scriptCache;  };  /// Base class to implement script reader modules diff --git a/project2/console/p2consoleMain.cpp b/project2/console/p2consoleMain.cpp index d443ab0..57008b6 100644 --- a/project2/console/p2consoleMain.cpp +++ b/project2/console/p2consoleMain.cpp @@ -17,7 +17,8 @@ main(int argc, char ** argv)  	BOOST_FOREACH(const ConsoleEnvironment::ToDo & todo, env.todoList()) {  		Plugable::onAllComponents(boost::bind(&ComponentLoader::onBefore, _1));  		Logger()->messagebf(LOG_DEBUG, "%s: Beginning script '%s/%s'", __FUNCTION__, todo.get<0>(), todo.get<1>()); -		boost::intrusive_ptr<ConsoleApplicationEngine> app(new ConsoleApplicationEngine(&env, env.resolveScript(todo.get<0>(), todo.get<1>(), false))); +		boost::intrusive_ptr<ConsoleApplicationEngine> app(new ConsoleApplicationEngine(&env, +					ScriptReader::resolveScript(todo.get<0>(), todo.get<1>(), false)));  		Logger()->messagef(LOG_DEBUG, "%s: Processing file", __FUNCTION__);  		app->process(); diff --git a/project2/mail/sendmailTask.cpp b/project2/mail/sendmailTask.cpp index 836b61a..10bfbdd 100644 --- a/project2/mail/sendmailTask.cpp +++ b/project2/mail/sendmailTask.cpp @@ -195,7 +195,7 @@ SendMailTask::execute() const  	parts->parts.insert(new Header("Content-Transfer-Encoding", "binary"));  	parts->parts.insert(new BoundaryEnd()); -	ViewHostPtr vsp = new EmailViewHost(parts, Environment::getCurrent()->resolveScript("emails", present(), false)->root()); +	ViewHostPtr vsp = new EmailViewHost(parts, ScriptReader::resolveScript("emails", present(), false)->root());  	vsp->executeViews();  	vsp->doTransforms();  	parts->part = parts->parts.begin();  | 
