summaryrefslogtreecommitdiffstats
path: root/upstream/parameter/ConfigurableDomains.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/parameter/ConfigurableDomains.cpp')
-rw-r--r--upstream/parameter/ConfigurableDomains.cpp619
1 files changed, 619 insertions, 0 deletions
diff --git a/upstream/parameter/ConfigurableDomains.cpp b/upstream/parameter/ConfigurableDomains.cpp
new file mode 100644
index 0000000..7c51083
--- /dev/null
+++ b/upstream/parameter/ConfigurableDomains.cpp
@@ -0,0 +1,619 @@
+/*
+ * Copyright (c) 2011-2015, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <cassert>
+#include "ConfigurableDomains.h"
+#include "ConfigurableDomain.h"
+#include "ConfigurableElement.h"
+
+#define base CElement
+
+using std::string;
+
+string CConfigurableDomains::getKind() const
+{
+ return "ConfigurableDomains";
+}
+
+bool CConfigurableDomains::childrenAreDynamic() const
+{
+ return true;
+}
+
+// Ensure validity on whole domains from main blackboard
+void CConfigurableDomains::validate(const CParameterBlackboard *pMainBlackboard)
+{
+ // Delegate to domains
+ size_t uiNbConfigurableDomains = getNbChildren();
+
+ for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
+
+ CConfigurableDomain *pChildConfigurableDomain =
+ static_cast<CConfigurableDomain *>(getChild(child));
+
+ pChildConfigurableDomain->validate(pMainBlackboard);
+ }
+}
+
+// Configuration application if required
+void CConfigurableDomains::apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet &syncerSet,
+ bool bForce, core::Results &infos) const
+{
+ /// Delegate to domains
+
+ // Start with domains that can be synchronized all at once (with passed syncer set)
+ size_t uiNbConfigurableDomains = getNbChildren();
+
+ for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
+
+ const CConfigurableDomain *pChildConfigurableDomain =
+ static_cast<const CConfigurableDomain *>(getChild(child));
+
+ std::string info;
+ // Apply and collect syncers when relevant
+ pChildConfigurableDomain->apply(pParameterBlackboard, &syncerSet, bForce, info);
+
+ if (!info.empty()) {
+ infos.push_back(info);
+ }
+ }
+ // Synchronize those collected syncers
+ syncerSet.sync(*pParameterBlackboard, false, NULL);
+
+ // Then deal with domains that need to synchronize along apply
+ for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
+
+ const CConfigurableDomain *pChildConfigurableDomain =
+ static_cast<const CConfigurableDomain *>(getChild(child));
+
+ std::string info;
+ // Apply and synchronize when relevant
+ pChildConfigurableDomain->apply(pParameterBlackboard, NULL, bForce, info);
+ if (!info.empty()) {
+ infos.push_back(info);
+ }
+ }
+}
+
+// From IXmlSource
+void CConfigurableDomains::toXml(CXmlElement &xmlElement,
+ CXmlSerializingContext &serializingContext) const
+{
+ // Set attribute
+ xmlElement.setAttribute("SystemClassName", getName());
+
+ base::childrenToXml(xmlElement, serializingContext);
+}
+
+// Configuration/Domains handling
+/// Domains
+bool CConfigurableDomains::createDomain(const string &strName, string &strError)
+{
+ // Already exists?
+ if (findChild(strName)) {
+
+ strError = "Already existing configurable domain";
+
+ return false;
+ }
+
+ // Creation/Hierarchy
+ addChild(new CConfigurableDomain(strName));
+
+ return true;
+}
+
+bool CConfigurableDomains::addDomain(CConfigurableDomain &domain, bool bOverwrite, string &strError)
+{
+ string strErrorDrop;
+
+ string strDomainName(domain.getName());
+ CConfigurableDomain *pExistingDomain = findConfigurableDomain(strDomainName, strErrorDrop);
+
+ if (pExistingDomain) {
+ if (!bOverwrite) {
+ strError = "Can't add domain \"" + strDomainName +
+ "\" because it already exists and overwrite was not requested.";
+ return false;
+ }
+
+ deleteDomain(*pExistingDomain);
+ }
+
+ addChild(&domain);
+
+ return true;
+}
+
+void CConfigurableDomains::deleteDomain(CConfigurableDomain &configurableDomain)
+{
+ removeChild(&configurableDomain);
+
+ delete &configurableDomain;
+}
+
+bool CConfigurableDomains::deleteDomain(const string &strName, string &strError)
+{
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strName, strError);
+
+ if (pConfigurableDomain) {
+ deleteDomain(*pConfigurableDomain);
+ return true;
+ }
+
+ return false;
+}
+
+void CConfigurableDomains::deleteAllDomains()
+{
+ // remove Children
+ clean();
+}
+
+bool CConfigurableDomains::renameDomain(const string &strName, const string &strNewName,
+ string &strError)
+{
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strName, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ // Rename
+ return pConfigurableDomain->rename(strNewName, strError);
+}
+
+bool CConfigurableDomains::setSequenceAwareness(const string &strDomain, bool bSequenceAware,
+ string &strError)
+{
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ pConfigurableDomain->setSequenceAwareness(bSequenceAware);
+
+ return true;
+}
+
+bool CConfigurableDomains::getSequenceAwareness(const string &strDomain, bool &bSequenceAware,
+ string &strError) const
+{
+ const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ bSequenceAware = pConfigurableDomain->getSequenceAwareness();
+
+ return true;
+}
+
+/// Configurations
+bool CConfigurableDomains::listConfigurations(const string &strDomain, string &strResult) const
+{
+ const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // delegate
+ pConfigurableDomain->listChildren(strResult);
+
+ return true;
+}
+
+bool CConfigurableDomains::createConfiguration(const string &strDomain,
+ const string &strConfiguration,
+ const CParameterBlackboard *pMainBlackboard,
+ string &strError)
+{
+ // Find domain
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->createConfiguration(strConfiguration, pMainBlackboard, strError);
+}
+
+bool CConfigurableDomains::deleteConfiguration(const string &strDomain,
+ const string &strConfiguration, string &strError)
+{
+ // Find domain
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->deleteConfiguration(strConfiguration, strError);
+}
+
+bool CConfigurableDomains::renameConfiguration(const string &strDomain,
+ const string &strConfigurationName,
+ const string &strNewConfigurationName,
+ string &strError)
+{
+ // Find domain
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->renameConfiguration(strConfigurationName, strNewConfigurationName,
+ strError);
+}
+
+bool CConfigurableDomains::listDomainElements(const string &strDomain, string &strResult) const
+{
+ // Find domain
+ const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate
+ pConfigurableDomain->listAssociatedToElements(strResult);
+
+ return true;
+}
+
+bool CConfigurableDomains::split(const string &domainName, CConfigurableElement *element,
+ core::Results &infos)
+{
+ // Find domain
+ std::string error;
+ CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
+
+ if (domain == NULL) {
+
+ infos.push_back(error);
+ return false;
+ }
+ // Delegate
+ domain->split(element, infos);
+
+ return true;
+}
+
+void CConfigurableDomains::listAssociatedElements(string &strResult) const
+{
+ std::set<const CConfigurableElement *> configurableElementSet;
+
+ // Get all owned configurable elements
+ gatherAllOwnedConfigurableElements(configurableElementSet);
+
+ // Fill result
+ std::set<const CConfigurableElement *>::const_iterator it;
+
+ for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
+
+ const CConfigurableElement *pConfigurableElement = *it;
+
+ string strAssociatedDomainList;
+
+ pConfigurableElement->listAssociatedDomains(strAssociatedDomainList, false);
+
+ strResult += pConfigurableElement->getPath() + " [" + strAssociatedDomainList + "]\n";
+ }
+}
+
+void CConfigurableDomains::listConflictingElements(string &strResult) const
+{
+ std::set<const CConfigurableElement *> configurableElementSet;
+
+ // Get all owned configurable elements
+ gatherAllOwnedConfigurableElements(configurableElementSet);
+
+ // Fill result
+ std::set<const CConfigurableElement *>::const_iterator it;
+
+ for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
+
+ const CConfigurableElement *pConfigurableElement = *it;
+
+ if (pConfigurableElement->getBelongingDomainCount() > 1) {
+
+ string strBelongingDomainList;
+
+ pConfigurableElement->listBelongingDomains(strBelongingDomainList, false);
+
+ strResult += pConfigurableElement->getPath() + " contained in multiple domains: " +
+ strBelongingDomainList + "\n";
+ }
+ }
+}
+
+void CConfigurableDomains::listDomains(string &strResult) const
+{
+ // List domains
+ size_t uiNbConfigurableDomains = getNbChildren();
+
+ for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
+
+ const CConfigurableDomain *pChildConfigurableDomain =
+ static_cast<const CConfigurableDomain *>(getChild(child));
+
+ // Name
+ strResult += pChildConfigurableDomain->getName();
+
+ // Sequence awareness
+ if (pChildConfigurableDomain->getSequenceAwareness()) {
+
+ strResult += " [sequence aware]";
+ }
+ strResult += "\n";
+ }
+}
+
+// Gather configurable elements owned by any domain
+void CConfigurableDomains::gatherAllOwnedConfigurableElements(
+ std::set<const CConfigurableElement *> &configurableElementSet) const
+{
+ // Delegate to domains
+ size_t uiNbConfigurableDomains = getNbChildren();
+
+ for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
+
+ const CConfigurableDomain *pChildConfigurableDomain =
+ static_cast<const CConfigurableDomain *>(getChild(child));
+
+ pChildConfigurableDomain->gatherConfigurableElements(configurableElementSet);
+ }
+}
+
+// Config restore
+bool CConfigurableDomains::restoreConfiguration(const string &domainName,
+ const string &configurationName,
+ CParameterBlackboard *mainBlackboard, bool autoSync,
+ core::Results &errors) const
+{
+ string error;
+ // Find domain
+ const CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
+
+ if (domain == NULL) {
+
+ errors.push_back(error);
+ return false;
+ }
+ // Delegate
+ return domain->restoreConfiguration(configurationName, mainBlackboard, autoSync, errors);
+}
+
+// Config save
+bool CConfigurableDomains::saveConfiguration(const string &strDomain,
+ const string &strConfiguration,
+ const CParameterBlackboard *pMainBlackboard,
+ string &strError)
+{
+ // Find domain
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->saveConfiguration(strConfiguration, pMainBlackboard, strError);
+}
+
+bool CConfigurableDomains::setElementSequence(const string &strDomain,
+ const string &strConfiguration,
+ const std::vector<string> &astrNewElementSequence,
+ string &strError)
+{
+ // Find domain
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ // Delegate to domain
+ return pConfigurableDomain->setElementSequence(strConfiguration, astrNewElementSequence,
+ strError);
+}
+
+bool CConfigurableDomains::getElementSequence(const string &strDomain,
+ const string &strConfiguration,
+ string &strResult) const
+{
+ // Find domain
+ const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate to domain
+ return pConfigurableDomain->getElementSequence(strConfiguration, strResult);
+}
+
+bool CConfigurableDomains::setApplicationRule(
+ const string &strDomain, const string &strConfiguration, const string &strApplicationRule,
+ const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition, string &strError)
+{
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ // Delegate to domain
+ return pConfigurableDomain->setApplicationRule(strConfiguration, strApplicationRule,
+ pSelectionCriteriaDefinition, strError);
+}
+
+bool CConfigurableDomains::clearApplicationRule(const string &strDomain,
+ const string &strConfiguration, string &strError)
+{
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ // Delegate to domain
+ return pConfigurableDomain->clearApplicationRule(strConfiguration, strError);
+}
+
+bool CConfigurableDomains::getApplicationRule(const string &strDomain,
+ const string &strConfiguration,
+ string &strResult) const
+{
+ const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+
+ // Delegate to domain
+ return pConfigurableDomain->getApplicationRule(strConfiguration, strResult);
+}
+
+// Last applied configurations
+void CConfigurableDomains::listLastAppliedConfigurations(string &strResult) const
+{
+ // Browse domains
+ size_t uiNbConfigurableDomains = getNbChildren();
+
+ for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
+
+ const CConfigurableDomain *pChildConfigurableDomain =
+ static_cast<const CConfigurableDomain *>(getChild(child));
+
+ strResult += pChildConfigurableDomain->getName() + ": " +
+ pChildConfigurableDomain->getLastAppliedConfigurationName() + " [" +
+ pChildConfigurableDomain->getPendingConfigurationName() + "]\n";
+ }
+}
+
+// Configurable element - domain association
+bool CConfigurableDomains::addConfigurableElementToDomain(
+ const string &domainName, CConfigurableElement *element,
+ const CParameterBlackboard *mainBlackboard, core::Results &infos)
+{
+ // Find domain
+ std::string error;
+ CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
+
+ if (domain == NULL) {
+
+ infos.push_back(error);
+ return false;
+ }
+ // Delegate
+ return domain->addConfigurableElement(element, mainBlackboard, infos);
+}
+
+bool CConfigurableDomains::removeConfigurableElementFromDomain(
+ const string &strDomain, CConfigurableElement *pConfigurableElement, string &strError)
+{
+ // Find domain
+ CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->removeConfigurableElement(pConfigurableElement, strError);
+}
+
+CParameterBlackboard *CConfigurableDomains::findConfigurationBlackboard(
+ const string &strDomain, const string &strConfiguration,
+ const CConfigurableElement *pConfigurableElement, size_t &baseOffset, bool &bIsLastApplied,
+ string &strError) const
+{
+ // Find domain
+ const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
+
+ if (!pConfigurableDomain) {
+
+ return NULL;
+ }
+
+ // Check that element belongs to the domain
+ if (!pConfigurableElement->belongsTo(pConfigurableDomain)) {
+
+ strError = "Element \"" + pConfigurableElement->getPath() +
+ "\" does not belong to domain \"" + strDomain + "\"";
+
+ return NULL;
+ }
+
+ // Find Configuration Blackboard and Base Offset
+ return pConfigurableDomain->findConfigurationBlackboard(strConfiguration, pConfigurableElement,
+ baseOffset, bIsLastApplied, strError);
+}
+
+// Domain retrieval
+CConfigurableDomain *CConfigurableDomains::findConfigurableDomain(const string &strDomain,
+ string &strError)
+{
+ // Call the const equivalent
+ return const_cast<CConfigurableDomain *>(
+ static_cast<const CConfigurableDomains *>(this)->findConfigurableDomain(strDomain,
+ strError));
+}
+
+const CConfigurableDomain *CConfigurableDomains::findConfigurableDomain(const string &strDomain,
+ string &strError) const
+{
+ // Find domain
+ const CConfigurableDomain *pConfigurableDomain =
+ static_cast<const CConfigurableDomain *>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return NULL;
+ }
+
+ return pConfigurableDomain;
+}