incubator-daffodil.git
6 hours agoMake daffodil-test tests more portable. master
Michael Beckerle [Tue, 11 Dec 2018 19:00:07 +0000 (14:00 -0500)] 
Make daffodil-test tests more portable.

Changed encodingErrorPolicy="error" for all tests except those
explicitly testing replace policy, and those are now restricted to
implementation 'daffodil'.

Changed calendarTimeZone="" to calendarTimeZone="UTC" or other except
for tests that are explicitly testing for no time zone. Those tests are
implementation 'daffodil' only.

Did NOT change GeneralFormat. A new format GeneralFormatPortable
is available which has encodingErrorPolicy 'error' and
calendarTimeZone='UTC' for future convenience.

TDML Runner doesn't compare error messages for cross tests, nor
compare warnings for cross tests by default.

It still runs the tests, just doesn't compare the messages.
So the test still has to fail, just without scrutinizing the diagnostic
messages.

By passing parameters to DFDLTestCase you can override this and create
tests which are designed to verify cross-test error message text or
warning text.

Portable tests should use GeneralFormatPortable

DAFFODIL-2028

9 hours agoAdd a distinction between how expressions and literals are compiled
Steve Lawrence [Wed, 12 Dec 2018 14:55:17 +0000 (09:55 -0500)] 
Add a distinction between how expressions and literals are compiled

Sometimes, we compile non-expressions just to benefit from the value
conversion capabilities of DPath. For example, if a property was either
"{ 1.234 }" or just "1.234", compilation would still convert it to the
correct float value, regardless if there were curly braces or not.

This is flexible, but can lead to unexpected behavior, specifically with
the defaultValue attribute in dfdl:defineVariable. This attribute can
accept either an expression or a literal value, so we use the above
logic to compile the expression or literval value to an expression. But
this does not always work as expected. For example, if the
defineVariable type was an xs:boolean, the defaultAttribute could accept
either "{ fn:false() }" or "false". Note that "false" is not a valid
expression, so if we try to compile this literval value we get an error.
So our current behavior of compiling literals as if they were
expressions without curly braces prevents the correct use of literals in
some cases.

To resolve this, we need to make a clear distinction between how to
handle expression and literals. With this change, a property value is
now only considered an expression and compiled if it starts with an
unescaped curly brace. All other values are treated as literal values,
the appropriate type conversion is performed by the fromXMLString()
method of the primitive type, and a ConstantExpression is created.
Additionally, the DPath expression grammar is modified to be more strict
and to only accept actual expressions that start and end with a
curly--this should help to prevent accidental compilation of
non-expressions.

This change allows the use of literal values in the defaultValue
attribute in a dfdl:defineVariable element and have them converted
appropriately.

DAFFODIL-2033

13 hours agoAdd tunables for textBidi and floating properties
Josh Adams [Wed, 12 Dec 2018 15:57:06 +0000 (10:57 -0500)] 
Add tunables for textBidi and floating properties

Many schemas may not have these rather uncommon properties defined, but
they are technically required and according to the DFDL spec missing
properties should not be defaulted. As a stop gap solution tunables have
been added for these properties that when enabled will cause an SDE if
the properties are not defined. If they are not enabled an SDW will be
shown about the missing property.

DAFFODIL-1720

15 hours agoRemoved use of ThreadLocal for DFA Register Pool.
Michael Beckerle [Tue, 11 Dec 2018 23:14:21 +0000 (18:14 -0500)] 
Removed use of ThreadLocal for DFA Register Pool.

DAFFODIL-2034

35 hours agoEclipse setup changes to facilitate cross testing.
Michael Beckerle [Mon, 10 Dec 2018 22:51:10 +0000 (17:51 -0500)] 
Eclipse setup changes to facilitate cross testing.

Separate eclipse projects for the primary test modules which share the
same source files, but provide distinct project state - so they can have
different class paths, allows one to easily right-click to run a test
against either Daffodil or the IBM Cross Tester for IBM DFDL.

38 hours agoAll ibm-provided tests run, or are specific to other tickets.
Michael Beckerle [Mon, 10 Dec 2018 22:51:10 +0000 (17:51 -0500)] 
All ibm-provided tests run, or are specific to other tickets.

Resolving this ticket, as tests that are remaining are covered by
other tickets.

All the ibm-provided testsn now work excepting a 4 that need missing
features.

There are minor incompatibilities with IBM DFDL. Not documented in this
change history.

DAFFODIL-20

39 hours agoFix hexBinary with non-byte lengths or non-byte boundaries
Steve Lawrence [Mon, 10 Dec 2018 18:00:47 +0000 (13:00 -0500)] 
Fix hexBinary with non-byte lengths or non-byte boundaries

- Elements with xs:hexBinary type no longer take into account byte order
  when reading bytes. Previously, Daffodil used an algorithm where the
  hex binary was essentially the hex binary representation of the
  non-negative integer of the same bit length. This is wrong and not
  compatible with the specification (for example, the little endian hex
  binary how the bytes in the reverse order). This changes Daffodil so
  it now reads eight bits at time and converts each eight bits to hex
  binary digits. The eights bits are read according to the bitOrder, and
  if less than eight bits are available, zero bit padding is applied to
  either the left or right according to the bit order to reach a
  full byte.
- This is a non-backwards compatible change, but makes Daffodil now
  compatible with the DFDL specification. Any hexBinary element that
  either had little endian byte order or were non-byte size lengths
  will now have different output.

DAFFODIL-2019

41 hours agoSupport dfdl:length="prefixed"
Steve Lawrence [Mon, 8 Oct 2018 17:45:46 +0000 (13:45 -0400)] 
Support dfdl:length="prefixed"

- Add a concept of a "detached element". This is an element that has no
  representation in the infoset, acting only as a place to hang
  properties and as a temporary infoset element to parse unparse.
- When parsing a prefix element, this creates a new detached element,
  parses the prefix length into the element, pulls out the length from
  the element, then uses that length for parsing the actual data. The
  reverse process is performed on unparse, except in the case of binary
  number where the lengths are predetermined by the specification.
- Rename OVCRetry to SimpleTypeRetry, since this is now used to retry
  the prefix length unparser, which has the same behavior as output
  value calc. It will suspend until something figures out the prefix
  length, sets the simple value, and then it can resume and unparse that
  value.
- Add many new binary related parsers/unparsers to handle prefix
  lengths. Text representations are all handled the same using specified
  length parsers/unparsers. This involved some level of refactoring to
  keep things somewhat clean, but not what is really needed. The binary
  parsers all have subtle differences which make this challenging.
- Modified the property generator to resolve QNames.
- For packed numbers, split out the length determination from the
  function that converts to a byte array. With prefixed lengths, we need
  to know how much minimum space is needed without needing to create the
  entire array.
- This does not support the ability to nest prefix lengths.
  Functionally, work is complete for parsing, but the uparsing side
  requires modifications to how UState is cloned. Nesting prefix lengths
  results in nesting suspensions, which doesn't work right now--one
  cannot create suspension from inside a suspension.
- This does not support the ability to unparse prefix lengths when
  lengthUnits is characters. This is a similar issue to trying to use
  content/value-length functions with 'characters'.
- Consolidate content/value length capture logic into single functions

DAFFODIL-114

2 days agoBump SBT version to 1.2.7
Steve Lawrence [Mon, 10 Dec 2018 14:24:11 +0000 (09:24 -0500)] 
Bump SBT version to 1.2.7

- SBT 1.2.7 fixes the issue where Javadocs do not generate in Java 9+

DAFFODIL-2002

2 days agoRemove Java 7 support
Steve Lawrence [Fri, 7 Dec 2018 20:03:11 +0000 (15:03 -0500)] 
Remove Java 7 support

- Daffodil depends on sbt 1.2.1, which requires Scala 2.12.6. But Scala
  2.12 requirements a minimum of Java 8. So the newer version of SBT
  that we depend on cannot run on Java 7.
- Also fix mixing Rat ignore files that caused TravisCI builds to fail

DAFFODIL-2025

12 days agoAnother tweak to eclipse classpath/project settings.
Michael Beckerle [Fri, 30 Nov 2018 21:49:06 +0000 (16:49 -0500)] 
Another tweak to eclipse classpath/project settings.

12 days agoMissing terminator was reporting itself as a missing initiator.
Michael Beckerle [Thu, 29 Nov 2018 03:06:04 +0000 (22:06 -0500)] 
Missing terminator was reporting itself as a missing initiator.

I.e., message like Parse Error: Initiator ';' not found.
Except ";" is the terminator of the element, not the initiator.

Due to object-construction-timing stuff I think. That or scala bugs.
But sub-class overrides were not happening to provide the member from
which this name was derived. Why it got the wrong one, I don't know, I
would have expected "unbound/undefined" or something.

Just passing the parameter to constructor rather than overriding a
member to provide it, solves the problem.

DAFFODIL-2204

