Hello all

A key interface has been recently committed: IdentifiedObject in the XML package (note: there is also closely-related IdentifiedObject interface in GeoAPI, but the later is not yet the subject of this email):

https://builds.apache.org/job/sis-trunk/site/apidocs/org/apache/sis/xml/package-summary.html


The problem
-----------
We will need to identify our object instances, sometime using the primary key in a database, sometime using a URL to a on-line resources, sometime by other ways. Identifiers are used a lot in OGC/ISO specifications, and there are defined in many ways. Actually (this is a funny coincidence!) in the OGC meeting last week, one of the speeches was someone who did an overview of many identifiers available in the OGC/ISO specifications and how to choose one. We have at least the following kinds of identifiers:

 * XML elements can have a "gml:id" attribute, which is valid only
   inside the XML document that define it.
 * XML elements can have a "gco:uuid" attribute, which is valid outside
   the document. E.g. the primary key in a database managed by an agency.
 * XML elements can have a "xlink:href" attribute, which can refer to
   the definition provided in another XML document.
 * Many Java objects derived from OGC/ISO have a getIdentifiers()
   method, which return MD_Identifier objects. Those identifier are
   basically (authority, code) pairs, where "authority" (a CI_Citation)
   is contact information to an agency, and "code" (a String) is any
   code allocated by that agency.
 * CI_Citation additionally provides ISBN and ISSN codes, which could
   be seen as special cases of MD_Identifier with fixed "authorities".


And I'm sure there is other kind of identifiers that I missed. When looking at the OGC/ISO specifications, I'm not aware of any central place where all kinds of identifiers are listed; the above list is an Apache SIS effort. It is easy to get lost.

The GeoAPI interfaces offer no programmatic way to access the "gml:id", "gco:uuid" and "xlink:href" identifiers, because they are specific to XML documents while GeoAPI is about Java development. Indeed, the above-cited identifiers do not exist in the UML of OGC/ISO abstract specifications. GeoAPI is derived from UML, not from XML. Nevertheless, sometime we need programmatical access to those XML identifiers.


Proposed approach
-----------------
We provide a specialization of CI_Citation : IdentifierSpace. All CI_Citation which are used in the "authority" part of a MD_Identifier will implement this interface. In addition, we provide in the IdentifierSpace interface some constants identifying the XML identifiers (non-XML identifiers are listed in the Citations class, not yet committed).

We provide an IdentifiedObject inteface, which will be implemented by all "object with identity" classes. There will be hundreds of such classes. All IdentifiedObjects provide two methods, which are basically the same thing from two different perspective:

Collection<Identifier> getIdentifiers()
--------------------------------
This method actually appears in various GeoAPI interfaces, so the method declared in IdentifiedObject has to be compatible. But instead of having this method in only a couple of types, we have it for every "object with identity" type. The Collection<Identifier> shall contains "gml:id", "gco:uuid" and "xlink:href" attributes, if any. Users can add and remove elements in this collection.

Map<Citation,Identifier> getIdentifierMap()
-------------------------------------
Basically the same information than 'getIdentifiers()', but with components of the (authority, code) pairs separated. It is usually easier for fetching or modifying a particular identifier (i.e. only the "gml:id").

Implementations are free to add more identifiers in the mix. For example DefaultCitation (not yet committed), will include ISBN and ISSN codes in the map of identifiers. Consequently getIdentifierMap() can be used as a central place where to see and edit all the various identifiers associated to an object.

    Martin

Reply via email to