3 days agoPrepend rather than append when adding required evaluations to the root OOLAGContext master
Steve Lawrence [Thu, 18 Jan 2018 17:25:32 +0000 (12:25 -0500)] 
Prepend rather than append when adding required evaluations to the root OOLAGContext

Setting the OOLAG context causes an append the required evaluations to
the root requiredEvalFunctions list. Because it is an append, scala will
make a copy of the requiredEvalFunctions list and append the items to
that copy. For very large schemas with lots of Expressions (which calls
setOOLAGContext), this can result in a huge amount of copies, resulting
in large performance slowdowns during schema compilation. To prevent
this, change the append to a prepend, which does not require a copy of
the very large root requiredEvalFunctions list and will only copy the
much smaller requiredEvalFunctions list from the child. This greatly
reduces the copying and improves schema compilation time.


6 days agoFix so query-style paths are allowed if unambiguous at runtime.
mbeckerle [Thu, 28 Dec 2017 22:20:47 +0000 (17:20 -0500)] 
Fix so query-style paths are allowed if unambiguous at runtime.

This fix done for nato-stanag-5516 latest schema which has choice branches that share an element name, and expressions that then refer to that element.
(That Link16 is currently broken is DAFFODIL-1869)

So /foo/bar if bar has multiple occurrances, but isn't an array, is
going to be accepted for compiling, though with a warning.
At runtime it is going to test for multiple values, and if there
are more than 1 it will issue a runtime SDE.

Someday it would be good to improve analysis to recognize choices so
that these warnings aren't issued in that case.

Infoset changed so we get a Runtime SDE if expression evaluates to more
than one node.

Tests added which insure one gets this warning, and the runtime SDE in
proper situations. See test_queryStyle1 and test_queryStyle2.

Modified TDML runner to check for warnings whether or not we also get
errors. This fixes DAFFODIL-1583.
Tests test_warningWhenExpectingSuccess and
test_warningWhenExpectingError are in the TDML Runner tests.

Modified expression compiler so that one can issue warnings from it, and
they get saved on the associated schema component.

Modified debugger to capture and issue any warnings that come from path
expression compilation at debug time.

Eliminated circularity bug problem caused by asking expression tree for
isError which checks errors for *everything*.

Refactored confusing ExpresssionCompiler class.

Methods are now explicitly named: compileProperty, compileDelimiter, and
compileExpression, with shared helper routines.


2 weeks agoOptimizations with Infoset HashMap lookups/insertions
Steve Lawrence [Fri, 5 Jan 2018 16:07:33 +0000 (11:07 -0500)] 
Optimizations with Infoset HashMap lookups/insertions

- Add a new variable to DPathElementCompileInfo that keeps track of
  which path steps are used in an expression. Because the variable is
  set when expression are compiled, which relies on the
  DPathElementCompileInfo already existing, this new variable is a var
  that is toggled during expression compilation. This replaces the
  notReferencedByExpressions in the ElementRuntimeData, which isn't
  actually used, and can't work since the ERD must exist before
  expression compilation.
- Use this new variable to only insert elements into the Infoset fast
  lookup hash map if that flag is set and thus might be needed in an
  expression. This minimizes the number of hash insertions, greatly
  improving performance.
- Add a new tunable, allowExternalPathExpressions, which allows one to
  evaluate expression on path steps that were not compiled at schema
  compilation time (e.g. using expressions when debugging). When this
  tunable is true and a path step is not found in the fast lookup hash
  map, a slower linear search is performed to see if the element exists.
  This is slower, but should only occur when debugging/testing. This
  tunable is automatically set when debugging is enabled.
- Remove the resetChildArray function. This isn't used anywhere and is
  not adequately tested, and it isn't clear what it is supposed to do.
- In the hashmap, rather than checking if the hashmap containsKey()
  and then calling get() if true, just call get() and check for null for
  existence. This avoids an extra hash lookup.
- Use += rather than append() to add to an ArrayBuffer. The append() takes a
  vararg, which causes scala to allocate a WrappedArray for a single
  element. Instead, use += which avoids that allocation. Similary,
  instead of the companion object ArrayBuffer(), which uses a vararg
  constructor, just use "new ArrayBuffer()" and append to it using +=,
  also avoiding a WrappedArray allocation.
- Use reduceToSize rather than dropRight with the ArrayBuffer. dropRight
  is more general and slower than reduceToSize.
- Make the childNodes array non-lazy. The vast majority of complex
  elements will end up using the array and causing it to be allocated,
  so this removes all the lazy checks to determine if it was initialized
  or not.


2 weeks agoRevised daffodil-io module to require passing in a FormatInfo object. 20/head
Mike Beckerle [Wed, 31 May 2017 13:44:57 +0000 (09:44 -0400)] 
Revised daffodil-io module to require passing in a FormatInfo object.

This is just one part in addressing this major issue of daffodil
schema compiler slowness/speed.

It also fixes DAFFODIL-1843 (bit order and OVC interaction bug)

The FormatInfo object is used to obtain the very commonly used format
properties like byteOrder, bitOrder, etc. This eliminates the need to
call setters that set these properties, eliminates the need to
save/restore them on backtracking, and when evaluating unparser
suspensions. Instead, the daffodil runtime just passes an object
(the PState/UState) which contains this information - getting it from
the ERD of an element most likely, or if runtime defined, from an
Evaluatable object which caches the property value on the infoset

The state/finfo has a ref to the processor which must be set so that
FormatInfo can obtain the right ERD/MGRD from that.

THis change eliminates all the "change" processors
(e.g., EncodingChangeParser, ByteOrderChangeParser, and
BitOrderChangeParser and
unparser variants thereof) the insertion of which uses compile-time
context-upward analysis. This should help with increasing sharing and
avoiding duplicated work and data structures in the schema compiler

There is some overhead in this change - performance impact will have to
be measured. It should reduce backtracking overheads to compensate

Unparser runtime was improved also to remove unneeded DOS splits.

We were splitting the DOS even for evaluations of just expressions -
things that couldn't write to the DOS at all. So we were creating
lots of known zero-length buffering DOS for no reason.

Improved scaladoc and comments to the suspension-related code

It seems our test coverage of LE_MSBF is thin at the unit test level.

Two TDML tests moved from scala-debug to scala-new as they work now.

Enhance TDML runner for config, defaultConfig, in files or embedded.

