Author: desruisseaux Date: Sat Dec 9 15:02:45 2017 New Revision: 1817620 URL: http://svn.apache.org/viewvc?rev=1817620&view=rev Log: Declare constants and internal methods for support of ISO 19115-3 metadata version. This is part of commit e780d66b4d7d59368e742ba01777a151d8827ea8 from Image Matter.
This revision can built but is known to have test failure. Tests will pass only after we completed the port of all ISO 19115-3 work. Modified: sis/branches/ISO-19115-3/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java sis/branches/ISO-19115-3/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Context.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/LegacyNamespaces.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Schemas.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/package-info.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/FilterVersion.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/package-info.java sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/StringAdapterTest.java sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/xml/ReferenceResolverMock.java Modified: sis/branches/ISO-19115-3/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -81,7 +81,7 @@ public final strictfp class DefaultConta * Initializes the test for catching warning messages. */ private void init() { - context = new Context(0, null, null, null, null, null, null, this); + context = new Context(0, null, null, null, null, null, null, null, this); } /** Modified: sis/branches/ISO-19115-3/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -213,7 +213,7 @@ public final strictfp class AbstractIden final AbstractIdentifiedObject o2 = new AbstractIdentifiedObject(properties); final AbstractIdentifiedObject o3 = new AbstractIdentifiedObject(properties); final AbstractIdentifiedObject o4 = new AbstractIdentifiedObject(properties); - final Context context = new Context(0, null, null, null, null, null, null, null); + final Context context = new Context(0, null, null, null, null, null, null, null, null); try { final String c1, c2, c3, c4; assertEquals("o1", "epsg-7019", c1 = o1.getID()); Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Context.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Context.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Context.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Context.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -50,7 +50,8 @@ import org.apache.sis.xml.ReferenceResol * if no (un)marshalling is in progress. * * @author Martin Desruisseaux (Geomatys) - * @version 0.7 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.3 * @module */ @@ -135,6 +136,12 @@ public final class Context extends Marsh private final Version versionGML; /** + * The metadata version to be marshalled or unmarshalled, or {@code null} if unspecified. + * If null, than the latest version is assumed. + */ + private final Version versionMetadata; + + /** * The reference resolver currently in use, or {@code null} for {@link ReferenceResolver#DEFAULT}. */ private final ReferenceResolver resolver; @@ -203,15 +210,20 @@ public final class Context extends Marsh * @param timezone the timezone, or {@code null} if unspecified. * @param schemas the schemas root URL, or {@code null} if none. * @param versionGML the GML version, or {@code null}. + * @param versionMetadata the metadata version, or {@code null}. * @param resolver the resolver in use. * @param converter the converter in use. * @param warningListener the object to inform about warnings. */ @SuppressWarnings("ThisEscapedInObjectConstruction") public Context(final int bitMasks, - final Locale locale, final TimeZone timezone, - final Map<String,String> schemas, final Version versionGML, - final ReferenceResolver resolver, final ValueConverter converter, + final Locale locale, + final TimeZone timezone, + final Map<String,String> schemas, + final Version versionGML, + final Version versionMetadata, + final ReferenceResolver resolver, + final ValueConverter converter, final WarningListener<?> warningListener) { this.bitMasks = bitMasks; @@ -219,6 +231,7 @@ public final class Context extends Marsh this.timezone = timezone; this.schemas = schemas; // No clone, because this class is internal. this.versionGML = versionGML; + this.versionMetadata = versionMetadata; this.resolver = resolver; this.converter = converter; this.warningListener = warningListener; @@ -347,7 +360,7 @@ public final class Context extends Marsh /** * Returns {@code true} if the GML version is equals or newer than the specified version. - * If no GML version were specified, then this method returns {@code true}, i.e. newest + * If no GML version was specified, then this method returns {@code true}, i.e. newest * version is assumed. * * <div class="note"><b>API note:</b> @@ -367,6 +380,30 @@ public final class Context extends Marsh } } return true; + } + + /** + * Returns {@code true} if the metadata version is equals or newer than the specified version. + * If no metadata version was specified, then this method returns {@code true}, i.e. newest + * version is assumed. + * + * <div class="note"><b>API note:</b> + * This method is static for the convenience of performing the check for null context.</div> + * + * @param context the current context, or {@code null} if none. + * @param version the version to compare to. + * @return {@code true} if the metadata version is equals or newer than the specified version. + * + * @see #getVersion(String) + */ + public static boolean isMetadataVersion(final Context context, final Version version) { + if (context != null) { + final Version versionMetadata = context.versionMetadata; + if (versionMetadata != null) { + return versionMetadata.compareTo(version) >= 0; + } + } + return true; } /** Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/LegacyNamespaces.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/LegacyNamespaces.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/LegacyNamespaces.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/LegacyNamespaces.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -22,7 +22,8 @@ import org.apache.sis.util.Version; /** * Legacy XML namespaces, and {@link Version} constants for identifying when those namespaces were used. * - * @author Guilhem Legal (Geomatys) + * @author Guilhem Legal (Geomatys) + * @author Cullen Rombach (Image Matters) * @version 1.0 * * @see org.apache.sis.xml.Namespaces @@ -32,6 +33,12 @@ import org.apache.sis.util.Version; */ public final class LegacyNamespaces { /** + * @deprecated to be replaced by {@code VERSION_1_0}, which is the version declared in XML schemas. + */ + @Deprecated + public static final Version ISO_19115_3 = new Version("2014"); + + /** * Miscellaneous version constants. */ public static final Version VERSION_3_0 = new Version("3.0"), @@ -91,6 +98,12 @@ public final class LegacyNamespaces { public static final String GFC = "http://www.isotc211.org/2005/gfc"; /** + * The <code>{@value}</code> URL, used in ISO 19139. + * The usual prefix for this namespace is {@code "gts"}. + */ + public static final String GTS = "http://www.isotc211.org/2005/gts"; + + /** * A non-public (un)marshaller property for controlling usage of {@code org.apache.sis.xml.FilteredNamespaces}. * Values can be: * Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Schemas.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Schemas.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Schemas.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/Schemas.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -41,7 +41,8 @@ package org.apache.sis.internal.jaxb; * </ul> * * @author Martin Desruisseaux (Geomatys) - * @version 0.7 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.4 * @module */ @@ -52,24 +53,49 @@ public final class Schemas { public static final String GML_XSD = "http://schemas.opengis.net/gml/3.2.1/gml.xsd"; /** - * The XSD definition for metadata objects. + * The XSD definition for 193139 metadata objects. */ + @Deprecated public static final String METADATA_XSD = "http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"; /** + * The XSD definition for the root of ISO 19115-3 metadata objects. + */ + public static final String METADATA_XSD_BASE = "http://standards.iso.org/iso/19115/-3/mdb/1.0/mdb.xsd", + METADATA_XSD_SPATIAL = "http://standards.iso.org/iso/19115/-3/msr/1.0/msr.xsd", + METADATA_XSD_QUALITY = "http://standards.iso.org/iso/19157/-2/dqc/1.0/dqc.xsd", + METADATA_XSD_MAINTENANCE = "http://standards.iso.org/iso/19115/-3/mmi/1.0/mmi.xsd", + METADATA_XSD_LINEAGE = "http://standards.iso.org/iso/19115/-3/mrl/1.0/mrl.xsd", + METADATA_XSD_IDENTIFICATION = "http://standards.iso.org/iso/19115/-3/mri/1.0/mri.xsd", + METADATA_XSD_EXTENT = "http://standards.iso.org/iso/19115/-3/gex/1.0/gex.xsd", + METADATA_XSD_DISTRIBUTION = "http://standards.iso.org/iso/19115/-3/mrd/1.0/mrd.xsd", + METADATA_XSD_CONTENT = "http://standards.iso.org/iso/19115/-3/mrc/1.0/mrc.xsd", + METADATA_XSD_CONSTRAINT = "http://standards.iso.org/iso/19115/-3/mrc/1.0/mrc.xsd", + METADATA_XSD_CITATION = "http://standards.iso.org/iso/19115/-3/cit/1.0/cit.xsd", + METADATA_XSD_ACQUISITION = "http://standards.iso.org/iso/19115/-3/mac/1.0/mac.xsd"; + + /** + * The root directory of OGC metadata schemas. + * This is the schema used by default in Apache SIS. + */ + @Deprecated + public static final String METADATA_ROOT_OLD = "http://schemas.opengis.net/iso/19139/20070417/"; + + /** * The root directory of OGC metadata schemas. * This is the schema used by default in Apache SIS. */ - public static final String METADATA_ROOT = "http://schemas.opengis.net/iso/19139/20070417/"; + public static final String METADATA_ROOT = "http://standards.iso.org/iso/19115/"; /** - * The root directory of ISO metadata schemas. - * This is sometime used as an alternative to {@link #METADATA_ROOT}. + * The root directory of ISO 19139 metadata schemas. + * This is sometime used as an alternative to {@link #METADATA_ROOT_OLD}. */ + @Deprecated public static final String ISO_19139_ROOT = "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/"; /** - * The string to append to {@link #METADATA_ROOT} or {@link #ISO_19139_ROOT} for obtaining the path + * The string to append to {@link #METADATA_ROOT_OLD} or {@link #ISO_19139_ROOT} for obtaining the path * to the definitions of code lists. * * <p>A localized version of this file exists also with the {@code "ML_gmxCodelists.xml"} filename @@ -77,7 +103,15 @@ public final class Schemas { * * @see <a href="https://issues.apache.org/jira/browse/SIS-154">SIS-154</a> */ - public static final String CODELISTS_PATH = "resources/Codelist/gmxCodelists.xml"; + @Deprecated + public static final String CODELISTS_PATH_OLD = "resources/Codelist/gmxCodelists.xml"; + + /** + * The string to append to {@link #METADATA_ROOT} for obtaining the path to the definitions of code lists. + * + * @see <a href="https://issues.apache.org/jira/browse/SIS-154">SIS-154</a> + */ + public static final String CODELISTS_PATH = "resources/Codelist/cat/codelists.xml"; /** * The string to append to {@link #METADATA_ROOT} or {@link #ISO_19139_ROOT} for obtaining the path Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/package-info.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/package-info.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/package-info.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/package-info.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -33,7 +33,8 @@ * This is used for storing the value in a list of identifiers while preserving the original object.</p> * * @author Cédric Briançon (Geomatys) - * @version 0.7 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.3 * @module */ Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/FilterVersion.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/FilterVersion.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/FilterVersion.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/FilterVersion.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -17,6 +17,8 @@ package org.apache.sis.xml; import java.util.Map; +import java.util.HashMap; +import org.apache.sis.util.collection.Containers; import org.apache.sis.internal.jaxb.LegacyNamespaces; import static java.util.Collections.singletonMap; @@ -28,21 +30,60 @@ import static java.util.Collections.sing * See {@link FilteredNamespaces} for more information. * * @author Martin Desruisseaux (Geomatys) - * @version 0.4 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.4 * @module */ enum FilterVersion { /** + * Metadata using the legacy ISO 19139 schema (replaced by ISO 19115-3). + */ + ISO19139(new String[] { + Namespaces.CAT, + Namespaces.CIT, + Namespaces.LAN, + Namespaces.MAC, + Namespaces.MAS, + Namespaces.MCC, + Namespaces.MCO, + Namespaces.MEX, + Namespaces.MMI, + Namespaces.MPC, + Namespaces.MRC, + Namespaces.MRD, + Namespaces.MDQ, + Namespaces.MRI, + Namespaces.MRL, + Namespaces.MRS, + Namespaces.MSR, + Namespaces.MDS, + Namespaces.MD1, + Namespaces.MDA, + Namespaces.MDT, + Namespaces.MD2, + Namespaces.RCE, + Namespaces.FCC, + Namespaces.GMW, + Namespaces.DQC, + Namespaces.MDB, + Namespaces.GEX, + }, LegacyNamespaces.GMD, + new String[] { + Namespaces.GCX, LegacyNamespaces.GMX, + Namespaces.GCO, LegacyNamespaces.GCO, + Namespaces.SRV, LegacyNamespaces.SRV}), + + /** * GML using the legacy {@code "http://www.opengis.net/gml"} namespace. */ - GML31(Namespaces.GML, LegacyNamespaces.GML); + GML31(Namespaces.GML, LegacyNamespaces.GML), /** * Apply all known namespace replacements. This can be used only at unmarshalling time, * for replacing all namespaces by the namespaces declared in Apache SIS JAXB annotations. */ - static FilterVersion ALL = GML31; + ALL(ISO19139, GML31); /** * The URI replacements to apply when going from the "real" data producer (JAXB marshaller) @@ -63,9 +104,46 @@ enum FilterVersion { /** * Creates a new enum for replacing only one namespace. + * + * @param impl the namespace used in JAXB annotations (should be latest schema). + * @param view the namespace used in the XML file to (un)marshall (older schema). */ private FilterVersion(final String impl, final String view) { this.toView = singletonMap(impl, view); this.toImpl = singletonMap(view, impl); } + + /** + * Creates a new enum for replacing many namespaces by a single one. + * This constructor is used when the legacy schema (the "view") was one large monolithic schema, + * and the new schema (the "impl") has been separated in many smaller modules. + * + * @param impl the namespaces used in JAXB annotations (should be latest schema). + * @param view the single namespace used in the XML file to (un)marshall (older schema). + * @param additional additional (<var>impl</var>, <var>view</var>) mapping for a few namespaces + * having different {@code view} values. + */ + private FilterVersion(final String[] impl, final String view, final String[] additional) { + toView = new HashMap<>(Containers.hashMapCapacity(impl.length)); + toImpl = new HashMap<>(); + for (final String e : impl) { + toImpl.put(e, view); + } + for (int i=0; i<additional.length;) { + final String p = additional[i++]; + final String v = additional[i++]; + toView.put(p, v); + toImpl.put(v, p); + } + } + + /** + * Creates the {@link #ALL} enumeration. + */ + private FilterVersion(final FilterVersion first, final FilterVersion more) { + toView = new HashMap<>(first.toView); + toImpl = new HashMap<>(first.toImpl); + toView.putAll(more.toView); + toImpl.putAll(more.toImpl); + } } Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -26,7 +26,7 @@ import org.opengis.util.InternationalStr * Context of a marshalling or unmarshalling process. * * @author Martin Desruisseaux (Geomatys) - * @version 0.3 + * @version 1.0 * @since 0.3 * @module */ @@ -83,14 +83,8 @@ public abstract class MarshalContext { * * <table class="sis"> * <caption>Supported schemas</caption> - * <tr> - * <th>Prefix</th> - * <th>Standard</th> - * <th>Typical values</th> - * </tr> - * <tr> - * <td>gml</td> <td>Geographic Markup Language</td> <td>{@code 3.0}, {@code 3.2}</td> - * </tr> + * <tr><th>Prefix</th> <th>Standard</th> <th>Typical values</th></tr> + * <tr><td>gml</td> <td>Geographic Markup Language</td> <td>{@code 3.0}, {@code 3.2}</td></tr> * </table> * * @param prefix one of the above-cited prefix. Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -118,6 +118,7 @@ public final class Namespaces extends St * <caption>Change log</caption> * <tr><th>SIS version</th> <th>URL</th></tr> * <tr><td>0.3 to 0.8</td> <td>http://www.isotc211.org/2005/gco</td></tr> + * <tr><td>Since 1.0</td> <td>http://standards.iso.org/iso/19115/-3/gco/1.0</td></tr> * </table> * * @category ISO @@ -154,6 +155,7 @@ public final class Namespaces extends St * <caption>Change log</caption> * <tr><th>SIS version</th> <th>URL</th></tr> * <tr><td>0.3 to 0.8</td> <td>http://www.isotc211.org/2005/gfc</td></tr> + * <tr><td>Since 1.0</td> <td>http://standards.iso.org/iso/19110/gfc/1.1</td></tr> * </table> * * @category ISO @@ -350,6 +352,7 @@ public final class Namespaces extends St * <caption>Change log</caption> * <tr><th>SIS version</th> <th>URL</th></tr> * <tr><td>0.3 to 0.8</td> <td>http://www.isotc211.org/2005/srv</td></tr> + * <tr><td>Since 1.0</td> <td>http://standards.iso.org/iso/19115/-3/srv/2.0</td></tr> * </table> * * @category ISO @@ -475,8 +478,11 @@ public final class Namespaces extends St * The usual prefix for this namespace is {@code "gts"}. * * @category ISO + * + * @deprecated as of ISO 19115-3, splitted in many different namespaces. */ - public static final String GTS = "http://www.isotc211.org/2005/gts"; + @Deprecated + public static final String GTS = LegacyNamespaces.GTS; /** * The <code>{@value}</code> URL. @@ -488,6 +494,7 @@ public final class Namespaces extends St * <caption>Change log</caption> * <tr><th>SIS version</th> <th>URL</th></tr> * <tr><td>0.3</td> <td>http://www.opengis.net/gml</td></tr> + * <tr><td>Since 0.4</td> <td>http://www.opengis.net/gml/3.2</td></tr> * </table> * * @category OGC Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -49,7 +49,8 @@ import org.apache.sis.internal.jaxb.Type * "endorsed JAR" names if needed. * * @author Martin Desruisseaux (Geomatys) - * @version 0.8 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.3 * @module */ @@ -115,12 +116,14 @@ abstract class Pooled { * Whether {@link FilteredNamespaces} shall be used of not. Values can be: * * <ul> - * <li>0 for the default behavior, which applies namespace replacements only if the {@link XML#GML_VERSION} - * property is set to an older value than the one supported natively by SIS.</li> - * <li>1 for forcing namespace replacements at unmarshalling time. This is useful for reading a XML document - * of unknown GML version.</li> - * <li>2 for disabling namespace replacements. XML (un)marshalling will use the namespaces URI supported - * natively by SIS as declared in JAXB annotations. This is sometime useful for debugging purpose.</li> + * <li>{@value #DEFAULT_REPLACEMENT} for the default behavior, which applies namespace replacements + * only if the {@link XML#GML_VERSION} property is set to an older value than the one supported + * natively by SIS.</li> + * <li>{@value #FORCE_REPLACEMENT} for forcing namespace replacements at unmarshalling time. + * This is useful for reading a XML document of unknown GML version.</li> + * <li>{@value #DISABLE_REPLACEMENT} for disabling namespace replacements. XML (un)marshalling + * will use the namespaces URI supported natively by SIS as declared in JAXB annotations. + * This is sometime useful for debugging purpose.</li> * </ul> * * @see LegacyNamespaces#APPLY_NAMESPACE_REPLACEMENTS @@ -128,6 +131,11 @@ abstract class Pooled { private byte xmlnsReplaceCode; /** + * Enumeration values for {@link #xmlnsReplaceCode}. + */ + private static final byte DEFAULT_REPLACEMENT = 0, FORCE_REPLACEMENT = 1, DISABLE_REPLACEMENT = 2; + + /** * The GML version to be marshalled or unmarshalled, or {@code null} if unspecified. * If null, then the latest version is assumed. * @@ -136,6 +144,14 @@ abstract class Pooled { private Version versionGML; /** + * The metadata version to be marshalled or unmarshalled, or {@code null} if unspecified. + * If null, then the latest version is assumed. + * + * @see Context#getVersion(String) + */ + private Version versionMetadata; + + /** * The reference resolver to use during unmarshalling. * Can be set by the {@link XML#RESOLVER} property. */ @@ -224,6 +240,7 @@ abstract class Pooled { schemas = template.schemas; xmlnsReplaceCode = template.xmlnsReplaceCode; versionGML = template.versionGML; + versionMetadata = template.versionMetadata; resolver = template.resolver; converter = template.converter; rootAdapters = template.rootAdapters; @@ -258,23 +275,28 @@ abstract class Pooled { */ final FilterVersion getFilterVersion() { switch (xmlnsReplaceCode) { - case 0: { + case DEFAULT_REPLACEMENT: { // Apply namespace replacements only for older versions than the one supported natively by SIS. if (versionGML != null) { if (versionGML.compareTo(LegacyNamespaces.VERSION_3_2_1) < 0) { return FilterVersion.GML31; } } + if (versionMetadata != null) { + if (versionMetadata.compareTo(LegacyNamespaces.ISO_19115_3) < 0) { + return FilterVersion.ISO19139; + } + } break; } - case 1: { + case FORCE_REPLACEMENT: { // Force namespace replacements at unmarshalling time (illegal for marshalling). if ((bitMasks & Context.MARSHALLING) == 0) { return FilterVersion.ALL; } break; } - // case 2: disable namespace replacements. + // case DISABLE_REPLACEMENT: disable namespace replacements. } return null; } @@ -343,6 +365,10 @@ abstract class Pooled { versionGML = (value instanceof CharSequence) ? new Version(value.toString()) : (Version) value; return; } + case XML.METADATA_VERSION: { + versionMetadata = (value instanceof CharSequence) ? new Version(value.toString()) : (Version) value; + return; + } case XML.RESOLVER: { resolver = (ReferenceResolver) value; return; @@ -376,9 +402,9 @@ abstract class Pooled { return; } case LegacyNamespaces.APPLY_NAMESPACE_REPLACEMENTS: { - xmlnsReplaceCode = 0; + xmlnsReplaceCode = DEFAULT_REPLACEMENT; if (value != null) { - xmlnsReplaceCode = ((Boolean) value) ? (byte) 1 : (byte) 2; + xmlnsReplaceCode = ((Boolean) value) ? FORCE_REPLACEMENT : DISABLE_REPLACEMENT; } return; } @@ -416,6 +442,7 @@ abstract class Pooled { case XML.TIMEZONE: return timezone; case XML.SCHEMAS: return schemas; case XML.GML_VERSION: return versionGML; + case XML.METADATA_VERSION: return versionMetadata; case XML.RESOLVER: return resolver; case XML.CONVERTER: return converter; case XML.WARNING_LISTENER: return warningListener; @@ -430,9 +457,9 @@ abstract class Pooled { } case LegacyNamespaces.APPLY_NAMESPACE_REPLACEMENTS: { switch (xmlnsReplaceCode) { - case 1: return Boolean.TRUE; - case 2: return Boolean.FALSE; - default: return null; + case FORCE_REPLACEMENT: return Boolean.TRUE; + case DISABLE_REPLACEMENT: return Boolean.FALSE; + default: return null; } } case TypeRegistration.ROOT_ADAPTERS: return (rootAdapters != null) ? rootAdapters.clone() : null; @@ -546,6 +573,6 @@ abstract class Pooled { * @see Context#finish() */ final Context begin() { - return new Context(bitMasks, locale, timezone, schemas, versionGML, resolver, converter, warningListener); + return new Context(bitMasks, locale, timezone, schemas, versionGML, versionMetadata, resolver, converter, warningListener); } } Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -64,7 +64,8 @@ import static org.apache.sis.util.Argume * <tr><td>{@link #TIMEZONE}</td> <td>{@link TimeZone}</td> <td>for specifying the timezone to use for dates and times.</td></tr> * <tr><td>{@link #SCHEMAS}</td> <td>{@link Map}</td> <td>for specifying the root URL of metadata schemas to use.</td></tr> * <tr><td>{@link #DEFAULT_NAMESPACE}</td> <td>{@link String}</td> <td>for specifying the default namespace of the XML document to write.</td></tr> - * <tr><td>{@link #GML_VERSION}</td> <td>{@link Version}</td> <td>for specifying the GML version to the document be (un)marshalled.</td></tr> + * <tr><td>{@link #GML_VERSION}</td> <td>{@link Version}</td> <td>for specifying the GML version of the document to be (un)marshalled.</td></tr> + * <tr><td>{@link #METADATA_VERSION}</td> <td>{@link Version}</td> <td>for specifying the metadata version of the document to be (un)marshalled.</td></tr> * <tr><td>{@link #RESOLVER}</td> <td>{@link ReferenceResolver}</td> <td>for replacing {@code xlink} or {@code uuidref} attributes by the actual object to use.</td></tr> * <tr><td>{@link #CONVERTER}</td> <td>{@link ValueConverter}</td> <td>for controlling the conversion of URL, UUID, Units or similar objects.</td></tr> * <tr><td>{@link #STRING_SUBSTITUTES}</td> <td>{@code String[]}</td> <td>for specifying which code lists to replace by simpler {@code <gco:CharacterString>} elements.</td></tr> @@ -73,7 +74,8 @@ import static org.apache.sis.util.Argume * * @author Cédric Briançon (Geomatys) * @author Martin Desruisseaux (Geomatys) - * @version 0.8 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.3 * @module */ @@ -171,7 +173,7 @@ public final class XML extends Static { * Newer versions typically have more elements, but not always. For example in {@code <gml:VerticalDatum>}, * the {@code <gml:verticalDatumType>} property presents in GML 3.0 and 3.1 has been removed in GML 3.2.</div> * - * The value can be {@link String} or {@link Version} objects. + * The value can be {@link String} or {@link Version} object. * If no version is specified, then the most recent GML version is assumed. * * <div class="section">Supported GML versions</div> @@ -184,6 +186,20 @@ public final class XML extends Static { public static final String GML_VERSION = "org.apache.sis.gml.version"; /** + * Specifies the metadata version of the document to be marshalled or unmarshalled. + * The metadata version may affect the set of XML elements to be marshalled and their namespaces. + * The value can be {@link String} or {@link Version} object. + * If no version is specified, then the most recent metadata version is assumed (ISO 19115-3). + * + * <div class="section">Supported metadata versions</div> + * Apache SIS currently supports ISO 19115-3 by default (with the value "2014"). + * SIS can read and write ISO 19139 if this property is set to "2003". + * + * @since 1.0 + */ + public static final String METADATA_VERSION = "org.apache.sis.metadata.version"; + + /** * Allows client code to replace {@code xlink} or {@code uuidref} attributes by the actual objects to use. * The value for this property shall be an instance of {@link ReferenceResolver}. * Modified: sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/package-info.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/package-info.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/package-info.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/main/java/org/apache/sis/xml/package-info.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -58,7 +58,8 @@ * @author Cédric Briançon (Geomatys) * @author Guilhem Legal (Geomatys) * @author Martin Desruisseaux (Geomatys) - * @version 0.7 + * @author Cullen Rombach (Image Matters) + * @version 1.0 * @since 0.3 * @module */ Modified: sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/StringAdapterTest.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/StringAdapterTest.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/StringAdapterTest.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/StringAdapterTest.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -57,7 +57,7 @@ public final strictfp class StringAdapte i18n.add(Locale.ENGLISH, "A word"); i18n.add(Locale.FRENCH, "Un mot"); i18n.add(Locale.JAPANESE, "言葉"); - final Context context = new Context(0, Locale.ENGLISH, null, null, null, null, null, null); + final Context context = new Context(0, Locale.ENGLISH, null, null, null, null, null, null, null); try { Context.push(Locale.JAPANESE); assertEquals("言葉", StringAdapter.toString(i18n)); Context.push(Locale.FRENCH); assertEquals("Un mot", StringAdapter.toString(i18n)); Modified: sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -143,7 +143,7 @@ public abstract strictfp class XMLTestCa */ protected final void createContext(final boolean marshal, final Locale locale, final String timezone) { context = new Context(marshal ? Context.MARSHALLING : 0, locale, - (timezone != null) ? TimeZone.getTimeZone(timezone) : null, null, null, null, null, null); + (timezone != null) ? TimeZone.getTimeZone(timezone) : null, null, null, null, null, null, null); } /** Modified: sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/xml/ReferenceResolverMock.java URL: http://svn.apache.org/viewvc/sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/xml/ReferenceResolverMock.java?rev=1817620&r1=1817619&r2=1817620&view=diff ============================================================================== --- sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/xml/ReferenceResolverMock.java [UTF-8] (original) +++ sis/branches/ISO-19115-3/core/sis-utility/src/test/java/org/apache/sis/xml/ReferenceResolverMock.java [UTF-8] Sat Dec 9 15:02:45 2017 @@ -58,7 +58,7 @@ public final strictfp class ReferenceRes */ public static Context begin(final boolean marshalling) { return new Context(marshalling ? Context.MARSHALLING : 0, null, null, null, null, - new ReferenceResolverMock(), null, null); + null, new ReferenceResolverMock(), null, null); } /**