You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@daffodil.apache.org by GitBox <gi...@apache.org> on 2019/01/11 14:30:26 UTC

[GitHub] jadams-tresys closed pull request #162: Properly handle malformed binding files

jadams-tresys closed pull request #162: Properly handle malformed binding files
URL: https://github.com/apache/incubator-daffodil/pull/162
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/daffodil-cli/src/main/scala/org/apache/daffodil/Main.scala b/daffodil-cli/src/main/scala/org/apache/daffodil/Main.scala
index 66a17a120..3ee25375d 100644
--- a/daffodil-cli/src/main/scala/org/apache/daffodil/Main.scala
+++ b/daffodil-cli/src/main/scala/org/apache/daffodil/Main.scala
@@ -49,7 +49,7 @@ import java.io.File
 import org.apache.daffodil.tdml.DFDLTestSuite
 import org.apache.daffodil.api.ValidationMode
 import scala.xml.Node
-import org.apache.daffodil.externalvars.Binding
+import org.apache.daffodil.externalvars.{ Binding, BindingException }
 import org.apache.daffodil.externalvars.ExternalVariablesLoader
 import org.apache.daffodil.configuration.ConfigurationLoader
 import org.apache.daffodil.api.ValidationMode
@@ -627,7 +627,9 @@ object Main extends Logging {
         val extVarBindingNodeOpt = (configNode \ "externalVariableBindings").headOption
         extVarBindingNodeOpt match {
           case None => Seq.empty
-          case Some(extVarBindingsNode) => ExternalVariablesLoader.getVariables(extVarBindingsNode, tunables)
+          case Some(extVarBindingsNode) => {
+            ExternalVariablesLoader.getVariables(extVarBindingsNode, tunables)
+          }
         }
       }
     }
@@ -1340,6 +1342,20 @@ object Main extends Logging {
     1
   }
 
