3 months agoFix deadlock issue with custom Enum implementation
Steve Lawrence [Wed, 15 Jun 2022 18:45:01 +0000 (14:45 -0400)] 
Fix deadlock issue with custom Enum implementation

Our Enum implementation use for property values/lookups has important
benefits over Scala Enumerations. However, it seems like the way we
implement it can lead to circular deadlocks. When a Value is initialized
it causes the Enum to be initialized. And the Enum initialized calls
forceConstruction to initialized all the Values. This leads to circular
instantiating that works in most cases, but sometimes leads to a
deadlock. Where this deadlock exists or how to fix it is not clear. It's
also not clear what changed to make this deadlock much more likely.

To avoid this, we this change removes the forceConstruction function and
replaces it with a manually managed Array of Enum Values. This Array is
lazily evaluated so that instantiated an Enum does not also directly
instantiate the Enum Value, avoiding the circular deadlock. This does
require extra code to define an Enum, but the majority of Enums are in
generated code so doesn't add much maintenance burden.


3 months agoEliminate build warning on VSCode IDE
Michael Beckerle [Tue, 7 Jun 2022 15:19:53 +0000 (11:19 -0400)] 
Eliminate build warning on VSCode IDE


3 months agoRun TDML tests with user-chosen TDML implementation
John Interrante [Mon, 6 Jun 2022 15:09:10 +0000 (11:09 -0400)] 
Run TDML tests with user-chosen TDML implementation

Define TDMLImplementation using simple enumerated type in dafext.xsd.
Add TDML implementation option to Daffodil's CLI test subcommand and
pass Option[TDMLImplementation] argument to Runner to allow CLI to run
TDML tests with different TDMLImplementations (formerly we had to edit
the TDML file, but that become undesirable).  Remove tunable
tdmlImplementation from dafext.xsd and runtime2 TDML files.  Modify
runtime2 Scala tests to pass TDMLImplementation.DaffodilC to Runner
instead.  Look up TDML_IMPLEMENTATION environment variable in
DFDLTestSuite to allow "sbt test" to run tests with different TDML
implementations too.  Add CLI integration tests to increase test
coverage of new and changed lines.

Interaction between environment variable, CLI option, and JUnit tests
is simple to understand.  CLI option or JUnit argument passed to
Runner always specifies TDML implementation.  In their absence,
environment variable specifies TDML implementation.  Otherwise, tests
run with TDMLImplementation.Daffodil (runtime1).

Also fix some inconsistencies with fill bits overlooked by a previous
pull request which extended runtime2 to read and write N-bit numbers.
See more detailed changelog below.


testNonCompatibleImplementation.tdml: Add another test schema and test
case to increase test coverage of "daffodil test -I" option.

Util.scala: Use standard Scala idioms for getting DAFFODIL_HOME
environment variable and composing environment variables.

TestCLIexecuting.scala: Add new error and normal test cases to
increase test coverage of "daffodil test -I" option.  Update "not
compatible" error test case due to change in error message.

Main.scala: Import TDMLImplementation (defined in dafext.xsd) to tell
CLI and user which TDML implementations Daffodil supports.  Add TDML
implementation option to CLI test subcommand.  Pass specified TDML
implementation or None to Runner for TDML file's tests.  Include TDML
implementation's name in "not compatible with implementation" message.

tdml.xsd: Update names of TDML implementations to match names of TDML
implementations in dafext.xsd.  Change runtime2 implementation name
from "daffodil-runtime2" to "daffodilC" because a TDML implementation
name must be a valid identifier in both XML and Scala and you can't
embed a dash within a Scala identifier.

dafext.xsd: Remove tdmlImplementation tunable to avoid overly
complicated interaction between tunable, environment variable, and CLI
-I option.  Add TunableTDMLImplementation simple type (can't remove
"Tunable" from its name because TunableGenerator filters out types not
beginning with "Tunable") with enumerations listing every TDML
implementation Daffodil supports, which also creates a
TDMLImplementation enumerated type we can import into Scala files.
Add comment to clarify you still need different classpaths to call ibm
as a cross tester.  Change all enumerated simple types to use standard
xs:token idiom instead of xs:string.

parsers.c: Rename parse_fill_bytes to parse_fill_bits and make it read
exactly N fill bits (no more, no less).

parsers.h: Rename parse_fill_bytes to parse_fill_bits and rename its
first parameter to correct name end_bitPos0b (not end_bytePos0b).

unparsers.c: Rename unparse_fill_bytes to unparse_fill_bits and make
it write exactly N fill bits (no more, no less).

unparsers.h: Rename unparse_fill_bytes to unparse_fill_bits and rename
its first parameter to correct name end_bitPos0b (not end_bytePos0b).

CodeGenerator.scala: Use standard Scala idiom for getting CC and PATH
environment variables.

CodeGeneratorState.scala: Rename calls of (un)parse_fill_bytes to
(un)parse_fill_bits in generated C code.

ex_nums.tdml: Make comments show how to run CLI test subcommand with
both daffodil and daffodilC implementations.  Remove config-runtime1
and config-runtime2 since tunable tdmlImplementation doesn't exist
anymore.  Add implementation-specific error tests with
implementations="daffodil" and implementations="daffodilC" to
demonstrate how runtime1 and runtime2 handle non-fixed values in
elements with fixed attributes slightly differently depending on
validation levels.  Combine runtime2 error_limited and error_on tests
into error_parse since runtime2 doesn't have a validation option.

nested.tdml: Replace tdmlImplementation configs with comments showing
how to run CLI test subcommand with different TDML implementations.

RunnerFactory.scala: Extend Runner API with TDMLImplementation
parameter in first apply method, Option[TDMLImplementation] parameter
in new two-argument apply method, and Option[TDMLImplementation]
parameter in base constructor to allow CLI and JUnit code to pass TDML
implementation to Runner(...) if they choose to.  Put all known TDML
implementations in defaultImplementationsDefaultDefault to make it
easier to run TDML tests with any TDML implementation.

TDMLRunner.scala: Extend DFDLTestSuite constructor with
Option[TDMLImplementation] parameter to allow Runner to pass TDML
implementation, also remove __nl parameter which was only difference
between first and second constructors since second constructor isn't
called anymore and can be removed.  Make DFDLTestSuite responsible for
defining defaultTDMLImplementation (either
sys.env.get("TDML_IMPLEMENTATION") or daffodil) and
tdmlDFDLProcessorFactory (moved to DFDLTestSuite from TestCase) to try
to minimize number of times code looks up TDML_IMPLEMENTATION and
matching TDMLDFDLProcessorFactory class and constructs new factory.
Unfortunately, both CLI Main class and JUnit tests run individual TDML
test cases one by one, not en masse, and each individual test calls
Runner.getTS which always creates a new DFDLTestSuite, so every single
test will fail and throw TDMLException if TDML_IMPLEMENTATION names an
invalid TDML implementation.  Didn't try it, but maybe could move
defaultTDMLImplementation and tdmlDFDLProcessorFactory to Runner and
pass tdmlDFDLProcessorFactory instead of optTDMLImplementation to
DFDLTestSuite.  Then only first test might fail and rest of tests
might run with daffodil implementation.

