This is an automated email from the ASF dual-hosted git repository.

olabusayo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil.git


The following commit(s) were added to refs/heads/main by this push:
     new 83edcb362 Use Seqs internally for BlobPaths/Diagnostics
83edcb362 is described below

commit 83edcb362350668839a3322b1572948129c8a046
Author: olabusayoT <[email protected]>
AuthorDate: Tue Jul 29 11:45:01 2025 -0400

    Use Seqs internally for BlobPaths/Diagnostics
    
    - the Java API uses Java Lists, but we need immutability and O(1) prepends 
in the scala code, so we update to use seqs internally and leverage 
.asJava/.asScala wrappers as necessary. For getBlobPaths/getDiagnostics, we 
keep those as lists internally as well since they override the java functions.
    
    DAFFODIL-3014
---
 .../codegen/c/DaffodilCCodeGenerator.scala         | 13 ++++------
 .../apache/daffodil/core/compiler/Compiler.scala   |  4 +--
 .../org/apache/daffodil/core/util/TestUtils.scala  |  2 +-
 .../org/apache/daffodil/lib/oolag/OOLAG.scala      |  4 +--
 .../runtime1/debugger/InteractiveDebugger.scala    |  2 +-
 .../runtime1/iapi/DFDLParserUnparser.scala         |  9 +++----
 .../runtime1/processors/DataProcessor.scala        | 15 +++++------
 .../runtime1/processors/ProcessorStateBases.scala  | 29 +++++++--------------
 .../processors/parsers/ElementCombinator1.scala    |  9 +++----
 .../runtime1/processors/parsers/PState.scala       | 28 ++++++++++----------
 .../runtime1/processors/parsers/ParseErrors.scala  | 12 ++++-----
 .../runtime1/processors/parsers/Parser.scala       | 11 +++-----
 .../runtime1/processors/unparsers/UState.scala     | 11 ++++----
 .../daffodil/core/dsom/TestExternalVariables.scala |  2 +-
 .../org/apache/daffodil/lib/oolag/TestOOLAG.scala  |  2 +-
 .../tdml/DaffodilCTDMLDFDLProcessor.scala          | 30 ++++++++--------------
 .../processor/tdml/DaffodilTDMLDFDLProcessor.scala | 14 +++++-----
 17 files changed, 80 insertions(+), 117 deletions(-)

diff --git 
a/daffodil-codegen-c/src/main/scala/org/apache/daffodil/codegen/c/DaffodilCCodeGenerator.scala
 