Note: Entity replacer/cooker for fill byte (FillByteCooker) isn't
correctly.  See comments in DAFFODIL-1646.


2 weeks agoUpdate eclipse classpaths to work with latest.
mbeckerle [Mon, 18 Dec 2017 21:35:02 +0000 (16:35 -0500)] 
Update eclipse classpaths to work with latest.

2 weeks agoClean up SBT warnings
Steve Lawrence [Tue, 2 Jan 2018 16:35:27 +0000 (11:35 -0500)] 
Clean up SBT warnings

- Change how we disable publishing some subprojects by setting "skip in
  publish" to true. The previous method of changing publishArtifact and
  packagedArtifacts was a hack that broke some things, including "sbt
  updateClassifiers", which resulted in an error message about "a
  required artifact is not listed by module descriptor".
- Both sbt and the sbt-native-pacakger plugin have transitive
  dependencies to different versions of plexus-utils and guava, but with
  different major version numbers. SBT interprets the major version
  number differences as having dependencies that are potentially not
  binary compatible, resulting in a warning message when starting SBT.
  It appears the binary incompatibilities, if they exist, do not affect
  building Daffodil, so this specifies dependencyOverrides in
  plugins.sbt to force use of the latest dependencies and remove the
- Modify the 'nopublish' val to also disable 'sbt publishM2' when
  publishing to a local maven repository.


5 weeks agoFix eclipse classpath for daffodil-io to exclude test dirs.
mbeckerle [Fri, 15 Dec 2017 17:52:02 +0000 (12:52 -0500)] 
Fix eclipse classpath for daffodil-io to exclude test dirs.


5 weeks agoRename CLI tests directory from 'scala-cli' to 'scala'
Steve Lawrence [Mon, 11 Dec 2017 20:04:39 +0000 (15:04 -0500)] 
Rename CLI tests directory from 'scala-cli' to 'scala'

Commit cf322c0e5c updated the sbt configuration so that running CLI
tests required one to do 'sbt daffodil-cli/test' so that it could use
the normal 'src/test/scala' directory structure as other tests. However,
that commit forgot to rename the 'scala-cli' directory 'scala', prevent
sbt from finding and running any of the cli tests. This does that rename
so 'sbt daffodil-cli/test' can actually find the tests.


6 weeks agoFix invalid URLs in source files
Steve Lawrence [Thu, 7 Dec 2017 13:00:40 +0000 (08:00 -0500)] 
Fix invalid URLs in source files

- Fixes SCM information for the move to gitbox
- Fixes location of the DFDL specification on


6 weeks agoUpdate sbt to 1.x, simplifing build config and replacing deprecated syntax
Steve Lawrence [Thu, 30 Nov 2017 18:30:52 +0000 (13:30 -0500)] 
Update sbt to 1.x, simplifing build config and replacing deprecated syntax

- Remove build.scala. Everything is now in the global build.sbt or
  build.sbt specific to a subproject
- Fix macrolib so it no longer needs to be published--it now only has a
  compile time dependency and mappings are added to copy the generated
  macros to the correct location
- Remove the 'sbt cli' tasks. Instead, make the cli tests use the exact
  same directory structure as tests (meaning scala-debug can now work), but
  do not aggregate cli in the root project. This means that to run any
  cli commands, one must specify the daffodil-cli subproject, e.g. 'sbt
  daffodil-cli/test' (also requires modificaations to the Travis CI
- Move scala-new tests to scala and remove he 'sbt new' commands. The
  'new' workflow added extra overhead and is no longer needed
- Remove sbt pgp plugin. That should be configured locally in ~/.sbt if
  a user needs to published signed releases


7 weeks agoFix truncation bug when unparsing escapeKind="character"
Steve Lawrence [Thu, 30 Nov 2017 13:02:33 +0000 (08:02 -0500)] 
Fix truncation bug when unparsing escapeKind="character"

Daffodil had a logic bug when unparsing a field with an escape scheme
with escapeKind="character". In such a case, we run the field DFA
looking at each character to unparse to see if it could potentially
start a delimiter and thus may need to be escaped. If we do find such a
character, we then run each delimiter DFA on the input to determine if
the delimiter actually existed or if we just found a character the looks
like it starts a delimiter but actually doesn't. We then gather up
successful matches for a longest match check. This logic is all

The problem is that for escapeKind="character", each time a delimiter
DFA failed to match, we would move the field register to the next rule. So
if we checked for 10 delimiters and 9 failed, we would advance the field
register 9 times, which is wrong and would cause the field register to
end prematurely, leading to truncated unparsed data.

Instead, we should wait until all the delimiter DFAs are checked, and
only if none match (i.e. success.isEmpty is true) then we advance the
field register by one rule to add that character to the field. This
patch fixes the text delimited unparser to use this logic for
escapeKind="character". This is actually very similar logic that
escapeKind="block" had, so this matches that correct behavior. Comments
were also added to clarify this section of code.


7 weeks agoEnsure marks are always returned to the markpool
Steve Lawrence [Mon, 6 Nov 2017 22:59:54 +0000 (17:59 -0500)] 
Ensure marks are always returned to the markpool

MarkPool leaks have been notoriously difficult to track down. This is
partly due to the fact that we don't check for leaks until the very end
of parsing, so we don't know there is a leak until well after it has
happened, giving us little information about where or why.

Additionally, we do not currently return leaked marks. Since marks are
stored in a ThreadLocal, and since they aren't returned, leaked marks
are forever leaked, and every subsequent parse will cause an assertion
due to the final validation check.

This modifies the users of marks to always return marks so the
processing could potentially continue if an API user wanted to (like in
the case of NiFi). This also throws an invariant failed assertion a mark
is leaked so we know exactly where it occurred. Furthermore, if an
exception was the cause of a mark leak, the stack trace of the exception
is captured to help determine the original cause.


7 weeks agoRemove charsReadUntilDelim from Registers
Steve Lawrence [Wed, 29 Nov 2017 16:42:21 +0000 (11:42 -0500)] 
Remove charsReadUntilDelim from Registers

This field is not used and currently creates a memory leak since it is
never reset and frequently appended to. Since it is not used, just remove


7 weeks agoAdd travis.yml file for continuous integration with Travis CI
Steve Lawrence [Thu, 26 Oct 2017 16:50:39 +0000 (12:50 -0400)] 
Add travis.yml file for continuous integration with Travis CI

