Package org.apache.sis.xml

## Class ReferenceResolver

- Object
- - ReferenceResolver

-     public class ReferenceResolver
      extends Object

  Controls the (un)marshaller behavior regarding the `xlink` or `uuidref` attributes. At marshalling time, this class controls whether the marshaller is allowed to write a reference to an existing instance instead than writing the full object definition. At unmarshalling time, this class replaces (if possible) a reference by the full object definition.

  Subclasses can override the methods defined in this class in order to search in their own catalog. See the `XML​.RESOLVER` javadoc for an example of registering a custom `ReferenceResolver` to a unmarshaller.

  Since:
    0.3

  Defined in the `sis-metadata` module

- - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static ReferenceResolver` | `DEFAULT` | The default and thread-safe instance.

  - ### Constructor Summary

    Constructors
    Modifier | Constructor | Description
    --- | --- | ---
    `protected` | `ReferenceResolver()` | Creates a default `ReferenceResolver`.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `XLink` | `anchor​(MarshalContext context, Object value, CharSequence text)` | Returns the `<gcx:Anchor>` to use for the given text, or `null` if none.
    `<T> boolean` | `canSubstituteByReference​(MarshalContext context, Class<T> type, T object, String id)` | Returns `true` if the marshaller can use a `xlink:href="#id"` reference to the given object instead than writing the full XML element.
    `<T> boolean` | `canSubstituteByReference​(MarshalContext context, Class<T> type, T object, UUID uuid)` | Returns `true` if the marshaller can use a reference to the given object instead than writing the full XML element.
    `<T> boolean` | `canSubstituteByReference​(MarshalContext context, Class<T> type, T object, XLink link)` | Returns `true` if the marshaller can use a `xlink:href` reference to the given object instead than writing the full XML element.
    `<T> T` | `newIdentifiedObject​(MarshalContext context, Class<T> type, Identifier... identifiers)` | Returns an empty object of the given type having the given identifiers.
    `<T> T` | `resolve​(MarshalContext context, Class<T> type, UUID uuid)` | Returns an object of the given type for the given `uuid` attribute, or `null` if none.
    `<T> T` | `resolve​(MarshalContext context, Class<T> type, XLink link)` | Returns an object of the given type for the given `xlink` attribute, or `null` if none.

    - ### Methods inherited from class Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### DEFAULT

          public static final ReferenceResolver DEFAULT

      The default and thread-safe instance. This instance is used at unmarshalling time when no `ReferenceResolver` was explicitly set by the `XML​.RESOLVER` property.

  - ### Constructor Detail

    - #### ReferenceResolver

          protected ReferenceResolver()

      Creates a default `ReferenceResolver`. This constructor is for subclasses only.

  - ### Method Detail

    - #### newIdentifiedObject

          public <T> T newIdentifiedObject​(MarshalContext context,
                                           Class<T> type,
                                           Identifier... identifiers)

      Returns an empty object of the given type having the given identifiers. The object returned by the default implementation has the following properties:
      - Implements the given `type` interface.
      - Implements the `NilObject` and `IdentifiedObject` interfaces from this package.
      - `IdentifiedObject​.getIdentifiers()` will return the given identifiers.
      - `IdentifiedObject​.getIdentifierMap()` will return a `Map` view over the given identifiers.
      - All other methods except the ones inherited from the `Object` class will return an empty collection, an empty array, `null`, `NaN`, 0 or `false`, depending on the method return type.
      Type Parameters:
        `T` - the compile-time type of the `type` argument.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `type` - the type of object to be unmarshalled, often as a GeoAPI interface.
        `identifiers` - an arbitrary amount of identifiers. For each identifier, the authority is typically (but not necessarily) one of the constants defined in `IdentifierSpace`.
      Returns:
        an object of the given type for the given identifiers, or `null` if none.

    - #### resolve

          public <T> T resolve​(MarshalContext context,
                               Class<T> type,
                               UUID uuid)

      Returns an object of the given type for the given `uuid` attribute, or `null` if none. The default implementation returns `null` in all cases.
      Type Parameters:
        `T` - the compile-time type of the `type` argument.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `type` - the type of object to be unmarshalled, often as a GeoAPI interface.
        `uuid` - the `uuid` attributes.
      Returns:
        an object of the given type for the given `uuid` attribute, or `null` if none.

    - #### resolve

          public <T> T resolve​(MarshalContext context,
                               Class<T> type,
                               XLink link)

      Returns an object of the given type for the given `xlink` attribute, or `null` if none. The default implementation performs the following lookups:
      - If the `xlink:href` attribute is a URI fragment of the form `"#foo"` and if an object of class `type` with the `gml:id="foo"` attribute has previously been seen in the same XML document, then that object is returned.
      - Otherwise returns `null`.
      Type Parameters:
        `T` - the compile-time type of the `type` argument.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `type` - the type of object to be unmarshalled, often as a GeoAPI interface.
        `link` - the `xlink` attributes.
      Returns:
        an object of the given type for the given `xlink` attribute, or `null` if none.

    - #### canSubstituteByReference

          public <T> boolean canSubstituteByReference​(MarshalContext context,
                                                      Class<T> type,
                                                      T object,
                                                      String id)

      Returns `true` if the marshaller can use a `xlink:href="#id"` reference to the given object instead than writing the full XML element. This method is invoked by the marshaller when:
      - The given object has already been marshalled in the same XML document.
      - The marshalled object had a `gml:id` attribute
        - either specified explicitly by `IdentifierMap​.put(IdentifierSpace​.ID, id)`
        - or inferred automatically by the marshalled object (e.g. `AbstractIdentifiedObject`).
      Note that if this method returns `true`, then the use of `xlink:href="#id"` will have precedence over UUID and XLink alternatives.

      The default implementation unconditionally returns `true`. Subclasses can override this method if they want to filter which objects to declare by reference.

      Type Parameters:
        `T` - the compile-time type of the `type` argument.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `type` - the type of object to be unmarshalled, often as a GeoAPI interface.
        `object` - the object to be marshalled.
        `id` - the `gml:id` value of the object to be marshalled.
      Returns:
        `true` if the marshaller can use the `xlink:href="#id"` attribute instead than marshalling the given object.
      Since:
        0.7

    - #### canSubstituteByReference

          public <T> boolean canSubstituteByReference​(MarshalContext context,
                                                      Class<T> type,
                                                      T object,
                                                      UUID uuid)

      Returns `true` if the marshaller can use a reference to the given object instead than writing the full XML element. This method is invoked when an object to be marshalled has a UUID identifier. Because those object may be defined externally, SIS can not know if the object shall be fully marshalled or not. Such information needs to be provided by the application.

      The default implementation returns `true` in the following cases:

      - If `object` implements `NilObject`.
      - If `object` implements `Emptiable` and its `isEmpty()` method returns `true`.
      Subclasses can override this method if they know whether the receiver will be able to resolve the reference.
      Type Parameters:
        `T` - the compile-time type of the `type` argument.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `type` - the type of object to be unmarshalled, often as a GeoAPI interface.
        `object` - the object to be marshalled.
        `uuid` - the unique identifier of the object to be marshalled.
      Returns:
        `true` if the marshaller can use the `uuidref` attribute instead than marshalling the given object.

    - #### canSubstituteByReference

          public <T> boolean canSubstituteByReference​(MarshalContext context,
                                                      Class<T> type,
                                                      T object,
                                                      XLink link)

      Returns `true` if the marshaller can use a `xlink:href` reference to the given object instead than writing the full XML element. This method is invoked when an object to be marshalled has a `XLink` identifier. Because those object may be defined externally, SIS can not know if the object shall be fully marshalled or not. Such information needs to be provided by the application.

      The default implementation returns `true` in the following cases:

      - If `object` implements `NilObject`.
      - If `object` implements `Emptiable` and its `isEmpty()` method returns `true`.
      Subclasses can override this method if they know whether the receiver will be able to resolve the reference.
      Type Parameters:
        `T` - the compile-time type of the `type` argument.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `type` - the type of object to be unmarshalled, often as a GeoAPI interface.
        `object` - the object to be marshalled.
        `link` - the reference of the object to be marshalled.
      Returns:
        `true` if the marshaller can use the `xlink:href` attribute instead than marshalling the given object.

    - #### anchor

          public XLink anchor​(MarshalContext context,
                              Object value,
                              CharSequence text)

      Returns the `<gcx:Anchor>` to use for the given text, or `null` if none. Anchors can appear in ISO 19115-3 documents where we would normally expect a character sequence. For example:

      XML representations of string
      As `<gco:CharacterString>` | As `<gcx:Anchor>`
      --- | ---
           <cit:country>
               <gco:CharacterString>France</gco:CharacterString>
           </cit:country>
           <cit:country>
               <gcx:Anchor xlink:href="SDN:C320:2:FR">France</gcx:Anchor>
           </cit:country>

      Subclasses can override this method if they can provide a mapping from some text values to anchors.
      Parameters:
        `context` - context (GML version, locale, etc.) of the (un)marshalling process.
        `value` - the value for which an anchor is requested. Often the same instance than `text`, but can also be the `URI` or `Locale` instance for which `text` is a string representation.
        `text` - the textual representation of the value for which to get the anchor.
      Returns:
        the anchor for the given text, or `null` if none.