Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -49,7 +49,7 @@ import static org.apache.sis.util.collec
  * bit tedious to explain, which is an other indication that they should not 
be in public API.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.3
  * @module
  */
@@ -61,6 +61,21 @@ public final class CollectionsExt extend
     }
 
     /**
+     * Returns a queue which is always empty and accepts no element.
+     * This method will be removed if a future JDK version provides such 
method in {@link Collections}.
+     *
+     * @param  <E>  the type of elements in the empty collection.
+     * @return an empty collection.
+     *
+     * @see Collections#emptyList()
+     * @see Collections#emptySet()
+     */
+    @SuppressWarnings("unchecked")
+    public static <E> Queue<E> emptyQueue() {
+        return EmptyQueue.INSTANCE;
+    }
+
+    /**
      * Returns an empty collection of the given type, or {@code null} if the 
given type is unknown to this method.
      *
      * @param  type  the desired collection type.
@@ -139,20 +154,6 @@ public final class CollectionsExt extend
     }
 
     /**
-     * Returns a {@linkplain Queue queue} which is always empty and accepts no 
element.
-     *
-     * @param  <E>  the type of elements in the empty collection.
-     * @return an empty collection.
-     *
-     * @see Collections#emptyList()
-     * @see Collections#emptySet()
-     */
-    @SuppressWarnings({"unchecked","rawtype"})
-    public static <E> Queue<E> emptyQueue() {
-        return EmptyQueue.INSTANCE;
-    }
-
-    /**
      * Returns the given value as a singleton if non-null, or returns an empty 
set otherwise.
      *
      * @param  <E>      the element type.
@@ -364,6 +365,8 @@ public final class CollectionsExt extend
      * @param  <E>  the type of elements in the set.
      * @param  set  the set to make unmodifiable, or {@code null}.
      * @return a unmodifiable version of the given set, or {@code null} if the 
given set was null.
+     *
+     * @see #compact(Set)
      */
     public static <E> Set<E> unmodifiableOrCopy(Set<E> set) {
         if (set != null) {
@@ -400,6 +403,8 @@ public final class CollectionsExt extend
      * @param  <V>  the type of values in the map.
      * @param  map  the map to make unmodifiable, or {@code null}.
      * @return a unmodifiable version of the given map, or {@code null} if the 
given map was null.
+     *
+     * @see #compact(Map)
      */
     public static <K,V> Map<K,V> unmodifiableOrCopy(Map<K,V> map) {
         if (map != null) {
@@ -593,19 +598,43 @@ public final class CollectionsExt extend
      * @param  <V>  the type of values in the map.
      * @param  map  the map to compact, or {@code null}.
      * @return a potentially compacted map, or {@code null} if the given map 
was null.
+     *
+     * @see #unmodifiableOrCopy(Map)
      */
     public static <K,V> Map<K,V> compact(final Map<K,V> map) {
         if (map != null) {
             switch (map.size()) {
-                case 0:  return Collections.emptyMap();
-                case 1:  final Map.Entry<K,V> entry = 
map.entrySet().iterator().next();
-                         return Collections.singletonMap(entry.getKey(), 
entry.getValue());
+                case 0: return Collections.emptyMap();
+                case 1: final Map.Entry<K,V> entry = 
map.entrySet().iterator().next();
+                        return Collections.singletonMap(entry.getKey(), 
entry.getValue());
             }
         }
         return map;
     }
 
     /**
+     * Returns a more compact representation of the given set. This method is 
similar to
+     * {@link #unmodifiableOrCopy(Set)} except that it does not wrap the set 
in an unmodifiable
+     * view. The intend is to avoid one level of indirection for performance 
and memory reasons.
+     * This is okay only if the set is kept in a private field and never 
escape outside that class.
+     *
+     * @param  <E>  the type of elements in the set.
+     * @param  set  the set to compact, or {@code null}.
+     * @return a unmodifiable version of the given set, or {@code null} if the 
given set was null.
+     *
+     * @see #unmodifiableOrCopy(Set)
+     */
+    public static <E> Set<E> compact(final Set<E> set) {
+        if (set != null) {
+            switch (set.size()) {
+                case 0: return Collections.emptySet();
+                case 1: return Collections.singleton(set.iterator().next());
+            }
+        }
+        return set;
+    }
+
+    /**
      * Returns a snapshot of the given list. The returned list will not be 
affected by changes
      * in the given list after this method call. This method makes no 
guaranteed about whether
      * the returned list is modifiable or not.
@@ -627,6 +656,18 @@ public final class CollectionsExt extend
     }
 
     /**
+     * Returns a clone of the given set. This method is only intended to avoid 
the "unchecked cast" warning.
+     *
+     * @param  <E>  type of elements in the set.
+     * @param  set  the set to clone.
+     * @return a clone of the given set.
+     */
+    @SuppressWarnings("unchecked")
+    public static <E> HashSet<E> clone(final HashSet<E> set) {
+        return (HashSet<E>) set.clone();
+    }
+
+    /**
      * Returns the given value as a collection. Special cases:
      *
      * <ul>

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/TemporalUtilities.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/TemporalUtilities.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/TemporalUtilities.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/util/TemporalUtilities.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -20,6 +20,7 @@ import java.util.Date;
 import org.apache.sis.internal.geoapi.temporal.Instant;
 import org.apache.sis.internal.geoapi.temporal.Period;
 import org.apache.sis.internal.geoapi.temporal.TemporalFactory;
+import org.opengis.temporal.TemporalPrimitive;
 import org.apache.sis.util.Static;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.internal.system.DefaultFactories;
@@ -31,7 +32,7 @@ import org.apache.sis.internal.system.De
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Guilhem Legal (Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.3
  * @module
  */
@@ -99,4 +100,28 @@ public final class TemporalUtilities ext
         final TemporalFactory factory = getTemporalFactory();
         return factory.createPeriod(createInstant(factory, begin), 
createInstant(factory, end));
     }
+
+    /**
+     * Infers a value from the extent as a {@link Date} object.
+     * This method is used for compatibility with legacy API and may disappear 
in future SIS version.
+     *
+     * @param  time  the instant or period for which to get a date, or {@code 
null}.
+     * @return the requested time as a Java date, or {@code null} if none.
+     *
+     * @since 1.0
+     */
+    public static Date getDate(final TemporalPrimitive time) {
+        Instant instant;
+        if (time instanceof Instant) {
+            instant = (Instant) time;
+        } else if (time instanceof Period) {
+            instant = ((Period) time).getEnding();
+            if (instant == null) {
+                instant = ((Period) time).getBeginning();
+            }
+        } else {
+            return null;
+        }
+        return instant.getDate();
+    }
 }

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java 
[UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -134,7 +134,9 @@ public final class Utilities extends Sta
             return true;
         }
         if (object1 == null || object2 == null) {
-            assert isNotDebug(mode) : "object" + (object1 == null ? '1' : '2') 
+ " is null";
+            assert isNotDebug(mode) : ((object1 != null) ? object1.getClass()
+                                     : (object2 != null) ? object2.getClass()
+                                     : Object.class).getSimpleName() + " #" + 
(object1 == null ? '1' : '2') + " is null";
             return false;
         }
         if (object1 instanceof LenientComparable) {

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -205,7 +205,7 @@ public class Cache<K,V> extends Abstract
      * {@linkplain Reference weak or soft references}.</p>
      *
      * @param initialCapacity  the initial capacity.
-     * @param costLimit        the maximum number of objects to keep by strong 
reference.
+     * @param costLimit        the maximum cost of objects to keep by strong 
reference.
      * @param soft             if {@code true}, use {@link SoftReference} 
instead of {@link WeakReference}.
      */
     public Cache(int initialCapacity, final long costLimit, final boolean 
soft) {

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultRecord.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -54,7 +54,7 @@ import org.apache.sis.internal.util.Abst
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cullen Rombach (Image Matters)
- * @version 0.8
+ * @version 1.0
  *
  * @see DefaultRecordType
  * @see DefaultRecordSchema
@@ -80,6 +80,14 @@ public class DefaultRecord implements Re
     private final Object values;
 
     /**
+     * Constructs an initially empty record. Used by JAXB.
+     */
+    private DefaultRecord() {
+        definition = null;
+        values = null;
+    }
+
+    /**
      * Creates a new record for the given record type.
      * The initial values are unspecified - they may be null or zero.
      * Callers can assign values by a call to {@link #setAll(Object[])}.
@@ -162,7 +170,8 @@ public class DefaultRecord implements Re
      */
     @Override
     public RecordType getRecordType() {
-        return definition.getRecordType();
+        // Should never be null, unless temporarily during unmarshalling.
+        return (definition != null) ? definition.getRecordType() : null;
     }
 
     /**

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -256,7 +256,7 @@ public final class Errors extends Indexe
         public static final short EmptyProperty_1 = 32;
 
         /**
-         * An error occurred in file “{0}” at Line {1}.
+         * An error occurred in file “{0}” at line {1}.
          */
         public static final short ErrorInFileAtLine_2 = 33;
 
@@ -535,6 +535,11 @@ public final class Errors extends Indexe
         public static final short MissingJAXBContext = 86;
 
         /**
+         * Missing or empty ‘{1}’ attribute in “{0}”.
+         */
+        public static final short MissingOrEmptyAttribute_2 = 182;
+
+        /**
          * This operation requires the “{0}” module.
          */
         public static final short MissingRequiredModule_1 = 87;

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
 [ISO-8859-1] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
 [ISO-8859-1] Mon Feb 26 11:28:17 2018
@@ -63,7 +63,7 @@ EmptyDictionary                   = The
 EmptyEnvelope2D                   = Envelope must be at least two-dimensional 
and non-empty.
 EmptyProperty_1                   = Property named \u201c{0}\u201d shall not 
be empty.
 ErrorIn_2                         = Error in \u201c{0}\u201d: {1}
-ErrorInFileAtLine_2               = An error occurred in file \u201c{0}\u201d 
at Line {1}.
+ErrorInFileAtLine_2               = An error occurred in file \u201c{0}\u201d 
at line {1}.
 ExcessiveArgumentSize_3           = Argument \u2018{0}\u2019 shall not contain 
more than {1} elements. A number of {2} is excessive.
 ExcessiveListSize_2               = A size of {1} elements is excessive for 
the \u201c{0}\u201d list.
 ExcessiveNumberOfDimensions_1     = For this algorithm, {0} is an excessive 
number of dimensions.
@@ -117,6 +117,7 @@ MismatchedMatrixSize_4            = Mism
 MissingCharacterInElement_2       = Missing a \u2018{1}\u2019 character in 
\u201c{0}\u201d element.
 MissingComponentInElement_2       = Missing a \u201c{1}\u201d component in 
\u201c{0}\u201d.
 MissingJAXBContext                = JAXB context has not been specified.
+MissingOrEmptyAttribute_2         = Missing or empty \u2018{1}\u2019 attribute 
in \u201c{0}\u201d.
 MissingRequiredModule_1           = This operation requires the 
\u201c{0}\u201d module.
 MissingValueForOption_1           = Missing value for \u201c{0}\u201d option.
 MissingValueForProperty_1         = Missing value for \u201c{0}\u201d property.

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
 [ISO-8859-1] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
 [ISO-8859-1] Mon Feb 26 11:28:17 2018
@@ -114,6 +114,7 @@ MismatchedMatrixSize_4            = Une
 MissingCharacterInElement_2       = Un caract\u00e8re \u2018{1}\u2019 est 
manquant dans l\u2019\u00e9l\u00e9ment \u00ab\u202f{0}\u202f\u00bb.
 MissingComponentInElement_2       = Il manque une composante 
\u00ab\u202f{1}\u202f\u00bb dans l\u2019\u00e9l\u00e9ment 
\u00ab\u202f{0}\u202f\u00bb.
 MissingJAXBContext                = Le contexte JAXB n\u2019a pas 
\u00e9t\u00e9 sp\u00e9cifi\u00e9.
+MissingOrEmptyAttribute_2         = L\u2019attribut \u2018{1}\u2019 de 
\u00ab\u202f{0}\u202f\u00bb est manquant ou vide.
 MissingRequiredModule_1           = Cette op\u00e9ration requiert le module 
\u00ab\u202f{0}\u202f\u00bb.
 MissingValueForOption_1           = Aucune valeur n\u2019a \u00e9t\u00e9 
d\u00e9finie pour l\u2019option \u00ab\u202f{0}\u202f\u00bb.
 MissingValueForProperty_1         = Aucune valeur n\u2019a \u00e9t\u00e9 
d\u00e9finie pour la propri\u00e9t\u00e9 \u00ab\u202f{0}\u202f\u00bb.

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -204,6 +204,11 @@ public final class Messages extends Inde
         public static final short PropertyHiddenBy_2 = 28;
 
         /**
+         * “{0}” is not the name of a known list of codes.
+         */
+        public static final short UnknownCodeList_1 = 33;
+
+        /**
          * The text contains unknown elements:
          */
         public static final short UnknownElementsInText = 29;

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties
 [ISO-8859-1] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties
 [ISO-8859-1] Mon Feb 26 11:28:17 2018
@@ -44,6 +44,7 @@ LocalesDiscarded                 = Text
 OptionalModuleNotFound_1         = Optional module \u201c{0}\u201d requested 
but not found.
 PropertyHiddenBy_2               = Property \u201c{0}\u201d is hidden by 
\u201c{1}\u201d.
 NonConformFormatting_1           = This \u201c{0}\u201d formatting is a 
departure from standard format.
+UnknownCodeList_1                = \u201c{0}\u201d is not the name of a known 
list of codes.
 UnknownElementsInText            = The text contains unknown elements:
 UnknownKeywordInRecord_2         = Loading of \u201c{0}\u201d done, but some 
records were ignored because of unrecognized keywords: {1}
 UnparsableValueStoredAsText_2    = Can not parse \u201c{1}\u201d as an 
instance of \u2018{0}\u2019. The value is stored as plain text instead, but 
will be ignored by some processing.

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties
 [ISO-8859-1] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties
 [ISO-8859-1] Mon Feb 26 11:28:17 2018
@@ -51,6 +51,7 @@ LocalesDiscarded                 = Des t
 OptionalModuleNotFound_1         = Le module optionnel 
\u00ab\u202f{0}\u202f\u00bb a \u00e9t\u00e9 demand\u00e9 mais n\u2019a pas 
\u00e9t\u00e9 trouv\u00e9.
 PropertyHiddenBy_2               = La propri\u00e9t\u00e9 
\u00ab\u202f{0}\u202f\u00bb est masqu\u00e9e par \u00ab\u202f{1}\u202f\u00bb.
 NonConformFormatting_1           = Cette \u00e9criture de 
\u00ab\u202f{0}\u202f\u00bb d\u00e9vie du format standard.
+UnknownCodeList_1                = \u00ab\u202f{0}\u202f\u00bb n\u2019est pas 
le nom d\u2019une liste de codes connue.
 UnknownElementsInText            = Le texte contient des \u00e9l\u00e9ments 
inconnus\u00a0:
 UnknownKeywordInRecord_2         = La lecture de \u00ab\u202f{0}\u202f\u00bb a 
\u00e9t\u00e9 faite, mais en ignorant certains enregistrements \u00e0 cause de 
mots-cl\u00e9s non reconnus: {1}
 UnparsableValueStoredAsText_2    = La valeur \u00ab\u202f{1}\u202f\u00bb ne 
peut pas \u00eatre interpr\u00e9t\u00e9e comme une instance de \u2018{0}\u2019. 
Elle est donc m\u00e9moris\u00e9e sous sa forme textuelle, mais sera 
ignor\u00e9e par certains traitements.

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/IdentifiedObject.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/IdentifiedObject.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/IdentifiedObject.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/IdentifiedObject.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -27,7 +27,7 @@ import org.opengis.metadata.citation.Cit
  * <a href="http://www.epsg.org";>EPSG</a> for Coordinate Reference System 
objects, or a
  * well-known acronym like ISBN for <cite>International Standard Book 
Number</cite>.
  *
- * <p>When an identified object is marshalled in a ISO 19139 compliant XML 
document, some identifiers
+ * <p>When an identified object is marshalled in a ISO 19115-3 compliant XML 
document, some identifiers
  * are handled in a special way: they appear as {@code gml:id}, {@code 
gco:uuid} or {@code xlink:href}
  * attributes of the XML element. Those identifiers can be specified using the 
{@link IdentifierSpace}
  * enum values as below:</p>

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/InputFactory.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/InputFactory.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/InputFactory.java 
[UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/InputFactory.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -25,7 +25,6 @@ import javax.xml.stream.XMLStreamExcepti
 import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stax.StAXSource;
 import org.w3c.dom.Node;
 import org.xml.sax.InputSource;
 import org.apache.sis.util.Static;
@@ -37,7 +36,7 @@ import org.apache.sis.util.Static;
  * only when first needed, when initializing this class.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.4
  * @module
  */
@@ -55,7 +54,7 @@ final class InputFactory extends Static
 
     /*
      * Do not provide convenience method for java.io.File, because the caller 
needs to close the created
-     * input stream himself (this is not done by XMLStreamReader.close(), 
despite its method name).
+     * input stream himself (this is not done by XMLEventReader.close(), 
despite its method name).
      */
 
     /**
@@ -65,8 +64,8 @@ final class InputFactory extends Static
      * @return the reader.
      * @throws XMLStreamException if the reader can not be created.
      */
-    public static XMLStreamReader createXMLStreamReader(final InputStream in) 
throws XMLStreamException {
-        return FACTORY.createXMLStreamReader(in);
+    public static XMLEventReader createXMLEventReader(final InputStream in) 
throws XMLStreamException {
+        return FACTORY.createXMLEventReader(in);
     }
 
     /**
@@ -76,8 +75,8 @@ final class InputFactory extends Static
      * @return the reader.
      * @throws XMLStreamException if the reader can not be created.
      */
-    public static XMLStreamReader createXMLStreamReader(final Reader in) 
throws XMLStreamException {
-        return FACTORY.createXMLStreamReader(in);
+    public static XMLEventReader createXMLEventReader(final Reader in) throws 
XMLStreamException {
+        return FACTORY.createXMLEventReader(in);
     }
 
     /**
@@ -87,8 +86,8 @@ final class InputFactory extends Static
      * @return the reader.
      * @throws XMLStreamException if the reader can not be created.
      */
-    public static XMLStreamReader createXMLStreamReader(final InputSource in) 
throws XMLStreamException {
-        return FACTORY.createXMLStreamReader(new SAXSource(in));
+    public static XMLEventReader createXMLEventReader(final InputSource in) 
throws XMLStreamException {
+        return FACTORY.createXMLEventReader(new SAXSource(in));
     }
 
     /**
@@ -98,8 +97,8 @@ final class InputFactory extends Static
      * @return the reader.
      * @throws XMLStreamException if the reader can not be created.
      */
-    public static XMLStreamReader createXMLStreamReader(final XMLEventReader 
in) throws XMLStreamException {
-        return FACTORY.createXMLStreamReader(new StAXSource(in));
+    public static XMLEventReader createXMLEventReader(final XMLStreamReader 
in) throws XMLStreamException {
+        return FACTORY.createXMLEventReader(in);
     }
 
     /**
@@ -109,8 +108,8 @@ final class InputFactory extends Static
      * @return the reader.
      * @throws XMLStreamException if the reader can not be created.
      */
-    public static XMLStreamReader createXMLStreamReader(final Node in) throws 
XMLStreamException {
-        return FACTORY.createXMLStreamReader(new DOMSource(in));
+    public static XMLEventReader createXMLEventReader(final Node in) throws 
XMLStreamException {
+        return FACTORY.createXMLEventReader(new DOMSource(in));
     }
 
     /**
@@ -120,7 +119,7 @@ final class InputFactory extends Static
      * @return the reader.
      * @throws XMLStreamException if the reader can not be created.
      */
-    public static XMLStreamReader createXMLStreamReader(final Source in) 
throws XMLStreamException {
-        return FACTORY.createXMLStreamReader(in);
+    public static XMLEventReader createXMLEventReader(final Source in) throws 
XMLStreamException {
+        return FACTORY.createXMLEventReader(in);
     }
 }

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java 
[UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshalContext.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -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,9 @@ 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>
+     *   <tr><td>gmd</td>     <td>Geographic MetaData</td>        <td>{@code 
2007}, {@code 2016}</td></tr>
      * </table>
      *
      * @param  prefix  one of the above-cited prefix.

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java 
[UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Namespaces.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -22,6 +22,7 @@ import java.util.Locale;
 import javax.xml.XMLConstants;
 import org.apache.sis.util.Static;
 import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.internal.jaxb.LegacyNamespaces;
 
 
 /**
@@ -33,21 +34,44 @@ import org.apache.sis.util.ArgumentCheck
  * URLs determined by the SIS version available at compile-time, not runtime, 
because the
  * {@code javac} compiler inlines string constants.</p>
  *
- * <p>The following table lists the URLs, their usual prefix, and the SIS 
versions when each URL changed.</p>
+ * <p>The following table lists some URLs, their usual prefix, and the SIS 
versions when each URL changed.</p>
  * <table class="sis">
  *   <caption>Namespaces and change log</caption>
- *   <tr><th>Prefix</th> <th>XML Namespace</th>   <th>Changes history</th></tr>
- *   <tr><td>gco</td>    <td>{@value #GCO}</td>   <td></td></tr>
- *   <tr><td>gfc</td>    <td>{@value #GFC}</td>   <td></td></tr>
- *   <tr><td>gmd</td>    <td>{@value #GMD}</td>   <td></td></tr>
- *   <tr><td>gmi</td>    <td>{@value #GMI}</td>   <td></td></tr>
- *   <tr><td>srv</td>    <td>{@value #SRV}</td>   <td></td></tr>
- *   <tr><td>gts</td>    <td>{@value #GTS}</td>   <td></td></tr>
- *   <tr><td>gmx</td>    <td>{@value #GMX}</td>   <td></td></tr>
- *   <tr><td>gml</td>    <td>{@value #GML}</td>   <td>SIS 0.4</td></tr>
- *   <tr><td>csw</td>    <td>{@value #CSW}</td>   <td></td></tr>
- *   <tr><td>xsi</td>    <td>{@value #XSI}</td>   <td></td></tr>
- *   <tr><td>xlink</td>  <td>{@value #XLINK}</td> <td></td></tr>
+ *   <tr><th>Prefix</th> <th>Meaning</th>                                    
<th>XML Namespace</th>   <th>Changes history</th></tr>
+ *   <tr><td>lan</td>    <td>Language localization</td>                      
<td>{@value #LAN}</td>   <td></td></tr>
+ *   <tr><td>gco</td>    <td>Geographic COmmon</td>                          
<td>{@value #GCO}</td>   <td>SIS 1.0</td></tr>
+ *   <tr><td>mcc</td>    <td>Metadata Common Classes</td>                    
<td>{@value #MCC}</td>   <td></td></tr>
+ *   <tr><td>fcc</td>    <td>Feature Catalog Common</td>                     
<td>{@value #FCC}</td>   <td></td></tr>
+ *   <tr><td>gfc</td>    <td>General Feature Catalog</td>                    
<td>{@value #GFC}</td>   <td>SIS 1.0</td></tr>
+ *   <tr><td>cat</td>    <td>CATalogue</td>                                  
<td>{@value #CAT}</td>   <td></td></tr>
+ *   <tr><td>mdb</td>    <td>Metadata Base</td>                              
<td>{@value #MDB}</td>   <td></td></tr>
+ *   <tr><td>cit</td>    <td>Citation and responsible party information</td> 
<td>{@value #CIT}</td>   <td></td></tr>
+ *   <tr><td>gex</td>    <td>Geospatial EXtent</td>                          
<td>{@value #GEX}</td>   <td></td></tr>
+ *   <tr><td>rce</td>    <td>Referencing By Coordinates Common</td>          
<td>{@value #RCE}</td>   <td></td></tr>
+ *   <tr><td>mrs</td>    <td>Metadata for Reference System</td>              
<td>{@value #MRS}</td>   <td></td></tr>
+ *   <tr><td>msr</td>    <td>Metadata for Spatial Representation</td>        
<td>{@value #MSR}</td>   <td></td></tr>
+ *   <tr><td>mrc</td>    <td>Metadata for Resource Content</td>              
<td>{@value #MRC}</td>   <td></td></tr>
+ *   <tr><td>mri</td>    <td>Metadata for Resource Identification</td>       
<td>{@value #MRI}</td>   <td></td></tr>
+ *   <tr><td>mrd</td>    <td>Metadata for Resource Distribution</td>         
<td>{@value #MRD}</td>   <td></td></tr>
+ *   <tr><td>mdt</td>    <td>Metadata for Data Transfer</td>                 
<td>{@value #MDT}</td>   <td></td></tr>
+ *   <tr><td>mco</td>    <td>Metadata for Constraints</td>                   
<td>{@value #MCO}</td>   <td></td></tr>
+ *   <tr><td>mac</td>    <td>Metadata for Acquisition</td>                   
<td>{@value #MAC}</td>   <td></td></tr>
+ *   <tr><td>mrl</td>    <td>Metadata for Resource Lineage</td>              
<td>{@value #MRL}</td>   <td></td></tr>
+ *   <tr><td>mmi</td>    <td>Metadata for Maintenance Information</td>       
<td>{@value #MMI}</td>   <td></td></tr>
+ *   <tr><td>dqc</td>    <td>Data Quality Common Classes</td>                
<td>{@value #DQC}</td>   <td></td></tr>
+ *   <tr><td>mdq</td>    <td>Metadata for Data Quality</td>                  
<td>{@value #MDQ}</td>   <td></td></tr>
+ *   <tr><td>mds</td>    <td>Metadata for Data and Services</td>             
<td>{@value #MDS}</td>   <td></td></tr>
+ *   <tr><td>srv</td>    <td>Metadata for Services</td>                      
<td>{@value #SRV}</td>   <td>SIS 1.0</td></tr>
+ *   <tr><td>mpc</td>    <td>Metadata for Portrayal Catalog</td>             
<td>{@value #MPC}</td>   <td></td></tr>
+ *   <tr><td>mda</td>    <td>MetaData Application</td>                       
<td>{@value #MDA}</td>   <td></td></tr>
+ *   <tr><td>mas</td>    <td>Metadata for Application Schema</td>            
<td>{@value #MAS}</td>   <td></td></tr>
+ *   <tr><td>mex</td>    <td>Metadata with Schema Extensions</td>            
<td>{@value #MEX}</td>   <td></td></tr>
+ *   <tr><td>gcx</td>    <td>Geospatial Common eXtension</td>                
<td>{@value #GCX}</td>   <td></td></tr>
+ *   <tr><td>gmw</td>    <td>Geographic Markup Wrappers</td>                 
<td>{@value #GMW}</td>   <td></td></tr>
+ *   <tr><td>gml</td>    <td>Geographic Markup Language</td>                 
<td>{@value #GML}</td>   <td>SIS 0.4</td></tr>
+ *   <tr><td>csw</td>    <td>Catalog Service for the Web</td>                
<td>{@value #CSW}</td>   <td></td></tr>
+ *   <tr><td>xsi</td>    <td>XML Schema Instance information</td>            
<td>{@value #XSI}</td>   <td></td></tr>
+ *   <tr><td>xlink</td>  <td>Link</td>                                       
<td>{@value #XLINK}</td> <td></td></tr>
  * </table>
  *
  * <div class="section">Profiles</div>
@@ -61,8 +85,9 @@ import org.apache.sis.util.ArgumentCheck
  *
  * @author  Cédric Briançon (Geomatys)
  * @author  Quentin Boileau (Geomatys)
- * @author  Guilhem Legal (Geomatys)
- * @version 0.4
+ * @author  Guilhem Legal   (Geomatys)
+ * @author  Cullen Rombach  (Image Matters)
+ * @version 1.0
  * @since   0.3
  * @module
  */
@@ -74,60 +99,390 @@ public final class Namespaces extends St
     }
 
     /**
-     * The <code>{@value}</code> URL.
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/lan/1.0/index.html";>Language 
localization (LAN) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "lan"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String LAN = 
"http://standards.iso.org/iso/19115/-3/lan/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/gco/1.0/index.html";>Geographic 
COmmon (GCO) version 1.0</a>.
      * The usual prefix for this namespace is {@code "gco"}.
      *
+     * <p>History</p>
+     * <table class="sis">
+     *   <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
      */
-    public static final String GCO = "http://www.isotc211.org/2005/gco";;
+    public static final String GCO = 
"http://standards.iso.org/iso/19115/-3/gco/1.0";;
 
     /**
-     * The <code>{@value}</code> URL.
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mcc/1.0/index.html";>Metadata Common 
Classes (MCC) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mcc"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MCC = 
"http://standards.iso.org/iso/19115/-3/mcc/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a href="http://standards.iso.org/iso/19110/fcc/1.0/index.html";>Feature 
Catalog Common (FCC) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "fcc"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String FCC = 
"http://standards.iso.org/iso/19110/fcc/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a href="http://standards.iso.org/iso/19110/gfc/1.1/index.html";>General 
Feature Catalog (GFC) version 1.1</a>.
      * The usual prefix for this namespace is {@code "gfc"}.
      *
+     * <p>History</p>
+     * <table class="sis">
+     *   <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
      */
-    public static final String GFC = "http://www.isotc211.org/2005/gfc";;
+    public static final String GFC = 
"http://standards.iso.org/iso/19110/gfc/1.1";;
 
     /**
-     * The <code>{@value}</code> URL.
-     * The usual prefix for this namespace is {@code "gmd"}.
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/cat/1.0/index.html";>CATalogue (CAT) 
version 1.0</a>.
+     * The usual prefix for this namespace is {@code "cat"}.
      *
      * @category ISO
+     * @since 1.0
      */
-    public static final String GMD = "http://www.isotc211.org/2005/gmd";;
+    public static final String CAT = 
"http://standards.iso.org/iso/19115/-3/cat/1.0";;
 
     /**
-     * The <code>{@value}</code> URL.
-     * The usual prefix for this namespace is {@code "gmi"}.
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mdb/1.0/index.html";>Metadata Base 
(MDB) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mdb"}.
      *
      * @category ISO
+     * @since 1.0
      */
-    public static final String GMI = "http://www.isotc211.org/2005/gmi";;
+    public static final String MDB = 
"http://standards.iso.org/iso/19115/-3/mdb/1.0";;
 
     /**
-     * The <code>{@value}</code> URL.
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/cit/1.0/index.html";>Citation and 
responsible party information (CIT) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "cit"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String CIT = 
"http://standards.iso.org/iso/19115/-3/cit/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/gex/1.0/index.html";>Geospatial 
EXtent (GEX) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "gex"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String GEX = 
"http://standards.iso.org/iso/19115/-3/gex/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mrs/1.0/index.html";>Metadata for 
Reference System (MRS) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mrs"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MRS = 
"http://standards.iso.org/iso/19115/-3/mrs/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19111/rce/1.0/index.html";>Referencing By 
Coordinates Common (RCE) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "rce"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String RCE = 
"http://standards.iso.org/iso/19111/rce/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/msr/1.0/index.html";>Metadata for 
Spatial Representation (MSR) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "msr"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MSR = 
"http://standards.iso.org/iso/19115/-3/msr/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mrc/1.0/index.html";>Metadata for 
Resource Content (MRC) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mrc"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MRC = 
"http://standards.iso.org/iso/19115/-3/mrc/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mri/1.0/index.html";>Metadata for 
Resource Identification (MRI) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mri"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MRI = 
"http://standards.iso.org/iso/19115/-3/mri/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mrd/1.0/index.html";>Metadata for 
Resource Distribution (MRD) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mrd"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MRD = 
"http://standards.iso.org/iso/19115/-3/mrd/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mdt/1.0/index.html";>Metadata for 
Data Transfer (MDT) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mdt"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MDT = 
"http://standards.iso.org/iso/19115/-3/mdt/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mco/1.0/index.html";>Metadata for 
Constraints (MCO) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mco"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MCO = 
"http://standards.iso.org/iso/19115/-3/mco/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mac/1.0/index.html";>Metadata for 
Acquisition (MAC) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mac"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MAC = 
"http://standards.iso.org/iso/19115/-3/mac/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mrl/1.0/index.html";>Metadata for 
Resource Lineage (MRL) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mrl"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MRL = 
"http://standards.iso.org/iso/19115/-3/mrl/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mmi/1.0/index.html";>Metadata for 
Maintenance Information (MMI) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mmi"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MMI = 
"http://standards.iso.org/iso/19115/-3/mmi/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a href="http://standards.iso.org/iso/19157/-2/dqc/1.0/index.html";>Data 
Quality Common Classes (DQC) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "dqc"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String DQC = 
"http://standards.iso.org/iso/19157/-2/dqc/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19157/-2/mdq/1.0/index.html";>Metadata for 
Data Quality (MDQ) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mdq"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MDQ = 
"http://standards.iso.org/iso/19157/-2/mdq/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mds/1.0/index.html";>Metadata for 
Data and Services (MDS) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mds"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MDS = 
"http://standards.iso.org/iso/19115/-3/mds/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/srv/2.0/index.html";>Metadata for 
Services (SRV) version 2.0</a>.
      * The usual prefix for this namespace is {@code "srv"}.
      *
+     * <p>History</p>
+     * <table class="sis">
+     *   <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
+     * @since 1.0
+     */
+    public static final String SRV = 
"http://standards.iso.org/iso/19115/-3/srv/2.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mpc/1.0/index.html";>Metadata for 
Portrayal Catalog (MPC) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mpc"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MPC = 
"http://standards.iso.org/iso/19115/-3/mpc/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mda/1.0/index.html";>MetaData 
Application (MDA) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mda"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MDA = 
"http://standards.iso.org/iso/19115/-3/mda/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mas/1.0/index.html";>Metadata for 
Application Schema (MAS) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mas"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MAS = 
"http://standards.iso.org/iso/19115/-3/mas/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/mex/1.0/index.html";>Metadata with 
Schema Extensions (MEX) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "mex"}.
+     *
      * @category ISO
+     * @since 1.0
      */
-    public static final String SRV = "http://www.isotc211.org/2005/srv";;
+    public static final String MEX = 
"http://standards.iso.org/iso/19115/-3/mex/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/gcx/1.0/index.html";>Geospatial 
Common eXtension (GCX) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "gcx"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String GCX = 
"http://standards.iso.org/iso/19115/-3/gcx/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/md1/1.0/index.html";>Metadata for 
Data and Services with Geospatial Common Extensions (MD1) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "md1"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MD1 = 
"http://standards.iso.org/iso/19115/-3/md1/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/md2/1.0/index.html";>Metadata for 
Data and Services with Geospatial Common Extensions (MD2) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "md2"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String MD2 = 
"http://standards.iso.org/iso/19115/-3/md2/1.0";;
+
+    /**
+     * The <code>{@value}</code> URL. This is the namespace of
+     * <a 
href="http://standards.iso.org/iso/19115/-3/gmw/1.0/index.html";>Geographic 
Markup Wrappers (GMW) version 1.0</a>.
+     * The usual prefix for this namespace is {@code "gmw"}.
+     *
+     * @category ISO
+     * @since 1.0
+     */
+    public static final String GMW = 
"http://standards.iso.org/iso/19115/-3/gmw/1.0";;
 
     /**
      * The <code>{@value}</code> URL.
-     * The usual prefix for this namespace is {@code "gts"}.
+     * The usual prefix for this namespace is {@code "gmd"}.
+     *
+     * @category ISO
+     *
+     * @deprecated as of ISO 19115-3, splitted in many different namespaces.
+     */
+    @Deprecated
+    public static final String GMD = LegacyNamespaces.GMD;
+
+    /**
+     * The <code>{@value}</code> URL.
+     * The usual prefix for this namespace is {@code "gmi"}.
      *
      * @category ISO
+     *
+     * @deprecated as of ISO 19115-4, splitted in many different namespaces.
      */
-    public static final String GTS = "http://www.isotc211.org/2005/gts";;
+    @Deprecated
+    public static final String GMI = LegacyNamespaces.GMI;
 
     /**
      * The <code>{@value}</code> URL.
      * The usual prefix for this namespace is {@code "gmx"}.
      *
      * @category ISO
+     *
+     * @deprecated as of ISO 19115-3, splitted in many different namespaces.
      */
-    public static final String GMX = "http://www.isotc211.org/2005/gmx";;
+    @Deprecated
+    public static final String GMX = LegacyNamespaces.GMX;
+
+    /**
+     * The <code>{@value}</code> URL.
+     * The usual prefix for this namespace is {@code "gts"}.
+     *
+     * @category ISO
+     *
+     * @deprecated as of ISO 19115-3, splitted in many different namespaces.
+     */
+    @Deprecated
+    public static final String GTS = LegacyNamespaces.GTS;
 
     /**
      * The <code>{@value}</code> URL.
@@ -139,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
@@ -175,6 +531,11 @@ public final class Namespaces extends St
      * URLs for which the prefix to use directly follows them.
      */
     private static final String[] GENERIC_URLS = {
+        "http://standards.iso.org/iso/19115/-3/";,
+        "http://standards.iso.org/iso/19115/-2/";,
+        "http://standards.iso.org/iso/19157/-2/";,
+        "http://standards.iso.org/iso/19111/";,
+        "http://standards.iso.org/iso/19110/";,
         "http://www.isotc211.org/2005/";,
         "http://www.opengis.net/";,
         "http://www.w3.org/1999/";,
@@ -189,7 +550,7 @@ public final class Namespaces extends St
     private static final Map<String,String> SPECIFIC_URLS;
     static {
         final Map<String,String> p = new HashMap<>(40);
-        p.put(XMLConstants.W3C_XML_SCHEMA_NS_URI,                         
"xsd");   // TODO: should be "xs".
+        p.put(XMLConstants.W3C_XML_SCHEMA_NS_URI,                          
"xs");
         p.put(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI,                
"xsi");
         p.put("http://www.w3.org/2004/02/skos/core#";,                    
"skos");
         p.put("http://www.w3.org/1999/02/22-rdf-syntax-ns#";,              
"rdf");
@@ -205,6 +566,8 @@ public final class Namespaces extends St
         p.put("http://www.opengis.net/citygml/building/1.0";,            
"build");
         p.put("http://www.opengis.net/citygml/cityfurniture/1.0";,   
"furniture");
         p.put("http://www.opengis.net/citygml/transportation/1.0";,         
"tr");
+        p.put("http://www.isotc211.org/2005/gco";,                        
"gcol");   // "l" for "legacy" (prior version 1).
+        p.put("http://www.isotc211.org/2005/srv";,                        
"srv1");
         p.put("http://www.purl.org/dc/elements/1.1/";,                     
"dc2");
         p.put("http://www.purl.org/dc/terms/";,                           
"dct2");
         p.put("http://purl.org/dc/terms/";,                                
"dct");
@@ -223,7 +586,7 @@ public final class Namespaces extends St
      * Returns the preferred prefix for the given namespace URI.
      *
      * @param  namespace     the namespace URI for which the prefix needs to 
be found. Can not be {@code null}.
-     * @param  defaultValue  the default prefix to returned if the given 
{@code namespace} is not recognized,
+     * @param  defaultValue  the default prefix to return if the given {@code 
namespace} is not recognized,
      *                       or {@code null}.
      * @return the prefix inferred from the namespace URI, or {@code null} if 
the given namespace is unrecognized
      *         and the {@code defaultValue} is null.
@@ -249,4 +612,54 @@ public final class Namespaces extends St
         }
         return defaultValue;
     }
+
+    /**
+     * Guesses the namespace for a type of the given ISO name. The argument 
given to this method
+     * must be a class name defined by ISO 19115 or other standards to be 
added in the future.
+     * Those ISO class names usually start with a two letter prefix, e.g. 
{@code "CI"}
+     * in {@link org.apache.sis.metadata.iso.citation.DefaultCitation 
CI_Citation}.
+     *
+     * <p>This method uses heuristic rules, first looking at the prefix, then 
the rest of the name in case of ambiguity.
+     * A namespace is returned on a <em>best effort</em> basis only; this 
method may or may not check the full name, and
+     * values returned by this method may change in future SIS versions (e.g. 
when new standards become supported by SIS
+     * or when existing standards are upgraded). This method should be used in 
last resort only, when this information
+     * can not be obtained easily in a more reliable way.</p>
+     *
+     * @param  type  a class name defined by ISO 19115 or related standards 
(e.g. {@code "CI_Citation"}.
+     * @return a <em>possible</em> namespace for the given type, or {@code 
null} if unknown.
+     *
+     * @since 1.0
+     */
+    public static String guessForType(final String type) {
+        /*
+         * Implementation note: we could invoke 
TransformingReader.namespace(type) unconditionally,
+         * but that method may be removed in a future SIS version if we 
replace TransformingReader
+         * by XSD 
(https://issues.apache.org/jira/projects/SIS/issues/SIS-381). By using a switch 
now,
+         * we reduce the behavioral change is SIS-381 is applied. It can also 
reduce classes loading.
+         */
+        if (type != null && type.length() >= 3) {
+            if (type.charAt(2) == '_') {
+                switch ((type.charAt(0) << Character.SIZE) | type.charAt(1)) {
+                    case ('C' << Character.SIZE) | 'I': return CIT;
+                    case ('E' << Character.SIZE) | 'X': return GEX;
+                    case ('F' << Character.SIZE) | 'C': return GFC;
+                    case ('L' << Character.SIZE) | 'E':
+                    case ('L' << Character.SIZE) | 'I': return MRL;
+                    case ('D' << Character.SIZE) | 'S': // Usually MDA except 
for DS_InitiativeTypeCode
+                    case ('M' << Character.SIZE) | 'D':
+                    case ('M' << Character.SIZE) | 'I': return 
TransformingReader.namespace(type);
+                    case ('M' << Character.SIZE) | 'X': return MDT;
+                    case ('P' << Character.SIZE) | 'T': return LAN;
+                    case ('S' << Character.SIZE) | 'V': return SRV;
+                    case ('C' << Character.SIZE) | 'S':
+                    case ('C' << Character.SIZE) | 'D':
+                    case ('S' << Character.SIZE) | 'C': return GML;
+                }
+            } else {
+                // Needs to handle at least DCPList
+                return TransformingReader.namespace(type);
+            }
+        }
+        return null;
+    }
 }

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/NilObject.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/NilObject.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/NilObject.java 
[UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/NilObject.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -27,8 +27,8 @@ package org.apache.sis.xml;
  * ({@link NilReason#UNKNOWN UNKNOW}), the information may not exist at all 
({@link NilReason#MISSING
  * MISSING}) or can not be divulged ({@link NilReason#WITHHELD WITHHELD}).
  *
- * <p>Nil objects appear most frequently in XML documents since if a mandatory 
ISO 19115 attribute
- * is absent, then the ISO 19139 standard requires us to said why it is so. 
The following example
+ * <p>Nil objects appear most frequently in XML documents because if a 
mandatory ISO 19115-1 attribute
+ * is absent, then the ISO 19115-3 standard requires us to said why it is 
absent. The following example
  * shows a {@code CI_Citation} fragment with an ordinary {@code CI_Series} 
element on the left side,
  * and an unknown {@code CI_Series} element on the right side:</p>
  *

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/OutputFactory.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/OutputFactory.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/OutputFactory.java 
[UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/OutputFactory.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -37,7 +37,7 @@ import org.apache.sis.util.Static;
  * only when first needed, when initializing this class.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.4
  * @module
  */
@@ -55,7 +55,7 @@ final class OutputFactory extends Static
 
     /*
      * Do not provide convenience method for java.io.File, because the caller 
needs to close the created
-     * output stream himself (this is not done by XMLStreamWriter.close(), 
despite its method name).
+     * output stream himself (this is not done by XMLEventWriter.close(), 
despite its method name).
      */
 
     /**
@@ -66,8 +66,8 @@ final class OutputFactory extends Static
      * @return the writer.
      * @throws XMLStreamException if the writer can not be created.
      */
-    public static XMLStreamWriter createXMLStreamWriter(OutputStream out, 
String encoding) throws XMLStreamException {
-        return FACTORY.createXMLStreamWriter(out, encoding);
+    public static XMLEventWriter createXMLEventWriter(OutputStream out, String 
encoding) throws XMLStreamException {
+        return FACTORY.createXMLEventWriter(out, encoding);
     }
 
     /**
@@ -77,8 +77,8 @@ final class OutputFactory extends Static
      * @return the writer.
      * @throws XMLStreamException if the writer can not be created.
      */
-    public static XMLStreamWriter createXMLStreamWriter(final Writer out) 
throws XMLStreamException {
-        return FACTORY.createXMLStreamWriter(out);
+    public static XMLEventWriter createXMLEventWriter(final Writer out) throws 
XMLStreamException {
+        return FACTORY.createXMLEventWriter(out);
     }
 
     /**
@@ -89,8 +89,8 @@ final class OutputFactory extends Static
      * @return the writer.
      * @throws XMLStreamException if the writer can not be created.
      */
-    public static XMLStreamWriter createXMLStreamWriter(final ContentHandler 
out) throws XMLStreamException {
-        return FACTORY.createXMLStreamWriter(new SAXResult(out));
+    public static XMLEventWriter createXMLEventWriter(final ContentHandler 
out) throws XMLStreamException {
+        return FACTORY.createXMLEventWriter(new SAXResult(out));
     }
 
     /**
@@ -101,8 +101,8 @@ final class OutputFactory extends Static
      * @return the writer.
      * @throws XMLStreamException if the writer can not be created.
      */
-    public static XMLStreamWriter createXMLStreamWriter(final Node out) throws 
XMLStreamException {
-        return FACTORY.createXMLStreamWriter(new DOMResult(out));
+    public static XMLEventWriter createXMLEventWriter(final Node out) throws 
XMLStreamException {
+        return FACTORY.createXMLEventWriter(new DOMResult(out));
     }
 
     /**
@@ -113,8 +113,8 @@ final class OutputFactory extends Static
      * @return the writer.
      * @throws XMLStreamException if the writer can not be created.
      */
-    public static XMLStreamWriter createXMLStreamWriter(final XMLEventWriter 
out) throws XMLStreamException {
-        return FACTORY.createXMLStreamWriter(new StAXResult(out));
+    public static XMLEventWriter createXMLEventWriter(final XMLStreamWriter 
out) throws XMLStreamException {
+        return FACTORY.createXMLEventWriter(new StAXResult(out));
     }
 
     /**
@@ -125,7 +125,7 @@ final class OutputFactory extends Static
      * @return the writer.
      * @throws XMLStreamException if the writer can not be created.
      */
-    public static XMLStreamWriter createXMLStreamWriter(final Result out) 
throws XMLStreamException {
-        return FACTORY.createXMLStreamWriter(out);
+    public static XMLEventWriter createXMLEventWriter(final Result out) throws 
XMLStreamException {
+        return FACTORY.createXMLEventWriter(out);
     }
 }

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java 
[UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java 
[UTF-8] Mon Feb 26 11:28:17 2018
@@ -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
  */
@@ -58,7 +59,7 @@ abstract class Pooled {
      * The keys of entries that can be stored in the {@link #schemas} map.
      * Those keys are documented in {@link XML#SCHEMAS}.
      */
-    private static final String[] SCHEMA_KEYS = {"gmd"};
+    private static final String[] SCHEMA_KEYS = {"cat", "gmd"};
 
     /**
      * {@code true} if the JAXB implementation is the one bundled in JDK 6, or 
{@code false}
@@ -105,35 +106,27 @@ abstract class Pooled {
     private TimeZone timezone;
 
     /**
-     * The base URL of ISO 19139 (or other standards) schemas. It shall be an 
unmodifiable
+     * The base URL of ISO 19115-3 (or other standards) schemas. It shall be 
an unmodifiable
      * instance because {@link #getProperty(String)} returns a direct 
reference to the user.
      * The valid values are documented in the {@link XML#SCHEMAS} property.
      */
     private Map<String,String> schemas;
 
     /**
-     * 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>
-     * </ul>
+     * The GML version to be marshalled or unmarshalled, or {@code null} if 
unspecified.
+     * If null, then the latest version is assumed.
      *
-     * @see LegacyNamespaces#APPLY_NAMESPACE_REPLACEMENTS
+     * @see Context#getVersion(String)
      */
-    private byte xmlnsReplaceCode;
+    private Version versionGML;
 
     /**
-     * The GML version to be marshalled or unmarshalled, or {@code null} if 
unspecified.
+     * 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 versionGML;
+    private Version versionMetadata;
 
     /**
      * The reference resolver to use during unmarshalling.
@@ -222,8 +215,8 @@ abstract class Pooled {
         locale           = template.locale;
         timezone         = template.timezone;
         schemas          = template.schemas;
-        xmlnsReplaceCode = template.xmlnsReplaceCode;
         versionGML       = template.versionGML;
+        versionMetadata  = template.versionMetadata;
         resolver         = template.resolver;
         converter        = template.converter;
         rootAdapters     = template.rootAdapters;
@@ -248,35 +241,35 @@ abstract class Pooled {
     protected abstract void reset(final Object key, final Object value) throws 
JAXBException;
 
     /**
-     * Returns the {@code FilterVersion} enumeration value to use for the 
current GML version, or
-     * {@code null} if the SIS native version is suitable. If this method 
returns a non-null value,
-     * then the output generated by JAXB will need to go through a {@link 
FilteredStreamWriter}
-     * in order to replace the namespace of the GML version implemented by SIS 
by the namespace of
-     * the GML version asked by the user.
-     *
-     * @see FilteredNamespaces
-     */
-    final FilterVersion getFilterVersion() {
-        switch (xmlnsReplaceCode) {
-            case 0: {
-                // 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;
-                    }
-                }
-                break;
-            }
-            case 1: {
-                // Force namespace replacements at unmarshalling time (illegal 
for marshalling).
-                if ((bitMasks & Context.MARSHALLING) == 0) {
-                    return FilterVersion.ALL;
-                }
-                break;
-            }
-            // case 2: disable namespace replacements.
+     * Returns the {@code TransformVersion} enumeration value to use for the 
current GML or metadata version,
+     * or {@code null} if the SIS native versions are suitable. If this method 
returns a non-null value, then
+     * the output generated by JAXB will need to go through a {@link 
TransformingWriter} in order to replace
+     * the namespace of versions implemented by SIS by the namespace of 
versions requested by the user.
+     *
+     * @see Transformer
+     */
+    final TransformVersion getTransformVersion() {
+        /*
+         * If no version is specified, then the default behavior will be:
+         *   - enable namespace replacement on unmarshalling (in order to 
accept all versions)
+         *   - disable namespace replacement on marshalling (in order to use 
latest version).
+         */
+        final boolean byDefault = (bitMasks & Context.MARSHALLING) == 0;
+        /*
+         * Bitwise combination of legacy schemas to support:
+         *   1: namespace replacement needed for GML
+         *   2: namespace replacement needed for metadata.
+         */
+        int combine = (specificBitMasks() & Context.LEGACY_METADATA) != 0 ? 2 
: 0;
+        if (versionGML      == null ? byDefault : versionGML     
.compareTo(LegacyNamespaces.VERSION_3_2_1) < 0) combine  = 1;
+        if (versionMetadata == null ? byDefault : 
versionMetadata.compareTo(LegacyNamespaces.VERSION_2014)  < 0) combine |= 2;
+        switch (combine) {
+            case 0:  return null;
+            case 1:  return TransformVersion.GML31;
+            case 2:  return TransformVersion.ISO19139;
+            case 3:  return TransformVersion.ALL;
+            default: throw new AssertionError(combine);     // Should never 
happen.
         }
-        return null;
     }
 
     /**
@@ -343,6 +336,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;
@@ -375,13 +372,6 @@ abstract class Pooled {
                     warningListener = (WarningListener<?>) value;
                     return;
                 }
-                case LegacyNamespaces.APPLY_NAMESPACE_REPLACEMENTS: {
-                    xmlnsReplaceCode = 0;
-                    if (value != null) {
-                        xmlnsReplaceCode = ((Boolean) value) ? (byte) 1 : 
(byte) 2;
-                    }
-                    return;
-                }
                 case TypeRegistration.ROOT_ADAPTERS: {
                     rootAdapters = (TypeRegistration[]) value;
                     // No clone for now because ROOT_ADAPTERS is not yet a 
public API.
@@ -416,6 +406,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;
@@ -428,13 +419,6 @@ abstract class Pooled {
                 if ((bitMasks & Context.SUBSTITUTE_MIMETYPE) != 0) 
substitutes[n++] = "mimetype";
                 return (n != 0) ? ArraysExt.resize(substitutes, n) : null;
             }
-            case LegacyNamespaces.APPLY_NAMESPACE_REPLACEMENTS: {
-                switch (xmlnsReplaceCode) {
-                    case 1:  return Boolean.TRUE;
-                    case 2:  return Boolean.FALSE;
-                    default: return null;
-                }
-            }
             case TypeRegistration.ROOT_ADAPTERS: return (rootAdapters != null) 
? rootAdapters.clone() : null;
             default: {
                 if (internal) {
@@ -531,6 +515,20 @@ abstract class Pooled {
     public abstract ValidationEventHandler getEventHandler() throws 
JAXBException;
 
     /**
+     * Returns bit masks specific to the object being marshalled. This mask 
will be combined with the
+     * bit masks managed by the {@link Pooled} base class. This is used mostly 
for mandating legacy
+     * metadata format (ISO 19139:2007) for some object to marshal.
+     *
+     * <p>This is a hopefully temporary hack for marshalling metadata in GML.
+     * May be deleted if we implement SIS-401.</p>
+     *
+     * @see <a href="https://issues.apache.org/jira/browse/SIS-401";>SIS-401</a>
+     */
+    int specificBitMasks() {
+        return 0;
+    }
+
+    /**
      * Must be invoked by subclasses before a {@code try} block performing a 
(un)marshalling
      * operation. Must be followed by a call to {@code finish()} in a {@code 
finally} block.
      *
@@ -546,6 +544,7 @@ abstract class Pooled {
      * @see Context#finish()
      */
     final Context begin() {
-        return new Context(bitMasks, locale, timezone, schemas, versionGML, 
resolver, converter, warningListener);
+        return new Context(bitMasks | specificBitMasks(), locale, timezone,
+                schemas, versionGML, versionMetadata, resolver, converter, 
warningListener);
     }
 }

Modified: 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java
URL: 
http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java?rev=1825355&r1=1825354&r2=1825355&view=diff
==============================================================================
--- 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java
 [UTF-8] (original)
+++ 
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java
 [UTF-8] Mon Feb 26 11:28:17 2018
@@ -37,6 +37,7 @@ import org.xml.sax.ContentHandler;
 import org.w3c.dom.Node;
 import org.apache.sis.internal.jaxb.Context;
 import org.apache.sis.internal.jaxb.TypeRegistration;
+import org.apache.sis.internal.jaxb.UseLegacyMetadata;
 
 
 /**
@@ -48,12 +49,12 @@ import org.apache.sis.internal.jaxb.Type
  *       when the marshaller is recycled.</li>
  *   <li>Constructs a SIS {@link Context} object on marshalling, in order to 
give
  *       additional information to the SIS object being marshalled.</li>
- *   <li>Wraps the output stream in a {@link FilteredStreamWriter} if the 
desired GML version
+ *   <li>Wraps the output stream in a {@link TransformingWriter} if the 
desired GML version
  *       in not the SIS native GML version.</li>
  * </ul>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.3
  * @module
  */
@@ -64,6 +65,13 @@ final class PooledMarshaller extends Poo
     private final Marshaller marshaller;
 
     /**
+     * Bit masks specific to the object being marshalled. This mask will be 
combined with the
+     * bit masks managed by the {@link Pooled} base class.  This is used 
mostly for mandating
+     * legacy metadata format (ISO 19139:2007) for some object to marshal.
+     */
+    private int specificBitMasks;
+
+    /**
      * Creates a pooled marshaller wrapping the given one.
      * Callers shall invoke {@link #reset(Pooled)} after construction for 
completing the initialization.
      *
@@ -115,11 +123,23 @@ final class PooledMarshaller extends Poo
     }
 
     /**
+     * Returns a non-zero bitmask if the object given in last call to {@link 
#toImplementation(Object)} should use
+     * legacy metadata. This is a hack for marshalling metadata in GML. May be 
deleted if we implement SIS-401.
+     *
+     * @see <a href="https://issues.apache.org/jira/browse/SIS-401";>SIS-401</a>
+     */
+    @Override
+    final int specificBitMasks() {
+        return specificBitMasks;
+    }
+
+    /**
      * Converts the given arbitrary object to an implementation having JAXB 
annotations.
      * If the given object is not recognized or is already an instance of the 
expected class,
      * then it is returned unchanged.
      */
     private Object toImplementation(final Object value) throws JAXBException {
+        specificBitMasks = 
value.getClass().isAnnotationPresent(UseLegacyMetadata.class) ? 
Context.LEGACY_METADATA : 0;
         final TypeRegistration[] converters = getRootAdapters();
         if (converters != null) {
             for (final TypeRegistration t : converters) {
@@ -132,21 +152,20 @@ final class PooledMarshaller extends Poo
 
     /**
      * Marshals to the given output with on-the-fly substitution of namespaces.
-     * This method is invoked only when the user asked to marshal to a 
different GML version
-     * than the one supported natively by SIS, i.e. when {@link 
#getFilterVersion()} returns
-     * a non-null value.
+     * This method is invoked when the user asked to marshal to a different 
GML or metadata version than the
+     * one supported natively by SIS, i.e. when {@link #getTransformVersion()} 
returns a non-null value.
      *
-     * @param object   the object to marshall.
+     * @param object   the object to marshal.
      * @param output   the writer created by SIS (<b>not</b> the writer given 
by the user).
      * @param version  identifies the namespace substitutions to perform.
      */
-    private void marshal(final Object object, XMLStreamWriter output, final 
FilterVersion version)
+    private void marshal(Object object, XMLEventWriter output, final 
TransformVersion version)
             throws XMLStreamException, JAXBException
     {
-        output = new FilteredStreamWriter(output, version);
+        output = new TransformingWriter(output, version);
         final Context context = begin();
         try {
-            marshaller.marshal(toImplementation(object), output);
+            marshaller.marshal(object, output);
         } finally {
             context.finish();
         }
@@ -157,17 +176,18 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, final Result output) throws 
JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final Result output) throws 
JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
-            marshal(object, OutputFactory.createXMLStreamWriter(output), 
version);
+            marshal(object, OutputFactory.createXMLEventWriter(output), 
version);
         } catch (XMLStreamException e) {
             throw new JAXBException(e);
         } else {
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -178,17 +198,18 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, final OutputStream output) throws 
JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final OutputStream output) throws 
JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
-            marshal(object, OutputFactory.createXMLStreamWriter(output, 
getEncoding()), version);
+            marshal(object, OutputFactory.createXMLEventWriter(output, 
getEncoding()), version);
         } catch (XMLStreamException e) {
             throw new JAXBException(e);
         } else {
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -199,11 +220,12 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, final File output) throws 
JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final File output) throws JAXBException 
{
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
             try (OutputStream s = new BufferedOutputStream(new 
FileOutputStream(output))) {
-                marshal(object, OutputFactory.createXMLStreamWriter(s, 
getEncoding()), version);
+                marshal(object, OutputFactory.createXMLEventWriter(s, 
getEncoding()), version);
             }
         } catch (IOException | XMLStreamException e) {
             throw new JAXBException(e);
@@ -211,7 +233,7 @@ final class PooledMarshaller extends Poo
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -222,17 +244,18 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, final Writer output) throws 
JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final Writer output) throws 
JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
-            marshal(object, OutputFactory.createXMLStreamWriter(output), 
version);
+            marshal(object, OutputFactory.createXMLEventWriter(output), 
version);
         } catch (XMLStreamException e) {
             throw new JAXBException(e);
         } else {
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -243,17 +266,18 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, final ContentHandler output) 
throws JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final ContentHandler output) throws 
JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
-            marshal(object, OutputFactory.createXMLStreamWriter(output), 
version);
+            marshal(object, OutputFactory.createXMLEventWriter(output), 
version);
         } catch (XMLStreamException e) {
             throw new JAXBException(e);
         } else {
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -264,17 +288,18 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, final Node output) throws 
JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final Node output) throws JAXBException 
{
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
-            marshal(object, OutputFactory.createXMLStreamWriter(output), 
version);
+            marshal(object, OutputFactory.createXMLEventWriter(output), 
version);
         } catch (XMLStreamException e) {
             throw new JAXBException(e);
         } else {
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -285,34 +310,18 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public void marshal(final Object object, XMLStreamWriter output) throws 
JAXBException {
-        final FilterVersion version = getFilterVersion();
-        if (version != null) {
-            output = new FilteredStreamWriter(output, version);
-        }
-        final Context context = begin();
-        try {
-            marshaller.marshal(toImplementation(object), output);
-        } finally {
-            context.finish();
-        }
-    }
-
-    /**
-     * Delegates the marshalling to the wrapped marshaller.
-     */
-    @Override
-    public void marshal(final Object object, final XMLEventWriter output) 
throws JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, final XMLStreamWriter output) throws 
JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) try {
-            marshal(object, OutputFactory.createXMLStreamWriter(output), 
version);
+            marshal(object, OutputFactory.createXMLEventWriter(output), 
version);
         } catch (XMLStreamException e) {
             throw new JAXBException(e);
         } else {
             // Marshalling to the default GML version.
             final Context context = begin();
             try {
-                marshaller.marshal(toImplementation(object), output);
+                marshaller.marshal(object, output);
             } finally {
                 context.finish();
             }
@@ -323,15 +332,34 @@ final class PooledMarshaller extends Poo
      * Delegates the marshalling to the wrapped marshaller.
      */
     @Override
-    public Node getNode(final Object object) throws JAXBException {
-        final FilterVersion version = getFilterVersion();
+    public void marshal(Object object, XMLEventWriter output) throws 
JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
+        if (version != null) {
+            output = new TransformingWriter(output, version);
+        }
+        final Context context = begin();
+        try {
+            marshaller.marshal(object, output);
+        } finally {
+            context.finish();
+        }
+    }
+
+    /**
+     * Delegates the marshalling to the wrapped marshaller.
+     */
+    @Override
+    public Node getNode(Object object) throws JAXBException {
+        object = toImplementation(object);                          // Must be 
call before getTransformVersion()
+        final TransformVersion version = getTransformVersion();
         if (version != null) {
             // This exception is thrown by 
javax.xml.bind.helpers.AbstractMarshallerImpl anyway.
             throw new UnsupportedOperationException();
         } else {
             final Context context = begin();
             try {
-                return marshaller.getNode(toImplementation(object));
+                return marshaller.getNode(object);
             } finally {
                 context.finish();
             }


Reply via email to