Runtime2TDMLDFDLProcessor.scala: Don't set implementationName to
"daffodil-runtime2" literal string, set it to
TDMLImplementation.DaffodilC.toString to get the correct name instead.

TestRunnerFactory.java: Pass Option.apply(null) [closest Java
equivalent to passing None] to Runner in first test case.  Noticed
that IDEA complains TestRunnerFactory is calling private Runner
constructor, but sbt still compiles TestRunnerFactory with no problem.

ISRM_green_to_orange_60000.tdml: Replace tunable configs with comments
showing how to run CLI test subcommand with different TDML

ISRM_orange_to_green_60002.tdml: Replace tunable configs with comments
showing how to run CLI test subcommand with different TDML

MPU_green_to_orange_60004.tdml: Replace tunable configs with comments
showing how to run CLI test subcommand with different TDML

MPU_orange_to_green_60006.tdml: Replace tunable configs with comments
showing how to run CLI test subcommand with different TDML

collisions.tdml: Replace tunable configs with comments showing how to
run CLI test subcommand with different TDML implementations.

egress_xdcc_bw.tdml: Replace tunable configs with comments showing how
to run CLI test subcommand with different TDML implementations.

ingress_xdcc_bw.tdml: Replace tunable configs with comments showing
how to run CLI test subcommand with different TDML implementations.

orion.tdml: Replace tunable configs with comments showing how to run
CLI test subcommand with different TDML implementations.

TestCollisions.scala: Pass TDMLImplementation.DaffodilC to Runner.

TestEgressXdccBw.scala: Pass TDMLImplementation.DaffodilC to Runner.

TestExNums.scala: Pass TDMLImplementation.Daffodil and
TDMLImplementation.DaffodilC to two Runners to run both runtime1 and
runtime2 tests side by side.  Combine runtime2 error_limited and
error_on tests into error_parse since runtime2 doesn't have a
validation option.

TestIngressXdccBw.scala: Pass TDMLImplementation.DaffodilC to Runner.

TestIsrmGreenToOrange60000.scala: Pass TDMLImplementation.DaffodilC to

TestIsrmOrangeToGreen60002.scala: Pass TDMLImplementation.DaffodilC to

TestMpuGreenToOrange60004.scala: Pass TDMLImplementation.DaffodilC to

TestMpuOrangeToGreen60006.scala: Pass TDMLImplementation.DaffodilC to

TestNested.scala: Pass TDMLImplementation.DaffodilC to Runner.

TestOrion.scala: Pass TDMLImplementation.DaffodilC to Runner.

4 months agoAdded support for pluggable charsets
alexanderrevello [Mon, 7 Mar 2022 16:27:49 +0000 (11:27 -0500)] 
Added support for pluggable charsets

Refactored existing charsets to use the BitsCharsetDefinition and created support for it. To implement a charset follow the format and add the classpath in the file in resources/META-INF/services. This process has been shown in daffodil-test/.../charsets


4 months agoExtend runtime2 to N-bit booleans and integers (1 <= N <= 64)
John Interrante [Mon, 16 May 2022 14:47:55 +0000 (10:47 -0400)] 
Extend runtime2 to N-bit booleans and integers (1 <= N <= 64)

Allow runtime2 to read and write N-bit booleans and integers where N
is an explicit length from 1 to 64 bits.  Add C-language unit tests
for easier debugging of N-bit-long numbers (requires Criterion test
framework with MIT license, https://github.com/Snaipe/Criterion, but
never used by or deployed with Daffodil itself so no need to change
Daffodil's LICENSE or NOTICE files).

Also avoid overwriting fields when initializing ERDs and fields of
structures containing choices within choices.  Tweak how runtime2
outputs float numbers in XML to reduce textual differences between
runtime1 and runtime2.  See more detailed file-level changelog below.


build.sbt: Compile only the library C source files (not the test
source files).

Makefile: Add test goal to build and run new C-language unit tests.
Tidy C-language test source files in clean, format, and iwyu goals.

daffodil_main.c: Call flushUState after unparsing to write out any
unwritten bits still buffered inside ustate.

xml_writer.c: Revise how fixNumberIfNeeded and xmlSimpleElem print
floats to reduce textual differences between runtime1 and runtime2 to
a few cases where different numbers of significant digits get printed.

infoset.c: Add flushUState to flush any buffered bits not written yet.

intoset.h: Remove initSelf from ERD struct since we call initSelf
statically and don't need to look it up from ERD objects.  Add/change
PState/UState fields to store bits not yet written or consumed by
Daffodil in a fractional byte and maintain a number-of-bits position
of the last successful parse or unparse.  Declare flushUState to flush
any buffered bits not written yet.

parsers.c: Add read_bits helper function to store bits not yet
consumed by Daffodil in a fractional byte.  Replace helper macros with
helper functions for easier debuggability since the debugger cannot
step through helper macros (they expand to only one source line).
Merge bool8, bool16, bool32 into just one bool parse function.  Change
parse_fill_bytes to take end_bitPos0b instead of end_bytePos0b.  Make
sure all parse functions update pstate->bitPos0b only after their
parse finishes successfully, otherwise leave it unchanged.

parsers.h: Pass num_bits to parse functions to allow them to read
numbers using fewer bits.  Merge parse_{bool8, bool16, bool32} into
just one parse_bool.  Change parse_fill_bytes to take end_bitPos0b
instead of end_bytePos0b.

unparsers.c: Add write_bits helper function to store bits not yet
written by Daffodil in a fractional byte.  Replace helper macros with
helper functions for easier debuggability since the debugger cannot
step through helper macros (they expand to only one source line).
Merge bool8, bool16, bool32 into just one bool unparse function.
Change unparse_fill_bytes to take end_bitPos0b instead of
end_bytePos0b.  Make sure all unparse functions update
ustate->bitPos0b only after their unparse finishes successfully,
otherwise leave it unchanged.

unparsers.h: Pass num_bits to unparse functions to allow them to write
numbers using fewer bits.  Merge unparse_{bool8, bool16, bool32} into
just one unparse_bool.  Change unparse_fill_bytes to take end_bitPos0b
instead of end_bytePos0b.

bits.c: Add C unit tests to check that unparse and parse functions can
write and read numbers using N bits correctly (if not, these tests
help debug these functions more quickly).  These unit tests require a
C test framework library called Criterion which has to be built and
installed manually on Ubuntu 20.04, so we don't want to make build.sbt
or main.yml run these unit tests.  Developers can manually install
Criterion and run the tests with "make test" during development.

extras.c: Define rootElement to avoid an undefined reference when
linking C unit tests.

CodeGenerator.scala: Skip test files when compiling C source files
from within Daffodil itself.

BinaryBooleanCodeGenerator.scala: Pass boolean lengths from 1 to 32
bits to booleanValueAddField and parse/unparse functions as `num_bits`
parameter.  Replace bool8, bool16, bool32 function names with just one
bool function name.

BinaryFloatCodeGenerator.scala: Makes no sense to accept any lengths
other than 32 bits or 64 bits, but modify to pass lengths in bits to
valueAddField and parse/unparse functions anyway.

BinaryIntegerKnownLengthCodeGenerator.scala: Accept all integer
lengths between 1 and 64 bits in DFDL.  Map to quantized lengths (8,
16, 32, 64 bits) for C numbers but pass actual lengths in bits to
valueAddField and parse/unparse functions.

BinaryValueCodeGenerator.scala: Pass actual lengths in bits from
valueAddField to parse/unparse functions.

CodeGeneratorState.scala: Avoid overwriting fields when initializing
ERDs and fields of structures containing choices within choices by
separating initStatements into initERDStatements and
initSelfStatements and making C code call initSelf functions in
rootElement but call initERD functions in initChoice functions when
choices are resolved.  Skip whitespace characters when generating
relative paths from choice dispatch key expressions.  Insert padding
using lengths in bits instead of lengths in bytes.  Relax pattern
matching in getPrimType to accept all boolean and integer lengths
allowed by DFDL.

ElementParseAndUnspecifiedLengthCodeGenerator.scala: Update a couple
of comments.

HexBinaryCodeGenerator.scala: Move some initialization from initSelf
to initERD to avoid overwriting fields when initializing choices
within choices.

{NestedUnion,ex_nums}/generated_code.c: Show changes to generated code
(updated automatically by sbt compile) due to code generator changes
as well as renaming and rearrangement of elements in ex_nums.dfdl.xsd.

ex_nums}/generated_code.h: Show changes to generated code (updated
automatically by sbt compile) due to renaming and rearrangement of
elements in ex_nums.dfdl.xsd.

