Salome HOME
Error management -- Default attribute validator
[modules/shaper.git] / src / Config / Config_Common.cpp
index 84e6328a26eacf9259c3cd9dc0f6031ff5a86ca6..bb5ddeed9b001da3700fd3298a3e8eb7e1e79d4f 100644 (file)
-/*
- * Config_Common.cpp
- *
- *  Created on: Apr 17, 2014
- *      Author: sbh
- */
-
-#include "Config_Common.h"
-#include <Config_Keywords.h>
-
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-#include <sstream> //for stringstream
-
-bool isElementNode(xmlNodePtr theNode)
-{
-  return theNode->type == XML_ELEMENT_NODE;
-}
-
-bool isNode(xmlNodePtr theNode, const char* theNodeName, ...)
-{
-  bool result = false;
-  const xmlChar* aName = theNode->name;
-  if (!aName || !isElementNode(theNode)) {
-    return false;
-  }
-  if (!xmlStrcmp(aName, (const xmlChar *) theNodeName)) {
-    return true;
-  }
-  va_list args; // define argument list variable
-  va_start(args, theNodeName); // init list; point to last defined argument
-  while(true) {
-    char *anArg = va_arg (args, char*); // get next argument
-    if (anArg == NULL)
-      break;
-    if (!xmlStrcmp(aName, (const xmlChar *) anArg)) {
-      va_end(args); // cleanup the system stack
-      return true;
-    }
-  }
-  va_end(args); // cleanup the system stack
-  return false;
-}
-
-bool hasChild(xmlNodePtr theNode)
-{
-  xmlNodePtr aNode = theNode->children;
-  for( ; aNode; aNode = aNode->next) {
-    if (isElementNode(theNode)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool getValidatorInfo(xmlNodePtr theNode,
-                      std::string& outValidatorId,
-                      std::list<std::string>& outValidatorParameters)
-{
-  //Validator id:
-  char* anIdProp = (char*) xmlGetProp(theNode, BAD_CAST _ID);
-  if (!anIdProp || anIdProp[0] == 0) {
-    return false;
-  }
-  outValidatorId = std::string(anIdProp);
-
-  //Validator parameters:
-  char* aParamProp = (char*) xmlGetProp(theNode, BAD_CAST VALIDATOR_PARAMETERS);
-  if (aParamProp && aParamProp[0] != 0) {
-    std::string aPropString = std::string(aParamProp);
-    std::stringstream aPropStringStream(aPropString);
-    char COMMA_DELIM = ',';
-    std::string aValidatorParameter;
-    while (std::getline(aPropStringStream, aValidatorParameter, ',')) {
-      outValidatorParameters.push_back(aValidatorParameter);
-    }
-  }
-  return true;
-}
-
-std::string library(const std::string& theLibName)
-{
-  std::string aLibName = theLibName;
-#ifndef WIN32
-  static std::string aLibExt( ".so" );
-  if (aLibName.size() < 3 || aLibName.substr(0, 3) !="lib") {
-    aLibName = "lib" + aLibName;
-  }
-#else
-  static std::string aLibExt(".dll");
-#endif
-  std::string anExt = aLibName.substr(aLibName.size() - 4);
-  if (anExt != aLibExt)
-    aLibName += aLibExt;
-
-  return aLibName;
-}
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D\r
+\r
+/*\r
+ * Config_Common.cpp\r
+ *\r
+ *  Created on: Apr 17, 2014\r
+ *      Author: sbh\r
+ */\r
+\r
+#include "Config_Common.h"\r
+#include <Config_Keywords.h>\r
+\r
+#include <libxml/parser.h>\r
+#include <libxml/tree.h>\r
+\r
+#include <sstream> // for stringstream\r
+\r
+#include <string>\r
+#include <algorithm> // for std::transform\r
+#include <vector>\r
+\r
+bool isElementNode(xmlNodePtr theNode)\r
+{\r
+  if (!theNode)\r
+    return false;\r
+  return theNode->type == XML_ELEMENT_NODE;\r
+}\r
+\r
+bool isNode(xmlNodePtr theNode, const char* theNodeName, ...)\r
+{\r
+  const xmlChar* aName = theNode->name;\r
+  if (!aName || !isElementNode(theNode)) {\r
+    return false;\r
+  }\r
+  if (!xmlStrcmp(aName, (const xmlChar *) theNodeName)) {\r
+    return true;\r
+  }\r
+  va_list args;  // define argument list variable\r
+  va_start(args, theNodeName);  // init list; point to last defined argument\r
+  while (true) {\r
+    char *anArg = va_arg (args, char*);  // get next argument\r
+    if (anArg == NULL)\r
+      break;\r
+    if (!xmlStrcmp(aName, (const xmlChar *) anArg)) {\r
+      va_end(args);  // cleanup the system stack\r
+      return true;\r
+    }\r
+  }\r
+  va_end(args);  // cleanup the system stack\r
+  return false;\r
+}\r
+\r
+bool isAttributeNode(xmlNodePtr theNode)\r
+{\r
+  if(!isElementNode(theNode))\r
+    return false;\r
+  // it's parent is "feature" or "source" or page ("case" or "box")\r
+  if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, \r
+                         WDG_GROUP, WDG_CHECK_GROUP,\r
+                         WDG_TOOLBOX_BOX, WDG_SWITCH_CASE, NULL))\r
+    return false;\r
+\r
+  //it should not be a "source" or a "validator" node\r
+  bool isLogical = isNode(theNode, NODE_SOURCE, NODE_VALIDATOR, NODE_SELFILTER, NULL);\r
+  bool isPagedContainer = isNode(theNode, WDG_TOOLBOX, WDG_TOOLBOX_BOX,\r
+                                          WDG_GROUP, WDG_CHECK_GROUP,\r
+                                          WDG_SWITCH, WDG_SWITCH_CASE,  NULL);\r
+  return !isLogical && !isPagedContainer;\r
+}\r
+\r
+bool isWidgetNode(xmlNodePtr theNode)\r
+{\r
+  if(!isElementNode(theNode))\r
+    return false;\r
+  // it's parent is "feature" or "source" or a page ("box", "case")\r
+  if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, WDG_GROUP,\r
+                         WDG_TOOLBOX_BOX, WDG_SWITCH_CASE, NULL))\r
+    return false;\r
+\r
+  //it should not be a "source" or a "validator" node\r
+  return !isNode(theNode, NODE_SOURCE, NODE_VALIDATOR, NODE_SELFILTER, NULL);\r
+}\r
+\r
+// widget api?\r
+bool isCaseNode(xmlNodePtr theNode)\r
+{\r
+  if(!isElementNode(theNode))\r
+    return false;\r
+\r
+  return isNode(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, NULL);\r
+}\r
+\r
+bool hasChild(xmlNodePtr theNode)\r
+{\r
+  xmlNodePtr aNode = theNode->children;\r
+  for (; aNode; aNode = aNode->next) {\r
+    if (isElementNode(theNode)) {\r
+      return true;\r
+    }\r
+  }\r
+  return false;\r
+}\r
+\r
+bool hasParent(xmlNodePtr theNode)\r
+{\r
+  xmlNodePtr aNode = theNode->parent;\r
+  if (!aNode) {\r
+    return false;\r
+  }\r
+  for (; aNode; aNode = aNode->next) {\r
+    if (isElementNode(theNode)) {\r
+      return true;\r
+    }\r
+  }\r
+  return false;\r
+}\r
+\r
+bool hasParent(xmlNodePtr theNode, const char* theNodeName, ...)\r
+{\r
+  if (!hasParent(theNode)) {\r
+    return false; // have no parents at all\r
+  }\r
+  xmlNodePtr aNode = theNode->parent;\r
+  const xmlChar* aName = aNode->name;\r
+  if (!aName || !isElementNode(aNode)) {\r
+    return false;\r
+  }\r
+  if (!xmlStrcmp(aName, (const xmlChar *) theNodeName)) {\r
+    return true;\r
+  }\r
+  va_list args;  // define argument list variable\r
+  va_start(args, theNodeName);  // init list; point to last defined argument\r
+  while (true) {\r
+    char *anArg = va_arg (args, char*);  // get next argument\r
+    if (anArg == NULL)\r
+      break;\r
+    if (!xmlStrcmp(aName, (const xmlChar *) anArg)) {\r
+      va_end(args);  // cleanup the system stack\r
+      return true;\r
+    }\r
+  }\r
+  va_end(args);  // cleanup the system stack\r
+  return false;\r
+}\r
+\r
+bool hasParentRecursive(xmlNodePtr theNode, const std::vector<const char*>& theNodeNames)\r
+{\r
+  if (!hasParent(theNode)) {\r
+    return false; // have no parents at all\r
+  }\r
+  xmlNodePtr aNode = theNode->parent;\r
+  const xmlChar* aName = aNode->name;\r
+  if (!aName || !isElementNode(aNode)) {\r
+    return false;\r
+  }\r
+  for (size_t anIndex = 0; anIndex < theNodeNames.size(); ++anIndex) {\r
+    if (!xmlStrcmp(aName, (const xmlChar *) theNodeNames[anIndex]))\r
+      return true;\r
+  }\r
+  return hasParentRecursive(aNode, theNodeNames);\r
+}\r
+\r
+bool hasParentRecursive(xmlNodePtr theNode, const char* theNodeName, ...)\r
+{\r
+  std::vector<const char*> aNodeNames;\r
+  va_list args;  // define argument list variable\r
+  va_start(args, theNodeName);  // init list; point to last defined argument\r
+  aNodeNames.push_back(theNodeName);\r
+  while (true) {\r
+    char *anArg = va_arg (args, char*);  // get next argument\r
+    if (anArg == NULL)\r
+      break;\r
+    aNodeNames.push_back(anArg);\r
+  }\r
+  va_end(args);  // cleanup the system stack\r
+  return hasParentRecursive(theNode, aNodeNames);\r
+}\r
+\r
+bool getParametersInfo(xmlNodePtr theNode, std::string& outPropertyId,\r
+                      std::list<std::string>& outValidatorParameters)\r
+{\r
+  //Property id:\r
+  char* anIdProp = (char*) xmlGetProp(theNode, BAD_CAST _ID);\r
+  if (!anIdProp || anIdProp[0] == 0) {\r
+    return false;\r
+  }\r
+  outPropertyId = std::string(anIdProp);\r
+\r
+  //Property parameters:\r
+  char* aParamProp = (char*) xmlGetProp(theNode, BAD_CAST _PARAMETERS);\r
+  if (aParamProp && aParamProp[0] != 0) {\r
+    std::string aPropString = std::string(aParamProp);\r
+    std::stringstream aPropStringStream(aPropString);\r
+    char COMMA_DELIM = ',';\r
+    std::string aParameter;\r
+    while (std::getline(aPropStringStream, aParameter, ',')) {\r
+      outValidatorParameters.push_back(aParameter);\r
+    }\r
+  }\r
+  return true;\r
+}\r
+\r
+std::string library(const std::string& theLibName)\r
+{\r
+  if(theLibName.empty())\r
+    return std::string();\r
+  std::string aLibName = theLibName;\r
+#ifndef WIN32\r
+  static std::string aLibExt( ".so" );\r
+  if (aLibName.size() < 3 || aLibName.substr(0, 3) !="lib") {\r
+    aLibName = "lib" + aLibName;\r
+  }\r
+#else\r
+  static std::string aLibExt(".dll");\r
+#endif\r
+  std::string anExt = aLibName.substr(aLibName.size() - 4);\r
+  if (anExt != aLibExt)\r
+    aLibName += aLibExt;\r
+\r
+  return aLibName;\r
+}\r
+\r
+std::string getProperty(xmlNodePtr theNode, const char* thePropName)\r
+{\r
+  std::string result = "";\r
+  char* aPropChars = (char*) xmlGetProp(theNode, BAD_CAST thePropName);\r
+  if (!aPropChars || aPropChars[0] == 0)\r
+    return result;\r
+  result = std::string(aPropChars);\r
+  return result;\r
+}\r
+\r
+std::string getNormalizedProperty(xmlNodePtr theNode, const char* thePropName)\r
+{\r
+  return normalize(getProperty(theNode, thePropName));\r
+}\r
+\r
+bool getBooleanAttribute(xmlNodePtr theNode, const char* theAttributeName, bool theDefault)\r
+{\r
+  std::string prop = normalize(getProperty(theNode, theAttributeName));\r
+  bool result = theDefault;\r
+  if (prop == "true" || prop == "1") {\r
+    result = true;\r
+  } else if (prop == "false" || prop == "0") {\r
+    result = false;\r
+  }\r
+  return result;\r
+}\r
+\r
+CONFIG_EXPORT std::string normalize(const char* theString)\r
+{\r
+  if (!theString)\r
+    return std::string();\r
+  return normalize(std::string(theString));\r
+}\r
+\r
+CONFIG_EXPORT std::string normalize(const std::string& theString)\r
+{\r
+  std::string result = theString;\r
+  std::transform(result.begin(), result.end(), result.begin(), ::tolower);\r
+  return result;\r
+}\r