- This tests compiling source, tests, and debug tests, running all tests
  and cli tests, building CLI zip/tar/rpm, and building javadoc and
- The rpm package is needed for rpmbuild used by rpm:packageBin
- Unsets _JAVA_OPTS, which causes strings to be written to stdout,
  interfering with CLI tests


7 weeks agoFix eclipse classpaths and application that maintains them. 9/head
mbeckerle [Wed, 29 Nov 2017 13:41:19 +0000 (08:41 -0500)] 
Fix eclipse classpaths and application that maintains them.

Problem was being caused by duplicate entries in bundles and jars
subdirs of lib_managed.

sbt populates same jars into both bundles and jars directories
for a number of dependencies.

Duplicates removed, and tool now checks and excludes duplicates.


7 weeks agoEliminate spurious SDE when using lengthKind pattern on all-text file. 7/head
mbeckerle [Wed, 29 Nov 2017 12:32:16 +0000 (07:32 -0500)] 
Eliminate spurious SDE when using lengthKind pattern on all-text file.

The isScannable computation is incorrect. For entirely textual formats
in one encoding it still comes up with isScannable false.

This causes a SDE if you are using lengthKind pattern. The SDE says the
data must be scannable in order to use lengthKind pattern.

This applies the patch 22b7bc7238a5434570ebd088357c9f25bf09a8c9 from
support/v2.0.x branch to the master branch.

There has been enough change to master (files moved, removed, etc.), and
some functional change affecting test behavior, and this is such a small
change set, that applying it by just re-editing the files was easiest;
hence, I did not do a rebase and then resolve the conflicts, nor use any
git cherry-pick operation.


8 weeks agoUpdates for Apache incubation
Steve Lawrence [Thu, 26 Oct 2017 16:45:12 +0000 (12:45 -0400)] 
Updates for Apache incubation

- Update URLs to point to apache infrastructure
- Add Apache incubating DISCLAIMER
- Remove the use of git to determine version numbers. The version is
  now hardcoded in build.sbt and needs to be updated manually. Not only
  does this reduce complexity, it allows one to build Daffodil from
  source tarballs without needing git installed and without needing
  certain branches and tags.
- Remove the NCSA resolver, not needed for any dependency resolution


2 months agoProperty Resolution - part of fixing schema compilation 5/head
mbeckerle [Mon, 23 Oct 2017 21:50:21 +0000 (17:50 -0400)] 
Property Resolution - part of fixing schema compilation

Refactors property resolving onto elementrefs and grouprefs so
as to eliminate use of backrefs when accessing properties.

Reorganized DSOM for model groups and references to them.

Converted OOLAGHost, SchemaComponent etc. down to LocalElementBase
into traits so that I can mix them the way I need to so that
Global elements aren't terms, etc.

