Implement support for making script variables constant.

Refs #4946
This commit is contained in:
Gunnar Beutner 2013-12-04 10:41:26 +01:00
parent c92625770c
commit 30c989074b
3 changed files with 72 additions and 23 deletions

View File

@ -607,7 +607,7 @@ String Application::GetPrefixDir(void)
*/ */
void Application::DeclarePrefixDir(const String& path) void Application::DeclarePrefixDir(const String& path)
{ {
ScriptVariable::Declare("IcingaPrefixDir", path); ScriptVariable::Set("IcingaPrefixDir", path, false);
} }
/** /**
@ -627,7 +627,7 @@ String Application::GetSysconfDir(void)
*/ */
void Application::DeclareSysconfDir(const String& path) void Application::DeclareSysconfDir(const String& path)
{ {
ScriptVariable::Declare("IcingaSysconfDir", path); ScriptVariable::Set("IcingaSysconfDir", path, false);
} }
/** /**
@ -647,7 +647,7 @@ String Application::GetLocalStateDir(void)
*/ */
void Application::DeclareLocalStateDir(const String& path) void Application::DeclareLocalStateDir(const String& path)
{ {
ScriptVariable::Declare("IcingaLocalStateDir", path); ScriptVariable::Set("IcingaLocalStateDir", path, false);
} }
/** /**
@ -667,7 +667,7 @@ String Application::GetPkgDataDir(void)
*/ */
void Application::DeclarePkgDataDir(const String& path) void Application::DeclarePkgDataDir(const String& path)
{ {
ScriptVariable::Declare("IcingaPkgDataDir", path); ScriptVariable::Set("IcingaPkgDataDir", path, false);
} }
/** /**
@ -687,7 +687,7 @@ String Application::GetStatePath(void)
*/ */
void Application::DeclareStatePath(const String& path) void Application::DeclareStatePath(const String& path)
{ {
ScriptVariable::Declare("IcingaStatePath", path); ScriptVariable::Set("IcingaStatePath", path, false);
} }
/** /**
@ -707,7 +707,7 @@ String Application::GetPidPath(void)
*/ */
void Application::DeclarePidPath(const String& path) void Application::DeclarePidPath(const String& path)
{ {
ScriptVariable::Declare("IcingaPidPath", path); ScriptVariable::Set("IcingaPidPath", path, false);
} }
/** /**
@ -727,7 +727,7 @@ String Application::GetApplicationType(void)
*/ */
void Application::DeclareApplicationType(const String& type) void Application::DeclareApplicationType(const String& type)
{ {
ScriptVariable::Declare("ApplicationType", type); ScriptVariable::Set("ApplicationType", type, false);
} }
/** /**

View File

@ -22,21 +22,58 @@
using namespace icinga; using namespace icinga;
ScriptVariable::ScriptVariable(const Value& data)
: m_Data(data), m_Constant(false)
{ }
ScriptVariable::Ptr ScriptVariable::GetByName(const String& name)
{
return ScriptVariableRegistry::GetInstance()->GetItem(name);
}
void ScriptVariable::SetConstant(bool constant)
{
m_Constant = constant;
}
bool ScriptVariable::IsConstant(void) const
{
return m_Constant;
}
void ScriptVariable::SetData(const Value& data)
{
m_Data = data;
}
Value ScriptVariable::GetData(void) const
{
return m_Data;
}
Value ScriptVariable::Get(const String& name) Value ScriptVariable::Get(const String& name)
{ {
Value value = ScriptVariableRegistry::GetInstance()->GetItem(name); ScriptVariable::Ptr sv = GetByName(name);
if (value.IsEmpty())
Log(LogWarning, "icinga", "Tried to access empty variable: " + name);
return value; if (!sv) {
Log(LogWarning, "icinga", "Tried to access undefined variable: " + name);
return Empty;
} }
void ScriptVariable::Set(const String& name, const Value& value) return sv->GetData();
}
ScriptVariable::Ptr ScriptVariable::Set(const String& name, const Value& value, bool overwrite)
{ {
ScriptVariableRegistry::GetInstance()->Register(name, value); ScriptVariable::Ptr sv = GetByName(name);
if (!sv) {
sv = make_shared<ScriptVariable>(value);
ScriptVariableRegistry::GetInstance()->Register(name, sv);
} else if (overwrite) {
sv->SetData(value);
} }
void ScriptVariable::Declare(const String& name, const Value& value) return sv;
{
ScriptVariableRegistry::GetInstance()->RegisterIfNew(name, value);
} }

View File

@ -29,22 +29,34 @@ namespace icinga
{ {
/** /**
* Global registry for script variables. * A script variables.
* *
* @ingroup base * @ingroup base
*/ */
class I2_BASE_API ScriptVariable class I2_BASE_API ScriptVariable : public Object
{ {
public: public:
DECLARE_PTR_TYPEDEFS(ScriptVariable);
ScriptVariable(const Value& data);
void SetConstant(bool constant);
bool IsConstant(void) const;
void SetData(const Value& data);
Value GetData(void) const;
static ScriptVariable::Ptr GetByName(const String& name);
static Value Get(const String& name); static Value Get(const String& name);
static void Set(const String& name, const Value& value); static ScriptVariable::Ptr Set(const String& name, const Value& value, bool overwrite = true);
static void Declare(const String& name, const Value& value);
private: private:
static Registry<ScriptVariable, Value> m_Registry; Value m_Data;
bool m_Constant;
}; };
class I2_BASE_API ScriptVariableRegistry : public Registry<ScriptVariableRegistry, Value> class I2_BASE_API ScriptVariableRegistry : public Registry<ScriptVariableRegistry, ScriptVariable::Ptr>
{ {
public: public:
static inline ScriptVariableRegistry *GetInstance(void) static inline ScriptVariableRegistry *GetInstance(void)