ex_nums.dat, ex_nums.dat.xml: Reduce number of significant digits in
doubles and floats to help eliminate textual differences between
runtime1 and runtime2 (allowing ex_nums.runtime{1,2}.dat.xml to be
merged into ex_nums.dat.xml).  Change some test elements to test N-bit
booleans and numbers.

ex_nums.dfdl.xsd: Force all elements to be 1-bit aligned to eliminate
differences between runtime1 and runtime2 (runtime2 doesn't pay any
attention to alignment yet).  Change some test elements to test N-bit
booleans and numbers.

ex_nums.error.dat, ex_nums.error.dat.xml: Same changes as ex_nums.dat,
ex_nums.dat.xml (also merging ex_nums.runtime{1,2}.error.dat.xml into

ex_nums.tdml: Add comments to show how to run tests with daffodil
commands.  Since float numbers (for our test cases) look the same now,
need only one ex_nums.dat.xml and one ex_nums.error.dat.xml for both
runtime1 and runtime2 tests.

egress_xdcc_bw.15.dat, egress_xdcc_bw.15.dat.xml: Reduce number of
significant digits in alt, lon doubles to eliminate differences
between runtime1 and runtime2.

egress_xdcc_bw.19.dat, egress_xdcc_bw.19.dat.xml: Reduce number of
significant digits in some x,y,z doubles to eliminate differences
between runtime1 and runtime2.

ingress_xdcc_bw.115.dat, ingress_xdcc_bw.115.dat.xml: Reduce number of
significant digits in some alt,bearing,confidence,lat,lon,speed
doubles to eliminate differences between runtime1 and runtime2.

4 months agoUpdate jackson-core to 2.13.3
Scala Steward [Sat, 14 May 2022 19:03:14 +0000 (21:03 +0200)] 
Update jackson-core to 2.13.3

4 months agoBump actions/github-script from 6.0.0 to 6.1.0
dependabot[bot] [Fri, 13 May 2022 19:13:52 +0000 (19:13 +0000)] 
Bump actions/github-script from 6.0.0 to 6.1.0

Bumps [actions/github-script](https://github.com/actions/github-script) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v6.0.0...v6.1.0)

- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-minor

Signed-off-by: dependabot[bot] <support@github.com>
4 months agoBump actions/setup-java from 3.2.0 to 3.3.0
dependabot[bot] [Wed, 4 May 2022 19:12:29 +0000 (19:12 +0000)] 
Bump actions/setup-java from 3.2.0 to 3.3.0

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v3.2.0...v3.3.0)

- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor

Signed-off-by: dependabot[bot] <support@github.com>
4 months agoBump actions/setup-java from 3.1.1 to 3.2.0
dependabot[bot] [Thu, 28 Apr 2022 12:43:21 +0000 (08:43 -0400)] 
Bump actions/setup-java from 3.1.1 to 3.2.0

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3.1.1 to 3.2.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v3.1.1...v3.2.0)

- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor

- Set `cache: sbt` settting to enable dependency caching
- Move checkout to before setup-java, needed for cache: sbt to work

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoBump actions/checkout from 3.0.1 to 3.0.2
dependabot[bot] [Thu, 21 Apr 2022 19:15:58 +0000 (19:15 +0000)] 
Bump actions/checkout from 3.0.1 to 3.0.2

Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.1...v3.0.2)

- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoBump codecov/codecov-action from 3.0.0 to 3.1.0
dependabot[bot] [Thu, 21 Apr 2022 19:15:55 +0000 (19:15 +0000)] 
Bump codecov/codecov-action from 3.0.0 to 3.1.0

Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v3.0.0...v3.1.0)

- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoBump actions/checkout from 3.0.0 to 3.0.1
dependabot[bot] [Thu, 14 Apr 2022 19:15:44 +0000 (19:15 +0000)] 
Bump actions/checkout from 3.0.0 to 3.0.1

Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.0...v3.0.1)

- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoBump actions/setup-java from 3.1.0 to 3.1.1
dependabot[bot] [Mon, 11 Apr 2022 19:19:50 +0000 (19:19 +0000)] 
Bump actions/setup-java from 3.1.0 to 3.1.1

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3.1.0 to 3.1.1.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v3.1.0...v3.1.1)

- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-patch

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoUpdate scalacheck to 1.16.0
Scala Steward [Fri, 8 Apr 2022 08:07:11 +0000 (10:07 +0200)] 
Update scalacheck to 1.16.0

5 months agoUpdate icu4j to 71.1
Scala Steward [Thu, 7 Apr 2022 20:03:31 +0000 (22:03 +0200)] 
Update icu4j to 71.1

bin.LICENSE: Incorporate icu4c/LICENSE changes from ICU 71.1.

5 months agoBump codecov/codecov-action from 2.1.0 to 3.0.0
dependabot[bot] [Tue, 5 Apr 2022 19:13:17 +0000 (19:13 +0000)] 
Bump codecov/codecov-action from 2.1.0 to 3.0.0

Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.1.0 to 3.0.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v2.1.0...v3.0.0)

- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoUpdate Saxon-HE to 11.3
Scala Steward [Mon, 28 Mar 2022 16:04:39 +0000 (18:04 +0200)] 
Update Saxon-HE to 11.3

5 months agoBump actions/setup-java from 3.0.0 to 3.1.0
dependabot[bot] [Fri, 1 Apr 2022 19:13:03 +0000 (19:13 +0000)] 
Bump actions/setup-java from 3.0.0 to 3.1.0

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v3.0.0...v3.1.0)

- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor

Signed-off-by: dependabot[bot] <support@github.com>
5 months agoStandardize licenses and notices
John Interrante [Wed, 30 Mar 2022 17:10:29 +0000 (10:10 -0700)] 
Standardize licenses and notices

Bring changes that I just made to daffodil-vscode's bin.LICENSE and
bin.NOTICE back to daffodil's bin.LICENSE and bin.NOTICE since we want
to standardize both repos' licenses and notices using the same
formatting, ordering, and wording to make future comparisons easier.

NOTICE: Update Scala copyright years in sub-notice attributing
UniquenessCache.scala to match bin.NOTICE.

bin.LICENSE: Remove 'lib/' from all filenames.  If listing individual
files from a jar, list jar filename first followed by " with:" and
individual files on subsequent lines.  Change next line's wording from
"This product bundles '...' with the above files" to "This product
bundles '...'  from the above files."  Update ICU license (ICU 70 had
changed parts of it).  Sort all sub-licenses alphabetically by

bin.NOTICE: Remove 'lib/' from all filenames.  Add daffodil-lib's
special sub-notice attributing UniquenessCache.scala to Scala library.
No need to add sub-notices for other daffodil jars since their
sub-notice is the same as top of NOTICE.  Merge sub-notice for
scala-library and scala-reflect since both libraries have identical

daffodil-lib/src/main/resources/META-INF/NOTICE: Update Scala
copyright years in sub-notice attributing UniquenessCache.scala to
match bin.NOTICE.

daffodil-schematron/src/main/resources/META-INF/LICENSE: Change
ordering and prologue of Schematron sub-licenses to match bin.LICENSE.


5 months agoRefresh bin.NOTICE and improve bin.LICENSE
John Interrante [Tue, 22 Mar 2022 18:22:53 +0000 (11:22 -0700)] 
Refresh bin.NOTICE and improve bin.LICENSE

Review all transitive dependencies and refresh any missing or updated
sub-NOTICEs in bin.NOTICE.  Improve bin.LICENSE as well for
consistency with bin.NOTICE.

bin.LICENSE: List jar filenames first, then English text and then
sub-LICENSEs to be more similar to bin.NOTICE.  Add W3 schemas and
documents in lib/org.xmlresolver.xmlresolver-<VERSION>-data.jar to W3C
licensed components.  Note jar filenames are not sorted alphabetically