Group references are allowed to carry annotations like dfdl:assert. It
is global group definitions that cannot. (They can't have annotations
period. Annotations go on the model group within the global group

SequenceBase is a ModelGroup is a Term, and is
the base of Sequence and SequenceGroupRef.

SequenceGroupDef is not a SequenceBase. It is GroupDefLike in that
it has children. It is not a Term, because the SequenceGroupRef that
refers to it is the Term.

Groups work exactly analogously to Elements now. For Elements, the Terms
LocalElementDecl and ElementRef. A GlobalElementDecl is *not* a Term.

Added package scaladoc for dsom and grammar packages.

Decided not to rename ModelGroup, nor ElementBase this go-round.

Decided not to try to fix precision of diagnostic messages - most will
have the location of the element ref/group ref not that of the
referenced definition now.


3 months agoRemove concept of slots from InfosetImpl.
Taylor Wise [Wed, 18 Oct 2017 16:25:30 +0000 (12:25 -0400)] 
Remove concept of slots from InfosetImpl.

Remove slotInParentIndex

Delete use of childSlot in UpDownMoves.scala.


4 months agoAdded test_bitOrderOVC1 which illustrates DFDL-1843
mbeckerle [Thu, 14 Sep 2017 21:13:57 +0000 (17:13 -0400)] 
Added test_bitOrderOVC1 which illustrates DFDL-1843

This is a Runtime SDE due to an interaction of bitOrder with
outputValueCalc, discovered originally in the Link16 schema, but
isolated here outside of that context.


4 months agoAdding tests for tunables and fixing typo in setTunable rel/v2.0.0
Beth Finnegan [Thu, 31 Aug 2017 22:37:34 +0000 (18:37 -0400)] 
Adding tests for tunables and fixing typo in setTunable


4 months agoDaffodilTunables is no longer a globally accessed class.
Taylor Wise [Wed, 30 Aug 2017 18:10:58 +0000 (14:10 -0400)] 
DaffodilTunables is no longer a globally accessed class.

SSRD/ERD, PState/UState, Compiler, DataProcessor receive
an immutable instance of DaffodilTunables.


4 months agoFix xs:hexBinary equality check
Josh Adams [Tue, 29 Aug 2017 18:53:16 +0000 (14:53 -0400)] 
Fix xs:hexBinary equality check

Before any sort of equality check on a xs:hexBinary element would need
to be converted to a string. I have now added an equality checker for
byte arrays that allows direct comparison of xs:hexBinary elements
without the need for conversion.


4 months agoFix eclipse classpath errors.
Mike Beckerle [Tue, 29 Aug 2017 17:58:50 +0000 (13:58 -0400)] 
Fix eclipse classpath errors.

4 months agoEnsure Bit/ByteOrderChange parsers always exist at root
Steve Lawrence [Fri, 25 Aug 2017 13:25:29 +0000 (09:25 -0400)] 
Ensure Bit/ByteOrderChange parsers always exist at root

If the dfdl:byteOrder or dfdl:bitOrder properties were not provided,
Daffodil did not complain, and it would not insert a Bit/ByteOrderChange
parser at root. This meant that Daffodil would use a default value,
which in some cases caused incorrect behavior. It also meant that the
check for valid bit and byte orders (e.g. not bigEndian &
leastSignificantBitFirst) never occurred since that only happend in
ByteOrderChange parsers, meaning it could allow invalid bit/byte order

This changes Daffodil so the root element will always insert Bit and
ByteOrderChange parsers, ensuring that the validity of the properties
are correct and ensuring correct parsing/unparsing. This means that
byteOrder is now always required, even in some cases where it might not
technically be needed.

This also modifies the initial UState/PState creation to not set
bit/byte order, but to instead rely on the Bit/ByteOrderChange parsers
to always be inserted first thing.


4 months agoCalculate the approximate length of delimited and pattern lengthKinds for alignment
Steve Lawrence [Fri, 25 Aug 2017 13:09:09 +0000 (09:09 -0400)] 
Calculate the approximate length of delimited and pattern lengthKinds for alignment

By assuming the length of delimited and pattern lengthKinds was 1,
Daffodil was unable to optimize out some alignment unparsers, which
could lead to deadlocks.

This changes that so the length of delimited or pattern lengthKinds is a
multiple of the length of the encoding. This allows Daffodil to optimize
out some alignment unparsers and prevent deadlocks.


5 months agoFix Xerces resource resolution for includes/imports
Steve Lawrence [Mon, 21 Aug 2017 20:42:17 +0000 (16:42 -0400)] 
Fix Xerces resource resolution for includes/imports

After we found a resource (like from an include/import), we reported the
location to Xerces incorrectly. For example, say we resolved the
systemID at


to the absolute URI at


When we created the new Input to return where we found payload.xsd to
Xerces, we set the systemID to the original relative systemID
(org/xsd/payload.xsd), and set the baseURI to the absolute URI
(file:/foo/bar/baz/org1/xsd/payload.xsd). To Xerces, this meant that the
resource was found at the first path relative to the second path. But
the first path relative to the second path is


So parts of the path end up doubled, and Xerces cannot actually find the
resource. We thought this was a bug in Xerces and added heuristics to
remove these doubled paths, but upon further inspection, it was just a
bug in how we created Input's that Xerces used.

This patch fixes this so that the Input sets the systemId to the
resolved absolute URI, and does not set a baseURI. Xerces will not try
to do any relative stuff and the absolute resource will work. This also
means we can remove the heuristics that tried to remove doubled paths
(but which did not actually work in non-trivial cases).

Also, fix how arrayIndexStack and occursBoundsStack modifications are
undone when errors occurr with Arrays. Rather than the Array pushing and
a child rep parser popping on error, the array should do both the push
and pop. The logic was wrong before and things were not popped correctly
in some cases.

DFDL-1832, DFDL-1183

5 months agoAdded new test-stdLayout project for testing include/import.
Mike Beckerle [Fri, 18 Aug 2017 21:55:53 +0000 (17:55 -0400)] 
Added new test-stdLayout project for testing include/import.

This new project (within daffodil) is for testing the standard project
layout. In particular, there are include/import bugs associated with

There is a test in scala-debug which fails with a path containing
Which is clearly wrong given that the directory is

Tests cover cases where a schema file in
src/main/resources/org1/xsd tries to include one from

And where a schema file in
src/test/resources/org2/xsd tries to include one from

And where a TDML embedded schema tries to include one from


5 months agoFixed test embedded-with-include so it actually includes.
Mike Beckerle [Wed, 16 Aug 2017 20:18:09 +0000 (16:18 -0400)] 
Fixed test embedded-with-include so it actually includes.

Had cut/paste error and the test case was requesting the wrong schema.

5 months agoAdding test for bit order without byte order specified
Beth Finnegan [Tue, 22 Aug 2017 18:47:11 +0000 (14:47 -0400)] 
Adding test for bit order without byte order specified


5 months agoEnsure the infoset exists before trying to display it in the debugger
Steve Lawrence [Fri, 18 Aug 2017 14:01:03 +0000 (10:01 -0400)] 
Ensure the infoset exists before trying to display it in the debugger

If you run 'info infoset' before stepping at least once, there will be
no infoset to visit. This checks to make sure that an infoset exists
before trying to print it in the debugger.


5 months agoSDE when arrays or optional elements contain dfdl:outputValueCalc property
Steve Lawrence [Thu, 17 Aug 2017 14:18:40 +0000 (10:18 -0400)] 
SDE when arrays or optional elements contain dfdl:outputValueCalc property


5 months agoModify test to verify that dfdl:inputValueCalc and dfdl:outputValueCalc cannot be...
Steve Lawrence [Thu, 17 Aug 2017 14:59:32 +0000 (10:59 -0400)] 
Modify test to verify that dfdl:inputValueCalc and dfdl:outputValueCalc cannot be on the same element


5 months agoAdded some tests for fixed length strings
Josh Adams [Fri, 4 Aug 2017 18:30:02 +0000 (14:30 -0400)] 
Added some tests for fixed length strings

Testing situations with fixed length strings with a default value and
fixed length string with a length of 0

5 months agoAdd license information for ICU
Steve Lawrence [Thu, 17 Aug 2017 13:29:35 +0000 (09:29 -0400)] 
Add license information for ICU

The ICU package does contain license information, but the link it points
to is dead. Manually override it to a link in the svn repo that works.


5 months agoThrow an Not Yet Implmemented SDE for encodingErrorPolicy="error"
Steve Lawrence [Wed, 16 Aug 2017 16:21:49 +0000 (12:21 -0400)] 
Throw an Not Yet Implmemented SDE for encodingErrorPolicy="error"

It isn't supported and can result in weird behavior and mark pool leaks.
Best to just not allow it.


5 months agoImprove nil checking for infoset outputters
Steve Lawrence [Wed, 16 Aug 2017 11:43:55 +0000 (07:43 -0400)] 
Improve nil checking for infoset outputters

The InfosetOutputters use _.isNilled to determine if an infoset element
is nil. However, _.isNilled can throw an exception if the nilled flag
has not been set (e.g. while debugging). This could lead to thrown
exceptions during the 'info infoset' debugger command. This patch adds a
new isNilled helper function to the InfosetOutputter trait that performs
the correct logic to check if the nilled flag is set and determine if an
element is nilled, and updates all the InfosetOutputters to use this


5 months agoUpdating copyright date in LICENSE
Beth Finnegan [Tue, 15 Aug 2017 19:40:55 +0000 (15:40 -0400)] 
Updating copyright date in LICENSE

5 months agoUpdating input for automated CLI test
Beth Finnegan [Fri, 11 Aug 2017 15:27:40 +0000 (11:27 -0400)] 
Updating input for automated CLI test

5 months agoUpdated line counter to match current file structure.
Mike Beckerle [Mon, 7 Aug 2017 21:40:22 +0000 (17:40 -0400)] 
Updated line counter to match current file structure.

Also includes NiFi and Spark, all new DFDL schemas, etc.

5 months agoModify isError API logic to support validation errors
Steve Lawrence [Mon, 7 Aug 2017 14:54:01 +0000 (10:54 -0400)] 
Modify isError API logic to support validation errors

- isError now returns true if either there are processing errors OR
  validation errors
- New methods, isProcessingError and isValidationError, are added to
  give the ability to differentiate why isError is true
- Remove the canProceed() method and deprecate it in the java/scala API.
  This is just a wrapper around !isError
- Rename status to processorStatus to clearly differentiate between the
  new validationStatus
- Remove unused isValidationSuccess method
- Remove status from the processor constructors--this is a holdover from
  when PState was immutable


5 months agoAdded simple test to verify division expressions
Josh Adams [Thu, 3 Aug 2017 19:13:16 +0000 (15:13 -0400)] 
Added simple test to verify division expressions

This has already been fixed in commit
3153e271dab64b029bbdde627bba14c42f370357 but no tests were added to
cover the example given in the bug report, dealing with number types
getting mixed up, ending in a divide by zero.


5 months agoAdding tests for outputValueCalc in hidden groups.
Beth Finnegan [Wed, 2 Aug 2017 23:57:35 +0000 (19:57 -0400)] 
Adding tests for outputValueCalc in hidden groups.


5 months agoMove TestOutputValueCalcAndAlignment from scala-new to scala
Steve Lawrence [Wed, 2 Aug 2017 13:37:50 +0000 (09:37 -0400)] 
Move TestOutputValueCalcAndAlignment from scala-new to scala

Verifies DFDL-1518

5 months agoAdd CLI delimiterStack test
Steve Lawrence [Wed, 2 Aug 2017 12:56:03 +0000 (08:56 -0400)] 
Add CLI delimiterStack test


5 months agoComment out unused imports in scala-new
Steve Lawrence [Wed, 2 Aug 2017 11:30:11 +0000 (07:30 -0400)] 
Comment out unused imports in scala-new

5 months agoClosing Ticket: Added test to add coverage for case when value is false.
Taylor Wise [Tue, 1 Aug 2017 20:46:50 +0000 (16:46 -0400)] 
Closing Ticket: Added test to add coverage for case when value is false.
Moved existing test and new test to scala from scala-new.


5 months agoIgnore all *.sbt files in the root directory except for build.sbt
Steve Lawrence [Tue, 1 Aug 2017 18:49:47 +0000 (14:49 -0400)] 
Ignore all *.sbt files in the root directory except for build.sbt

This is useful for automated build systems to add custom *.sbt files to
add customizations to the build. For example, adding custom sbt
configurations to publish to a local repository. Note that this is
necessary since our sbt configurations makes a release a SNAPSHOT if
there are any untracked files (e.g. custom sbt file) or files with
changes. If we don't ignore this *.sbt files, then it will also build a
SNAPSHOT. This all helps Daffodil build cleanly on a jenkins automated
build and publishing to artifactory.


5 months agoFix test to have correct value and move out of debug
Steve Lawrence [Tue, 1 Aug 2017 18:38:21 +0000 (14:38 -0400)] 
Fix test to have correct value and move out of debug

F7FF came frome the specification, but it is wrong. It should be F7DC.
Fix the tests and moved it out of debug.


5 months agoMoved scala-new to scala tests to close out Boolean impl tickets.
Mike Beckerle [Tue, 1 Aug 2017 14:12:48 +0000 (10:12 -0400)] 
Moved scala-new to scala tests to close out Boolean impl tickets.

DFDL-177, DFDL-178, DFDL-243, DFDL-461, DFDL-462

5 months agoMoved union tests out of scala-new
Josh Adams [Tue, 1 Aug 2017 12:13:47 +0000 (08:13 -0400)] 
Moved union tests out of scala-new

5 months agoFix TestSchemaCache.scala, which got corrupted.... not sure how.
Mike Beckerle [Mon, 31 Jul 2017 21:45:54 +0000 (17:45 -0400)] 
Fix TestSchemaCache.scala, which got corrupted.... not sure how.

5 months agoClosing DFDL-1521. Moving test scala-new to scala.
Mike Beckerle [Mon, 31 Jul 2017 20:38:31 +0000 (16:38 -0400)] 
Closing DFDL-1521. Moving test scala-new to scala.

5 months agoClosing DFDL-1576, move tests to scala from scala-new
Mike Beckerle [Mon, 31 Jul 2017 20:32:51 +0000 (16:32 -0400)] 
Closing DFDL-1576, move tests to scala from scala-new

5 months agoClosing DFDL-1577. Moved tests scala-new to scala.
Mike Beckerle [Mon, 31 Jul 2017 20:28:34 +0000 (16:28 -0400)] 
Closing DFDL-1577. Moved tests scala-new to scala.

5 months agoClose out DFDL-1648. Move tests scala-new to scala.
Mike Beckerle [Mon, 31 Jul 2017 20:19:31 +0000 (16:19 -0400)] 
Close out DFDL-1648. Move tests scala-new to scala.

5 months agoMoving tests from scala-new to scala to close out multiple tickets.
Mike Beckerle [Mon, 31 Jul 2017 19:51:25 +0000 (15:51 -0400)] 
Moving tests from scala-new to scala to close out multiple tickets.


5 months agoClosing DFDL-1650. Moving tests to scala from scala-new.
Mike Beckerle [Mon, 31 Jul 2017 18:24:25 +0000 (14:24 -0400)] 
Closing DFDL-1650. Moving tests to scala from scala-new.


5 months agoSupply encoding so default isn't used.
Mike Beckerle [Mon, 31 Jul 2017 16:14:58 +0000 (12:14 -0400)] 
Supply encoding so default isn't used.

Fixes DFDL-1684 for windows "for real", i.e., no longer need to specify
options like -Dfile.encoding=utf-8


5 months agoRemoved AO tests and mention thereof (recursion - not yet a feature)
Mike Beckerle [Wed, 26 Jul 2017 20:46:42 +0000 (16:46 -0400)] 
Removed AO tests and mention thereof (recursion - not yet a feature)


5 months agoRemove Tests AExxx and related code.
Mike Beckerle [Wed, 26 Jul 2017 20:42:18 +0000 (16:42 -0400)] 
Remove Tests AExxx and related code.


5 months agoUse a ThreadLocal for w3c dom infoset inputters in CLI
Steve Lawrence [Wed, 26 Jul 2017 16:27:19 +0000 (12:27 -0400)] 
Use a ThreadLocal for w3c dom infoset inputters in CLI

w3c Documents are not thread-safe, even for reading. This is because the
implementation lazily evaluates parts of the tree and creates/destroys
various caches while reading. It is still safe to read the same tree
multiple times, just not at the same time. This patch adds a ThreadLocal
variable when creating w3c documents in the CLI, so that each thread has
a unique copy that it can use. This prevents any threading issue while
still keeping the total number of copies to minimum to save memory.

Also add W3CDOMInfosetInputter/Outputter to the Java and Scala API's,
alont with a comment describing the non-thread-safe nature of the


5 months agoFix reference to README file, which is now
Steve Lawrence [Wed, 26 Jul 2017 12:08:05 +0000 (08:08 -0400)] 
Fix reference to README file, which is now

5 months agoAdd missing copyright headers in source files
Steve Lawrence [Wed, 26 Jul 2017 11:52:00 +0000 (07:52 -0400)] 
Add missing copyright headers in source files

5 months agoSimplify README, BUILD, LICENSE
Steve Lawrence [Tue, 25 Jul 2017 19:02:59 +0000 (15:02 -0400)] 

- Update README to use Markdown and be more concise. Reference the wiki
  where it makes sense so there is only one place we need to update
  when things change
- Delete BUILD--this file was basically 'how to use sbt', and involved
  sbt commands we never even really need to use. Commonly use commands
  are put in the README
- Delete RELEASE, it does not belong in this repo
- Rename COPYRIGHT to the more common LICENSE


6 months agoFix daf:trace so you can trace a complex element. v2.0.0-rc3
Mike Beckerle [Fri, 21 Jul 2017 17:04:32 +0000 (13:04 -0400)] 
Fix daf:trace so you can trace a complex element.

E.g. useful to trace in this context:
   fn:exists(daf:trace(/foo/bar, "bar is complex type"))

I needed this fixed to debug jpeg's dfdl:assert expressions.


6 months agoCorrect tutorials that were showing the wrong schema
Taylor Wise [Thu, 20 Jul 2017 21:35:20 +0000 (17:35 -0400)] 
Correct tutorials that were showing the wrong schema
in the examples.

Corrects XSL to print the entire 'document' element
for the Datastream as to not be misleading regarding
bitOrder and byteOrder.


6 months agoUpdate the performance CLI command to use less memory when unparsing
Steve Lawrence [Wed, 19 Jul 2017 17:16:21 +0000 (13:16 -0400)] 
Update the performance CLI command to use less memory when unparsing

When unparsing, the performance command currently creates N copies of
the input infoset. For large infosets, this can require a lot of memory,
causing trouble for the garbage collector and limiting how much memory
is available to perform the actual unparse.

This patch modifies the performance command so that it only creates a
single infoset (e.g. scala node, jdom tree, etc.) that is shared among
unique instances of InfosetInputters used during unparse. This does rely
on the shared data to not be mutated by the InfosetInputters, but that
is currently always the case since they just read and create events.

For many large files, this greatly reduces memory during the CLI
performance command, and speeds things up since there isn't as much time
spent in the garbage collector.

Also remove the scala-slow and jdom-slow InfosetInputters/Outputters
since they are undocumented and not needed anymore. We have gathered the
performance statistics we needed from them.


6 months agoRemove daffodil-examples project. Contents have been
Taylor Wise [Wed, 19 Jul 2017 14:27:49 +0000 (10:27 -0400)] 
Remove daffodil-examples project.  Contents have been
placed into the DFDLSchemas repo on GitHub.


6 months agoImprove diagnostics about left over data in the CLI
Steve Lawrence [Wed, 19 Jul 2017 12:57:31 +0000 (08:57 -0400)] 
Improve diagnostics about left over data in the CLI

Now displays how many bits were consumed and how many bits remain,
rather than displaying the byte position and limit, which loses bit
information and isn't very clear. Also avoids any confusion with
bit position being 0- or 1-based.


6 months agoExplicitly set a null namespace in the W3CDOMInfosetOutputter when there is no namespace
Steve Lawrence [Mon, 17 Jul 2017 12:39:57 +0000 (08:39 -0400)] 
Explicitly set a null namespace in the W3CDOMInfosetOutputter when there is no namespace

When printing out a w3cdom tree, if we do not specify a namespace for an
element (i.e. createElement instead of createElementNS) then the element
is output using the default namesapce. In cases where the element is
actually no namespace, an xmlns="" is sometimes required to prevent the
use of the default namespace. Explicitly setting the namespace to null
when there is no namepsace will tell w3c to add the xmlns="" when
necessary when printed. Note that this change isn't required for the API
to work--the namespace is correctly seen as no namespace regardless.
This incorrect default namespace only occurs with the CLI and converting
the w3cdom to text.


6 months agoVerified DFDL-1707. Moved specified tests from scala-new to scala TestSimpleTypes...
Dave Thompson [Tue, 11 Jul 2017 16:13:37 +0000 (12:13 -0400)] 
Verified DFDL-1707. Moved specified tests from scala-new to scala TestSimpleTypes.scala.


6 months agoConfirm all stacks in PState/UState finish empty
Josh Adams [Tue, 11 Jul 2017 13:33:16 +0000 (09:33 -0400)] 
Confirm all stacks in PState/UState finish empty

This commit adds final stack checking to make sure that all the stacks
in PState and UState are empty at the end of parsing/unparsing.


6 months agoUpdate grammar to yield a not yet implemented error
Taylor Wise [Fri, 7 Jul 2017 18:28:41 +0000 (14:28 -0400)] 
Update grammar to yield a not yet implemented error
when dfdl:lengthKind='endOfParent' for complex types.

JSON5 tests were inappropriately using 'endOfParent'
and the code wasn't actually recognizing this as
a feature that's not yet implemented.  Changed
JSON5 tests to use 'implicit' and now they pass.

Updated all sections where LengthKind is used to also
contain a case for EndOfParent so that we error.

There should hopefully no longer be a branch where
we don't hit this check.


6 months agoImprove stylesheet and add wiki's bug report template here for testing.
Mike Beckerle [Fri, 7 Jul 2017 18:50:51 +0000 (14:50 -0400)] 
Improve stylesheet and add wiki's bug report template here for testing.


6 months agoDetect error where dfdl:proerty doesn't have dfdl:element around it.
Mike Beckerle [Thu, 6 Jul 2017 20:51:33 +0000 (16:51 -0400)] 
Detect error where dfdl:proerty doesn't have dfdl:element around it.

Fix dfdl:property being ignored in PCAP.

Update daffodil-test pcap (negative tests) to have proper dfdl:property,
and to bind the external variable $dfdl:byteOrder to littleEndian for
round trip tests that are little endian.

Fixed built-in-variables not being externally bindable.

DFDL-1722, DFDL-1792

6 months agoRemoves withParseErrorThrowing. The only places remaining
Taylor Wise [Fri, 30 Jun 2017 15:10:38 +0000 (11:10 -0400)] 
Removes withParseErrorThrowing.  The only places remaining
that throw are in DPath.evaluate and as the
structure of the code surrounding these calls is not
such that one can easily return a state failure.

We catch ParseError now in Parser.parse1.


6 months agoFix regression with if-then-else expressions
Steve Lawrence [Wed, 5 Jul 2017 17:35:34 +0000 (13:35 -0400)] 
Fix regression with if-then-else expressions

Commit 0041deba4 attempted to fix an issue where then- and else-
branches of an if-expression were not correctly generalized if their
inherent types differed. However, it did this by just setting the
inherent type to the target type of the if-expression. But this does not
work since the inherent calculation must be bottom up only. By accessing
the target type in the inherent type, it could lead to infinite
recursion. Instead, use the generlaizeArgResultTypesForNumeric to
determine numeric inherent types. For non-numeric types, the then- and
else- branches must have the same type, which is a similar restriction
to comparison operators.


6 months agoCLI: Move left over data check to after data is output and flushed
Steve Lawrence [Fri, 30 Jun 2017 17:56:08 +0000 (13:56 -0400)] 
CLI: Move left over data check to after data is output and flushed

When using the CLI, we log a left over data message before flushing the
writer. If you output the infoset to stdout (the default) and since
logs go to stderr, and is very easy for the message to end up in the
middle of the infoset. This doesn't break anything since usually people
only read from stdout, but it hides the fact that there was left over

This moves the has left over data check to after we output and flush the
infoset. So if there is left over data and the infoset goes to stdout,
you should see the message much more clearly at the bottom of the
screen. Also changes left over data to be a Warning and to return a
succes code, regardless of left over data or not since it isn't really
an error.


6 months agoSupport then- and else- expressions with different types
Steve Lawrence [Fri, 30 Jun 2017 16:37:46 +0000 (12:37 -0400)] 
Support then- and else- expressions with different types

XPath does not require that the then- and else- branches of an
if-expresison return the same type. In fact, using various XPath
testers, I've found that it is completely reasonable for branches to
return completely different types, without any conversion going on. For
example, something like this is perfectly legal:

  if (foo) then 1 else 'false'

This can return either xs:int(1) or xs:string('false'). However, in
Daffodil, since everything is strongly typed, these expressions do need
to be converted to a common type. But that type is determined by the
target type of the if-expression, not a generalized type of the

This patch modifies IfExpression so that the inherent type of the
if-expression is the same as its target type. That has the effect that
the then- and else- expressions will add converters to convert to the
target type of the if-expression. So in the above example, if the target
type of the if-expression was a string, then the then- expression would
have a string converter to convert the xs:int(1) to a string, and the
else- branch would have no extra converter. So the then- and else-
branches do not really need to have a common type. They just need to
both able to be converted to the target type of the if-expression.


6 months agoFix random failures in TDML Runner
Steve Lawrence [Fri, 30 Jun 2017 13:05:46 +0000 (09:05 -0400)] 
Fix random failures in TDML Runner

Two issues caused random failures when using the TDML runner:

- The ConfigurationLoader is an object that stores a DaffodilXMLLoader
  for loading configuration files. However, DaffodilXMLLoader it is not
  thread safe and the TDML Runner used this object in a unthread safe
  manner, which could lead to random failures when reading config files.
  To fix this, require that a loader be passed in. The TDML runner
  already has a loader to use, and the only other caller of the method
  is the CLI, so this doesn't relaly affect much.

- TDML files allow the setting of tunables. However, tunables are global
  to Daffodil, so this means that setting a tunable could affect other
  tests. We got lucky for the most part because we had one test that set
  a tunable that was always immediately followed by a test that reset
  the tunable. However, if another test suite was compiled in between
  these two tests, it could lead to odd behaviors because a tunable had
  the wrong value. Really, we shouldn't be using tunables in the TDML
  runner because of this issue. DFDL-1143 describes changes that would
  make it so that tunables are not global and could be use in TDML
  tests. But until that is resolved, this comments out the two tests
  that use tunables, and throws an error if any tests do use tunables.


6 months agoAllow annotation in global group definitions
Steve Lawrence [Thu, 29 Jun 2017 18:24:44 +0000 (14:24 -0400)] 
Allow annotation in global group definitions

Use .collect to only match sequences and choices and convert them to the
appropriate Global*GroupDef. Other things allowed in groups (e.g.
annotations, comments, processing instructions) will be ignored.


6 months agoRemove stale file containing only comments.
Mike Beckerle [Thu, 29 Jun 2017 22:46:04 +0000 (18:46 -0400)] 
Remove stale file containing only comments.

6 months agofixed eclipse classpath for tdml runner.
Mike Beckerle [Thu, 29 Jun 2017 22:40:41 +0000 (18:40 -0400)] 
fixed eclipse classpath for tdml runner.

6 months agoFix tdml's schema so that it disallows byteOrder attribute on document.
Mike Beckerle [Thu, 1 Jun 2017 18:43:31 +0000 (14:43 -0400)] 
Fix tdml's schema so that it disallows byteOrder attribute on document.

It was allowing this, though there is no implementation of it in the

6 months agoConverted SD(E/W)Unless/When to macros
Josh Adams [Wed, 28 Jun 2017 19:10:30 +0000 (15:10 -0400)] 
Converted SD(E/W)Unless/When to macros

Using macros for schemaDefinitionUnless/When will prevent the need to
allocate an WrappedArray for the variable arguments passed into the
function when we know that the Unless/When test will fail and not need
to throw an SDE or SDW.


6 months agoCorrect jackson-core library information
Steve Lawrence [Tue, 27 Jun 2017 19:46:16 +0000 (15:46 -0400)] 
Correct jackson-core library information

The jackson jar does not contain licensing information, so it must be
hardcoded in the sbt configuration. It is Apache v2.

6 months agoImprove performance for Infoset Inputters and Outputters
Steve Lawrence [Tue, 20 Jun 2017 14:03:04 +0000 (10:03 -0400)] 
Improve performance for Infoset Inputters and Outputters

Two issues were found that slow down infoset inputters and outputters

1) For infoset outputters, we convert a hexBinary byte array to a hex
   string in a very inefficient manner. With file types with big blobs
   of hex binary, this caused a noticeable slowdown. This patch optimizes
   the Misc.bytes2Hex function to be as fast as possible. There is still
   noticeable overhead, but it is significantly better.

