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