bin.NOTICE: Reorder all sub-NOTICEs to match same order as alphabetic
listing of jars in lib directory.  Shrink bin.NOTICE by removing the
redundant line "This product includes software developed at The Apache
Software Foundation (https://www.apache.org/)" from all sub-NOTICEs
(explicitly allowed by Apache instructions).  Shrink bin.NOTICE even
further by listing just the jar's filename followed by its sub-NOTICE,
which nearly always mentions the binary component's name as well.
Update all out of date sub-NOTICEs and add missing sub-NOTICEs for
these new transitive dependencies,



6 months agoUpdate copyright year to 2022
Steve Lawrence [Fri, 25 Mar 2022 14:23:08 +0000 (10:23 -0400)] 
Update copyright year to 2022


6 months agoStart developing Daffodil 3.4.0
John Interrante [Tue, 22 Mar 2022 13:54:35 +0000 (06:54 -0700)] 
Start developing Daffodil 3.4.0

build.sbt: Change version to 3.4.0-SNAPSHOT.


6 months agoPrepare for Release 3.3.0 v3.3.0 v3.3.0-rc1
John Interrante [Thu, 17 Mar 2022 16:52:02 +0000 (09:52 -0700)] 
Prepare for Release 3.3.0

build.sbt: Remove SNAPSHOT.


6 months agoFix invariant broken masking of unparse error.
Michael Beckerle [Mon, 14 Mar 2022 23:16:39 +0000 (19:16 -0400)] 
Fix invariant broken masking of unparse error.

Add test files focused on enums using repType/repValues
in the simplest possible way.


6 months agoCleanup solarcloud warning. Remove do-while(false) local block workaround
Michael Beckerle [Mon, 14 Mar 2022 19:20:48 +0000 (15:20 -0400)] 
Cleanup solarcloud warning. Remove do-while(false) local block workaround

Some workaround is necessary. I used a cleaner one than the do-while thing.


6 months agoCLI does not output diagnostics on restore parser
Michael Beckerle [Fri, 11 Mar 2022 17:34:13 +0000 (12:34 -0500)] 
CLI does not output diagnostics on restore parser

Added CLI test that verifies SDW on save-parser, not on using it.


6 months agoAdded dfdlx:alignmentKind automatic/manual property
Michael Beckerle [Thu, 10 Mar 2022 21:31:04 +0000 (16:31 -0500)] 
Added dfdlx:alignmentKind automatic/manual property

ParseError on charset not aligned.

This is a significant change in behavior, though because the compiler
puts down mandatory text alignment fill regions the automatic
alignmentby the I/O layer was redundant.

Without the mandatory text alignment regions, the I/O layer really
must not do auto alignment.

Removed dead code from TextParser and unused I/O layer getString


6 months agoFix saveParser CLI with config having tunables.
Michael Beckerle [Thu, 10 Mar 2022 22:50:31 +0000 (17:50 -0500)] 
Fix saveParser CLI with config having tunables.

The CLI's loading of config files was not
trimming the node, hence, getting PCDATA nodes
instead of the strings it expected.

Shares code from DaffodilTunables object now.

centralize tunables logic and config file handling

Introduced DaffodilConfig class to represent the XML config-file


6 months agoRevert "Update alignment to improve correctness and prevent deadlocks"
Michael Beckerle [Wed, 9 Mar 2022 18:19:26 +0000 (13:19 -0500)] 
Revert "Update alignment to improve correctness and prevent deadlocks"

This reverts commit 9043425760dae277eff36087a2e715c70793db9c.
This was an attempt to fix DAFFODIL-2626 but it caused too many
regressions (unparser deadlocks in various schemas)

The ticket DAFFODIL-2626 will be reopened.

The tickets for NITF and P8 deadlocks (the regressions) are fixed by this.


6 months agoUpdate jackson-core to 2.13.2
Scala Steward [Sun, 6 Mar 2022 23:05:18 +0000 (00:05 +0100)] 
Update jackson-core to 2.13.2

6 months agoUpdate log4j-api, log4j-core to 2.17.2
Scala Steward [Sun, 27 Feb 2022 09:03:30 +0000 (10:03 +0100)] 
Update log4j-api, log4j-core to 2.17.2

6 months agoBump actions/checkout from 2.4.0 to 3.0.0
dependabot[bot] [Tue, 1 Mar 2022 19:19:32 +0000 (19:19 +0000)] 
Bump actions/checkout from 2.4.0 to 3.0.0

Bumps [actions/checkout](https://github.com/actions/checkout) from 2.4.0 to 3.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2.4.0...v3.0.0)

- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major

Signed-off-by: dependabot[bot] <support@github.com>
6 months agoUpdate Apache Daffodil KEYS
Shane Dell [Wed, 2 Mar 2022 19:38:42 +0000 (14:38 -0500)] 
Update Apache Daffodil KEYS

7 months agoChange output of dfdlx:trace from stderr to the logger
U-COLUMBIA\arevello [Tue, 22 Feb 2022 21:51:12 +0000 (16:51 -0500)] 
Change output of dfdlx:trace from stderr to the logger

dfdlx:trace now outputs to the info level of the logger instead of the previous stderr. A CLI parsing test was added to demonstrate the feature


7 months agoBump actions/setup-java from 2.5.0 to 3.0.0
dependabot[bot] [Thu, 24 Feb 2022 19:16:58 +0000 (19:16 +0000)] 
Bump actions/setup-java from 2.5.0 to 3.0.0

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.5.0 to 3.0.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v2.5.0...v3.0.0)

- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-major

Signed-off-by: dependabot[bot] <support@github.com>
7 months agoUpdate scala-parser-combinators to 2.1.1
Scala Steward [Sat, 19 Feb 2022 17:03:56 +0000 (18:03 +0100)] 
Update scala-parser-combinators to 2.1.1

7 months agoUpdate sbt-native-packager to 1.9.9
Scala Steward [Mon, 21 Feb 2022 19:03:41 +0000 (20:03 +0100)] 
Update sbt-native-packager to 1.9.9

7 months agoCheck for RepType when getting element length
Josh Adams [Thu, 2 Dec 2021 03:07:32 +0000 (22:07 -0500)] 
Check for RepType when getting element length

Now using a repElement value that is either the element itself or, if
optRepTypeElement is defined, the repTypeElement.  This avoids the
proliferating conditionals where we needed to check to see if
optRepTypeElement was defined or not.

There may be more places where repElement should be used, but this
covers all of our existing needs.


7 months agoUpdate Saxon-HE to 11.2
Scala Steward [Fri, 18 Feb 2022 13:04:06 +0000 (14:04 +0100)] 
Update Saxon-HE to 11.2

7 months agoImprove diagnostic for no forward progress
Josh Adams [Thu, 17 Feb 2022 16:29:30 +0000 (11:29 -0500)] 
Improve diagnostic for no forward progress

Improved diagnostic message now contains reference to the array and
describes how it is stuck in an infinite loop.


7 months agoModify the release candidate container to work for both daffodil and vscode
Steve Lawrence [Fri, 11 Feb 2022 20:49:06 +0000 (15:49 -0500)] 
Modify the release candidate container to work for both daffodil and vscode

- When running the release candidate script, prompt the user for either
  "daffodil" or "daffodil-vscode" to determine which repository to
  release. This changes which repo is checked out, how the repo is
  built, and which files are copied to the dist directory. All other
  automated build steps are common and are unchanged.
- Daffodil release files are still installed to dist.apache.org/repos/dist/dev/daffodil/
- VS Code release files are installed to dist.apache.org/repos/dist/dev/daffodil/daffodil-vscode

Also did some cleanup to the container script:

- Move wix files and Docker setup/entrypoint scripts out of /root and
  into /opt and /usr/bin, respectively. With this change, the only files
  in /root are build files, making it easier to verify release artifacts
- Add the --rm option to podman run. This container is short lived and
  does not need to exist once it finishes


7 months agoAdded charset for ICAO Aircraft IDs.
Michael Beckerle [Tue, 15 Feb 2022 22:39:59 +0000 (17:39 -0500)] 
Added charset for ICAO Aircraft IDs.

Added test showing TDML Runner bug.


7 months agoCall setFinished on the correct data output stream
Josh Adams [Mon, 14 Feb 2022 22:51:20 +0000 (17:51 -0500)] 
Call setFinished on the correct data output stream

When splitting the data output stream during unparse for a bitOrder
change, we had been setting the incorrect DOS to finished. We need to
call dos.setFinished(UState) before we update the UState's
dataOutputStream to the new split DOS.


7 months agodfdl:contentLength and valueLength for prefixed
Michael Beckerle [Mon, 14 Feb 2022 18:38:00 +0000 (13:38 -0500)] 
dfdl:contentLength and valueLength for prefixed

For lengthKind prefixed and complex types,
captures the content and value lengths.
For simple types captures the content length.

valueLength for simpleTypes unchanged.

Added test cases for complex types and
contentLength for simple types.

Test added showing prefixed + valueLength for
simple values with trimming of pad-char does
NOT work (DAFFODIL-2658)

Tests added to improve coverage of prefixed
length corner cases around lengthUnits
'characters' and utf-8/variable-width encodings.

Rename maybeComputedLength to reflect "InBits" units.


7 months agoUpdate sbt-native-packager to 1.9.8
Scala Steward [Mon, 14 Feb 2022 21:06:57 +0000 (22:06 +0100)] 
Update sbt-native-packager to 1.9.8

7 months agoUpdate alignment to improve correctness and prevent deadlocks
Steve Lawrence [Wed, 2 Feb 2022 18:47:38 +0000 (13:47 -0500)] 
Update alignment to improve correctness and prevent deadlocks

Three changes are made to how alignment works:

1. When statically determining if alignment is needed or not, we
   previously did not implement prefixed length elements and just
   assumed no alignment information. This prevented optimizations when
   prefixed elements existed. This implements the approximate length of
   prefixed elements to be a multiple of their lengthUnits, which should
   allow many alignment parsers/unparsers to optimize out and avoid

2. When asking about the alignment of prior elements (e.g. parents,
   previous siblings) we can sometimes get an answer of no information.
   This most commonly happens when asking about the prior alignment of
   model group that is the first child in a global declaration. In these
   cases, we do not know how or where the global declaration will be
   referenced, and so it could have any alignment. And because the
   alignment algorithm only looks at lexical scope, it cannot make any
   decisions based on those references. So, in this kinds of cases where
   we have no information about prior alignment, we must assume we have
   no information. This means we will now have some alignment
   parsers/unparsers that we simply cannot optimize out, but this also
   means we fix a bug where there was required alignment that was
   incorrectly optimized out because it assumed known alignment.

3. Be less pessimistic about assigning lengths of the
   SimpleTypeRetryUnparser. This unparser previously assumed no length
   information about the suspension, which meant that we lost bit
   position information about suspensions and the locations of buffered
   data output streams. This could lead to AlignmentFillUnparsers
   getting deadlocked. This changes the logic so that when we can
   statically determine that there will be no padding/fill bytes/etc.
   and that the actual unparsed length will be exactly the same as the
   target unparse length, then we can use that length and give more
   information to the DataOutputStreams to avoid deadlocks.


7 months agoBump actions/github-script from 5.1.0 to 6.0.0
dependabot[bot] [Fri, 11 Feb 2022 20:06:23 +0000 (20:06 +0000)] 
Bump actions/github-script from 5.1.0 to 6.0.0

Bumps [actions/github-script](https://github.com/actions/github-script) from 5.1.0 to 6.0.0.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v5.1.0...v6.0.0)

- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-major

Signed-off-by: dependabot[bot] <support@github.com>
7 months agoFix fn:exists when unparsing non-blocking expressions
Steve Lawrence [Wed, 9 Feb 2022 15:46:46 +0000 (10:46 -0500)] 
Fix fn:exists when unparsing non-blocking expressions

Unparsing non-blocking expressions represent expression that are only
backwards referencing and will not require a suspension. This means that
the associated node must be final, and so we can immediately respond
that the element exists or not. Rethrowing the associated exception not
correct in this case. That is only correct when suspensions will be
involve, in which case that exception triggers the suspension logic.


7 months agoUpdate Saxon-HE to 11.1.1
Scala Steward [Fri, 4 Feb 2022 21:06:37 +0000 (22:06 +0100)] 
Update Saxon-HE to 11.1.1

Dependencies.scala: Remove xmlresolver lines now redundant since
Saxon-HE 11.1.1 has added missing transitive dependencies on
xmlresolver and xmlresolver data jars.

7 months agoUpdate typesafe:config to 1.4.2
Scala Steward [Wed, 2 Feb 2022 15:08:49 +0000 (16:08 +0100)] 
Update typesafe:config to 1.4.2

7 months agoFix Incorrect isError Scaladoc
olabusayoT [Mon, 31 Jan 2022 19:56:40 +0000 (14:56 -0500)] 
Fix Incorrect isError Scaladoc

- scaladoc described opposite behavior of isError


7 months agoUpdate Saxon-HE to 11.1
Scala Steward [Tue, 1 Feb 2022 21:20:48 +0000 (22:20 +0100)] 
Update Saxon-HE to 11.1

Add new xmlresolver dependencies needed by Saxon 11.1

bin.LICENSE - Remove PCOLLECTIONS notice (gone since Saxon,
THAI (gone since Saxon 11.1), and UNICODE (ditto).  Also sort "This
product bundles 'NAME' ..."  sections alphabetically by NAME and word
each first line more uniformly.

bin.NOTICE - Add xmlresolver notice.

Dependencies.scala - Update Saxon-HE to 11.1 and add the necessary
xmlresolver dependencies.

7 months agoSDE if include/import schemaLocation not found.
Michael Beckerle [Tue, 1 Feb 2022 16:08:11 +0000 (11:08 -0500)] 
SDE if include/import schemaLocation not found.


7 months agoReplace WeakHashMap TDML cache with a custom cache we have more control over
Steve Lawrence [Mon, 31 Jan 2022 13:59:31 +0000 (08:59 -0500)] 
Replace WeakHashMap TDML cache with a custom cache we have more control over

Commit 4cc0863e71 modified the TDML compile result cache to use a
WeakHashMap. While this worked in some cases, it relied on the garbage
collector not being too aggressive. If the garbage collector
aggressively cleans up our WeakHashMap entries, or something like an IDE
frequently causes the GC to be run in between tests, it becomes
difficult to share compiled results between different DFDL Test Suites.
This leads to excessive schema compilation.

To fix this, this modifies to global TDML cache to be a normal HashMap,
with expiration times stored with each compile result entry. When a DFDL
Test suite finishes, it marks the compile results it uses with an
expiration time. Entries are removed form this cache when the expire
time is reached.

To minimize the size of this global cache, we also only store
non-embedded schemas in it. Embedded schemas cannot be shared between
different TDML files/DFDL Test suites, so putting them in the global
cache is unnecessary. Instead, compile results for embedded schemas are
stored in a cache local to the DFDL Test Suite. They will be garbage
collected when the DFDL Test Suite is garbage collected.


7 months agoUpdate sbt to 1.6.2
Scala Steward [Tue, 1 Feb 2022 05:11:43 +0000 (06:11 +0100)] 
Update sbt to 1.6.2

7 months agoUpdate os-lib to 0.8.1
Scala Steward [Mon, 31 Jan 2022 21:05:24 +0000 (22:05 +0100)] 
Update os-lib to 0.8.1

7 months agoUpdate daffodil-cli link syntax
Brennan Fox [Tue, 1 Feb 2022 03:15:28 +0000 (22:15 -0500)] 
Update daffodil-cli link syntax

7 months agoAdded test to confirm delimiter behavior.
Michael Beckerle [Mon, 31 Jan 2022 13:59:04 +0000 (08:59 -0500)] 
Added test to confirm delimiter behavior.


7 months agoUpdate xercesImpl to 2.12.2
Scala Steward [Thu, 27 Jan 2022 11:06:54 +0000 (12:06 +0100)] 
Update xercesImpl to 2.12.2

8 months agoDisable capture value length parsers for all delimited simple types
Steve Lawrence [Wed, 26 Jan 2022 12:22:56 +0000 (07:22 -0500)] 
Disable capture value length parsers for all delimited simple types

We already disable capture value length parsers for simple types with
representation="text" because the value parsers for those simple text
types directly calculate the value length themselves. This is needed
because these parsers have special logic for excluding things like
delimiters and padding from the length.

Additionally, simple types that aren't text (e.g. hex binary, packed
decimal) but are delimited use the same simple text parsers that capture
value length. So we must also disable capture value length parsers for
delimited simple types as well. This ensures we do not have multiple
capture value length logic for the same element that may conflict.


8 months agoUse setVariable value expression to get referenced elements
Steve Lawrence [Mon, 24 Jan 2022 17:56:51 +0000 (12:56 -0500)] 
Use setVariable value expression to get referenced elements

When trying to calculcate which elements are referenced via
dfdl:setVariable expressions, which is used for things like value and
content length, we incorectly used the default expression associated
with the dfdl:defineDariable instead of the actual value expression of
the dfdl:setVariable. This modifies the logic to use the correct


8 months agoAdded test to reproduce prefixed length aspect.
Michael Beckerle [Mon, 24 Jan 2022 17:42:01 +0000 (12:42 -0500)] 
Added test to reproduce prefixed length aspect.


8 months agoEnsure quasi elements for type calc expressions have a parent
Steve Lawrence [Mon, 24 Jan 2022 13:30:20 +0000 (08:30 -0500)] 
Ensure quasi elements for type calc expressions have a parent

These quasi elements aren't really part of the infoset so a parent
element isn't actually needed, except for in some rare cases such as
when walking the infoset in the interactive debugger. There may also be
other edge cases we are unaware of. So ensure that these quasi type calc
elements have a parent, making it the same as its related simple


8 months agoAdd test that reproduces Runtime SDE bug.
Michael Beckerle [Fri, 21 Jan 2022 14:05:10 +0000 (09:05 -0500)] 
Add test that reproduces Runtime SDE bug.


8 months agoAdd a global TDML CompileResult cache
Steve Lawrence [Fri, 21 Jan 2022 19:30:15 +0000 (14:30 -0500)] 
Add a global TDML CompileResult cache

We previosly only cache CompileResults on individual DFDLTestSuites.
This meant that we could compiled schemas within a single test suite,
but not between tests suites. This could lead to lots of duplicate
schema compilation if multiple .tdml files referenced the same schema

To avoid this, CompileResults are now stored in a global WeakHashMap
instead of the DFDLTestSuite. And DFDLTestSuites are changed to maintain
strong references to the keys of the CompileResult they use. This
ensures that as long as a DFDLTestSuite exists, so will all of its
CompileResults, so tests within a DFDLTestSuite can share them. And
after the DFDLTestSuite is garbage collected, as long as those weak
references aren't also garbage collected, other DFDLTestSuites will be
able to use them, and help to minimize compilation same schemas used in
different TDML files.


8 months agoReset genjavadoc-plugin to 0.18
Scala Steward [Fri, 14 Jan 2022 13:09:57 +0000 (08:09 -0500)] 
Reset genjavadoc-plugin to 0.18

8 months agoUpdate woodstox-core to 6.2.8
Scala Steward [Fri, 14 Jan 2022 09:07:28 +0000 (10:07 +0100)] 
Update woodstox-core to 6.2.8

8 months agoAdded tests for unparser prefixed length deadlock
Michael Beckerle [Fri, 14 Jan 2022 17:21:43 +0000 (12:21 -0500)] 
Added tests for unparser prefixed length deadlock


8 months agoAdd a "daffodil" alias to the RPM
Steve Lawrence [Mon, 27 Dec 2021 13:57:31 +0000 (08:57 -0500)] 
Add a "daffodil" alias to the RPM

The official name of the Daffodil RPM is "apache-daffodil", which means
this intuitive command to install the RPM with dnf does not work:

    dnf install daffodil

Instead you need to install using the full name:

    dnf install apache-daffodil

To support both commands, adds a "Provides: daffodil" tag to the RPM
build configuration, which essentially adds an alias so that users can
dnf install either "daffodil" or "apache-daffodil".


8 months agoFix C compilation errors due to name collisions
John Interrante [Thu, 13 Jan 2022 00:51:59 +0000 (16:51 -0800)] 
Fix C compilation errors due to name collisions

Runtime2 was generating C code with compilation errors from schemas
with name collisions in elements/types or even name collisions with
names in C header files.  Make runtime2 build more distinct C struct
names to prevent those name collisions.  Also make runtime2 generate
correct root element name everywhere using same method.

Main.scala: Don't pass rootNS to generateCode method.

DFDLParserUnparser.scala: Remove generateCode's rootNS parameter.

CodeGenerator.scala: Remove generateCode's rootNS parameter.  Pass
root from CodeGenerator constructor to CodeGeneratorState constructor
instead.  Don't pass rootElementName to generateCodeFile method or
rootNS to generateCode method.

CodeGeneratorState.scala: Add root parameter to CodeGeneratorScala
constructor.  Remove firstElementSeen and change elementNotSeenYet,
erdName, buildName, and localName (rename to cStructName) to handle
elements/types with same names by building hopefully unique names for
their C struct names.  Get root element's name from root parameter
everywhere its name is needed.  Use element's local name, not C struct
name, in defineQNameInit (also addComputations) and rename qnameInit
to qNameInit.  Remove generateCodeFile's rootElementName parameter and
get rootName from constructor's root parameter instead.

ElementParseAndUnspecifiedLengthCodeGenerator.scala: Avoid defining
duplicate ERD structures for simple types as well as complex types.

examples/{NestedUnion,ex_nums}/generated_code.[ch]: Regenerate
generated code examples with more distinct C struct names.

TestCodeGenerator.scala: Don't pass rootNS/None to generateCode.

Runtime2TDMLDFDLProcessor.scala: Don't pass rootNS to generateCode.

collisions.{dat,dat.xml,dfdl.xsd,tdml}: Add test to verify name
collisions don't cause C compilation errors anymore.

TestCollisions.scala: Run above test.

Rat.scala: Ignore collisions.dat (binary file).


8 months agoRemove 4 sonarcloud code smells
Michael Beckerle [Wed, 12 Jan 2022 14:36:03 +0000 (09:36 -0500)] 
Remove 4 sonarcloud code smells


8 months agoImprove performance of XMLUtils.coalesceAllAdjacentTextNodes
Steve Lawrence [Wed, 12 Jan 2022 13:27:45 +0000 (08:27 -0500)] 
Improve performance of XMLUtils.coalesceAllAdjacentTextNodes

Accessing the length of a Seq is linear with the size of the Seq. And
accessing an index of a Seq is also linear with the index to get. The
coalesceAdjacentTextNodes function has a loop that iterates over the
children and gets both the length and index of the children Seq for
every iteration, making this polynomial complexity. For very large
infosets with many many children, the complexity explodes and takes an
incredibly long time, in one case up to 8 hours.

This function is called by the XMLUtils.normalize() function, which is
used for comparing TDML infosets and building the NullInfosetOuputter,
so for large infosets, these common functions can be very slow.

This changes the loop to use a foreach instead, which avoids the length
and indexing calculation, making this function linear and allowing TDML
test compaison and NullInfosetOutputters to complete in a reasonable
amount of time for large infosets (e.g. seconds instead of hours for
large infosets).


8 months agoUpdate sbt-scoverage to 1.9.3
Scala Steward [Tue, 11 Jan 2022 17:14:44 +0000 (18:14 +0100)] 
Update sbt-scoverage to 1.9.3

8 months agoBump actions/github-script from 5.0.0 to 5.1.0
dependabot[bot] [Fri, 7 Jan 2022 19:13:29 +0000 (19:13 +0000)] 
Bump actions/github-script from 5.0.0 to 5.1.0

Bumps [actions/github-script](https://github.com/actions/github-script) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v5.0.0...v5.1.0)

- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-minor

Signed-off-by: dependabot[bot] <support@github.com>
8 months agoSupport --infoset null for CLI unparsing
Steve Lawrence [Wed, 5 Jan 2022 16:22:37 +0000 (11:22 -0500)] 
Support --infoset null for CLI unparsing

A "null" infoset inputter does not normally make sense in the context of
unparsing because there must always be an infoset to unparse--you can't
unparse null data. But in the context of performance, a "null" infoset
inputter could be considered one that has close to zero overhead
(similar to the null infoset outputter for parsing), which can help to
understand the raw speed of Daffodil unparsing operations and to compare
different infoset inputter overheads.

To support this, this allows "null" to be used for the --infoset option
when unparsing. This triggers the use of a new NullInfosetInputter,
which uses a pre-created array of infoset events that are exactly what
the Daffodil unparser expects. The events are created outside of
measured unparser code, so the only overhead that occurs inside measured
code is indexing into the event array and returning fields from the
indexed event, which should give good picture of raw unparse speed.


8 months agoAdded test to reproduce shared group bug.
Michael Beckerle [Fri, 31 Dec 2021 20:31:14 +0000 (15:31 -0500)] 
Added test to reproduce shared group bug.

Commented out currently so it won't break the build.


8 months agoUpdate junit-interface to 0.13.3
Scala Steward [Wed, 29 Dec 2021 23:09:57 +0000 (00:09 +0100)] 
Update junit-interface to 0.13.3

8 months agoUpdate sbt to 1.6.1
Scala Steward [Wed, 29 Dec 2021 11:15:22 +0000 (12:15 +0100)] 
Update sbt to 1.6.1

8 months agoUpdate log4j-api, log4j-core to 2.17.1
Scala Steward [Tue, 28 Dec 2021 23:04:13 +0000 (00:04 +0100)] 
Update log4j-api, log4j-core to 2.17.1

8 months agoUpdate sbt to 1.6.0
Scala Steward [Sun, 26 Dec 2021 19:12:12 +0000 (20:12 +0100)] 
Update sbt to 1.6.0

9 months agoBump actions/setup-java from 2.4.0 to 2.5.0
dependabot[bot] [Tue, 21 Dec 2021 19:13:36 +0000 (19:13 +0000)] 
Bump actions/setup-java from 2.4.0 to 2.5.0

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.4.0 to 2.5.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v2.4.0...v2.5.0)

- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor

Signed-off-by: dependabot[bot] <support@github.com>
9 months agoUpdate sbt to 1.5.8
Scala Steward [Tue, 21 Dec 2021 11:30:55 +0000 (12:30 +0100)] 
Update sbt to 1.5.8

9 months agoUpdate jackson-core to 2.13.1
Scala Steward [Sun, 19 Dec 2021 03:07:32 +0000 (04:07 +0100)] 
Update jackson-core to 2.13.1

9 months agoSetup for 3.3.0-SNAPSHOT development on main branch
Michael Beckerle [Wed, 22 Dec 2021 21:35:13 +0000 (16:35 -0500)] 
Setup for 3.3.0-SNAPSHOT development on main branch

9 months agoUpdate log4j-api, log4j-core to 2.17.0 v3.2.1 v3.2.1-rc2
Scala Steward [Sat, 18 Dec 2021 07:04:50 +0000 (08:04 +0100)] 
Update log4j-api, log4j-core to 2.17.0

9 months agoChange version in build.sbt to 3.2.1 v3.2.1-rc1
Michael Beckerle [Thu, 16 Dec 2021 17:21:34 +0000 (12:21 -0500)] 
Change version in build.sbt to 3.2.1

This is for a urgent patch release to fix 2 CVEs (log4J, JDOM)
and to incorporate the fix for unparsing layers with checksums
(DAFFODIL-2608) which
is a key feature of 3.2.0 found to be broken.


9 months agoUpdate jdom2 to
Scala Steward [Wed, 8 Dec 2021 07:04:11 +0000 (08:04 +0100)] 
Update jdom2 to

9 months agoChange layering to pass and use state.
Michael Beckerle [Wed, 15 Dec 2021 14:11:14 +0000 (09:11 -0500)] 
Change layering to pass and use state.

Removed state from LayerRuntimeInfo

This fixes layer unparsing as the passed state can be the one created for use
by suspensions.

Eliminated LayerSerializedInfo, as it is the same as LayerRuntimeInfo now.

Eliminated VariableHandle (just use VariableRuntimeData)

Tested with PCAP and EthernetIP, both of which now work.

Add daffodil-runtime1-layers to sonarcube


9 months agoUpdate sbt to 1.5.7
Scala Steward [Wed, 15 Dec 2021 07:15:08 +0000 (08:15 +0100)] 
Update sbt to 1.5.7

9 months agoUpdate os-lib to 0.8.0
Scala Steward [Sun, 12 Dec 2021 09:04:37 +0000 (10:04 +0100)] 
Update os-lib to 0.8.0

9 months agoUpdate log4j-api, log4j-core to 2.16.0
Scala Steward [Mon, 13 Dec 2021 21:05:42 +0000 (22:05 +0100)] 
Update log4j-api, log4j-core to 2.16.0

9 months agoUpdate log4j-api, log4j-core to 2.15.0
Scala Steward [Fri, 10 Dec 2021 03:04:47 +0000 (04:04 +0100)] 
Update log4j-api, log4j-core to 2.15.0

9 months agoUpdate sbt to 1.5.6
Scala Steward [Fri, 10 Dec 2021 07:15:06 +0000 (08:15 +0100)] 
Update sbt to 1.5.6

9 months agoRename version header and update C code generator
John Interrante [Thu, 9 Dec 2021 16:16:26 +0000 (11:16 -0500)] 
Rename version header and update C code generator

StringDataInputStreamForUnparse.scala: Restore // $COVERAGE-ON$
because there's a // $COVERAGE-OFF$ preceding it (misc fix too small
for its own JIRA issue).

.clang-format: Move from resources to c so it will be included
alongside Makefile in C code generator's output directory (Makefile
has a "format" goal which needs our .clang-format to do it right).