2) Remapping invalid XML strings to PUA and back can be very slow for
   large strings. All infoset inputters and outputters currently perform
   this conversion with every string that is input or output, regardless
   of the primitive type. However, the only primitives types that could
   actually contain invalid XML characters and thus need the PUA mapping
   are xs:strings. All other types are canonicalized to contain only
   legal XML ASCII characters. This patch modifies the infoset inputters
   and outputters to only perform the illegal XML <-> PUA mapping when
   the primitive type is an xs:string, vastly increasing performance.
   Note that outputters can get the primitive type from the DISimple
   runtime data, but inputters require the type to be passed in to the
   getSimpleText method, so this does modify the infoset inputter API.
   This API has not been in an official release, so this shouldn't break


7 months agoImplemented fn:error() and deprecated daf:error()
Josh Adams [Fri, 23 Jun 2017 13:56:29 +0000 (09:56 -0400)] 
Implemented fn:error() and deprecated daf:error()

daf:error does not accept any arguments and the DFDL-WG has agreed that
fn:error is essential, especially for expressions in dfdl:outputValueCalc
since there is no work around when unparsing using dfdl:assert.


7 months agoTest all infoset inputters/outputters for round trip parser tests
Steve Lawrence [Wed, 14 Jun 2017 11:52:25 +0000 (07:52 -0400)] 
Test all infoset inputters/outputters for round trip parser tests

