Uploaded image for project: 'Spatial Information Systems'
  1. Spatial Information Systems
  2. SIS-586

Abandon NilObject support of primitive wrappers

    XMLWordPrintableJSON

Details

    • Task
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 1.3
    • 1.4
    • Metadata
    • None

    Description

      The ISO 19115-1 standard (which provides the metadata model) defines each attribute as optional, mandatory or conditional. For example in the CI_Citation class, the title attribute is mandatory but the edition attribute is optional. A mandatory attribute shall never be null.

      The ISO 19115-3 standard (which provides the XML representation of ISO 19115-1) maps mandatory attributes to required XML elements. However in practice, sometime a mandatory attribute is nevertheless missing. ISO 19115-3 recognizes the following reasons why a mandatory attribute may be missing:

      • INAPPLICABLE — There is no value.
      • MISSING — The correct value is not readily available to the sender of this data.
      • TEMPLATE — The value will be available later.
      • UNKNOWN — The correct value is not known to, and not computable by, the sender of this data.
      • WITHHELD — The value is not divulged.

      Apache SIS represents those special cases by sentinel values with all properties set to NaN, 0 or empty strings, depending on what the value permits. Those special values implement the org.apache.sis.xml.NilObject interface, which provides a method giving the reason why the value is nil. However this approach is not possible when the class of the value is final. In particular, it is not possible to return a String, Integer or Double value implementing the NilObject interface. As a workaround, Apache SIS creates a new instance of those classes with, for example, new Double(NaN) — intentionally not with Double.valueOf(NaN) because we really want a new instance — then uses identity check (i.e. using == instead of Double.equals(Object) for identifying the nil sentinel value.

      However above trick will soon be impossible. The constructors of all primitive wrappers have been deprecated for removal, so this part of Apache SIS code will not compile or even execute on future Java versions. Even if the constructors were not removed, the wrappers are planed to become value objects when this feature will be added to the Java language (Project Valhalla), which will make the identity checks ineffective.

      We have no workaround at this time. The only thing we can do is to drop the support of NilObject on Integer and Double values (or any other primitive wrapper classes). We are better to do that soon because all Apache SIS releases having explicit calls to new Double(…) may break in future Java environments.

      As a replacement, a future SIS version could use BigDecimal or BigInteger instead of Double and Long. This is actually desirable even if it was not for this NilObject issue. Performance and memory consumption of BigDecimal or BigInteger are not a big issue in metadata (they would be much more important in referencing, features or coverage classes), and there is a desire to express as closely as possible the data distributor intend, which includes the use of base 10 and the number of significant decimal digits. See issue #87 on GeoAPI.

      Attachments

        Issue Links

          Activity

            People

              desruisseaux Martin Desruisseaux
              desruisseaux Martin Desruisseaux
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: