Apache Daffodil 3.0.0

Documentation

Javadoc | Scaladoc

Get Release

Source

Binaries


The above release files should be verified using the PGP signatures and the project release KEYS. See verification instructions for a description of using the PGP and KEYS files for verification. A SHA512 checksum is also provided as an alternative verification method.

<dependency>
  <groupId>org.apache.daffodil</groupId>
  <artifactId>daffodil-japi_2.12</artifactId>
  <version>3.0.0</version>
</dependency>
libraryDependencies += "org.apache.daffodil" %% "daffodil-sapi" % "3.0.0"

Release Notes

SAX Support and Streaming

Numerous changes were made to improve streaming and reduce memory usage during parse and unparse operations.

The most visible change is the addition of a new SAX API for both parsing and unparsing. A new DaffodilParseXMLReader can be used to parse data and provide infoset events to a SAX ContentHandler. And a new DaffodilUnparseContentHandler can be used to unparse SAX events from a SAX XMLReader. See the Javadoc and Scaladoc for examples of creating and using the new SAX Daffodil objects.

For both the new SAX API or original Daffodil API, infoset events are now created during parsing, rather than waiting for a parse to complete. As infoset events are streamed out while parsing, or read in during unparsing, Daffodil now removes them from the internal infoset representation, reducing overall memory usage in many cases.

Lastly, while unparsing, Daffodil must sometimes buffer data due to circumstances such as alignment, length calculations, and forward looking expressions. Previous versions of Daffodil would not attempt to resolve these issues until the end of an unparse. Daffodil now makes attempts to resolve these issues during the unparse process, allowing for the buffered data to be written to the unparse output stream, ultimately reducing memory usage.

Multiple changes were also made to support files larger than 4GB behave as expected, including those with blobs.

API Changes

A new experimental API is added to allow traversing the Daffodil internal DFDL Schema Object Model, enabling API users the ability to build an alternative schema object model, sometimes needed to allow native infoset integrate with external tools.

A new withExternalVariables function is added to the Java API that accepts a Java AbstractMap. Previously, the only available function used a Scala Map, which is difficult to use from a Java application.

Diagnostics

Multiple changes were made to improve ambiguous error messages, or to provide new error checks or warnings for behavior that may be unintuitive to users.

Bug Fixes

Miscellaneous Changes

Deprecation/Compatibility

Daffodil no longer provides support for Scala 2.11.x. Scala API users must upgrade to Scala 2.12.

The dfdl:fillByte property is now always required in DFDL Schemas, even if it may not be needed. This change does not affect any schemas that use DFDLGeneralFormat.dfdl.xsd for providing default arguments, since this provides the property. Schemas that do not specify the fillByte property now result in a Schema Definition Error.

The withExternalVariables function in the Java API that accepts a Scala Map has been deprecated. When using the Java API, the same function name that accepts a Java AbstractMap should be used instead.