12 days agoFixed eclipse classpath files due to tdml to tdml-lib name change.
Michael Beckerle [Fri, 30 Nov 2018 21:35:23 +0000 (16:35 -0500)] 
Fixed eclipse classpath files due to tdml to tdml-lib name change.

12 days agoFixed infinite loop due to not gathering the error reliably.
Michael Beckerle [Thu, 29 Nov 2018 02:49:53 +0000 (21:49 -0500)] 
Fixed infinite loop due to not gathering the error reliably.

This error situation was causing an infinite loop before. No longer
does.

The test is badElementFormProperty2.

Problem is that a regular scala lazy val x = expression
If the expression throws, this lazy val will be re-evaluated over and
over each time it is requested.

That's why we have the LV system. This insures such values are attempted
exactly once, and if they throw, the fact that they threw is remembered,
and they're not attempted again.

To reduce overhead we've taken out a bunch of the LVs. But this results
in compiler errors that ripple. When parts of the compiler can't be LVs
because they are methods with parameters, it's important to CALL such
methods from something that IS an LV so that if an error is thrown, it's
not
repeatedly thrown.

So a number of LVs have been put back in. Especially on things that
involve recursive descent or traversal of the DSOM objects or
corresponding XML.

This also fixes some other minor bugs which were being masked. E.g., a
test for hiddenGroupRef where the ref is empty string. I also renamed
this
test since it was poorly named.

DAFFODIL-2202

12 days agoRefactored TDML Runner for Cross Validation with IBM.
Josh Adams [Fri, 19 Oct 2018 01:36:24 +0000 (21:36 -0400)] 
Refactored TDML Runner for Cross Validation with IBM.

Renamed daffodil-tdml to daffodil-tdml-lib. This is the
shared part of the TDML implementation that is usable by both
Daffodil's TDML processor (in daffodil-tdml-processor module), or
runners for other DFDL implementations.

Also fixed other minor bugs that were in the way of this.
DAFFODIL-2014 - TextBidi property name was misspelled.
DAFFODIL-2015 - accept textStandardOutputCharacter (legacy prop name)
DAFFODIL-1616 - textOutputMinLength required when it shouldn't be.

TDML Runner now implements everything it does in terms of an abstract
DFDL processor defined in the tdml.processor package.

There are a number of sweeping changes in this that change many files.

First: Added explicit xs:include of DFDLGeneralFormat.dfdl.xsd to all
TDML. The Daffodil TDML runner used to implicitly include
DFDLGeneralFormat.dfdl.xsd. Now that we're cross testing, tests won't
necessarily want to do this, so it has to be done explicitly.

