Martin Desruisseaux created SIS-401:
---------------------------------------
Summary: Use of GML 3.2 implies the use of ISO 19139:2007 metadata
Key: SIS-401
URL: https://issues.apache.org/jira/browse/SIS-401
Project: Spatial Information Systems
Issue Type: Sub-task
Components: Metadata, Referencing
Affects Versions: 1.0
Reporter: Martin Desruisseaux
The use of GML 3.2 implies the use of ISO 19139:2007 metadata for describing
the extent, positional accuracy, identifiers, _etc._ For now (in Apache SIS
1.0), we use an {{\@UseLegacyMetadata}} annotations (internal API). When this
annotation is found on the object to marshal, {{PooledMarshaller}}
automatically set the metadata version to 2007. However this works only for the
root element. If the user specifies another object which itself contains GML,
this will not work.
If we want this automatic selection of ISO 19139:2007 metadata to work no
matter where the GML elements appear, we need a different approach. One
possible approach is to update the {{org.apache.sis.internal.jaxb.Context}}
state in a way similar to what we do for {{Locale}}. This can be done by
addition the following constructor and modifying the {{push(…)}} method like
below (only the main elements that are modified are shown below):
{code:java}
public final class Context extends MarshalContext {
/**
* The locale to use for marshalling, or {@code null} if no locale were
explicitly specified.
*/
private final Locale locale;
/**
* Creates a new context identical to the given parent except for the
locale and bitmask.
*/
private Context(final Context parent, final int bitMasks, final Locale
locale) {
this.bitMasks = bitMasks;
this.locale = locale;
this.timezone = parent.timezone;
this.schemas = parent.schemas;
this.versionGML = parent.versionGML;
this.resolver = parent.resolver;
this.converter = parent.converter;
this.warningListener = parent.warningListener;
this.identifiers = parent.identifiers;
this.identifiedObjects = parent.identifiedObjects;
this.previous = parent;
}
@Override
public final Locale getLocale() {
return locale;
}
/**
* Sets the locale to the given value, optionally with additional bits to
set.
* The old locales and bit masks are remembered and will be restored by the
next call to {@link #pull()}.
* This method can be invoked when marshalling object that need to marshall
their children in a different
* locale, like below:
*
* {@preformat java
* private void beforeMarshal(Marshaller marshaller) {
* Context.push(0, language);
* }
*
* private void afterMarshal(Marshaller marshaller) {
* Context.pull();
* }
* }
*
* @param bitsToSet new bits to set, or 0 for no change.
* @param locale the locale to set, or {@code null} for keeping the
current locale.
*/
public static void push(final int bitsToSet, Locale locale) {
Context current = current();
if (current != null) {
if (locale == null) {
locale = current.getLocale();
}
current = new Context(current, current.bitMasks | bitsToSet,
locale);
CURRENT.set(current);
}
}
/**
* Restores the locale which was used prior the call to {@link #push(int,
Locale)}.
*/
public static void pull() {
final Context current = current();
if (current != null) {
CURRENT.set(current.previous);
}
}
}
{code}
Then, in the {{org.apache.sis.referencing}} package:
{code:java}
public class AbstractIdentifiedObject implements IdentifiedObject {
/**
* Invoked by JAXB {@link javax.xml.bind.Marshaller} before this object is
marshalled to XML.
* This method sets the locale to be used for XML marshalling to the
metadata language.
*/
@SuppressWarnings("unused")
private void beforeMarshal(final Marshaller marshaller) {
Context.push(Context.LEGACY_METADATA, null);
}
/**
* Invoked by JAXB {@link javax.xml.bind.Marshaller} after this object has
been marshalled to
* XML. This method restores the locale to be used for XML marshalling to
its previous value.
*/
@SuppressWarnings("unused")
private void afterMarshal(final Marshaller marshaller) {
Context.pull();
}
}
{code}
This approach almost work. The problem is that changing {{Context}} state is
not sufficient. We also need to change on-the-fly the {{TransformVersion}} used
by {{TransformingReader}} in the {{org.apache.sis.xml}} package, and restore
the previous state once the GML object marshalling is finished. Since the
impact needs more investigation, this task has been deferred to a later version.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)