- When a parser test can round trip, this creates an new
  TDMLInfosetOutputter that proxies all events to to all the
  InfosetOutputters we have during parse. It then create a
  InfosetInputters using the results from those InfosetOutputters, and
  ensures that they all have the exact same chain of events and data
  during unparse, using a new TDMLInfosetInputter. This is a decent way
  to ensure our InfosetInputters and InfosetOutputters are correct.
  Note that this does not check error cases, but does give some degree
  of confidence of correctness in the positive case.
- This discovered a bug in the JsonInfosetInputter, which caused
  failures with nilled complex elements. The issue was that complex
  nillable elements look just like simple types in json, which caused a
  missing end event for nilled complex events. The primary issue was
  that the API relied on getSimpleText() to implicitly call next, but
  getSimpleText() isn't called on complex nils. To resolve this, the
  InfosetInputter API was changed so that calling getSimpleText() should
  not move directly to an EndEvent, but requires that next() be called
  instead. This requires changes to the InfosetInputters to modify their
  behavior. It also changes the InfosetInputter abstract class to treat
  simple types much like complex types, removing the need to queue
  simple type end events and reducing the max pending queue size by 1.
  This should reduce the number of tuples allocated during infoset


7 months agoPass non-expression Strings to ConstantExpression
Taylor Wise [Fri, 9 Jun 2017 15:22:09 +0000 (11:22 -0400)] 
Pass non-expression Strings to ConstantExpression
construct and avoid compilation of the constant.