Second: The namespace prefixes in the root elements in many of our test
cases were not correct. Those had to be uniformly fixed so that tests
can insist on the proper namespace in result data.
These were wrong because the comparison logic in the test rig was
tolerating them being incorrect, but as part of making the TDML runner
into a viable cross-testing rig, these things are being tightened up.
The root element named by a test must match that of the infoset element.
(in fact the root element declaration is unnecessary, as the root will
be taken from the infoset's root element.

The TDML module's code has changed significantly.

The daffodil-tdml module has been split into daffodil-tdml
and daffodil-tdml-processor. The latter has dependencies on all of
daffodil. The former is independent of most of daffodil so that it can be
used with an IBM-based implementation of the tdml processor class
(Which is defined separately and outside of Daffodil's code base.)

Yes, this is yet another API for Daffodil, but it is narrower and not as
comprehensive as the SAPI/JAPI stuff. It's only and exactly what the
TDML runner uses to drive tests.

The TDML processors are always dynamically loaded from the classpath
(even Daffodil's own - just to insure we're always testing this
mechanism.) This allows one to change which processor is used by changing the
classpath, and avoids a static dependency from the daffodil-tdml module on
the daffodil-tdml-processor module.

Enable TDMLDFDLProcessors to force skip of left-over-data checking.

Moved all the IBM contributed tests to the daffodil-test-ibm1 module
out of the daffodil-test module. There were redundant tests being run in
both places. Probably this was due to an ambitious QA effort to
reorganize the IBM-supplied tests to determine requirements coverage on
the DFDL Specification, along with the Daffodil-project tests... I mean
why have more than one test for a given requirement. However, this was
not done right - moving the tests from one place to another - instead
tests were left in both places. So I have moved all the tests that use
the files supplied orignally by IBM back to the daffodil-test-ibm1
module.

So there is no longer any ibm-tests subdir of the daffodil-test module.

(Reminder: IBM supplied these a long time ago, and they are fully
approved for inclusion into Daffodil, with ASF licensing, etc. There is
no issue of source code origins here. )

Modify daffodil-test-ibm1 module to run most tests on IBM_DFDL also.

Properties were added that are required by IBM DFDL and other properties
changed: E.g.,

encodingErrorPolicy='error'
choiceLengthKind='implicit' (also added to DFDLGeneralFormat.dfdl.xsd)
binaryNumberCheckPolicy="lax" (ditto)

This obsolete property had to be removed from our
IBMDefined/GeneralPurposeFormat.xsd

textBidiTextShaped="no"

Quite a lot of the tests in daffodil-test-ibm1 pass when run on
IBM_DFDL. Some fail.

A few tests have been modified to specify daffodil only because they use
features only in Daffodil (like hidden groups and calculated values).

The failures are mixture of unexpected infoset contents (much around
calendars with timezone Z vs. "+00:00".

There are other tests that appear to be places where IBM DFDL and
daffodil have fundamentally different behavior that needs
investigation.

The runner.trace method works and will invoke the IBM_DFDL trace
facility when running tests via IBM_DFDL. This is needed to get more
than just "parse failed" from it.

A couple of other minor things.

Fixed test regression in test_alignmentPaddingOVC4.

This test shows that when textOutputMinLength and an explicit length
constant are inconsistent, we still get a warning anyway.

Removed test dateBinPacked3.

This test was only checking that binaryNumberCheckPolicy was not
defined, but it now is defined for IBM compatibility reasons, in the
DFDLGeneralFormat.dfdl.xsd.

Made some test runners lazy - that was causing warnings in unrelated
test files that were confusing.

Get rid of xsi:schemaLocation that are generating annoying warnings.

Fix missing namespace prefixes for xsi:type="xs:int" also.

Specify ibm and daffodil implementations or just daffodil.

Change encodingErrorPolicy to 'error' in ibm-centric test file.

Modified build.sbt to show how to edit to quickly switch to using the
IBM DFDL cross test rig.

DAFFODIL-2014, DAFFODIL-723, DAFFODIL-2015, DAFFODIL-1616

2 weeks agoUpdating to set encoding of CLI output to UTF-8
Beth Fahl [Fri, 16 Nov 2018 21:50:21 +0000 (16:50 -0500)] 
Updating to set encoding of CLI output to UTF-8

Without an encoding specified the system default is used for outputting
the infoset in the CLI, which could result in unexpected output. This
will ensure UTF-8 is used instead of the system default.

Daffodil-2011

3 weeks agoAdding error when a property is "%" or ends in "%"
Beth Fahl [Wed, 14 Nov 2018 22:34:40 +0000 (17:34 -0500)] 
Adding error when a property is "%" or ends in "%"

When a property evaluated to a single percent sign, it was being ignored.
This will now throw an error since a percent sign is used to introduce
a DFDL entity and to have a single percent sign as the value it must
be self escaped (%%).

DAFFODIL-1840

3 weeks agoChanging to ignore attributeFormDefault
Beth Fahl [Tue, 13 Nov 2018 18:10:15 +0000 (13:10 -0500)] 
Changing to ignore attributeFormDefault

Previously an error was thrown when attributeFormDefault="qualified". This attribute
is not used by DFDL so now a warning is issued and the attribute is ignored.

Daffodil-565

4 weeks agoUpdated broken tests to check for error message
Josh Adams [Wed, 14 Nov 2018 14:08:46 +0000 (09:08 -0500)] 
Updated broken tests to check for error message

These tests were trying to use expressions in attributes that end up
starting with a " ". This is not valid for attributes that are space
separated lists. The tests have been updated to check for the
appropriate error message.

DAFFODIL-1287

4 weeks agoShow different error message for OOM
Josh Adams [Mon, 12 Nov 2018 21:05:42 +0000 (16:05 -0500)] 
Show different error message for OOM

Instead of showing a generic error message, we should suggest
increasing memory when we crash due to an OutOfMemoryError.

DAFFODIL-1953

4 weeks agoAdd SDE for missing closing tag
Josh Adams [Thu, 8 Nov 2018 19:32:43 +0000 (14:32 -0500)] 
Add SDE for missing closing tag

Previously a missing closing tag would case a fatal Scala xml parsing
error. Now it will have an SDE specifying the missing tag.

DAFFODIL-1955

5 weeks agoRemove Java 10 from TravisCI build configuration
Steve Lawrence [Mon, 5 Nov 2018 15:53:10 +0000 (10:53 -0500)] 
Remove Java 10 from TravisCI build configuration

Using Java 10 results in a deprecation error and causes the build to
fail. Since Java 10 is deprecated, let's just remove it from the build
matrix.

DAFFODIL-2016

5 weeks agoAdded max/minValidYear tunable
Josh Adams [Mon, 5 Nov 2018 13:36:34 +0000 (08:36 -0500)] 
Added max/minValidYear tunable

Due to differences in the DFDL spec and ICU4J SimpleDateFormat, we must
have SimpleDateFormat parse in lenient mode which allows the year value
to overflow with very large years into possibly negative years.

To combat this overflowing of years the max/minValidYear tunable has
been added with default values of "9999" and "0" respectively.

DAFFODIL-1946

5 weeks agoDo not allow ' ' at the start or end of delimiters
Josh Adams [Wed, 31 Oct 2018 13:00:54 +0000 (09:00 -0400)] 
Do not allow ' ' at the start or end of delimiters

Delimiters with a leading or trailing ' ' now cause an SDE with an error
message suggesting the use of '%SP;' instead.

DAFFODIL-1956

6 weeks agoIgnore minLength when lengthKind=explicit
Josh Adams [Fri, 26 Oct 2018 17:56:24 +0000 (13:56 -0400)] 
Ignore minLength when lengthKind=explicit

According to DFDL Erratum 5.18 if dfdl:lengthKind='explicit' the facet
minLength is not used to determin the target length.

Although we are ignoring minLength, it is a schema definition wraning if
the explicit length specified is out of range of minLength and it is an
error if it is out of range of textOutputMinLength.

Also fixed a small error in the range check warning.

DFDL-1989

7 weeks agoOnly output milliseconds in infoset when necessary
Josh Adams [Wed, 17 Oct 2018 15:44:15 +0000 (11:44 -0400)] 
Only output milliseconds in infoset when necessary

Most Time/DateTime elements are parsed without millisecond precision, so
we should only show milliseconds in the infoset when they are used,
instead of outputting 12:00:00.000000

REGRESSION:
This is a potentially breaking change if there are any infoset readers
that always expect milliseconds as they are now only added to the
infoset when necessary.

DAFFODIL-2005

8 weeks agoAdd default value for binaryCalendarEpoch
Josh Adams [Mon, 15 Oct 2018 19:08:43 +0000 (15:08 -0400)] 
Add default value for binaryCalendarEpoch

Default value in DFDLGeneralFormat.dfdl.xsd is set to the Unix Epoch

DAFFODIL-2006

8 weeks agoFixed typo in "charaters"
Josh Adams [Mon, 15 Oct 2018 18:56:49 +0000 (14:56 -0400)] 
Fixed typo in "charaters"

8 weeks agoCheck for available data before trying to parse binarySeconds or binaryMilliseconds
Steve Lawrence [Tue, 9 Oct 2018 12:31:57 +0000 (08:31 -0400)] 
Check for available data before trying to parse binarySeconds or binaryMilliseconds

If we do not check for available data, a NotEnoughData exception is
thrown when trying to get the binary long, which ends up leaking.
Instead, we should just check for enough data first.

Also, when exceptions are accidentally leaked, ensure that we discard
marks before throwing an assertion about the leak. Otherwise the mark is
never returned and we get an error about leaked marks instead of the
actual root issue of a leaked assertion.

DAFFODIL-2010

8 weeks agoUse --binary flag when generating release checksums
Steve Lawrence [Thu, 4 Oct 2018 11:51:11 +0000 (07:51 -0400)] 
Use --binary flag when generating release checksums

The sha*sum programs default to --text mode when generating checksums.
On GNU systems this isn't a problem since --text and --binary are the
same. But that isn't the case on Windows systems, which can result in
failed checksum validations. This change specifies the --binary option
when generating checksums to ensure compatability with Windows and
similar systems.

DAFFODIL-2009

2 months agoAllow DFDL expressions in the message attribute of asserts/discriminators
Steve Lawrence [Mon, 27 Aug 2018 15:43:08 +0000 (11:43 -0400)] 
Allow DFDL expressions in the message attribute of asserts/discriminators

- Converts the message attribute to a compiled expression that evaluates
  to a String at runtime. Creates a constant expression if no message is
  provided that is just the expression followed by "failed".
- Refactor the Assert/DiscriminatorPatternParsers into a single Parser.
  They are virtually the same except the discrimnator pattern parsers
  sets the the discriminator to true on match. This is similar to how
  AssertExpressionEvaluationParser is for both assert/discriminators
  that use tests instead of patterns.

DAFFODIL-1965

2 months agoRemove sha1 generation from release candidate script
Steve Lawrence [Fri, 7 Sep 2018 13:33:56 +0000 (09:33 -0400)] 
Remove sha1 generation from release candidate script

DAFFODIL-1997

2 months agoSupport more versions of Java
Steve Lawrence [Wed, 12 Sep 2018 13:31:09 +0000 (09:31 -0400)] 
Support more versions of Java

- With the recent switch to custom decoders, we no longer are affected
  by the Java 7 decoder bug--we can now support Java 7, so remove those
  checks that required Java 8 or higher. Those checks also caused
  exceptions on older versions of Scala mixed with newer versions of
  Java, so this removes that problem as well.
- Remove the use of deprecated functions and remove some function
  ambiguities (e.g. .limit vs .limit()), enabling support for Java 9+
- Modify TravisCI configuration to build/test on all versions of Java 7
  and higher.
- Bump down the TravisCI JVM memory a bit--newer versions of Java aren't
  happy with us using so much of the available memory.
- Split the different sbt build/test steps into separate commands. Not
  only does this help with total memory usage, but since TravisCI
  executes all script commands even if previous ones fail, it ensures
  that all test/validation commands are executed, so we no longer just
  see the first failure. The only time we don't want to execute all the
  scripts is if we fail to compile, so we call travis_terminate in that
  case.
- Two tests now fail due to features added Java 9+'s regular expression
  language. These regular expressions are not valid according to the
  DFDL spec due to their use of advanced regular expression features,
  but they are now allowed since new versions of Java support them. Move
  tests to debug.
- Minor fixes to java/scaladoc found by newer versions of javadoc

DAFFODIL-1945

2 months agoFix OGF typo in LICENSE
Steve Lawrence [Thu, 13 Sep 2018 16:56:06 +0000 (12:56 -0400)] 
Fix OGF typo in LICENSE

DAFFODIL-1996

2 months agoUpdate the README.md
Steve Lawrence [Thu, 13 Sep 2018 17:28:34 +0000 (13:28 -0400)] 
Update the README.md

- Include information about increasing memory usage
- Remove the section about debugging tests with Eclipse--detailed
  debugging information belongs on the wiki
- General cleanup/organization

DAFFODIL-1998

3 months agoFix comparison of calendars that do not have timezones
Steve Lawrence [Mon, 27 Aug 2018 15:37:23 +0000 (11:37 -0400)] 
Fix comparison of calendars that do not have timezones

The assertions was just incorrect. It is perfectly valid to call the
orderIgnoreTimeZone function where one calendar has a timezone and the
other does not, as long as they have been normalized/modified according
to the W3C spec before being called. Remove this invarient, and add a
couple extra just to make sure we are modifying calendar appropriately.
And move test out of scala debug.

DAFFODIL-1986

3 months agoQuick fixes, and moving tests that work from scala-debug.
Michael Beckerle [Thu, 16 Aug 2018 16:25:22 +0000 (12:25 -0400)] 
Quick fixes, and moving tests that work from scala-debug.

Change release target to version 2.3.0-SNAPSHOT in build.sbt

Consolidate some "...New" test classes that don't need to be
separate classes.

DAFFODIL-1988, DAFFODIL-711, DAFFODIL-1221, DAFFODIL-809

3 months agoSmall improvements. Offers to delete directories that must be empty. rel/v2.2.0 v2.2.0-rc2
Michael Beckerle [Wed, 22 Aug 2018 17:56:25 +0000 (13:56 -0400)] 
Small improvements. Offers to delete directories that must be empty.

More echos, so errors can be detected.

3 months agoClean up scaladoc
Steve Lawrence [Mon, 20 Aug 2018 19:00:42 +0000 (15:00 -0400)] 
Clean up scaladoc

Scaladoc does not do a good job at making links to methods pretty. So
where we have links, specify a link text that is much shorter and easier
to read than what scaladoc generates.

DAFFODIL-1992

3 months agoFix logic related to lengthKind="pattern" matching
Steve Lawrence [Mon, 20 Aug 2018 18:22:12 +0000 (14:22 -0400)] 
Fix logic related to lengthKind="pattern" matching

A logic bug prevented matching more than 64 characters if 64 characters
was considered a match. For example, the pattern "[a]{0,80}" would only
match 64 a's, even if 80 were available since 64 a's is technically a
valid match.

DAFFODIL-1991

3 months agoUpdates to release-candidate script
Steve Lawrence [Thu, 16 Aug 2018 19:08:13 +0000 (15:08 -0400)] 
Updates to release-candidate script

- Validate that rpmbuild exists on the system
- Validate that the Apache dist directory exists
- Script now creates javadoc and scaladoc and copies to the website repo
- Compact the validation checks, making the source easier to read
- Renamed variables to make their purpose more clear

3 months agochange permissions +x on release-candidate.sh script. v2.2.0-rc1
Michael Beckerle [Thu, 16 Aug 2018 18:14:24 +0000 (14:14 -0400)] 
change permissions +x on release-candidate.sh script.

3 months agoAdd missing -u option to specify the key to sign release tags
Steve Lawrence [Thu, 16 Aug 2018 17:51:06 +0000 (13:51 -0400)] 
Add missing -u option to specify the key to sign release tags

3 months agoAdded release candidate script to repo.
Michael Beckerle [Thu, 16 Aug 2018 17:45:01 +0000 (13:45 -0400)] 
Added release candidate script to repo.

3 months agoFixed refs to 2.1.0 to 2.2.0 in CLI bin.LICENSE
Michael Beckerle [Thu, 16 Aug 2018 17:33:20 +0000 (13:33 -0400)] 
Fixed refs to 2.1.0 to 2.2.0 in CLI bin.LICENSE

3 months agoRemove SNAPSHOT suffix.
Michael Beckerle [Thu, 16 Aug 2018 17:23:51 +0000 (13:23 -0400)] 
Remove SNAPSHOT suffix.

3 months agoAdded signing key.
Michael Beckerle [Thu, 16 Aug 2018 17:06:07 +0000 (13:06 -0400)] 
Added signing key.

3 months agoEnable tests that roundtrip with new ICU version
Steve Lawrence [Thu, 16 Aug 2018 15:54:46 +0000 (11:54 -0400)] 
Enable tests that roundtrip with new ICU version

The new version ICU fixed a bug related to unparsing very small
BigDecimals, allowing these tests to correctly trip.

DAFFODIL-1736

3 months agoEnsure that buckets with no references are released
Steve Lawrence [Thu, 16 Aug 2018 13:33:37 +0000 (09:33 -0400)] 
Ensure that buckets with no references are released

When we release a byte, we decreased the refCount of the bucket that
byte was in and then check to see if that buckets reference count was
zero and if it was the oldest bucket and, if so, we release buckets.

However, if the oldest bucket never had any locked bytes, then we'll
never release a byte in that bucket and bucketIndex will never equal
oldestBucketIndex. This means we'll never release the oldest bucket and
no buckets end up getting released.

Instead, just check to see if the oldest bucket has a refCount of zero
and then release buckets.

DAFFODIL-1987

3 months agoModified general format to have calendarTimeZone="" not UTC.
Michael Beckerle [Wed, 15 Aug 2018 22:50:09 +0000 (18:50 -0400)] 
Modified general format to have calendarTimeZone="" not UTC.

Updated tests to not expect "+00:00" on end of every date/time/datetime.

DAFFODIL-1930

3 months agoMake maxOccursBounds limit a fatal error
Steve Lawrence [Wed, 15 Aug 2018 14:46:57 +0000 (10:46 -0400)] 
Make maxOccursBounds limit a fatal error

- Move the existing and unused TunableLimitExceeedError to SDE and treat
  it more like an SDE rather than a Diagnostic. This requires less
  special casing.
- Instead of treating an array larger than maxOccursBounds as a
  ParseError, treat it as a fatal TunableLimitExceeded error to make it
  more obvious to the user that either the tunable needs to be increased
  or the schema needs to be modified
- Move checkN inside the try/catch block that cleans up mark pool leaks
  since this now throws an exception.
- Bump the maxOccursBoudns tunable to MaxInt to reduce the chance of
  valid schemas/data from hitting this bound. If there is invalid data,
  it may now just take longer before we realize things go off the rails
  and hits the larger maxOccursBounds.
- Modify existing code to throw a TunableLimitExceededError instead of
  an SDE where appropriate

DAFFODIL-1519

3 months agoAdded tests that exercise ambiguous separator/terminator case.
Michael Beckerle [Wed, 15 Aug 2018 14:52:11 +0000 (10:52 -0400)] 
Added tests that exercise ambiguous separator/terminator case.

Improved stack-empty checking at end of parse, so it tests the
discriminator stack also.

DAFFODIL-1984

3 months agoChange occursCountKind to 'implicit' in general format.
Michael Beckerle [Wed, 15 Aug 2018 15:23:44 +0000 (11:23 -0400)] 
Change occursCountKind to 'implicit' in general format.

Fixed test regressions that were depending on 'parsed' behavior.

Also fixed some comments about SDE that is now an SDW (DAFFODIL-991)

DAFFODIL-1948, DAFFODIL-991

3 months agoMoved pushDiscriminator to fix separators bug.
Michael Beckerle [Tue, 14 Aug 2018 18:26:14 +0000 (14:26 -0400)] 
Moved pushDiscriminator to fix separators bug.

Fix missing checks for minOccurs after zero occurrences.
Also verify that assertion failure no longer occurs.

Also found some unused code and deleted it. Old methods not used
anywmore.

Removed beforeArrayState - not needed. Prevents streaming behavior.

Eliminates backpointers from RuntimeData structures.

This is a step toward eliminating the double-linked non-sharing behavior
in the schema compiler, because maintaining these double-linked pointers
for the runtime was forcing them to exist in the schema compiler also.

DAFFODIL-1984, DAFFODIL-1985, DAFFODIL-1964, DAFFODIL-1444

3 months agoFix binaryCalendarRep regression
Steve Lawrence [Wed, 15 Aug 2018 11:33:46 +0000 (07:33 -0400)] 
Fix binaryCalendarRep regression

Commits 3877a44c79 and 8a694b5fd5 added new grammar prods for packed
binary calendar representations, which used the AltProd. However, the
earilier commit 2612ad8da2 removed the AltProd. The new grammar prods
are mutually exclusive, so || is actually the correct operator to use
here, so replace | with || for the new prods.

DAFFODIL-1942, DAFFODIL-1943

3 months agoAdding binaryCalendarRep='packed'
Beth Fahl [Fri, 3 Aug 2018 18:50:56 +0000 (14:50 -0400)] 
Adding binaryCalendarRep='packed'

Add parsing and unparsing for binary representation of
xs:date, xs:time, and xs:dateTime with a binaryCalendarRep
of 'packed'. This uses a combination of existing
parsers/unparsers for packed integers and text calendar.

DAFFODIL-1942

3 months agoAdding binaryCalendarRep="ibm4690Packed"
Beth Fahl [Fri, 27 Jul 2018 16:22:03 +0000 (12:22 -0400)] 
Adding binaryCalendarRep="ibm4690Packed"

Add parsing and unparsing for binary representation of
xs:date, xs:time, and xs:dateTime with a binaryCalendarRep
of 'ibm4690Packed'. This uses a combination of existing
parsers/unparsers for IBM4690 integers and text calendar.

DAFFODIL-1943

3 months agoUpdate sbt and sbt-native-packager plugin to make jar hashes consistent
Steve Lawrence [Mon, 13 Aug 2018 15:57:00 +0000 (11:57 -0400)] 
Update sbt and sbt-native-packager plugin to make jar hashes consistent

It looks like some combination of old versions of sbt and the sbt native
packager plugin caused generated jars in the zip/tar/rpms to have
different hashes. The only difference appeared to be the timestamp of
the file, but this makes it difficult to ensure that all files are the
same. Updating sbt and the sbt-native-packager plugin to the latest
version seems to correct this issue. So all jars, no matter if in a zip,
tar, rpm, or maven, should all have the exact same hash.

DAFFODIL-1938

3 months agoUpdate Runtime to only use Vector.
Michael Beckerle [Mon, 13 Aug 2018 18:33:36 +0000 (14:33 -0400)] 
Update Runtime to only use Vector.

Eliminate use of List and Sequence (mostly) in the runtime.

Should become a code-review check now, when reviewing runtime code, that
it use Vector as the standard immutable collection, vs. Sequence or
List.

This insures constant time access to the contents of the collection,
when indexed. The runtime mostly uses while-loops and indexing for speed
reasons (vs. map/foreach or other more scala-ish idioms).

DAFFODIL-1978

3 months agoFix eclipse paths.
Michael Beckerle [Mon, 13 Aug 2018 18:57:32 +0000 (14:57 -0400)] 
Fix eclipse paths.

Also moved UpdateEclipseClasspaths tool to daffodil-propgen, which has
no dependencies on libraries except for scala's XML library.

Propgen might want to be renamed someday, but it is the right module for
various sorts of code generators and tools that are used to setup the
rest of the build.

DAFFODIL-1982

3 months agoUpdate dependencies to their latest versions
Steve Lawrence [Wed, 8 Aug 2018 19:07:42 +0000 (15:07 -0400)] 
Update dependencies to their latest versions

Updates that required changes:

- ICU4J
  - License has switched to the Unicode license, LICENSE and NOTICE
    updated.
  - No longer requires that a positive number pattern exists. That is
    required by the DFDL specification, so the check is done manually
    (i.e. the pattern cannot start with a semi-colon)
  - ICU now correctly checks roundUnnecsssary and throws an exception
    if rounding is needed on unparsing--before it would just round with
    roundHalfEven. We now catch this exception and return an
    UnparseError. To maintain backwards compatibility, the
    textNumberRoundingMode property in built-in-formats.xsd and
    DFDLGeneralFormat.dfdl.xsd is changed from roundUnnecessary to
    roundHalfEven.
  - ICU's DecimalFormat.parse() method now returns an ICU BigDecimal
    instead of a Java BigInt/BigDecimal.
  - There is a bug in ICU that if a text number pattern uses scientific
    notation but the number is +Inf, -Inf, or NaN, ICU will add the
    exponent (e.g. INFx10^0). This is wrong, so this now manually
    detects if the number is one of those values and outputs the
    appropriate inf/nanRep along with pattern prefix/suffix instead of
    using the DecimalFormat.format method.
  - Lax number parsing no longer trims whitespace, so we now manually
    perform the trim if dfdl:checkPolicy is lax.
  - Various tests are changed or moved out of scala-debug due to ICU bug
    fixes. For example ICU now handles MMM (abbreviated month) for a
    Russian calendar language. Some tests are changed just due to
    different error messages. Some just need to use twoPass round trip.
  - A new bug in ICU exists where the ParsePosition is not set past
    after-suffix padding. Add a manual workound to detect if everything
    after the ParsePosition is a padding character.
  - Add ICU tests for bugs in ICU where we have a manual workaround. If
    ICU ever fixes those bugs, tests should fail and we can adjust the
    code and tests that workaround these bugs.
  - A new bug in ICU is added that does not have a workaround: ICU Fails
    to parse scientific numbers where the exponent rep is the empty
    string, e.g. 12.34+2 is now invalid. Tests are added to determine if
    this fixed, but two existing tests are moved to scala-debug.

- Xerces
  - Some error messages changed to now expand namespace prefixes or
    display slightly different information, requiring updates to some
    tests.

- JLine
  - Deprecated shutdown() in favor of close()

- Jackson
  - Deprecated JsonStringReader.getInstance() replaced with
    BufferRecyclers.getJsonStringEncoder()

DAFFODIL-1973, DAFFODIL-851, DAFFODIL-845

3 months agoSubstantial refactoring to support sequence separators properly.
Michael Beckerle [Thu, 5 Jul 2018 21:40:33 +0000 (17:40 -0400)] 
Substantial refactoring to support sequence separators properly.

Also Merged with TDMLRunner explicit roundTrip="twoPass" feature.

Added test case to demonstrate ATO bug

OrderedSeparatedSequence
OrderedUnseparatedSequence
+ someday eventually Unordered versions of both the above.

These combinators each create a Parser and an Unparser, so:

OrderedSeparatedSequenceParser
OrderedSeparatedSequenceUnparser
OrderedUnseparatedSequenceParser
OrderedUnseparatedSequenceUnparser

The OrderedUnseparated flavors have no change to their function.

The OrderedSeparatedParser flavors are quite different in behavior.

Both depend heavily on SequenceChild and RepeatingSequenceChild classes which
carry the point-of-use information. (Should improve sharing/speed at some point)

Renamings and simplifications of grammar.

Removed the "|" operator entirely. Any place we're actually doing
alternation we should be doing so in some structured combinator.

Optimizes out NadaParser and unparser entirely now.

Invariant that NadaParser is always optimized out re-established.

Got rid of everything about stop values and other unimplemented cruft.

Remove ability for any schema component to walk backrefs to a Term.

Only terms are able to "generate code" i.e., have gram (grammar)
objects. Code that resides on other schema component classes that is
needed to generate code, if that code needs properties to be resolved,
then it has to go on a subclass of Term.

Only Terms are able to resolve properties - schema components can get
access to local properties for certain warning checks, but they can't
lookup properties for resolution.

Added HasTermCheck mixin to eliminate backpointers from some places.

Some checks were being missed due to the refactoring of
GlobalElementDecl where it is no longer an ElementBase and hence, not a
Term.

Added this HasTermCheck feature by which a schema component can express
consistency checks that need the concrete Term.

Avoids need for the schema component to have a backpointer to the Term.

Added ChoiceBranchImpliedSequence

Used when a choice branch is non-scalar.
Required refactoring to make this a SeqTermBase, so that everything
about unseparated sequences applies to it.

Removed unimplemented UnorderedSequence DSOM class.

This class, as a DSOM object, is a bad idea, and when unordered
sequences are implemented, it will not want to use a UnorderedSequence
DSOM object, rather it should use an UnorderedSequence grammar
combinator, created from the SepTermBase DSOM class, based on the
dfdl:separatorKind property 'unordered'.

There is no more occursBounds nor stack for it
in the PState/UState, so the corresponding
CLI debug commands to check it have been removed.

Added threePass feature to TDMLRunner. Needed for testing some separator
scenarios.

Some tests changed to roundTrip="threePass" to get them to work.

Note that "threePass" can mask errors very easily. It needs to be avoided whenever possible.

In some cases the "threePass" tests are questionable in terms of
whether Daffodil is doing the right thing vis a vis the DFDL specification.

But they're easily identified by searching for roundTrip="threePass" in
the test modules. Such time as DFDL spec. clarifications are available
for some of these they should be revisited.

Fixed eclipse class paths for scala 2.12 IDE.

Added tests and descriptions related to DAFFODIL-1975 change.
The fix for DAFFODIL-1975 is not done here, but tests that verify the
behavior change are in scala-debug.

NadaUnparser now throws error if it survives until runtime.
This insures all grammar terms optimize it out.

Added doc about Gram and parser/unparser methods that must implement the
optimizing out of NadaParser and NadaUnparser.

DAFFODIL-1919, DAFFODIL-1961, DAFFODIL-1975

3 months agoFix "recieve" misspelling
Steve Lawrence [Wed, 8 Aug 2018 11:36:56 +0000 (07:36 -0400)] 
Fix "recieve" misspelling

DAFFODIL-1977

3 months agoFix utf-8 3-byte and 4-byte overlong detection.
Michael Beckerle [Fri, 10 Aug 2018 14:10:38 +0000 (10:10 -0400)] 
Fix utf-8 3-byte and 4-byte overlong detection.

This fixes one test for the PNG format (on DFDLSchemas github) that used
3 byte unicode chars.

DAFFODIL-1979

4 months agoFix bugs associated with truncateSpecifiedLengthString="yes"
Steve Lawrence [Thu, 19 Jul 2018 19:06:53 +0000 (15:06 -0400)] 
Fix bugs associated with truncateSpecifiedLengthString="yes"

- Check to make sure an explicit length string actually needs to be
  truncated before trying to truncate it, otherwise it results in an
  StringIndexOutOfBoundsException. We have the check for character
  lengths, but were missing it for bit/byte lenghts.
- Allow truncateSpecifiedLengthString="yes" when
  textStringJustification="center". This is legal according to the spec,
  but should result in a processing error in cases where truncation is
  needed.

DAFFODIL-1969

4 months agoAllow same character for escapeBlockEnd and escapeEscapeCharacter
Josh Adams [Thu, 26 Jul 2018 19:52:42 +0000 (15:52 -0400)] 
Allow same character for escapeBlockEnd and escapeEscapeCharacter

This commit fixes the issue where the escapeBlockEnd and
escapeEscapeCharacter are the same character. This is apparently a
common thing in how Excel escapes things in CSV.

This is not a complete fix as there are still issues in cases like
escapeBlockEnd="++" and escapeEscapeCharacter='+', but there does not
seem to be an easy way to deal with these extreme edge cases cleanly in
the existing code. This issue has been documented in DAFFODIL-1972

DAFFODIL-1923

4 months agoAdding value of 'bcd' to binaryCalendarRep
Beth Fahl [Tue, 22 May 2018 16:29:47 +0000 (12:29 -0400)] 
Adding value of 'bcd' to binaryCalendarRep

Adds parsing and unparsing capability for binary representation of
xs:date, xs:time, and xs:dateTime with a binaryCalendarRep of 'bcd',
including known, runtime determined, and delimited lengths of data.

This uses a combination of the existing BCD parser/unparser and
text calendar parser/unparser, with some added checks for binary
calendars.

DAFFODIL-1941

4 months agoAdded a layer transform that swaps bytes within an array of 32 bit words
Marshall Miller [Mon, 14 May 2018 22:28:04 +0000 (18:28 -0400)] 
Added a layer transform that swaps bytes within an array of 32 bit words

This is a layer transform that allows Daffodil to support parsing
Link-16 J messages embedded within DIS PDUs, commonly referred to as SISO-J.

DAFFODIL-1888

4 months agoSupport the --stream option with the unparse subcommand
Steve Lawrence [Mon, 16 Jul 2018 19:05:52 +0000 (15:05 -0400)] 
Support the --stream option with the unparse subcommand

- When the --stream option is provided to the parse command, output a
  NUL character (\u0000) after each infoset is output to act as a
  separator. The NUL character is not allowed in either XML or JSON
  output, so this can never be confused with infoset data. This is also
  consistent with common linux tools like 'find' and 'xargs' which can
  use the NUL character for data separation.
- When the --stream option is provided to the unparse command, the
  input data is split on the NUL character. Each chunk is converted to
  an InfosetInputter and unparsed to the same output channel. Note that
  we need to do this split because all the XML parsing libraries we use
  see the XML stream as invalid since there is not a single root
  element.
- Fix a bug in the DirectOrBufferDataOutputStream where we incorrectly
  closed the underlying JavaOutputStream provided from the user, which
  caused successive unparse writes to fail. We do still need to close
  JavaOutputStreams related to layering, so add a flag that defines
  which DOS's are for layering and close those when appropriate. But if
  a DOS is not for layering, do not close it--the user is responsible
  for cleanup.

These changes enable piping the output of parse --stream to unparse
--stream, acting as a streaming round trip.

DAFFODIL-1967

4 months agoReduce memory usage regressions in commit 07ee2434bb
Steve Lawrence [Mon, 16 Jul 2018 12:31:29 +0000 (08:31 -0400)] 
Reduce memory usage regressions in commit 07ee2434bb

The modifications to the IO layer to support streaming made changes
that substantially increased memory usage. This makes the following
changes to minimize that:

- No longer save the char iterator state. Saving this state required
  duplication a LongBuffer and CharBuffer, which are two non-trivial
  allocations/copies for every point of uncertainty. This really adds up
  for some file types. Instead, never save the char iterator state. When
  the bit position changes due to resetting a mark, we will just clear
  the char iterator state and decode data again. This does mean some
  data might be decoded twice if we backtrack, but that should be
  relatively quick, and means we only take a hit when we backtrack
  instead of every time there is a point of uncertainty.
- The regexMatch buffers are intentionally large to match long patterns.
  Unfortunately, the PState was changed so that every PState allocated
  its own regex buffers, which resulted in a lot of large allocations.
  Instead, modify the DataProcessor to store ThreadLocal state for the
  regex buffers, and the PState access that state when necessary. So we
  will no only have large regex buffers for each Thread rather than each
  call to parse.
- For every file parsed in the CLI performance command, we allocated a
  new InputSourceDataInputStream before doing any performance testing.
  So if you wanted to do a performance test of 500,000 files, we would
  allocate 500,000 InputSourceDataInputStreams immediately. This class
  isn't huge, but it can add up pretty quick and use a lot of memory.
  Instead, just allocate the InputSourceDataInputStream right before the
  call to parse so that it can be garbage collected when the parse ends.

DAFFODIL-1966

5 months agoModifications to IO layer to support streaming input data
Steve Lawrence [Fri, 23 Feb 2018 19:10:53 +0000 (14:10 -0500)] 
Modifications to IO layer to support streaming input data

- Modify the ByteBufferDataInputStream to no longer depend on
  ByteBuffers. It is now an InputSourceDataInputStream, and one can
  implement a new InputSource interface to provide Bytes. This also
  includes various changes like how bitPos and bitLimit are stored to
  simplify code (e.g. no offsets) and no longer requires a bitLimit to
  be set, since not all inputs may know a bit limit. Moves TLState
  members into the PState--the InputSourceDataInputStream class is now
  created by the user and so isn't necessarily created in thread from
  which it will be used, breaking the ThreadLocal functionality.
- Create two InputSource implementations, one using a ByteBuffer as the
  data store and one using a bucketing algorithm to support files larger
  than Int.MaxValue and can free up data that can no longer be
  backtracked to.
- Remove the DataLimits, most of these values weren't actually used.
  Instead, create new tunables for those that were and use those where
  appropriate.
- When we decode data to characters, we need to know exactly how many
  bits were used to decode each character. The Java decoders do not
  provide this information, requiring a lot of complex code to keep
  track, and even then there were bugs. This creates our own Decoders
  that provides the exact information we need and allow for further
  modifications that may be needed for things like
  dfdl:errorEncodingPolicies and dfdl:utf16Width.
- Remove the reporting and replacing decoders. Instead, we now just have
  a single decoder and it handles replacing/reporting based on the
  format info. Another benefit of our custom Decoders.
- Modifies the parse Scala/Java API to expect an
  InputSourceDataInputStream, created by the API user. Other public API
  methods are deprecated and are modified to
  create an InputSourceDataInputStream behind the scenes. API functions
  are also simplified to not take in a bit starting position or bit
  limit. This were really only used for testing, and were used fairly
  rarely. Alternative methods are used to set these values where
  necessary.
- Adds the --stream option to the CLI parse subcommand. When this is
  provided, if there is left over data at the end of a parse, the CLI
  will perform a new parse continuing where the previous left off.
- Modify the TDMLRunner to be based on java.nio.InputStreams rather than
  Channels. It was already using streams for everything and then just
  wrapping with a channel without provided any actual benefit.
- Fix issue where isAtEnd sometimes does not return a correct value. It
  now queries the underlying data stream to determine if there is more
  data or not, rather than relying on bitLimit which might not always be
  set.

DAFFODIL-934, DAFFODIL-931, DAFFODIL-1065, DAFFODIL-1565

5 months agoTDMLRunner explicit roundTrip="twoPass" feature.
Michael Beckerle [Thu, 5 Jul 2018 21:40:33 +0000 (17:40 -0400)] 
TDMLRunner explicit roundTrip="twoPass" feature.

This changes the TDML runner so that tests now must be explicit about
how many passes. This applies only to positive parse test cases. No
changes for unparser tests or negative tests. The roundTrip (and
defaultRoundTrip) attributes now take these values:

- "none" or "false" - no round trip
- "onePass" or "true" - parse: infoset must match, unparse: data must
  match original data exactly. This is the default behavior unless
  overridden with defaultRoundTrip property of test suite.
- "twoPass" - parse: infoset must match, unparse: data must NOT match
  original, parse - infoset must match.

320+ tests required change from onePass to twoPass.

DAFFODIL-1961

5 months agoAllow Daffodil to build against Scala 2.12
Nick Smith [Thu, 14 Jun 2018 17:57:01 +0000 (13:57 -0400)] 
Allow Daffodil to build against Scala 2.12

This modifies the code to be compatable with Scala 2.12, while stilling
maintaining support for 2.11.

- Configure TravisCI to build/test everything with scala 2.12 and 2.11
- Update Scallop to the latest, which requires some modifications to the
  syntax
- Newer versions of scallop broke our use of the --validate option where
  a parameter was optional. However, this syntax is ambiguous. In some
  cases, it isn't clear if the thing after --validate is a parameter to
  the validate option or the input data. Due to this ambiguity, just
  require that on/off/limited is provided with the --validate option.
  Note that this breaks backwards compatability, but only affects a
  small usage of the CLI.
- Manually add a 'version' option. This is provided by default by
  scallop, but if if another option exists with 'v' as a short option
  (like we do for verbose) it thinks that is the version option. So
  enabling verbose mode would print the version instead. By manually
  specifying a version option, it doesn't get confused.
- Update LICENSE and .classpath files to use 2.12 and new scallop
  version

DAFFODIL-1652

5 months agoEnable the sbt-rat plugin to perform Apache Rat checks
Steve Lawrence [Wed, 30 May 2018 18:43:33 +0000 (14:43 -0400)] 
Enable the sbt-rat plugin to perform Apache Rat checks

One can now run 'sbt ratReport' to generate an Apache Rat report in
target/rat.txt to check for any unapproved licensed files. Running 'sbt
ratCheck' will do the same, but will return an error if any unapproved
licenses are found. Specifically, this patch does the following:

- Enable the sbt-rat plugin
- Removes the .rat-excludes file and instead uses the sbt ratExcludes
  setting, which allows exluding full paths rather than just file names
- Modify Travis CI config to perform a ratCheck on every commit
- Add matchers for the passera and Scala BSD licenses, and mark them as
  approved licenses
- Rename LICENSE-bin and NOTICE-bin to bin.LICENSE and bin.NOTICE.
  Apache Rat does not see them as NOTICE files otherwise
- Fix URL in W3C files so rat can detect the license
- Move all non-root .gitignore content to the root .gitignore file so
  that the sbt rat plugin can use them. It only reads the root file
- Change how the TestDaffodilXMLLoader code works. It currently has
  different behavior based on the name of the daffodil root diretory,
  which can be anything (e.g. daffodil.git/,
  apache-daffodil-2.1.0-incubating-src/). Instead, just check for
  existance of daffodil-test, which will always be the same regardless
  of the name of the daffodil directory. Also, ensure the files are
  deleted at the end of the test rather than deleteOnExit. Sbt doesn't
  fork tests so the test files still exist when subsequent commands are
  run, e.g. 'ratCheck'.
- Remove the testData_onClassPath directory from git. This file should
  be created and deleted as necessary by tests

DAFFODIL-1937

5 months agoImplemented Zoned Decimal formats
Josh Adams [Thu, 5 Apr 2018 12:36:50 +0000 (08:36 -0400)] 
Implemented Zoned Decimal formats

This commit implements parsers and unparsers for the following Zoned
Decimal formats:

 - asciiStandard
 - asciiTranslatedEBCDIC
 - asciiCARealiaModified
 - asciiTandemModified

The one caveat to this support is that due to the DecimalFormat library
we use P/V symbols, which are used to indicate decimal point position in
dfdl:textNumberPattern, are not supported and therefore we currently
cannot support Zoned Decimal numbers that have a decimal point.

DAFFODIL-1738

5 months agoConfigure the Travis CI build environment for more memory
Steve Lawrence [Thu, 5 Jul 2018 14:07:25 +0000 (10:07 -0400)] 
Configure the Travis CI build environment for more memory

The default Travis CI build environment (sudo: false, dist: trusty) is
container based on only provides a max of 4GB of memory. This is near
the limit Daffodil requires to run all the tests and create artifacts,
which sometimes results in a kill -9 when it runs out of memory and the
build fails. This configures Travis CI to use a virtual machine based
environment (sudo: true, dist: trust). This takes longer to start up
(20-50 seconds vs 1-6 seconds) and we don't actually need the sudo
functionality, but it provides 7.5GB of memory. Daffodil already takes
20+ minutes to run all the tests on Travis CI--an extra minute of
startup time won't even be noticed. Allows configuring SBT to use 7GB
instead of 4GB when run in the Travsi CI environment.

DAFFODIL-1962

6 months agoAdding property binaryCalendarRep with values "binarySeconds" and "binaryMilliseconds"
Beth Fahl [Wed, 16 May 2018 19:48:58 +0000 (15:48 -0400)] 
Adding property binaryCalendarRep with values "binarySeconds" and "binaryMilliseconds"

Adds parsing and unparsing capability for binary representation of xs:dateTime
with binaryCalendarRep of "binarySeconds" and "binaryMilliseconds", using the
binaryCalendarEpoch property. Added various checks for restrictions on valid input
and both positive and negative tests.

Also removed some unnecessary parameters from parsers and unparsers of calendars
with text representation

DAFFODIL-99

6 months agoFix modulus problem with ULong
Russ Williams [Fri, 25 May 2018 10:34:32 +0000 (11:34 +0100)] 
Fix modulus problem with ULong

The ULong code incurrectly calculates the modulus (remainder) of values
and x%y can have values in the range 0<=val<2y instead of 0<=val<y, due
to the way unsigned arithmetic is performed using signed primitives.

This commit fixes the underlying problem and adds test cases to check
the behaviour is correct with both small (<2^63) and large (>=2^63)
unsigned longs.

DAFFODIL-1714

6 months agoDisable failing calendar tests
Russ Williams [Thu, 24 May 2018 19:13:20 +0000 (20:13 +0100)] 
Disable failing calendar tests

Some tests are failing when run on a machine with standard UK locale
setup (en_GB / Europe/London) in a repeatable way, but for an unknown
reason. This commit disables them until the problem can be investigated.

Tests affected:
    org.apache.daffodil.IBMTestsThatPass:
        test_simple_type_properties_text_calendar_13_01
    org.apache.daffodil.section05.simple_types.TestSimpleTypes:
        test_dateCalendarDaysInFirstWeek3
        test_dateCalendarDaysInFirstWeek5
        test_dateCalendarFirstDayOfWeek03
        test_dateCalendarFirstDayOfWeek04

DAFFODIL-1945

6 months agoBump version to 2.2.0-SNAPSHOT for development
Steve Lawrence [Tue, 15 May 2018 11:09:23 +0000 (07:09 -0400)] 
Bump version to 2.2.0-SNAPSHOT for development

DAFFODIL-1936

7 months agoExplicitly use the Xerces factories that use our custom catalog resolver
Steve Lawrence [Fri, 13 Apr 2018 13:30:30 +0000 (09:30 -0400)] 
Explicitly use the Xerces factories that use our custom catalog resolver

The DFDLCatalogResolver is a custom resolver that extends the Xerces
EntityResolver. This means that the SAXParserFactory's and
SchemaFactory's that use this resolver must also be the Xerces versions
since only they know how to use the Xerces EntityResolver correctly.

The newInstance(...) method provides a parameter to state explicitly
which SchemaFactory/SAXParserFactory instance to create so that we can
ensure the Xerces versions are used. However, this appears to use a
different ClassLoader than normal. This has become apparent in cases
where the Daffodil dependencies (included Xerces) are in a "fat jar", in
which case newInstance() fails to find the Xerces classes with a
ClassNotFoundException, presumably because it uses a ClassLoader that
does not understand to look in the fat jar.

So, instead of using newInstance() and worrying about ClassLoaders, this
changes all SchemaFactory and SAXParserFactory instances to directly
instantiate the Xerces version, which will load the classes just like
every other class instantiation.

The downside with this approach is that one cannot swap out to a
different SchemaFactory/SAXParserFactory, but that was not possible
anyways due to our custom EntityResolver that depends on the Xerces
version, so this isn't really a new limitation.

DFDL-1924

7 months agoFix so trace works even when layering is being used.
Michael Beckerle [Mon, 7 May 2018 16:24:54 +0000 (12:24 -0400)] 
Fix so trace works even when layering is being used.

DAFFODIL-1935

7 months agoAdded AISPayloadArmoring layer with tests.
Michael Beckerle [Thu, 3 May 2018 18:30:20 +0000 (14:30 -0400)] 
Added AISPayloadArmoring layer with tests.

Added tests matching to layering wiki page.

DAFFODIL-1805

7 months agoFix performance regression in layering feature
Steve Lawrence [Fri, 4 May 2018 14:10:45 +0000 (10:10 -0400)] 
Fix performance regression in layering feature

Commit 1ea2290f28 changed how the input data was copied to a
ByteArrayOutputStream by coping byte-by-byte rather than use
IOUtils.copy(). The byte-by-byte change was useful for debugging, but
caused a noticeable performance hit since IOUtils.copy() can copy in
chunks. Revert the change to bring back the performance.

DAFFODIL-1933

7 months agoAdded tests to verify processing of escapeBlock escapeScheme
Dave Thompson [Fri, 20 Apr 2018 18:39:31 +0000 (14:39 -0400)] 
Added tests to verify processing of escapeBlock escapeScheme
where the escapeBlockEnd and escapeEscapeBlock characters are the same.

Added tests to verify processing of apostrophes (&apos;) within the document
and infoset data.

DAFFODIL-1923 DAFFODIL-1928

7 months agoRemove Category X test files
Steve Lawrence [Thu, 19 Apr 2018 14:26:13 +0000 (10:26 -0400)] 
Remove Category X test files

These test schemas are Category X and do not contain anything that we do
not have covered in other tests. Since they do not provide any extra
value and are not compatible with the ASLv2 license, simply remove them.

DAFFODIL-1925

7 months agoAll properties for Base64/layering implemented.
Michael Beckerle [Tue, 6 Mar 2018 13:34:33 +0000 (08:34 -0500)] 
All properties for Base64/layering implemented.

Layers allowed are base64_MIME, gzip, lineFolded_IMF, lineFolded_iCalendar

base64_MIME supports layerLengthKind 'boundaryMark'
gzip supports layerLengthKind 'explcit'
lineFolded_XXX supports either 'boundaryMark' or 'implicit'

Characterized with tests, what is needed in order to implement
stream filters that impose terminators that are scanned for - using
Java's Scanner class.

Java's scanner class saves us the hassle of block filling/enlarging,
etc. that is otherwise necessary when you want to use the regex
libraries against a stream.

Also put catch for ClassNotFound around compiler.reload for Java 7 vs.
Java 8. Note: Base64 needs Java 8 classes. (there may be alternative
implementation that would work with Java 7.)

Identified a couple cleanups where java.io.HashMap can be replaced with
our NonAllocatingMap - which uses Maybe types instead of null/notNull.
Just code cleanups.

For future use in AIS layer: Added a charset so we can use the encoder
to unparse AIS data that must be armored with AIS_PAYLOAD_ARMORING
which is a 6 bit to 8 bit.

This is all part of layering, i.e., AIS format requires layering as does
base64, so merging this all onto same branch.

Combined tests that have base64 encoded regions that contain gzip data
having a computed length field also with the base64 region.... a test of
that works.

Verified that the nato-stanag-5516 schema still works with this build,
as well as VMF. Those are the most bit-order intensive schemas we have.

Changed terminology uniformly from terminator to boundaryMark for
layers.

Refactored BoundaryMarkLimitingStream to pull out a
RegexLimitingStream. Needed because line folded data is terminated by a
CRLF followed by either a tab or a space. Can't express this as a
boundary mark string.

DAFFODIL-1734, DAFFODIL-1805

8 months agoImproved toString of grammar and parser/unparser objects. rel/v2.1.0 v2.1.0-rc3
Michael Beckerle [Thu, 29 Mar 2018 16:24:50 +0000 (12:24 -0400)] 
Improved toString of grammar and parser/unparser objects.

This is just to assist in debugging some thorny problems.

DAFFODIL-1920

8 months agoAdd new tunable (errorOnUnsupportedJavaVersion) to allow running with older versions...
Steve Lawrence [Tue, 3 Apr 2018 12:50:21 +0000 (08:50 -0400)] 
Add new tunable (errorOnUnsupportedJavaVersion) to allow running with older versions of Java

Currently we intentionally throw an exception if Daffodil is not run
with Java 8 due to bugs in how Java 7 handles decoding errors. However,
there are some cases where a user has no choice except to run under Java
7.

This patch adds a new tunable "errorOnUnsupportedJavaVersion" that causes
Java 8 check failures to be logged as a warning rather than thrown as an
exception. This allows the above use case to be possible, with the explicit
understanding that it is not fully tested and is know to have unexpected
behavior in some circumstances.

Additionally, the file "/daffodil-config.xml" can be put on the
classpath to override tunables globally, regardless of how Daffodil is
run (e.g. CLI, TDMLRunner, API, etc.). This allows one to easily run all
tests and processing with the errorOnUnsupportedJavaVersion check
disable, or other tunables modified, if desired.

DAFFODIL-1921

8 months agoUpdates to LICENSE/NOTICE
Steve Lawrence [Mon, 5 Mar 2018 16:19:11 +0000 (11:19 -0500)] 
Updates to LICENSE/NOTICE

- Add explicit paths to files that are not Apache licensed
- Append -bin to LICENSE/NOTICE in daffodil-cli to clarify that it is
  for binary release files
- Add acknowledgments to UoI NCSA, Tresys, and IBM for their pre-ASF
  contributions
- Remove content from NOTICE files that is not legally required to be
  there (e.g. BSD copyrights)
- Remove Utility.scala. This was copied from the Scala library and we
  only use the most basic of features that are already accessible in scala
  lib. This file isn't needed.
- Move the PrettyPrinter.scala file out of the scalaLib directory. This
  file was originally based off of a file in the scala library. Since
  then, this file was essentially rewritten with completely different
  behavior. Since it is no longer looks anything like the scala lib
  version except for some function names, move it out of the directory
  to make this clear.
- Correct the short notice for W3C documents

DAFFODIL-1906

8 months agoRevert "Fixes some issues with separated empty optional elements, (ie. 1:2::4:5)."
Josh Adams [Thu, 5 Apr 2018 12:37:48 +0000 (08:37 -0400)] 
Revert "Fixes some issues with separated empty optional elements, (ie. 1:2::4:5)."

This reverts commit a54caa74deb895816aa274353d389a241c303917.
Although this commit allowed some cases of empty optional elements with
trailing suppression to work it caused regressions in some previously
working schema projects (DAFFODIL-1922). Parts of this commit may still be used once
changes have been made to the compiler that will allow full support for
trailing separator supression (DAFFODIL-1919)

DAFFODIL-1919 and DAFFODIL-1922

8 months agoFixes some issues with separated empty optional elements, (ie. 1:2::4:5).
Josh Adams [Fri, 23 Feb 2018 15:53:16 +0000 (10:53 -0500)] 
Fixes some issues with separated empty optional elements, (ie. 1:2::4:5).
This was one of the bugs that was preventing the IBMTLOG4690 schema
project form working correctly.  Note that formats that have these
optional empty elements will not necessarily round trip.

There is still a bug that is preventing sequences with separated
optional content where the first element is missing from working (ie.
:2:3::5), see DAFFODIL-1919

DAFFODIL-1886, DAFFODIL-1919

9 months agoAdds missing properties to DFDLGeneralFormat.dfdl.xsd
Michael Beckerle [Fri, 9 Mar 2018 18:16:43 +0000 (13:16 -0500)] 
Adds missing properties to DFDLGeneralFormat.dfdl.xsd

Tolerates encodingErrorPolicy='error' with a warning.

DAFFODIL-1915

9 months agoChange val and lazy val to def - multi-threading bug due to state?
Michael Beckerle [Tue, 20 Feb 2018 23:43:46 +0000 (18:43 -0500)] 
Change val and lazy val to def - multi-threading bug due to state?

DAFFODIL-1908

9 months agoFix eclipse project files for daffodil-cli module.
Michael Beckerle [Mon, 5 Mar 2018 21:52:42 +0000 (16:52 -0500)] 
Fix eclipse project files for daffodil-cli module.

In the recent changes to simplify sbt tasks so that specialized tasks
aren't needed for the cli except for testing it, the src/test directory
was renamed src/it.

This change adjusts the eclipse project setup to match.

Eclipes classpath updater now excludes genjavadoc tool jar.

DAFFODIL-1913, DAFFODIL-1914

9 months agoMove CLI tests to sbt integration
Steve Lawrence [Wed, 28 Feb 2018 16:28:09 +0000 (11:28 -0500)] 
Move CLI tests to sbt integration

Move CLI tests to src/it/ rather than being part of src/test. This means
that we can reenable aggregation of the daffodil-cli subproject without
fear of 'sbt test' running the CLI tests and extending the test cycle.
With aggregation reenabled, this also means that we no longer need to
run commands explicitly in the daffodil-cli project (i.e. things like
'sbt compile' or 'sbt clean' will compile/clean all subprojects,
including daffodil-cli), simplifying build process and preventing some
bugs in sbt from cropping up.

To run cli tests, use 'sbt it:test'.

To debug cli tests, use 'sbt debugIt:test'.

DAFFODIL-1911

9 months agoCorrectly check if an element is required
Steve Lawrence [Tue, 27 Feb 2018 14:32:53 +0000 (09:32 -0500)] 
Correctly check if an element is required

When determining which elements could appear after an element in an
infoset for unparsing, we need to determine if an element is optional or
not to know if its siblings could also appear next. We use a mixture of
isOptional (for scalars) and isRequiredArrayElment (for arrays) to
determine if an element is optional. However, this logic was actually
not correct and has some edge cases it misses. Instead, we should just
use the isRequired function, which has the correct logic to determine if
an element could exist or not.

DAFFODIL-1910

9 months agoEnable annotation of an XSD with both DFDL
Michael Beckerle [Tue, 20 Feb 2018 15:58:41 +0000 (10:58 -0500)] 
Enable annotation of an XSD with both DFDL
annotations and an unrelated annotation language.

Problem is that like DFDL, this additional annotation language defines
annotation elements that have xsd:attribute definitions in them.

And Daffodil issues SDE on those attribute definitions because DFDL
doesn't use attributes.

But they're not being used to describe data. They're just being used in
annotation elements that Daffodil (or any DFDL processor) can simply
ignore.

To allow import of a full-function XML Schema for an annotation
language, Daffodil looks at schemas for use of the DFDL_NAMESPACE. If
the root element of the schema uses the DFDL_NAMESPACE (e.g., to define
the dfdl prefix), then the file is treated as a DFDL schema. If the
DFDL_NAMESPACE is not used, then the file is not imported. It is
ignored.

Rationalized validation. Schemas no longer validated by SchemaSet, but
centralized into DFDLSchemaFile class.

This changes validation behavior somewhat. Some errors are superceded by
others now, so negative tests need to change somewhat.

Some tests used to work only because of bugs where validation was not
occurring but should have been, or passed because validation was
occurring when it should not have. So more precise use of test runners,
with fewer tests using modes like validateTDMLFile=false or
validateDFDLSchemas=false.

DAFFODIL-1907,  DAFFODIL-1473

9 months agoAdded WarnIDs for all warnings. Removed non-warnID forms of methods.
Michael Beckerle [Tue, 27 Feb 2018 19:06:34 +0000 (14:06 -0500)] 
Added WarnIDs for all warnings. Removed non-warnID forms of methods.

Fixes DAFFODIL-1874, and also DAFFODIL-1838
Enables fixing https://github.com/DFDLSchemas/NACHA/issues/2

DAFFODIL-1874, DAFFODIL-1838

9 months agoAdded tests that clarify what we allow in appinfo annotations. v2.1.0-rc2
Michael Beckerle [Fri, 16 Feb 2018 17:03:14 +0000 (12:03 -0500)] 
Added tests that clarify what we allow in appinfo annotations.

DAFFODIL-1902