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_r234692873
##########
File path:
daffodil-tdml/src/main/scala/org/apache/daffodil/tdml/TDMLRunner.scala
##########
@@ -437,69 +432,70 @@ 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: 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: TDMLDFDLProcessorFactory = {
+ 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.DaffodilTDMLDFDLProcessorFactory"
Review comment:
How do we change which implementation to use? It looks like this is
hardcoded to always use the Daffodil TDML processor factory. Should this come
from an environment variable, or maybe we could use Java's [ServiceLoader
API](https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html)?
The Services API actually looks kindof nice, looks like we just need to add a
META-INF folder in the src/main/resources that has the right file name, and
TDMLDFDLProcessorFactory becomes a service?
----------------------------------------------------------------
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