7 months agoAdding input file for CLI test
Beth Finnegan [Tue, 13 Jun 2017 14:44:33 +0000 (10:44 -0400)] 
Adding input file for CLI test


7 months agoThrow an SDE when ambiguities exist in DFDL path expression steps
Steve Lawrence [Mon, 12 Jun 2017 17:41:19 +0000 (13:41 -0400)] 
Throw an SDE when ambiguities exist in DFDL path expression steps


7 months agoAdding InfosetInputter for w3c DOM
Beth Finnegan [Tue, 23 May 2017 19:08:28 +0000 (15:08 -0400)] 
Adding InfosetInputter for w3c DOM


7 months agoDFDL-1689 - Remove Warnings from test suite
Josh Adams [Tue, 2 May 2017 14:35:58 +0000 (10:35 -0400)] 
DFDL-1689 - Remove Warnings from test suite

Removed the majority of Schema Definition Warnings from the tests in the
test suite that are not supposed to be here.  There are a few that
remain that I believe are the expectecd result of the test.

7 months agoUpdated DFDL Schema projects to use standard layout
Josh Adams [Mon, 5 Jun 2017 18:52:34 +0000 (14:52 -0400)] 
Updated DFDL Schema projects to use standard layout

Schemas from daffodil-lib are now stored in
'edu/daffodil/ncsa/daffodil/xsd' instead of just an 'xsd' directory.
This helps avoid name collisions and to set a proper example for people
using copying our patterns for their projects.

