summaryrefslogtreecommitdiffstats
path: root/upstream/parameter/SelectionCriterionRule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/parameter/SelectionCriterionRule.cpp')
-rw-r--r--upstream/parameter/SelectionCriterionRule.cpp250
1 files changed, 250 insertions, 0 deletions
diff --git a/upstream/parameter/SelectionCriterionRule.cpp b/upstream/parameter/SelectionCriterionRule.cpp
new file mode 100644
index 0000000..8c22045
--- /dev/null
+++ b/upstream/parameter/SelectionCriterionRule.cpp
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2011-2014, 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 "SelectionCriterionRule.h"
+#include "SelectionCriterion.h"
+#include "XmlDomainSerializingContext.h"
+#include "XmlDomainImportContext.h"
+#include "SelectionCriteriaDefinition.h"
+#include "SelectionCriterionTypeInterface.h"
+#include "RuleParser.h"
+#include <assert.h>
+
+#define base CRule
+
+using std::string;
+
+const CSelectionCriterionRule::SMatchingRuleDescription
+ CSelectionCriterionRule::_astMatchesWhen[CSelectionCriterionRule::ENbMatchesWhen] = {
+ {"Is", true}, {"IsNot", true}, {"Includes", false}, {"Excludes", false}};
+
+// Class kind
+string CSelectionCriterionRule::getKind() const
+{
+ return "SelectionCriterionRule";
+}
+
+// Content dumping
+string CSelectionCriterionRule::logValue(utility::ErrorContext & /*cxt*/) const
+{
+ // Dump rule
+ return dump();
+}
+
+// Parse
+bool CSelectionCriterionRule::parse(CRuleParser &ruleParser, string &strError)
+{
+ // Criterion
+ _pSelectionCriterion =
+ ruleParser.getSelectionCriteriaDefinition()->getSelectionCriterion(ruleParser.getType());
+
+ // Check existence
+ if (!_pSelectionCriterion) {
+
+ strError = "Couldn't find selection criterion " + ruleParser.getType();
+
+ return false;
+ }
+
+ // Verb
+ string strMatchesWhen;
+
+ if (!ruleParser.next(strMatchesWhen, strError)) {
+
+ return false;
+ }
+ // Value
+ string strValue;
+
+ if (!ruleParser.next(strValue, strError)) {
+
+ return false;
+ }
+
+ // Matches when
+ if (!setMatchesWhen(strMatchesWhen, strError)) {
+
+ strError = "Verb error: " + strError;
+
+ return false;
+ }
+
+ // Value
+ if (!_pSelectionCriterion->getCriterionType()->getNumericalValue(strValue, _iMatchValue)) {
+
+ strError = "Value error: \"" + strValue + "\" is not part of criterion \"" +
+ _pSelectionCriterion->getCriterionName() + "\"";
+
+ return false;
+ }
+
+ return true;
+}
+
+// Dump
+string CSelectionCriterionRule::dump() const
+{
+ // Value
+ string value;
+ _pSelectionCriterion->getCriterionType()->getLiteralValue(_iMatchValue, value);
+
+ // "<Name> <Verb> <Value>"
+ return string(_pSelectionCriterion->getName()) + " " +
+ _astMatchesWhen[_eMatchesWhen].pcMatchesWhen + " " + value;
+}
+
+// Rule check
+bool CSelectionCriterionRule::matches() const
+{
+ assert(_pSelectionCriterion);
+
+ switch (_eMatchesWhen) {
+ case EIs:
+ return _pSelectionCriterion->is(_iMatchValue);
+ case EIsNot:
+ return _pSelectionCriterion->isNot(_iMatchValue);
+ case EIncludes:
+ return _pSelectionCriterion->includes(_iMatchValue);
+ case EExcludes:
+ return _pSelectionCriterion->excludes(_iMatchValue);
+ default:
+ assert(0);
+ return false;
+ }
+}
+
+// From IXmlSink
+bool CSelectionCriterionRule::fromXml(const CXmlElement &xmlElement,
+ CXmlSerializingContext &serializingContext)
+{
+ // Retrieve actual context
+ CXmlDomainImportContext &xmlDomainImportContext =
+ static_cast<CXmlDomainImportContext &>(serializingContext);
+
+ // Get selection criterion
+ string strSelectionCriterion;
+ xmlElement.getAttribute("SelectionCriterion", strSelectionCriterion);
+
+ _pSelectionCriterion =
+ xmlDomainImportContext.getSelectionCriteriaDefinition()->getSelectionCriterion(
+ strSelectionCriterion);
+
+ // Check existence
+ if (!_pSelectionCriterion) {
+
+ xmlDomainImportContext.setError("Couldn't find selection criterion " +
+ strSelectionCriterion + " in " + getKind() + " " +
+ xmlElement.getPath());
+
+ return false;
+ }
+
+ // Get MatchesWhen
+ string strMatchesWhen;
+ xmlElement.getAttribute("MatchesWhen", strMatchesWhen);
+ string strError;
+
+ if (!setMatchesWhen(strMatchesWhen, strError)) {
+
+ xmlDomainImportContext.setError("Wrong MatchesWhen attribute " + strMatchesWhen + " in " +
+ getKind() + " " + xmlElement.getPath() + ": " + strError);
+
+ return false;
+ }
+
+ // Get Value
+ string strValue;
+ xmlElement.getAttribute("Value", strValue);
+
+ if (!_pSelectionCriterion->getCriterionType()->getNumericalValue(strValue, _iMatchValue)) {
+
+ xmlDomainImportContext.setError("Wrong Value attribute value " + strValue + " in " +
+ getKind() + " " + xmlElement.getPath());
+
+ return false;
+ }
+
+ // Done
+ return true;
+}
+
+// From IXmlSource
+void CSelectionCriterionRule::toXml(CXmlElement &xmlElement, CXmlSerializingContext & /*ctx*/) const
+{
+ assert(_pSelectionCriterion);
+
+ // Set selection criterion
+ xmlElement.setAttribute("SelectionCriterion", _pSelectionCriterion->getName());
+
+ // Set MatchesWhen
+ xmlElement.setAttribute("MatchesWhen", _astMatchesWhen[_eMatchesWhen].pcMatchesWhen);
+
+ // Set Value
+ string strValue;
+
+ _pSelectionCriterion->getCriterionType()->getLiteralValue(_iMatchValue, strValue);
+
+ xmlElement.setAttribute("Value", strValue);
+}
+
+// XML MatchesWhen attribute parsing
+bool CSelectionCriterionRule::setMatchesWhen(const string &strMatchesWhen, string &strError)
+{
+ for (size_t matchesWhen = 0; matchesWhen < ENbMatchesWhen; matchesWhen++) {
+
+ const SMatchingRuleDescription *pstMatchingRuleDescription = &_astMatchesWhen[matchesWhen];
+
+ if (strMatchesWhen == pstMatchingRuleDescription->pcMatchesWhen) {
+
+ // Found it!
+
+ // Get Type
+ const ISelectionCriterionTypeInterface *pSelectionCriterionType =
+ _pSelectionCriterion->getCriterionType();
+
+ // Check compatibility if relevant
+ if (!pSelectionCriterionType->isTypeInclusive() &&
+ !pstMatchingRuleDescription->bExclusiveTypeCompatible) {
+
+ strError = "Value incompatible with exclusive kind of type";
+
+ return false;
+ }
+
+ // Store
+ _eMatchesWhen = (MatchesWhen)matchesWhen;
+
+ return true;
+ }
+ }
+
+ strError = "Value not found";
+
+ return false;
+}