So you are trying to not compute the things that go into the slots of the
ExpressionTypeCalculator at the time the object is constructed, but later when
they are demanded.
Since this is part of the schema compiler, one way to snag the exceptions is to
make sure that an OOLAG LV is used to do the calculation.
E.g.,
lazy val myThang = LV('mythang) {
.... // sometimes causes SDE
}.value
lazy val expComp = new ExpressionTypeCalculator(myThang)
Now since this is passed by name, it's not evaluated until it is needed later.
The latest this could be needed would be preSerialization. At that point if
myThang is evaluated and an SDE occurs, it will get captured the way all
SDE/diagnsotics are by the OOLAG LV stuff. Blame will be placed on the schema
component where myThang is defined.
That *should* work.
________________________________
From: Sloane, Brandon <[email protected]>
Sent: Wednesday, June 26, 2019 4:32:01 PM
To: [email protected]
Subject: SDE during pre-serialization
I am working on moving much of the typeCalc logic to compile time (notably for
this email, I am moving much of the error detection to compile time).
To avoid circular depdencies, I am trying to use the same pass-by-name trick we
use for the runtime data structures:
class ExpressionTypeCalculator[A <: AnyRef, B <: AnyRef](
@TransientParam maybeInputTypeCalcArg: => Maybe[ CompiledExpression[B]],
...
) extends TypeCalculator
//TypeCalculator extends PreSerialization
lazy val maybeInputTypeCalc = maybeInputTypeCalcArg
override protected def preSerialization: Any = {
super.preSerialization
maybeInputTypeCalc
maybeOutputTypeCalc
}
This works in the Common case. In some error cases, it is now possible that the
DPath expression compiler will detect an error and emit an SDE.
When this happens, I would expect to see an SDE; however the SDE appears to be
getting eaten by the serialization code. I assume that I am missing a step in
how I am saving/computing these values.
java.io.IOException: unexpected exception type
at java.io.ObjectStreamClass.throwMiscException(ObjectStreamClass.java:1736)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1146)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at
scala.collection.immutable.HashMap$SerializationProxy.$anonfun$writeObject$2(HashMap.scala:609)
at
scala.collection.immutable.HashMap$SerializationProxy.$anonfun$writeObject$2$adapted(HashMap.scala:607)
at
scala.collection.TraversableLike$WithFilter.$anonfun$foreach$1(TraversableLike.scala:789)
at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:231)
at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:462)
at
scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:788)
at
scala.collection.immutable.HashMap$SerializationProxy.writeObject(HashMap.scala:607)
at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
at org.apache.daffodil.util.PreSerialization.serializeObject(Serialize.scala:46)
at
org.apache.daffodil.util.PreSerialization.serializeObject$(Serialize.scala:42)
at
org.apache.daffodil.dsom.DPathCompileInfo.serializeObject(CompiledExpression1.scala:204)
at
org.apache.daffodil.dsom.DPathCompileInfo.writeObject(CompiledExpression1.scala:234)
at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
at org.apache.daffodil.util.PreSerialization.serializeObject(Serialize.scala:46)
at
org.apache.daffodil.util.PreSerialization.serializeObject$(Serialize.scala:42)
at
org.apache.daffodil.processors.TermRuntimeData.serializeObject(RuntimeData.scala:99)
at
org.apache.daffodil.processors.TermRuntimeData.writeObject(RuntimeData.scala:175)
at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.apache.daffodil.processors.DataProcessor.save(DataProcessor.scala:171)
at
org.apache.daffodil.tdml.processor.TDMLDFDLProcessorFactory.generateProcessor(DaffodilTDMLDFDLProcessor.scala:82)
at
org.apache.daffodil.tdml.processor.TDMLDFDLProcessorFactory.compileProcessor(DaffodilTDMLDFDLProcessor.scala:99)
at
org.apache.daffodil.tdml.processor.TDMLDFDLProcessorFactory.$anonfun$getProcessor$1(DaffodilTDMLDFDLProcessor.scala:112)
at
org.apache.daffodil.tdml.SchemaCache.doCompile$lzycompute$1(SchemaCache.scala:95)
at org.apache.daffodil.tdml.SchemaCache.doCompile$1(SchemaCache.scala:95)
at
org.apache.daffodil.tdml.SchemaCache.$anonfun$compileAndCache$1(SchemaCache.scala:108)
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:82)
at
org.apache.daffodil.tdml.SchemaCache$Cache.getOrElseUpdate(SchemaCache.scala:51)
at org.apache.daffodil.tdml.SchemaCache.compileAndCache(SchemaCache.scala:107)
at
org.apache.daffodil.tdml.processor.TDMLDFDLProcessorFactory.getProcessor(DaffodilTDMLDFDLProcessor.scala:112)
at org.apache.daffodil.tdml.TestCase.run(TDMLRunner.scala:772)
at org.apache.daffodil.tdml.DFDLTestSuite.runOneTest(TDMLRunner.scala:394)
at org.apache.daffodil.tdml.Runner.runOneTest(RunnerFactory.scala:133)
at
org.apache.daffodil.extensions.TestInputTypeValueCalc.test_outputTypeCalcInt_01(TestInputTypeValueCalc.scala:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: Schema Definition Error: dfdlx:repTypeValue can only be defined on a
simple type
Schema context: ex:AbstractIntToMulitiply2 Location line 53 column 4 in
file:/tmp/inputTypeCalc-Embedded.dfdl.xsd7371030902782065874.dfdl.xsd
Brandon T. Sloane
Associate, Services
[email protected] | tresys.com