daffodil_getopt.c: Include renamed version header and add iwyu
comment.  Rename daffodil_program_version to match version header's

version.h: Rename to daffodil_version.h (looks better in dired
listing).  Also rename include guards and daffodil_program_version to
match version header's name.

CodeGenerator.scala: Change version header's name and reorder lines
better semantically.

CodeGeneratorState.scala: Rename include guards and
daffodil_program_version to match version header's name.


9 months agoAdd test to illustrate checksum/layer bug.
Michael Beckerle [Thu, 9 Dec 2021 00:52:13 +0000 (19:52 -0500)] 
Add test to illustrate checksum/layer bug.


9 months agoAdded -Y warning check options
Michael Beckerle [Wed, 21 Apr 2021 00:04:26 +0000 (20:04 -0400)] 
Added -Y warning check options

These 3 were added.

Note we cannot use -Ywarn-nullary-unit, as it interferes with the ability to
create def foo: Unit and override it as any of def, val, or lazy val.
Scala is also changing relative to this with Scala 2.13 and 3.0 which
will eventually require call sites to have () if the definition has ().
Today in Scala 2.12 if the def has () parameter list, the call site
can either have, or not have, the ().

It is still considered proper style to use a parameter list () if
the method has side-effects.

All Junit test methods should have () parameter lists for this reason.

