OneBusAway / onebusaway-gtfs-modules

A Java-based library for reading, writing, and transforming public transit data in the GTFS format, including database support.
Other
129 stars 106 forks source link

Optional field with default value in GtfsTransformStrategy implementation not injected with default value #97

Closed kurtraschke closed 6 years ago

kurtraschke commented 6 years ago

Summary:

A field annotated with @CsvField(optional = true, defaultValue = "foo") in a class which implements GtfsTransformStrategy is not injected with the default value, if a value is not specified in the transform JSON which invokes the class (i.e. as described here).

Steps to reproduce:

  1. Implement GtfsTransformStrategy in a class.
  2. Introduce a field annotated with @CsvField(optional = true, defaultValue = "foo").
  3. Run the transformer with a transform JSON which invokes the class, but does not specify a value for the optional field.

Expected behavior:

The field should be injected with the default value.

Observed behavior:

The field is not injected, and remains null.

Platform:

Helium:onebusaway-gtfs-modules kurt$ uname -a
Darwin Helium.local 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 x86_64
Helium:onebusaway-gtfs-modules kurt$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
kurtraschke commented 6 years ago

It seems like the root cause lies somewhere in onebusaway-csv-entities - I can't find anywhere where it actually makes use of the default value. The closest we get is in AbstractFieldMapping.isMissing(), but presumably there needs to be something in DefaultFieldMapping.translateFromCSVToObject() which actually uses the default value.