+  def oomError(e: OutOfMemoryError): Int = {
+    System.err.println("""|
+                          |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+                          |!!             Daffodil ran out of memory!              !!
+                          |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+                          |
+                          | Try increasing the amount of memory by changing or
+                          | setting the DAFFODIL_JAVA_OPTS environment variable.
+                          | "DAFFODIL_JAVA_OPTS=-Xmx5G" for 5GB.
+                          |
+                          |""".format(e.getMessage()).stripMargin)
+    1
+  }
+
   def main(arguments: Array[String]): Unit = {
     val ret = try {
       run(arguments)
@@ -1353,6 +1369,10 @@ object Main extends Logging {
         log(LogLevel.Error, "%s", e.getMessage())
         1
       }
+      case e: BindingException => {
+        log(LogLevel.Error, "%s", e.getMessage())
+        1
+      }
       case e: NotYetImplementedException => {
         nyiFound(e)
       }
@@ -1361,18 +1381,7 @@ object Main extends Logging {
         1
       }
       case e: OutOfMemoryError => {
-        System.err.println("""|
-                            |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                            |!!             Daffodil ran out of memory!              !!
-                            |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                            |
-                            | Try increasing the amount of memory by changing or
-                            | setting the DAFFODIL_JAVA_OPTS environment variable.
-                            | "DAFFODIL_JAVA_OPTS=-Xmx5G" for 5GB.
-                            |
-                            |""".stripMargin)
-        e.printStackTrace
-        1
+        oomError(e)
       }
       case e: Exception => {
         bugFound(e)
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala
index 017ae6808..4a1135543 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala
@@ -18,7 +18,7 @@
 package org.apache.daffodil.dsom
 
 import scala.xml.Node
-import org.apache.daffodil.externalvars.Binding
+import org.apache.daffodil.externalvars.{ Binding, BindingException }
 import org.apache.daffodil.compiler.RootSpec
 import org.apache.daffodil.exceptions.Assert
 import org.apache.daffodil.xml._
@@ -472,7 +472,11 @@ final class SchemaSet(
       }
 
       val newNS = matchingDVs.head.namespace
-      val newBinding = Binding(v.varQName.local, Some(newNS), v.varValue)
+      val newBinding = try {
+        Binding(v.varQName.local, Some(newNS), v.varValue)
+      } catch {
+        case e: BindingException => this.SDE("Exception when processing external variable %s: %s", v.varQName, e.getMessage)
+      }
       finalExternalVariables.enqueue(newBinding)
     })
     finalExternalVariables
diff --git a/daffodil-lib/src/main/scala/org/apache/daffodil/externalvars/Binding.scala b/daffodil-lib/src/main/scala/org/apache/daffodil/externalvars/Binding.scala
index 20e11e3c8..41b823302 100644
--- a/daffodil-lib/src/main/scala/org/apache/daffodil/externalvars/Binding.scala
+++ b/daffodil-lib/src/main/scala/org/apache/daffodil/externalvars/Binding.scala
@@ -45,6 +45,9 @@ class Binding(val varQName: RefQName, val varValue: String, scope: scala.xml.Nam
       GlobalQName(varQName.prefix, varQName.local, varQName.namespace)
 }
 
+case class BindingException(message: String)
+  extends Exception("Exception when processing external variable binding: %s".format(message))
+
 /**
  * This object is for cases when external variable bindings
  * are passed in via the Command Line Interface.
@@ -54,24 +57,36 @@ object Binding {
   /**
    * extSyntax is {uri}ncName, or {}ncName, or ncName
    */
-  def apply(extSyntax: String, value: String): Binding = {
+  def apply(extSyntax: String, value: String): Binding = try {
     val tryRefQName = QName.refQNameFromExtendedSyntax(extSyntax)
     new Binding(tryRefQName.get, value, null)
+  } catch {
+    case e: Throwable => throw BindingException(e.getMessage)
   }
 
   def apply(node: Node, tunable: DaffodilTunables): Binding = {
     val name = (node \ "@name").head.text
-    val refQName = QName.resolveRef(name, node.scope, tunable)
+    val refQName = try {
+      QName.resolveRef(name, node.scope, tunable)
+    } catch {
+      case e: Throwable => throw BindingException(e.getMessage)
+    }
     val value = node.text
     new Binding(refQName.get, value, node.scope)
   }
 
-  def apply(name: String, namespace: Option[NS], value: String): Binding = {
+  def apply(name: String, namespace: Option[NS], value: String): Binding = try {
     new Binding(RefQName(None, name, namespace.getOrElse(UnspecifiedNamespace)), value)
+  } catch {
+    case e: Throwable => throw BindingException(e.getMessage)
   }
 
   def getBindings(extVarBindings: Node, tunableArg: DaffodilTunables) = {
     val bindings = extVarBindings \ "bind"
-    bindings.map(b => Binding(b, tunableArg))
+    try {
+      bindings.map(b => Binding(b, tunableArg))
+    } catch {
+      case e: Throwable => throw BindingException(e.getMessage)
+    }
   }
 }
diff --git a/daffodil-runtime1/src/main/scala/org/apache/daffodil/externalvars/ExternalVariablesLoader.scala b/daffodil-runtime1/src/main/scala/org/apache/daffodil/externalvars/ExternalVariablesLoader.scala
index ce5695bd9..c138d48b7 100644
--- a/daffodil-runtime1/src/main/scala/org/apache/daffodil/externalvars/ExternalVariablesLoader.scala
+++ b/daffodil-runtime1/src/main/scala/org/apache/daffodil/externalvars/ExternalVariablesLoader.scala
@@ -83,7 +83,12 @@ object ExternalVariablesLoader {
   // return the mutated map.
 
   def loadVariables(vars: Map[String, String], referringContext: ThrowsSDE, vmap: VariableMap): VariableMap = {
-    val bindings = getVariables(vars)
+    val bindings = try {
+      getVariables(vars)
+    } catch {
+      case e: Throwable => referringContext.SDE("Exception when processing external variable binding file: %s", e.getMessage)
+    }
+
     val finalVMap = this.loadVariables(bindings, referringContext, vmap)
     finalVMap
   }
@@ -115,7 +120,12 @@ object ExternalVariablesLoader {
   def loadVariables(node: Node, referringContext: ThrowsSDE, vmap: VariableMap, tunableArg: DaffodilTunables): VariableMap = {
     Assert.usage(node != null, "loadVariables expects 'node' to not be null!")
     Assert.usage(referringContext != null, "loadVariables expects 'referringContext' to not be null!")
-    val bindings = Binding.getBindings(node, tunableArg)
+    val bindings = try {
+      Binding.getBindings(node, tunableArg)
+    } catch {
+      case e: Throwable => referringContext.SDE("Exception when processing external variable binding file: %s", e.getMessage)
+    }
+
     loadVariables(bindings, referringContext, vmap)
   }
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services