DFDL-1726, DFDL-1700

7 months agoFix typo in XMLTextInfosetOutputter of nilled elements
Steve Lawrence [Thu, 1 Jun 2017 15:12:21 +0000 (11:12 -0400)] 
Fix typo in XMLTextInfosetOutputter of nilled elements


7 months agoCorrected scala/.../section23/dfdl_expressions/TestDFDLExpressionsNew.scala
Dave Thompson [Thu, 25 May 2017 12:20:15 +0000 (08:20 -0400)] 
Corrected scala/.../section23/dfdl_expressions/TestDFDLExpressionsNew.scala
for test test_expr_path_past_root1

    Ticket: DFDL-1771

7 months agoMoved test scala-new/.../section23/dfdl_expressions/TestDFDLExpressionsNew.scala...
Dave Thompson [Thu, 25 May 2017 11:00:28 +0000 (07:00 -0400)] 
Moved test scala-new/.../section23/dfdl_expressions/TestDFDLExpressionsNew.scala - test_expr_path_past_root1
to scala/.../section23/dfdl_expressions/TestDFDLExpressions.scala

Ticket: DFDL-1771

8 months agoAdding outputter for W3C DOM
Beth Finnegan [Fri, 5 May 2017 22:13:22 +0000 (18:13 -0400)] 
Adding outputter for W3C DOM