b/daffodil-codegen-c/src/main/scala/org/apache/daffodil/codegen/c/DaffodilCCodeGenerator.scala
index 97d085124..32838afcc 100644
--- 
a/daffodil-codegen-c/src/main/scala/org/apache/daffodil/codegen/c/DaffodilCCodeGenerator.scala
+++ 
b/daffodil-codegen-c/src/main/scala/org/apache/daffodil/codegen/c/DaffodilCCodeGenerator.scala
@@ -81,7 +81,7 @@ import 
org.apache.daffodil.runtime1.dsom.SchemaDefinitionWarning
 class DaffodilCCodeGenerator(root: Root) extends api.CodeGenerator {
   // Note this class is not thread-safe due to mutable state needed to
   // implement WithDiagnostics trait
-  private var diagnostics: java.util.List[api.Diagnostic] = 
java.util.Collections.emptyList()
+  private var diagnostics: Seq[api.Diagnostic] = Nil
   private var errorStatus: Boolean = false
 
   /**
@@ -123,8 +123,7 @@ class DaffodilCCodeGenerator(root: Root) extends 
api.CodeGenerator {
     // while appending any warnings to our diagnostics
     val cgState = new CodeGeneratorState(root)
     DaffodilCCodeGenerator.generateCode(root.document, cgState)
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.addAll(root.warnings.asJava)
+    diagnostics = diagnostics ++ root.warnings
     val versionHeaderText = cgState.generateVersionHeader
     val codeHeaderText = cgState.generateCodeHeader
     val codeFileText = cgState.generateCodeFile
@@ -228,8 +227,7 @@ class DaffodilCCodeGenerator(root: Root) extends 
api.CodeGenerator {
   private def warning(formatString: String, args: Any*): Unit = {
     val sde =
       new SchemaDefinitionWarning(WarnID.CodeGenerator, None, None, 
formatString, args: _*)
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(sde)
+    diagnostics = diagnostics :+ sde
   }
 
   /**
@@ -237,13 +235,12 @@ class DaffodilCCodeGenerator(root: Root) extends 
api.CodeGenerator {
    */
   private def error(formatString: String, args: Any*): Unit = {
     val sde = new SchemaDefinitionError(None, None, formatString, args: _*)
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(sde)
+    diagnostics = diagnostics :+ sde
     errorStatus = true
   }
 
   // Implements the WithDiagnostics trait
-  override def getDiagnostics: java.util.List[api.Diagnostic] = diagnostics
+  override def getDiagnostics: java.util.List[api.Diagnostic] = 
diagnostics.asJava
   override def isError: Boolean = errorStatus
 }
 
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/compiler/Compiler.scala 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/compiler/Compiler.scala
index 2837cbd1f..fb629c7f6 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/compiler/Compiler.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/compiler/Compiler.scala
@@ -103,7 +103,7 @@ final class ProcessorFactory private (
 
   def elementBaseInstanceCount: Long = sset.elementBaseInstanceCount
 
-  def diagnostics: java.util.List[api.Diagnostic] = {
+  def diagnostics: Seq[api.Diagnostic] = {
     // The work to compile a schema and build diagnostics is triggered by the 
user calling
     // isError. But if a user gets diagnostics before doing so, then no work 
will have been done
     // and the diagnostics will be empty. Technically this is incorrect 
usage--a user should
@@ -117,7 +117,7 @@ final class ProcessorFactory private (
     sset.diagnostics
   }
 
-  def getDiagnostics: java.util.List[api.Diagnostic] = diagnostics
+  def getDiagnostics: java.util.List[api.Diagnostic] = diagnostics.asJava
 
   override def onPath(xpath: String): api.DataProcessor = sset.onPath(xpath)
 
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/util/TestUtils.scala 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/util/TestUtils.scala
index eee6cfbf8..2f89e5aeb 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/core/util/TestUtils.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/core/util/TestUtils.scala
@@ -127,7 +127,7 @@ object TestUtils {
   ): Unit = {
     val compiler = Compiler()
     val pf = compiler.compileNode(testSchema)
-    if (pf.isError) throwDiagnostics(pf.diagnostics)
+    if (pf.isError) throwDiagnostics(pf.getDiagnostics)
     var u = pf.onPath("/").asInstanceOf[DataProcessor]
     if (u.isError) throwDiagnostics(u.getDiagnostics)
     val outputStream = new java.io.ByteArrayOutputStream()
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/lib/oolag/OOLAG.scala 
b/daffodil-core/src/main/scala/org/apache/daffodil/lib/oolag/OOLAG.scala
index c2c52a75f..388f048ce 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/lib/oolag/OOLAG.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/lib/oolag/OOLAG.scala
@@ -450,7 +450,7 @@ object OOLAG {
     final def warnings: Seq[api.Diagnostic] = oolagRoot.warnings_.toSeq
 
     override def getDiagnostics: java.util.List[api.Diagnostic] =
-      diagnostics
+      diagnostics.asJava
 
     def warn(th: Diagnostic): Unit = {
       oolagRoot.oolagWarn(th)
@@ -493,7 +493,7 @@ object OOLAG {
       errorCount > 0
     }
 
-    def diagnostics: java.util.List[api.Diagnostic] = (errors ++ 
warnings).asJava
+    def diagnostics: Seq[api.Diagnostic] = errors ++ warnings
   }
 
   /**
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/debugger/InteractiveDebugger.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/debugger/InteractiveDebugger.scala
index 092b957c9..82650831d 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/debugger/InteractiveDebugger.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/debugger/InteractiveDebugger.scala
@@ -195,7 +195,7 @@ class InteractiveDebugger(
 
       if (state.processorStatus ne Success) {
         debugPrintln("failure:")
-        debugPrintln("%s".format(state.diagnostics.get(0).toString), "  ")
+        debugPrintln("%s".format(state.diagnostics.head.toString), "  ")
       }
 
       if (debugState == DebugState.Trace) {
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/iapi/DFDLParserUnparser.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/iapi/DFDLParserUnparser.scala
index 4a9f64b62..7e875a1fe 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/iapi/DFDLParserUnparser.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/iapi/DFDLParserUnparser.scala
@@ -184,7 +184,7 @@ object DFDL {
     /**
      * @return list of diagnostics
      */
-    def diagnostics: java.util.List[Diagnostic]
+    def diagnostics: Seq[Diagnostic]
 
     /**
      * @return current data location
@@ -197,7 +197,7 @@ object DFDL {
    */
   abstract class Result extends api.Result {
     def resultState: State
-    var diagnostics: java.util.List[api.Diagnostic] = 
java.util.Collections.emptyList()
+    var diagnostics: Seq[api.Diagnostic] = Nil
 
     private def resultStatusDiagnostics: Seq[api.Diagnostic] = {
       resultState.processorStatus match {
@@ -207,12 +207,11 @@ object DFDL {
     }
 
     override def getDiagnostics: java.util.List[api.Diagnostic] = {
-      (diagnostics.asScala ++ resultState.diagnostics.asScala ++ 
resultStatusDiagnostics).distinct.asJava
+      (diagnostics ++ resultState.diagnostics ++ 
resultStatusDiagnostics).distinct.asJava
     }
 
     override def addDiagnostic(d: api.Diagnostic): Unit = {
-      diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-      diagnostics.add(0, d)
+      diagnostics = d +: diagnostics
     }
 
     override def isError = isProcessingError || isValidationError
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/DataProcessor.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/DataProcessor.scala
index feffdd74d..0caf95ad9 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/DataProcessor.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/DataProcessor.scala
@@ -27,9 +27,9 @@ import java.nio.charset.StandardCharsets
 import java.nio.file.Files
 import java.nio.file.Path
 import java.util.zip.GZIPOutputStream
+import scala.jdk.CollectionConverters._
 
 import org.apache.daffodil.api
-import org.apache.daffodil.api.Diagnostic
 import org.apache.daffodil.api.debugger.Debugger
 import org.apache.daffodil.api.metadata.MetadataHandler
 import org.apache.daffodil.lib.Implicits._
@@ -133,8 +133,7 @@ class DataProcessor(
   val validator: api.validation.Validator = NoValidator,
   protected val areDebugging: Boolean = false,
   protected val optDebugger: Option[api.debugger.Debugger] = None,
-  protected val diagnostics: java.util.List[api.Diagnostic] =
-    new java.util.LinkedList[api.Diagnostic]()
+  protected val diagnostics: Seq[api.Diagnostic] = Seq.empty
 ) extends DFDL.DataProcessor
   with Serializable
   with MultipleEventHandler {
@@ -167,7 +166,7 @@ class DataProcessor(
     validator: api.validation.Validator = validator,
     areDebugging: Boolean = areDebugging,
     optDebugger: Option[api.debugger.Debugger] = optDebugger,
-    diagnostics: java.util.List[api.Diagnostic] = diagnostics
+    diagnostics: Seq[api.Diagnostic] = diagnostics
   ) = new DataProcessor(
     ssrd,
     tunables,
@@ -239,7 +238,7 @@ class DataProcessor(
   override def isError = false
 
   override def getDiagnostics: java.util.List[api.Diagnostic] =
-    diagnostics
+    diagnostics.asJava
 
   override def newXMLReaderInstance: api.DaffodilParseXMLReader = {
     val xrdr = new DaffodilParseXMLReader(this)
@@ -274,7 +273,7 @@ class DataProcessor(
       variableMap = ssrd.originalVariables,
       validator = NoValidator,
       // don't save any warnings that were generated
-      diagnostics = new java.util.ArrayList[Diagnostic]()
+      diagnostics = Seq.empty
     )
 
     try {
@@ -364,11 +363,11 @@ class DataProcessor(
         validator.validateXML(bis, state)
       }
       // copy the blob paths we created to the users infoset outputter
-      output.setBlobPaths(state.blobPaths)
+      output.setBlobPaths(state.blobPaths.asJava)
       new ParseResult(state)
     } else {
       // failed, so delete all blobs that were created
-      state.blobPaths.forEach { path =>
+      state.blobPaths.foreach { path =>
         Files.delete(path)
       }
       // ensure the blob paths on the users infoset outputter are empty in 
case of reuse
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/ProcessorStateBases.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/ProcessorStateBases.scala
index 8401d26f1..d099e6885 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/ProcessorStateBases.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/ProcessorStateBases.scala
@@ -140,7 +140,7 @@ trait HasTunable {
  */
 abstract class ParseOrUnparseState protected (
   protected var variableBox: VariableBox,
-  var diagnostics: java.util.List[api.Diagnostic],
+  var diagnostics: Seq[api.Diagnostic],
   var dataProc: Maybe[DataProcessor],
   val tunable: DaffodilTunables
 ) extends api.validation.ValidationHandler
@@ -155,7 +155,7 @@ abstract class ParseOrUnparseState protected (
 
   def this(
     vmap: VariableMap,
-    diags: java.util.List[api.Diagnostic],
+    diags: Seq[api.Diagnostic],
     dataProc: Maybe[DataProcessor],
     tunable: DaffodilTunables
   ) =
@@ -419,8 +419,7 @@ abstract class ParseOrUnparseState protected (
     // threadCheck()
     if (!diagnostics.contains(failureDiagnostic)) {
       _processorStatus = new Failure(failureDiagnostic)
-      diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-      diagnostics.add(0, failureDiagnostic)
+      diagnostics = failureDiagnostic +: diagnostics
     } else {
       Assert.invariant(processorStatus ne Success)
     }
@@ -430,8 +429,7 @@ abstract class ParseOrUnparseState protected (
     val ctxt = getContext()
     val vde = new ValidationError(ctxt.schemaFileLocation, this, msg, args: _*)
     _validationStatus = false
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(0, vde)
+    diagnostics = vde +: diagnostics
   }
 
   final def validationErrorAny(msg: String, args: Any*): Unit = {
@@ -441,8 +439,7 @@ abstract class ParseOrUnparseState protected (
   final override def validationErrorNoContext(cause: Throwable): Unit = {
     val vde = new ValidationError(this, cause)
     _validationStatus = false
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(0, vde)
+    diagnostics = vde +: diagnostics
   }
 
   /**
@@ -461,8 +458,7 @@ abstract class ParseOrUnparseState protected (
    */
   final def suppressDiagnosticAndSucceed(d: Diagnostic): Unit = {
     Assert.usage(diagnostics.contains(d))
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.removeIf { _ eq d }
+    diagnostics = diagnostics.filterNot { _ eq d }
     setSuccess()
   }
 
@@ -573,8 +569,7 @@ abstract class ParseOrUnparseState protected (
   final def SDEButContinue(str: String, args: Any*) = {
     val ctxt = getContext()
     val rsde = new RuntimeSchemaDefinitionError(ctxt.schemaFileLocation, str, 
args: _*)
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(0, rsde)
+    diagnostics = rsde +: diagnostics
   }
 
   final def SDW(warnID: WarnID, str: String, args: Any*) = {
@@ -590,8 +585,7 @@ abstract class ParseOrUnparseState protected (
         val sde = new SchemaDefinitionErrorFromWarning(rsdw)
         ctxt.toss(sde)
       } else {
-        diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-        diagnostics.add(0, rsdw)
+        diagnostics = rsdw +: diagnostics
       }
     }
   }
@@ -666,12 +660,7 @@ final class CompileState(
   tci: DPathCompileInfo,
   maybeDataProc: Maybe[DataProcessor],
   tunable: DaffodilTunables
-) extends ParseOrUnparseState(
-    tci.variableMap,
-    new java.util.ArrayList(),
-    maybeDataProc,
-    tunable
-  ) {
+) extends ParseOrUnparseState(tci.variableMap, Nil, maybeDataProc, tunable) {
 
   def arrayIterationPos: Long = 1L
   def occursPos: Long = 1L
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ElementCombinator1.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ElementCombinator1.scala
index 2286963a5..1c53a5755 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ElementCombinator1.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ElementCombinator1.scala
@@ -18,7 +18,6 @@
 package org.apache.daffodil.runtime1.processors.parsers
 
 import org.apache.daffodil.api
-import org.apache.daffodil.api.Diagnostic
 import org.apache.daffodil.lib.exceptions.Assert
 import org.apache.daffodil.lib.util.Logger
 import org.apache.daffodil.lib.util.Maybe
@@ -143,9 +142,7 @@ abstract class ElementParserBase(
 
       Assert.invariant(pstate.hasInfoset)
 
-      var setVarFailureDiags: java.util.List[api.Diagnostic] =
-        new java.util.LinkedList[Diagnostic]()
-
+      var setVarFailureDiags: Seq[api.Diagnostic] = Nil
       if (pstate.processorStatus eq Success) {
         var i: Int = 0
         while (i < setVarParser.length) {
@@ -175,8 +172,8 @@ abstract class ElementParserBase(
       // We're done with the discriminator, so now we revisit the set variable 
statements.
       // If a failure occurred there, then now we can fail out right here.
       //
-      if (!setVarFailureDiags.isEmpty) {
-        pstate.setFailed(setVarFailureDiags.get(0))
+      if (setVarFailureDiags.nonEmpty) {
+        pstate.setFailed(setVarFailureDiags.head)
         return
       }
 
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/PState.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/PState.scala
index 585a72bea..11a54f326 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/PState.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/PState.scala
@@ -165,11 +165,11 @@ final class PState private (
   var dataInputStream: InputSourceDataInputStream,
   val walker: InfosetWalker,
   vmap: VariableMap,
-  diagnosticsArg: java.util.List[api.Diagnostic],
+  diagnosticsArg: Seq[api.Diagnostic],
   val mpstate: MPState,
   dataProcArg: DataProcessor,
   var delimitedParseResult: Maybe[dfa.ParseResult],
-  var blobPaths: java.util.List[Path],
+  var blobPaths: Seq[Path],
   tunable: DaffodilTunables
 ) // Runtime tunables obtained from DataProcessor)
   extends ParseOrUnparseState(vmap, diagnosticsArg, One(dataProcArg), tunable)
@@ -465,8 +465,7 @@ final class PState private (
   }
 
   def addBlobPath(path: Path): Unit = {
-    blobPaths = new java.util.LinkedList[Path](blobPaths)
-    blobPaths.add(0, path)
+    blobPaths = path +: blobPaths
   }
 
   final def notifyDebugging(flag: Boolean): Unit = {
@@ -604,9 +603,9 @@ object PState {
     var variableMap: VariableMap = _
     var processorStatus: ProcessorResult = _
     var validationStatus: Boolean = _
-    var diagnostics: java.util.List[api.Diagnostic] = _
+    var diagnostics: Seq[api.Diagnostic] = _
     var delimitedParseResult: Maybe[dfa.ParseResult] = Nope
-    var blobPaths: java.util.List[Path] = new java.util.LinkedList[Path]()
+    var blobPaths: Seq[Path] = Seq.empty
     var context: RuntimeData = _
 
     val mpStateMark = new MPState.Mark
@@ -622,7 +621,7 @@ object PState {
       diagnostics = null
       delimitedParseResult = Nope
       mpStateMark.clear()
-      blobPaths = new java.util.LinkedList[Path]()
+      blobPaths = Seq.empty
       // DO NOT clear requestorId/context. It is there to help us debug if we 
try to repeatedly reset/discard a mark already discarded.
     }
 
@@ -671,16 +670,15 @@ object PState {
 
       // We are backtracking here, potentially past blob files that have
       // already been written, so we must delete them. Since we always prepend
-      // blobs to the blobPaths list as they are created, we can delete them by
-      // deleting all blob files that are in front of the blobsToKeep list. 
This
+      // blobs to the blobPaths Seq as they are created, we can delete them by
+      // deleting all blob files that are in front of the blobsToKeep Seq. This
       // also lets us do fast reference equality comparisons for determining
       // when to stop deleting.
       val blobsToKeep = this.blobPaths
       var currentBlobs = ps.blobPaths
-      while (!currentBlobs.equals(blobsToKeep)) {
-        Files.delete(currentBlobs.get(0))
-        currentBlobs = new java.util.LinkedList[Path](currentBlobs)
-        currentBlobs.remove(0)
+      while (currentBlobs ne blobsToKeep) {
+        Files.delete(currentBlobs.head)
+        currentBlobs = currentBlobs.tail
       }
       ps.blobPaths = blobsToKeep
     }
@@ -732,7 +730,7 @@ object PState {
      */
     val variables = dataProc.variableMap.copy()
 
-    val diagnostics = new java.util.LinkedList[api.Diagnostic]()
+    val diagnostics = Nil
     val mutablePState = MPState()
     val tunables = dataProc.tunables
     val infosetWalker = InfosetWalker(
@@ -756,7 +754,7 @@ object PState {
       mutablePState,
       dataProc.asInstanceOf[DataProcessor],
       Nope,
-      new java.util.LinkedList[Path](),
+      Seq.empty,
       tunables
     )
     newState
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ParseErrors.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ParseErrors.scala
index dd99a9587..a8a6d5b35 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ParseErrors.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/ParseErrors.scala
@@ -65,7 +65,7 @@ class AssertionFailed(
 class ChoiceBranchFailed(
   rd: SchemaFileLocation,
   state: PState,
-  val errors: java.util.List[api.Diagnostic]
+  val errors: Seq[api.Diagnostic]
 ) extends ParseError(
     One(rd),
     One(state.currentLocation),
@@ -76,7 +76,7 @@ class ChoiceBranchFailed(
 class EntireChoiceFailed(
   rd: SchemaFileLocation,
   state: PState,
-  diags: java.util.List[api.Diagnostic]
+  diags: Seq[api.Diagnostic]
 ) extends ParseError(
     One(rd),
     One(state.currentLocation),
@@ -85,13 +85,13 @@ class EntireChoiceFailed(
   ) {
 
   override def getLocationsInSchemaFiles: 
java.util.List[api.LocationInSchemaFile] = {
-    val locs = diags.asScala.flatMap { d => 
d.getLocationsInSchemaFiles.asScala }
+    val locs = diags.flatMap { d => d.getLocationsInSchemaFiles.asScala }
     locs.toList.asJava
   }
 
   override def getDataLocations: java.util.List[api.DataLocation] = {
     // all should have the same starting location if they are alternatives.
-    val dataLocs = diags.asScala.flatMap { _.getDataLocations.asScala }
+    val dataLocs = diags.flatMap { _.getDataLocations.asScala }
     // TBD: what is the idiom for "insert a equals sign between all the 
elements of the list...??"
     // Well, this works, but isn't there a one-liner for this idiom.
     val allAreSame = dataLocs match {
@@ -99,7 +99,7 @@ class EntireChoiceFailed(
       case _ => true
     }
     Assert.invariant(allAreSame)
-    diags.get(0).getDataLocations
+    diags.head.getDataLocations
   }
 }
 
@@ -114,7 +114,7 @@ class ChoiceDispatchNoMatch(rd: SchemaFileLocation, state: 
PState, val key: Stri
 class ChoiceDispatchFailed(
   rd: SchemaFileLocation,
   state: PState,
-  val errors: java.util.List[api.Diagnostic]
+  val errors: Seq[api.Diagnostic]
 ) extends ParseError(
     One(rd),
     One(state.currentLocation),
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/Parser.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/Parser.scala
index f9070c5eb..89c42aedb 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/Parser.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/Parser.scala
@@ -17,8 +17,6 @@
 
 package org.apache.daffodil.runtime1.processors.parsers
 
-import java.util.Collections
-
 import org.apache.daffodil.api
 import org.apache.daffodil.api.DataLocation
 import org.apache.daffodil.io.BacktrackingException
@@ -260,7 +258,7 @@ class ChoiceParser(ctxt: RuntimeData, val childParsers: 
Array[Parser])
 
   def parse(pstate: PState): Unit = {
 
-    var diagnostics: java.util.List[api.Diagnostic] = Collections.emptyList()
+    var diagnostics: Seq[api.Diagnostic] = Nil
     var i = 0
     val numAlternatives = childParsers.length
 
@@ -295,8 +293,7 @@ class ChoiceParser(ctxt: RuntimeData, val childParsers: 
Array[Parser])
 
           val diag =
             new ChoiceBranchFailed(context.schemaFileLocation, pstate, 
pstate.diagnostics)
-          diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-          diagnostics.add(0, diag)
+          diagnostics = diag +: diagnostics
 
           if (pstate.isPointOfUncertaintyResolved(pou)) {
             // A discriminator resolved the point of uncertainty associated 
with
@@ -318,10 +315,8 @@ class ChoiceParser(ctxt: RuntimeData, val childParsers: 
Array[Parser])
     }
 
     if (!successfullyParsedChildBranch) {
-      diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-      Collections.reverse(diagnostics)
       val allDiags =
-        new EntireChoiceFailed(context.schemaFileLocation, pstate, diagnostics)
+        new EntireChoiceFailed(context.schemaFileLocation, pstate, 
diagnostics.reverse)
       pstate.setFailed(allDiags)
     }
   }
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/unparsers/UState.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/unparsers/UState.scala
index a87b901ab..125fad645 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/unparsers/UState.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/runtime1/processors/unparsers/UState.scala
@@ -71,7 +71,7 @@ object ENoWarn { EqualitySuppressUnusedImportWarning() }
 
 abstract class UState(
   vbox: VariableBox,
-  diagnosticsArg: java.util.List[api.Diagnostic],
+  diagnosticsArg: Seq[api.Diagnostic],
   dataProcArg: Maybe[DataProcessor],
   tunable: DaffodilTunables,
   areDebugging: Boolean
@@ -220,8 +220,7 @@ abstract class UState(
   }
 
   def addUnparseError(ue: UnparseError): Unit = {
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(0, ue)
+    diagnostics = ue +: diagnostics
     _processorStatus = new Failure(ue)
   }
 
@@ -507,7 +506,7 @@ final class UStateMain private (
   private val inputter: InfosetInputter,
   outStream: java.io.OutputStream,
   vbox: VariableBox,
-  diagnosticsArg: java.util.List[api.Diagnostic],
+  diagnosticsArg: Seq[api.Diagnostic],
   dataProcArg: DataProcessor,
   tunable: DaffodilTunables,
   areDebugging: Boolean
@@ -519,7 +518,7 @@ final class UStateMain private (
     inputter: InfosetInputter,
     outputStream: java.io.OutputStream,
     vmap: VariableMap,
-    diagnosticsArg: java.util.List[api.Diagnostic],
+    diagnosticsArg: Seq[api.Diagnostic],
     dataProcArg: DataProcessor,
     tunable: DaffodilTunables,
     areDebugging: Boolean
@@ -761,7 +760,7 @@ object UState {
      */
     val variables = dataProc.variableMap.copy()
 
-    val diagnostics = new java.util.LinkedList[api.Diagnostic]()
+    val diagnostics = Nil
     val newState = new UStateMain(
       inputter,
       outStream,
diff --git 
a/daffodil-core/src/test/scala/org/apache/daffodil/core/dsom/TestExternalVariables.scala
 
b/daffodil-core/src/test/scala/org/apache/daffodil/core/dsom/TestExternalVariables.scala
index 1b3789897..a25ff5209 100644
--- 
a/daffodil-core/src/test/scala/org/apache/daffodil/core/dsom/TestExternalVariables.scala
+++ 
b/daffodil-core/src/test/scala/org/apache/daffodil/core/dsom/TestExternalVariables.scala
@@ -218,7 +218,7 @@ class TestExternalVariables {
     val c = Compiler(validateDFDLSchemas = false)
     val pf = c.compileSource(source)
     pf.isError
-    pf.diagnostics.forEach { d => println(d) }
+    pf.diagnostics.foreach { d => println(d) }
     assertFalse(pf.isError)
     val dp = 
pf.onPath("/").asInstanceOf[DataProcessor].withExternalVariables(variables)
 
diff --git 
a/daffodil-core/src/test/scala/org/apache/daffodil/lib/oolag/TestOOLAG.scala 
b/daffodil-core/src/test/scala/org/apache/daffodil/lib/oolag/TestOOLAG.scala
index bde42a32b..5ea72bacd 100644
--- a/daffodil-core/src/test/scala/org/apache/daffodil/lib/oolag/TestOOLAG.scala
+++ b/daffodil-core/src/test/scala/org/apache/daffodil/lib/oolag/TestOOLAG.scala
@@ -256,7 +256,7 @@ class TestOOLAG {
     assertTrue(h.divZero_.isError)
 
     val d = h.diagnostics
-    d.forEach { System.err.println(_) }
+    d.foreach { System.err.println(_) }
     // Division by zero is not caught by oolag anymore, so there will be
     // no diagnostic message.
     // assertTrue(d.length == 1)
diff --git 
a/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilCTDMLDFDLProcessor.scala
 
b/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilCTDMLDFDLProcessor.scala
index 476aac6d4..41367b307 100644
--- 
a/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilCTDMLDFDLProcessor.scala
+++ 
b/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilCTDMLDFDLProcessor.scala
@@ -229,20 +229,14 @@ final class DaffodilCTDMLParseResult(
   messages: String = ""
 ) extends TDMLParseResult {
 
-  private var diagnostics: java.util.List[api.Diagnostic] = processorResult 
match {
+  private var diagnostics: Seq[api.Diagnostic] = processorResult match {
     case Success =>
-      if (messages.nonEmpty)
-        new java.util.LinkedList[api.Diagnostic](
-          java.util.Arrays.asList(DaffodilCTDMLMessages(messages))
-        )
-      else java.util.Arrays.asList()
-    case Failure(cause) =>
-      new java.util.LinkedList[api.Diagnostic](java.util.Arrays.asList(cause))
+      if (messages.nonEmpty) List(DaffodilCTDMLMessages(messages)) else Nil
+    case Failure(cause) => List(cause)
   }
 
   override def addDiagnostic(diagnostic: Diagnostic): Unit = {
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(diagnostic)
+    diagnostics = diagnostic +: diagnostics
   }
 
   // We must read outFile right away (def or lazy val will not work) because 
the parse
@@ -260,9 +254,9 @@ final class DaffodilCTDMLParseResult(
   }
 
   override def currentLocation: DataLocation = 
DaffodilCTDMLDataLocation(finalBitPos0b)
-  override def isValidationError: Boolean = 
diagnostics.asScala.exists(_.isValidation)
+  override def isValidationError: Boolean = diagnostics.exists(_.isValidation)
   override def isProcessingError: Boolean = processorResult.isFailure
-  override def getDiagnostics: java.util.List[api.Diagnostic] = diagnostics
+  override def getDiagnostics: java.util.List[api.Diagnostic] = 
diagnostics.asJava
 }
 
 /**
@@ -297,18 +291,16 @@ final class DaffodilCTDMLUnparseResult(
   messages: String = ""
 ) extends TDMLUnparseResult {
 
-  private val diagnostics: java.util.List[api.Diagnostic] = processorResult 
match {
+  private val diagnostics: Seq[api.Diagnostic] = processorResult match {
     case Success =>
-      if (messages.nonEmpty)
-        new 
java.util.LinkedList(java.util.Arrays.asList(DaffodilCTDMLMessages(messages)))
-      else new java.util.ArrayList[api.Diagnostic]()
-    case Failure(cause) => new 
java.util.LinkedList(java.util.Arrays.asList(cause))
+      if (messages.nonEmpty) List(DaffodilCTDMLMessages(messages)) else Nil
+    case Failure(cause) => List(cause)
   }
 
   override def bitPos0b: Long = finalBitPos0b
   override def isScannable: Boolean = false // binary data is not scannable
   override def encodingName: String = "" // encoding needed only if scannable
-  override def isValidationError: Boolean = 
diagnostics.asScala.exists(_.isValidation)
+  override def isValidationError: Boolean = diagnostics.exists(_.isValidation)
   override def isProcessingError: Boolean = processorResult.isFailure
-  override def getDiagnostics: java.util.List[api.Diagnostic] = diagnostics
+  override def getDiagnostics: java.util.List[api.Diagnostic] = 
diagnostics.asJava
 }
diff --git 
a/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilTDMLDFDLProcessor.scala
 
b/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilTDMLDFDLProcessor.scala
index 849028253..84bf07728 100644
--- 
a/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilTDMLDFDLProcessor.scala
+++ 
b/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/processor/tdml/DaffodilTDMLDFDLProcessor.scala
@@ -441,7 +441,7 @@ final class DaffodilTDMLParseResult(actual: ParseResult, 
outputter: TDMLInfosetO
 
   override def getResult: Node = outputter.getResult
 
-  override def getBlobPaths: java.util.List[Path] = outputter.getBlobPaths()
+  override def getBlobPaths: java.util.List[Path] = outputter.getBlobPaths
 
   def inputter = outputter.toInfosetInputter
 
@@ -455,7 +455,7 @@ final class DaffodilTDMLParseResult(actual: ParseResult, 
outputter: TDMLInfosetO
 
   override def addDiagnostic(diag: Diagnostic): Unit = 
actual.addDiagnostic(diag)
 
-  override def cleanUp(): Unit = getBlobPaths.forEach { Files.delete }
+  override def cleanUp(): Unit = getBlobPaths.forEach { Files.delete(_) }
 }
 
 final class DaffodilTDMLUnparseResult(
@@ -481,28 +481,26 @@ final class DaffodilTDMLUnparseResult(
 }
 
 class DaffodilTDMLSAXErrorHandler extends ErrorHandler with WithDiagnostics {
-  private var diagnostics: java.util.List[api.Diagnostic] = 
java.util.Collections.emptyList()
+  private var diagnostics: Seq[api.Diagnostic] = Nil
   private var errorStatus: Boolean = false
 
   override def warning(exception: SAXParseException): Unit = {
     errorStatus = false
     val embeddedDiagnostic = exception.getCause.asInstanceOf[Diagnostic]
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(embeddedDiagnostic)
+    diagnostics = embeddedDiagnostic +: diagnostics
   }
 
   override def error(exception: SAXParseException): Unit = {
     errorStatus = true
     val embeddedDiagnostic = exception.getCause.asInstanceOf[Diagnostic]
-    diagnostics = new java.util.LinkedList[api.Diagnostic](diagnostics)
-    diagnostics.add(embeddedDiagnostic)
+    diagnostics = embeddedDiagnostic +: diagnostics
   }
 
   override def fatalError(exception: SAXParseException): Unit = {
     error(exception)
   }
 
-  override def getDiagnostics: java.util.List[api.Diagnostic] = diagnostics
+  override def getDiagnostics: java.util.List[api.Diagnostic] = 
diagnostics.asJava
 
   override def isError: Boolean = errorStatus
 }


Reply via email to