Ensures normalization on waitfe/fc-xml operations
[anna.git] / source / diameter / codec / Avp.cpp
index a956aae..2338111 100644 (file)
@@ -1374,20 +1374,28 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException)
 
   // Check attributes exclusiveness
   if(name) {  // compact mode
-    bool allowFlagsField = ( stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::shouldnot
+
+    if(code || vendorCode) {
+      std::string msg = "Error processing avp <name '"; msg += name->getValue();
+      msg += "'>: avp attributes <'code' + 'vendorCode'> are not allowed if <'name'> is provided";
+      throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
+    }
+
+    // flags uncertainty:
+    bool flagsUncertainty = ( stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::shouldnot
                              || stackAvp->getMbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getMbit() == anna::diameter::stack::Avp::FlagRule::shouldnot
                              /* umm, perhaps we could omit for bit P, whic is deprecated ... */
                              /* || stackAvp->getPbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getPbit() == anna::diameter::stack::Avp::FlagRule::shouldnot*/ );
-    if(code || (flags && !allowFlagsField) || vendorCode) {
-      std::string msg = "Error processing avp <name '"; msg += name->getValue();
-      if (flags) msg += "'>: avp attributes <'code' + 'flags' + 'vendorCode'> are not allowed if <'name'> is provided (also flags is not permitted: no may, no shouldnot)";
-      else msg += "'>: avp attributes <'code' + 'vendorCode'> are not allowed if <'name'> is provided";
-      throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
+    if(flags && !flagsUncertainty) {
+      std::string msg = "Be careful processing avp <name '"; msg += name->getValue();
+      msg += "'> together with avp 'flags' attribute, because may/shouldnot uncertainty was not specified";
+      LOGINFORMATION(Logger::information(msg, ANNA_FILE_LOCATION));
     }
 
     setId(stackAvp->getId());
 
-    if (flags && allowFlagsField) {
+    //if (flags && flagsUncertainty) {
+    if (flags) {
       // Flags check
       int i_aux = flags->getIntegerValue();
 
@@ -1417,9 +1425,11 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException)
     int i_aux = code->getIntegerValue();
 
     if(i_aux < 0) {
-      std::string msg = "Error processing avp <code '"; msg += code->getValue();
-      msg += "': negative values are not allowed";
-      throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
+      LOGWARNING(
+        std::string msg = "Error processing avp <code '"; msg += code->getValue();
+        msg += "': negative value read from xml";
+        anna::Logger::warning(msg, ANNA_FILE_LOCATION);
+      );
     }
 
     U24 u_code = i_aux;
@@ -1638,9 +1648,16 @@ anna::xml::Node* Avp::asXML(anna::xml::Node* parent) const throw() {
 //------------------------------------------------------------------------------
 //----------------------------------------------------------- Avp::asXMLString()
 //------------------------------------------------------------------------------
-std::string Avp::asXMLString() const throw() {
+std::string Avp::asXMLString(bool normalize) const throw() {
   anna::xml::Node root("root");
-  return anna::xml::Compiler().apply(asXML(&root));
+
+  anna::xml::Compiler::Mode::_v mode = normalize ? anna::xml::Compiler::Mode::Sort : anna::xml::Compiler::Mode::Visual;
+  std::string result = anna::xml::Compiler().apply(asXML(&root), mode);
+
+  if (normalize)
+    result.erase(std::remove(result.begin(), result.end(), '\n'), result.end());
+
+  return result;
 }
 
 
@@ -1649,5 +1666,6 @@ std::string Avp::asXMLString() const throw() {
 //------------------------------------------------------------------------------
 bool Avp::isLike(const std::string &pattern) const throw() {
   anna::RegularExpression re(pattern);
-  return re.isLike(asXMLString());
+  return re.isLike(asXMLString(true /* normalize by mean sorting attribute names and removing new lines */));
 }
+