- updated PoliciesGatekeeper to reflect change in design, it is still not usable at this time

git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@616 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
elvez 2006-06-10 15:44:42 +00:00
parent 1e75fe91f1
commit c5d78f3547
7 changed files with 103 additions and 24 deletions

View File

@ -143,6 +143,7 @@ src_backend_libbackend_la_SOURCES = \
src/backend/global_settings.cc \
src/backend/history.cc \
src/backend/observed_subject.cc \
src/backend/policies_gatekeeper.cc \
src/backend/policy.cc \
src/backend/policy_manager.cc \
src/backend/policy_parameters.cc \
@ -161,6 +162,7 @@ pkginclude_HEADERS = \
src/backend/history.hh \
src/backend/observed_subject.hh \
src/backend/plugin.hh \
src/backend/policies_gatekeeper.hh \
src/backend/policy.hh \
src/backend/policy_manager.hh \
src/backend/policy_parameters.hh \

View File

@ -76,6 +76,16 @@ namespace sgpem
policy_sorts_type wants() const throw(UserInterruptException);
void activate()
{
//FIXME write code for me
}
void deactivate()
{
//FIXME write code for me
}
private:
PythonPolicy(const PythonPolicy&);
PythonPolicy& operator=(const PythonPolicy&);

View File

@ -58,6 +58,12 @@ namespace sgpem
*/
void init();
std::vector<Policy*> get_avail_policies()
{
//FIXME write code for me
return std::vector<Policy*>();
}
/** \brief Returns the singleton instance of
* PythonPolicyManager.
*

View File

@ -19,12 +19,21 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "policies_gatekeeper.hh"
#include "policy_manager.hh"
#include "policy.hh"
#include <algorithm>
#include <cassert>
using std::vector;
using std::map;
using std::find;
using std::runtime_error;
using namespace sgpem;
typedef vector<PolicyManager*>::iterator ManagerIterator;
typedef map<History*, Policy*>::iterator ActiveIterator;
PoliciesGatekeeper* PoliciesGatekeeper::_instance = NULL;
PoliciesGatekeeper&
@ -44,11 +53,9 @@ PoliciesGatekeeper::get_registered() const
void
PoliciesGatekeeper::register_manager(PolicyManager* manager)
{
using std::find;
assert(manager != NULL);
end = _registered.end();
ManagerIterator end = _registered.end();
if(find(_registered.begin(), end, manager) != end)
_registered.push_back(manager);
@ -57,31 +64,78 @@ PoliciesGatekeeper::register_manager(PolicyManager* manager)
void
PoliciesGatekeeper::unregister_manager(PolicyManager* manager)
{
using std::find;
assert(manager != NULL);
end = _registered.end();
pos = find(_registered.begin(), end, manager);
ManagerIterator end = _registered.end();
ManagerIterator pos = find(_registered.begin(), end, manager);
if(pos != end)
{
deactivate_policies(*pos);
_registered.erase(pos);
}
}
Policy*
PoliciesGatekeeper::get_current_policy()
PoliciesGatekeeper::get_current_policy(History* history) throw(runtime_error)
{
return _cur_policy;
assert(history != NULL);
ActiveIterator policy = _active_policies.find(history);
if(policy == _active_policies.end())
throw runtime_error("No active policy associated with this "
"history is available.");
return policy->second;
}
void
PoliciesGatekeeper::activate_policy(Policy* policy)
PoliciesGatekeeper::activate_policy(History *history, Policy* policy)
{
_cur_policy = policy;
assert(history != NULL && policy != NULL);
ActiveIterator end = _active_policies.end();
ActiveIterator pos = _active_policies.find(history);
if(pos != end && pos->second != policy)
_active_policies[history]->deactivate();
if(pos == end || pos->second != policy)
{
_active_policies[history] = policy;
_active_policies[history]->activate();
}
}
PoliciesGatekeeper::PoliciesGatekeeper() :
_cur_policy(NULL)
PoliciesGatekeeper::PoliciesGatekeeper()
{
}
void
PoliciesGatekeeper::deactivate_policies(PolicyManager* manager)
{
typedef vector<Policy*>::iterator PolicyIterator;
vector<Policy*> avail_policies = manager->get_avail_policies();
PolicyIterator avail_it = avail_policies.begin();
PolicyIterator avail_end = avail_policies.end();
for(; avail_it != avail_end; ++avail_it)
{
// TODO isn't there a way to write more compact code by using
// library utilities?
ActiveIterator act_it = _active_policies.begin();
for(; act_it != _active_policies.end(); ++act_it)
{
if(act_it->second == *avail_it)
{
act_it->second->deactivate();
_active_policies.erase(act_it);
}
}
}
}

View File

@ -25,11 +25,14 @@ namespace sgpem
{
class PolicyManager;
class Policy;
class History;
}
#include "config.h"
#include <vector>
#include <map>
#include <stdexcept>
namespace sgpem
{
@ -51,25 +54,23 @@ namespace sgpem
std::vector<PolicyManager*> get_registered() const;
/** FIXME what to do when the manager was already registered? should we throw an exception?
*
*/
void register_manager(PolicyManager* manager);
/** FIXME what to do when the manager wasn't already registered? should we throw an exception?
*
*/
void unregister_manager(PolicyManager* manager);
Policy* get_current_policy();
Policy* get_current_policy(History* history) throw(std::runtime_error);
void activate_policy(Policy* policy);
void activate_policy(History* history, Policy* policy);
private:
PoliciesGatekeeper(); //private constructor.
PoliciesGatekeeper(); //private constructor.
// Deactivates active policies managed by the specified manager.
void deactivate_policies(PolicyManager* manager);
static PoliciesGatekeeper* _instance;
std::vector<PolicyManager*> _registered;
Policy* _cur_policy;
std::map<History*, Policy*> _active_policies;
};
}//~ namespace sgpem

View File

@ -113,6 +113,10 @@ namespace sgpem
*/
virtual policy_sorts_type wants() const throw(UserInterruptException) = 0;
virtual void activate() = 0;
virtual void deactivate() = 0;
/**
Gets the parameters related with this policy.

View File

@ -61,6 +61,8 @@ namespace sgpem
*/
virtual void init() = 0;
virtual std::vector<Policy*> get_avail_policies() = 0;
/** \brief Get the registered manager instance
*
* \return The registered policy manager instance.