stevedlawrence commented on a change in pull request #140: TDML Runner and test 
changes for Cross Validation with IBM.
URL: https://github.com/apache/incubator-daffodil/pull/140#discussion_r236324461
 
 

 ##########
 File path: 
daffodil-tdml/src/main/scala/org/apache/daffodil/tdml/TDMLRunner.scala
 ##########
 @@ -437,69 +432,81 @@ abstract class TestCase(testCaseXML: NodeSeq, val 
parent: DFDLTestSuite)
   lazy val defaultRoundTrip: RoundTrip = parent.defaultRoundTrip
   lazy val defaultValidation: String = parent.defaultValidation
 
-  /**
-   * This doesn't fetch a serialized processor, it runs whatever the processor 
is
-   * through a serialize then unserialize path to get a processor as if
-   * it were being fetched from a file.
-   */
-  private def generateProcessor(pf: DFDL.ProcessorFactory, 
useSerializedProcessor: Boolean): DFDLTestSuite.CompileResult = {
-    val p = pf.onPath("/")
-    val diags = p.getDiagnostics
-    if (p.isError) Left(diags)
-    else {
-      val dp =
-        if (useSerializedProcessor) {
-          val os = new java.io.ByteArrayOutputStream()
-          val output = Channels.newChannel(os)
-          p.save(output)
-
-          val is = new java.io.ByteArrayInputStream(os.toByteArray)
-          val input = Channels.newChannel(is)
-          val compiler_ = Compiler()
-          compiler_.reload(input)
-        } else p
+  private lazy val defaultImplementations: Seq[String] = 
parent.defaultImplementations
+  private lazy val tcImplementations = (testCaseXML \ "@implementations").text
+  private lazy val implementationStrings =
+    if (tcImplementations == "") defaultImplementations
+    else tcImplementations.split("""\s+""").toSeq
 
-      Right((diags, dp))
+  protected def toss(t: Throwable, implString: Option[String]) = {
+    t match {
+      case e: TDMLException => throw e
+      case e: UnsuppressableException => throw e
+      case s: scala.util.control.ControlThrowable => throw s
+      case _ => throw TDMLException(t, implString)
     }
   }
 
-  private def compileProcessor(schemaSource: DaffodilSchemaSource, 
useSerializedProcessor: Boolean): DFDLTestSuite.CompileResult = {
-    val pf = compiler.compileSource(schemaSource)
-    val diags = pf.getDiagnostics
-    if (pf.isError) {
-      Left(diags) // throw new TDMLException(diags)
-    } else {
-      val res = this.generateProcessor(pf, useSerializedProcessor)
-      res
-    }
-  }
+  lazy val tdmlDFDLProcessorFactory: AbstractTDMLDFDLProcessorFactory = {
+    import scala.language.reflectiveCalls
+    import scala.language.existentials
 
-  final protected def getProcessor(schemaSource: DaffodilSchemaSource, 
useSerializedProcessor: Boolean): DFDLTestSuite.CompileResult = {
-    val res: DFDLTestSuite.CompileResult = schemaSource match {
-      case uss: URISchemaSource =>
-        SchemaDataProcessorCache.compileAndCache(uss, useSerializedProcessor,
-          parent.checkAllTopLevel,
-          root,
-          null) {
-            compileProcessor(uss, useSerializedProcessor)
-          }
-      case _ => {
-        compileProcessor(schemaSource, useSerializedProcessor)
-      }
-    }
+    val className = 
"org.apache.daffodil.tdml.processor.TDMLDFDLProcessorFactory"
+
+    //
+    // If you haven't seen it before. Check out this Try(...) idiom.
+    // Much cleaner than the messy nest of individual try/catches for each 
case.
+    //
+    // We're not catching anything here, but we could have surrounded the 
tryInstance.get call with a
+    // single tier of catch, with cases for all the various throws that could 
have happened anywhere on
+    // the three lines of actions that can throw various things.
+    //
+    // of course this will allocate an object, so not for tightest inner 
loops, but the code
+    // cleanup is substantial.
+    //
+    val clazz = Try(Class.forName(className))
+    val constructor = clazz.map { _.getDeclaredConstructor() }
+    val tryInstance = constructor.map { 
_.newInstance().asInstanceOf[AbstractTDMLDFDLProcessorFactory] }
+    val res = tryInstance.get
 
 Review comment:
   If no TDMLDFDLProcessorFactory is on the classpath this ``.get`` will fail 
with a ClassNotFoundException. Might be more helpful to instead throw a 
TDMLException with a helpful error message?

----------------------------------------------------------------
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:
[email protected]


With regards,
Apache Git Services

Reply via email to