+ add new class ParameterSerializer to load and save parameter files

This commit is contained in:
wmayer 2016-04-29 17:43:07 +02:00
parent af72ae09c1
commit 00eaab0522
5 changed files with 151 additions and 26 deletions

View File

@ -904,15 +904,31 @@ void Application::destruct(void)
{
// saving system parameter
Console().Log("Saving system parameter...\n");
_pcSysParamMngr->SaveDocument(mConfig["SystemParameter"].c_str());
_pcSysParamMngr->SaveDocument();
// saving the User parameter
Console().Log("Saving system parameter...done\n");
Console().Log("Saving user parameter...\n");
_pcUserParamMngr->SaveDocument(mConfig["UserParameter"].c_str());
_pcUserParamMngr->SaveDocument();
Console().Log("Saving user parameter...done\n");
// clean up
delete _pcSysParamMngr;
delete _pcUserParamMngr;
// now save all other parameter files
std::map<std::string,ParameterManager *>& paramMgr = _pcSingleton->mpcPramManager;
for (std::map<std::string,ParameterManager *>::iterator it = paramMgr.begin(); it != paramMgr.end(); ++it) {
if ((it->second != _pcSysParamMngr) && (it->second != _pcUserParamMngr)) {
if (it->second->HasSerializer()) {
Console().Log("Saving %s...\n", it->first.c_str());
it->second->SaveDocument();
Console().Log("Saving %s...done\n", it->first.c_str());
}
}
// clean up
delete it->second;
}
paramMgr.clear();
_pcSysParamMngr = 0;
_pcUserParamMngr = 0;
// not initialized or doubel destruct!
assert(_pcSingleton);
@ -1455,10 +1471,6 @@ void Application::logStatus()
void Application::LoadParameters(void)
{
// create standard parameter sets
_pcSysParamMngr = new ParameterManager();
_pcUserParamMngr = new ParameterManager();
// Init parameter sets ===========================================================
//
if (mConfig.find("UserParameter") == mConfig.end())
@ -1466,9 +1478,15 @@ void Application::LoadParameters(void)
if (mConfig.find("SystemParameter") == mConfig.end())
mConfig["SystemParameter"] = mConfig["UserAppData"] + "system.cfg";
// create standard parameter sets
_pcSysParamMngr = new ParameterManager();
_pcSysParamMngr->SetSerializer(new ParameterSerializer(mConfig["SystemParameter"]));
_pcUserParamMngr = new ParameterManager();
_pcUserParamMngr->SetSerializer(new ParameterSerializer(mConfig["UserParameter"]));
try {
if (_pcSysParamMngr->LoadOrCreateDocument(mConfig["SystemParameter"].c_str()) && !(mConfig["Verbose"] == "Strict")) {
if (_pcSysParamMngr->LoadOrCreateDocument() && !(mConfig["Verbose"] == "Strict")) {
// Configuration file optional when using as Python module
if (!Py_IsInitialized()) {
Console().Warning(" Parameter does not exist, writing initial one\n");
@ -1487,7 +1505,7 @@ void Application::LoadParameters(void)
}
try {
if (_pcUserParamMngr->LoadOrCreateDocument(mConfig["UserParameter"].c_str()) && !(mConfig["Verbose"] == "Strict")) {
if (_pcUserParamMngr->LoadOrCreateDocument() && !(mConfig["Verbose"] == "Strict")) {
// The user parameter file doesn't exist. When an alternative parameter file is offered
// this will be used.
std::map<std::string, std::string>::iterator it = mConfig.find("UserParameterTemplate");

View File

@ -957,6 +957,34 @@ void ParameterGrp::NotifyAll()
Notify(It5->first.c_str());
}
//**************************************************************************
//**************************************************************************
// ParameterSerializer
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ParameterSerializer::ParameterSerializer(const std::string& fn)
: filename(fn)
{
}
ParameterSerializer::~ParameterSerializer()
{
}
void ParameterSerializer::SaveDocument(const ParameterManager& mgr)
{
mgr.SaveDocument(filename.c_str());
}
int ParameterSerializer::LoadDocument(ParameterManager& mgr)
{
return mgr.LoadDocument(filename.c_str());
}
bool ParameterSerializer::LoadOrCreateDocument(ParameterManager& mgr)
{
return mgr.LoadOrCreateDocument(filename.c_str());
}
//**************************************************************************
//**************************************************************************
// ParameterManager
@ -970,7 +998,7 @@ static XercesDOMParser::ValSchemes gValScheme = XercesDOMParser::Val_Au
/** Default construction
*/
ParameterManager::ParameterManager()
: ParameterGrp(), _pDocument(0)
: ParameterGrp(), _pDocument(0), paramSerializer(0)
{
// initialize the XML system
Init();
@ -1036,6 +1064,7 @@ ParameterManager::ParameterManager()
ParameterManager::~ParameterManager()
{
delete _pDocument;
delete paramSerializer;
}
void ParameterManager::Init(void)
@ -1069,6 +1098,43 @@ void ParameterManager::Terminate(void)
XMLPlatformUtils::Terminate();
}
//**************************************************************************
// Serializer handling
void ParameterManager::SetSerializer(ParameterSerializer* ps)
{
if (paramSerializer != ps)
delete paramSerializer;
paramSerializer = ps;
}
bool ParameterManager::HasSerializer() const
{
return (paramSerializer != 0);
}
int ParameterManager::LoadDocument()
{
if (paramSerializer)
return paramSerializer->LoadDocument(*this);
else
return -1;
}
bool ParameterManager::LoadOrCreateDocument()
{
if (paramSerializer)
return paramSerializer->LoadOrCreateDocument(*this);
else
return false;
}
void ParameterManager::SaveDocument() const
{
if (paramSerializer)
paramSerializer->SaveDocument(*this);
}
//**************************************************************************
// Document handling

View File

@ -25,7 +25,7 @@
#ifndef BASE__PARAMETER_H
#define BASE__PARAMETER_H
// (re-)defined in pyconfig.h
#if defined (_POSIX_C_SOURCE)
# undef _POSIX_C_SOURCE
@ -264,13 +264,33 @@ protected:
};
/** The parameter serializer class
* This is a helper class to serialize a parameter XML document.
* Does loading and saving the DOM document from and to files.
* In sub-classes the load and saving of XML documents can be
* customized.
* @see ParameterManager
*/
class BaseExport ParameterSerializer
{
public:
ParameterSerializer(const std::string& fn);
virtual ~ParameterSerializer();
virtual void SaveDocument(const ParameterManager&);
virtual int LoadDocument(ParameterManager&);
virtual bool LoadOrCreateDocument(ParameterManager&);
protected:
std::string filename;
};
/** The parameter manager class
* This class manages a parameter XML document.
* Does loding, saving and handling the DOM document.
* Does loading, saving and handling the DOM document.
* @see ParameterGrp
*/
class BaseExport ParameterManager : public ParameterGrp
class BaseExport ParameterManager : public ParameterGrp
{
public:
ParameterManager();
@ -286,9 +306,24 @@ public:
void CreateDocument(void);
void CheckDocument() const;
/** @name Parameter serialization */
//@{
/// Sets a serializer. The ParameterManager takes ownership of the serializer.
void SetSerializer(ParameterSerializer*);
/// Returns true if a serializer is set, otherwise false is returned.
bool HasSerializer() const;
/// Loads an XML document by calling the serializer's load method.
int LoadDocument();
/// Loads or creates an XML document by calling the serializer's load method.
bool LoadOrCreateDocument();
/// Saves an XML document by calling the serializer's save method.
void SaveDocument() const;
//@}
private:
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *_pDocument;
ParameterSerializer * paramSerializer;
bool gDoNamespaces ;
bool gDoSchema ;

View File

@ -237,6 +237,16 @@ void DlgParameterImp::onGroupSelected( QTreeWidgetItem * item )
}
}
/** Switches the type of parameters with name @a config. */
void DlgParameterImp::activateParameterSet(const char* config)
{
int index = ui->parameterSet->findData(QByteArray(config));
if (index != -1) {
ui->parameterSet->setCurrentIndex(index);
onChangeParameterSet(index);
}
}
/** Switches the type of parameters either to user or system parameters. */
void DlgParameterImp::onChangeParameterSet(int index)
{
@ -244,12 +254,7 @@ void DlgParameterImp::onChangeParameterSet(int index)
if (!rcParMngr)
return;
if (rcParMngr == App::GetApplication().GetParameterSet("System parameter"))
ui->buttonSaveToDisk->setEnabled(true);
else if (rcParMngr == App::GetApplication().GetParameterSet("User parameter"))
ui->buttonSaveToDisk->setEnabled(true);
else
ui->buttonSaveToDisk->setEnabled(false);
ui->buttonSaveToDisk->setEnabled(rcParMngr->HasSerializer());
// remove all labels
paramGroup->clear();
@ -302,11 +307,10 @@ void DlgParameterImp::on_buttonSaveToDisk_clicked()
{
int index = ui->parameterSet->currentIndex();
ParameterManager* parmgr = App::GetApplication().GetParameterSet(ui->parameterSet->itemData(index).toByteArray());
if (!parmgr) return;
if (parmgr == App::GetApplication().GetParameterSet("System parameter"))
parmgr->SaveDocument(App::Application::Config()["SystemParameter"].c_str());
else if (parmgr == App::GetApplication().GetParameterSet("User parameter"))
parmgr->SaveDocument(App::Application::Config()["UserParameter"].c_str());
if (!parmgr)
return;
parmgr->SaveDocument();
}
namespace Gui {

View File

@ -49,6 +49,8 @@ public:
void accept();
void reject();
void activateParameterSet(const char*);
protected Q_SLOTS:
void onChangeParameterSet(int);
void on_buttonSaveToDisk_clicked();