Rebase onto 3.2.0


9 months agoEnsure we use UTF-8 when outputting and comparing SAX output
Steve Lawrence [Mon, 6 Dec 2021 19:56:33 +0000 (14:56 -0500)] 
Ensure we use UTF-8 when outputting and comparing SAX output

Whenever Daffodil outputs an infoset, it always does so with UTF-8
encoding. The one exception to this when converting SAX evensts to in
the CLI and TDML runner. This means that depending on a users system
encoding, tests may act differently and lead to failure. This kind of
system-dependent behavior is not desierable. So instead, thiss modifies
SAX related output to use UTF-8 so that a users environment does not
affect the results of tests or results of a parser.

Also use StandardCharsets instead of a encoding name string where


9 months agoUse same version for both log4j-api and log4j-core
John Interrante [Mon, 6 Dec 2021 21:48:30 +0000 (16:48 -0500)] 
Use same version for both log4j-api and log4j-core

Daffodil's libs contain log4j-api-2.13.2 and log4j-core-2.14.1.  They
should contain the same version of both log4j-api and log4j-core.

project/Dependencies.scala: Add log4j-api as well.


9 months agoFix NVI and SetVar so expr has access to properties of term.
Michael Beckerle [Wed, 24 Nov 2021 21:05:35 +0000 (16:05 -0500)] 
Fix NVI and SetVar so expr has access to properties of term.

Also added tests demonstrating access to Term values, such as BitOrder,
which was required for usign dfdlx:lookAhead.

Add tests that characterize poor diagnostics for setVar/nvi expressions.

test_setVariable_neg_line_info_01 added (but commented out for now)

test_newVariableInstance_neg_line_info_01 added (but commented out for now)


9 months agoAdd tests verifying correct textNumberRoundingIncrement behavior
Steve Lawrence [Mon, 29 Nov 2021 21:13:19 +0000 (16:13 -0500)] 
Add tests verifying correct textNumberRoundingIncrement behavior

Tests added based on comments at https://unicode-org.atlassian.net/browse/ICU-20425

All tests pass with fixes made as part of ICU 70.1, some tests fail with
older versions.