sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1626345 [2/14] - in /sis/trunk: ./ core/sis-feature/src/main/java/org/apache/sis/feature/ core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/code/ core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/ core/sis-metadat...
Date Fri, 19 Sep 2014 21:46:44 GMT
Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -88,7 +88,7 @@ import static org.apache.sis.util.Argume
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-2.4)
- * @version 0.3
+ * @version 0.5
  * @module
  *
  * @see AbstractMetadata
@@ -122,7 +122,7 @@ public class MetadataStandard implements
      * An instance working on ISO 19119 standard as defined by GeoAPI interfaces
      * in the {@code org.opengis.service} package and sub-packages.
      *
-     * @deprecated Merged with {@link #ISO_19115} as of ISO 19115:2014 revision.
+     * @deprecated as of ISO 19115:2014 revision, merged with {@link #ISO_19115}.
      */
     @Deprecated
     public static final MetadataStandard ISO_19119;
@@ -304,7 +304,14 @@ public class MetadataStandard implements
             if (SpecialCases.isSpecialCase(type)) {
                 accessor = new SpecialCases(citation, type, implementation);
             } else {
-                accessor = new PropertyAccessor(citation, type, implementation);
+                /*
+                 * If "multi-value returns" was allowed in the Java language, the 'onlyUML' boolean would
+                 * be returned by 'findInterface(Class)' method when it falls in the special case for the
+                 * UML annotation on implementation class. But since we do not have multi-values, we have
+                 * to infer it from our knownledge of how 'findInterface(Class)' is implemented.
+                 */
+                final boolean onlyUML = (type == implementation && !type.isInterface());
+                accessor = new PropertyAccessor(citation, type, implementation, onlyUML);
             }
             accessors.put(implementation, accessor);
             return accessor;
@@ -337,6 +344,18 @@ public class MetadataStandard implements
     }
 
     /**
+     * Returns {@code true} if the given implementation class, normally rejected by {@link #findInterface(Class)},
+     * should be accepted as a pseudo-interface. We use this undocumented feature when Apache SIS experiments a new
+     * API which is not yet published in GeoAPI. This happen for example when upgrading Apache SIS public API from
+     * the ISO 19115:2003 standard to the ISO 19115:2014 version, but GeoAPI interfaces are still the old version.
+     * In such case, API that would normally be present in GeoAPI interfaces are temporarily available only in
+     * Apache SIS implementation classes.
+     */
+    boolean isPendingAPI(final Class<?> type) {
+        return false;
+    }
+
+    /**
      * Returns the metadata interface implemented by the specified implementation.
      * Only one metadata interface can be implemented. If the given type is already
      * an interface from the standard, then it is returned directly.
@@ -344,7 +363,7 @@ public class MetadataStandard implements
      * @param  type The standard interface or the implementation class.
      * @return The single interface, or {@code null} if none where found.
      */
-    private Class<?> findInterface(Class<?> type) {
+    private Class<?> findInterface(final Class<?> type) {
         if (type != null) {
             if (type.isInterface()) {
                 if (type.getName().startsWith(interfacePackage)) {
@@ -356,10 +375,9 @@ public class MetadataStandard implements
                  * including the ones declared in the super-class.
                  */
                 final Set<Class<?>> interfaces = new LinkedHashSet<Class<?>>();
-                do {
-                    getInterfaces(type, interfaces);
-                    type = type.getSuperclass();
-                } while (type != null);
+                for (Class<?> t=type; t!=null; t=t.getSuperclass()) {
+                    getInterfaces(t, interfaces);
+                }
                 /*
                  * If we found more than one interface, removes the
                  * ones that are sub-interfaces of the other.
@@ -381,6 +399,17 @@ public class MetadataStandard implements
                     }
                     // Found more than one interface; we don't know which one to pick.
                     // Returns 'null' for now; the caller will thrown an exception.
+                } else if (isPendingAPI(type)) {
+                    /*
+                     * Found no interface. According to our method contract we should return null.
+                     * However we make an exception if the implementation class has a UML annotation.
+                     * The reason is that when upgrading  API  from ISO 19115:2003 to ISO 19115:2014,
+                     * implementations are provided in Apache SIS before the corresponding interfaces
+                     * are published on GeoAPI. The reason why GeoAPI is slower to upgrade is that we
+                     * have to go through a voting process inside the Open Geospatial Consortium (OGC).
+                     * So we use those implementation classes as a temporary substitute for the interfaces.
+                     */
+                    return type;
                 }
             }
         }
@@ -413,6 +442,7 @@ public class MetadataStandard implements
      * The standard package is usually made of interfaces and code lists only, but this is
      * not verified by this method.</div>
      *
+     * @param  <T>  The compile-time {@code type}.
      * @param  type The implementation class.
      * @return The interface implemented by the given implementation class.
      * @throws ClassCastException if the specified implementation class does
@@ -420,23 +450,28 @@ public class MetadataStandard implements
      *
      * @see AbstractMetadata#getInterface()
      */
-    public Class<?> getInterface(final Class<?> type) throws ClassCastException {
+    @SuppressWarnings("unchecked")
+    public <T> Class<? super T> getInterface(final Class<T> type) throws ClassCastException {
         ensureNonNull("type", type);
+        final Class<?> standard;
         synchronized (accessors) {
             final Object value = accessors.get(type);
             if (value != null) {
                 if (value instanceof PropertyAccessor) {
-                    return ((PropertyAccessor) value).type;
+                    standard = ((PropertyAccessor) value).type;
+                } else {
+                    standard = (Class<?>) value;
                 }
-                return (Class<?>) value;
-            }
-            final Class<?> standard = findInterface(type);
-            if (standard == null) {
-                throw new ClassCastException(Errors.format(Errors.Keys.UnknownType_1, type));
+            } else {
+                standard = findInterface(type);
+                if (standard == null) {
+                    throw new ClassCastException(Errors.format(Errors.Keys.UnknownType_1, type));
+                }
+                accessors.put(type, standard);
             }
-            accessors.put(type, standard);
-            return standard;
         }
+        assert standard.isAssignableFrom(type) : type;
+        return (Class<? super T>) standard;
     }
 
     /**
@@ -444,10 +479,11 @@ public class MetadataStandard implements
      * The default implementation returns {@code null} if every cases. Subclasses shall
      * override this method in order to map GeoAPI interfaces to their implementation.
      *
+     * @param  <T>  The compile-time {@code type}.
      * @param  type The interface, typically from the {@code org.opengis.metadata} package.
      * @return The implementation class, or {@code null} if none.
      */
-    public Class<?> getImplementation(final Class<?> type) {
+    public <T> Class<? extends T> getImplementation(final Class<T> type) {
         return null;
     }
 

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -86,8 +86,8 @@ import static org.apache.sis.internal.ja
 @XmlTransient
 public abstract class ModifiableMetadata extends AbstractMetadata implements Cloneable {
     /**
-     * Initial capacity of lists and sets. We use a small value because those
-     * collections will typically contain few elements (often just a singleton).
+     * Initial capacity of sets. We use a small value because collections will typically
+     * contain few elements (often just a singleton).
      */
     private static final int INITIAL_CAPACITY = 4;
 
@@ -385,7 +385,7 @@ public abstract class ModifiableMetadata
             if (unmodifiable == FREEZING) {
                 /*
                  * freeze() method is under progress. The source collection is already
-                 * an unmodifiable instance created by unmodifiable(Object).
+                 * an unmodifiable instance created by Cloner.clone(Object).
                  */
                 assert collectionType(elementType).isInstance(source);
                 return (Collection<E>) source;
@@ -500,7 +500,7 @@ public abstract class ModifiableMetadata
         if (useSet(elementType)) {
             collection = createSet(elementType, INITIAL_CAPACITY);
         } else {
-            collection = new CheckedArrayList<E>(elementType, INITIAL_CAPACITY);
+            collection = new CheckedArrayList<E>(elementType, 1);
         }
         collection.add(value);
         return collection;
@@ -523,7 +523,14 @@ public abstract class ModifiableMetadata
             return null;
         }
         if (isModifiable()) {
-            return new CheckedArrayList<E>(elementType, INITIAL_CAPACITY);
+            /*
+             * Do not specify an initial capacity, because the list will stay empty in a majority of cases
+             * (i.e. the users will want to iterate over the list elements more often than they will want
+             * to add elements). JDK implementation of ArrayList has a lazy instantiation mechanism for
+             * initially empty lists, but as of JDK8 this lazy instantiation works only for list having
+             * the default capacity.
+             */
+            return new CheckedArrayList<E>(elementType);
         }
         return Collections.emptyList();
     }
@@ -545,7 +552,7 @@ public abstract class ModifiableMetadata
             return null;
         }
         if (isModifiable()) {
-            return new CheckedHashSet<E>(elementType, INITIAL_CAPACITY);
+            return createSet(elementType, INITIAL_CAPACITY);
         }
         return Collections.emptySet();
     }
@@ -584,7 +591,8 @@ public abstract class ModifiableMetadata
             }
         } else {
             if (isModifiable) {
-                return new CheckedArrayList<E>(elementType, INITIAL_CAPACITY);
+                // Do not specify an initial capacity for the reason explained in nonNullList(…).
+                return new CheckedArrayList<E>(elementType);
             } else {
                 return Collections.emptyList();
             }

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ObjectPair.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ObjectPair.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ObjectPair.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/ObjectPair.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -23,7 +23,7 @@ import org.apache.sis.util.Classes;
 
 
 /**
- * A pair of objects in process of being compared by the {@code MetadataStandard#equals(…)} method.
+ * A pair of objects in process of being compared by the {@code MetadataStandard.equals(…)} method.
  * We have to remember those pairs for avoiding infinite recursivity when comparing metadata objects
  * having cyclic associations. The objects are compared using the identity comparison.
  * Object order is not significant.

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -83,7 +83,7 @@ import static org.apache.sis.util.collec
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-2.4)
- * @version 0.3
+ * @version 0.5
  * @module
  */
 class PropertyAccessor {
@@ -146,18 +146,37 @@ class PropertyAccessor {
      * {@preformat java
      *     type.isAssignableFrom(implementation);
      * }
+     *
+     * <div class="note"><b>Design note:</b>
+     * We could enforce the above-cited restriction with type parameter: if the {@link #type} field is declared
+     * as {@code Class<T>}, then this {@code implementation} field would be declared as {@code Class<? extends T>}.
+     * However this is not useful for this internal class because the {@code <T>} type is never known; we have the
+     * {@code <?>} type everywhere except in tests, which result in compiler warnings at {@code PropertyAccessor}
+     * construction.</div>
      */
     final Class<?> implementation;
 
     /**
-     * Number of {@link #getters} methods to use. This is either {@code getters.length}
-     * or {@code getters.length-1}, depending on whether the {@link #EXTRA_GETTER} method
-     * needs to be skipped or not.
+     * Number of {@link #getters} methods that can be used, regardless of whether the methods are visible
+     * or hidden to the user. This is either {@code getters.length} or {@code getters.length-1}, depending
+     * on whether the {@link #EXTRA_GETTER} method needs to be skipped or not.
+     */
+    private final int allCount;
+
+    /**
+     * Numbers of methods to shown to the user. This is always equal or lower than {@link #allCount}.
+     * This count may be lower than {@code allCount} for two reasons:
+     *
+     * <ul>
+     *   <li>The {@link #EXTRA_GETTER} method is not part of the international standard.</li>
+     *   <li>The interface contains deprecated methods from an older international standard.
+     *       Example: changes caused by the upgrade from ISO 19115:2003 to ISO 19115:2014.</li>
+     * </ul>
      */
-    private final int standardCount, allCount;
+    private final int standardCount;
 
     /**
-     * The getter methods. This array should not contain any null element.
+     * The public getter methods. This array should not contain any null element.
      * They are the methods defined in the interface, not the implementation class.
      *
      * <p>This array shall not contains any {@code null} elements.</p>
@@ -236,13 +255,14 @@ class PropertyAccessor {
      * @param  type The interface implemented by the metadata, which must be
      *         the value returned by {@link #getStandardType(Class, String)}.
      * @param  implementation The class of metadata implementations, or {@code type} if none.
+     * @param  onlyUML {@code true} for taking only the getter methods having a {@link UML} annotation.
      */
-    PropertyAccessor(final Citation standard, final Class<?> type, final Class<?> implementation) {
+    PropertyAccessor(final Citation standard, final Class<?> type, final Class<?> implementation, final boolean onlyUML) {
         assert type.isAssignableFrom(implementation) : implementation;
         this.standard       = standard;
         this.type           = type;
         this.implementation = implementation;
-        this.getters        = getGetters(type, implementation);
+        this.getters        = getGetters(type, implementation, onlyUML);
         int allCount = getters.length;
         int standardCount = allCount;
         if (allCount != 0 && getters[allCount-1] == EXTRA_GETTER) {
@@ -251,6 +271,12 @@ class PropertyAccessor {
             }
             standardCount--;
         }
+        while (standardCount != 0) { // Skip deprecated methods.
+            if (!isDeprecated(standardCount - 1)) {
+                break;
+            }
+            standardCount--;
+        }
         this.allCount      = allCount;
         this.standardCount = standardCount;
         /*
@@ -359,8 +385,18 @@ class PropertyAccessor {
         if (!name.isEmpty()) {
             final Integer old = mapping.put(name, index);
             if (old != null && !old.equals(index)) {
-                throw new IllegalStateException(Errors.format(Errors.Keys.DuplicatedIdentifier_1,
-                        Classes.getShortName(type) + '.' + name));
+                /*
+                 * Same identifier for two different properties. If one is deprecated while the
+                 * other is not, then the non-deprecated identifier overwrite the deprecated one.
+                 */
+                final boolean deprecated = isDeprecated(index);
+                if (deprecated == isDeprecated(old)) {
+                    throw new IllegalStateException(Errors.format(Errors.Keys.DuplicatedIdentifier_1,
+                            Classes.getShortName(type) + '.' + name));
+                }
+                if (deprecated) {
+                    mapping.put(name, old); // Restore the undeprecated method.
+                }
             }
         }
     }
@@ -382,9 +418,10 @@ class PropertyAccessor {
      *
      * @param  type The metadata interface.
      * @param  implementation The class of metadata implementations.
+     * @param  onlyUML {@code true} for taking only the getter methods having a {@link UML} annotation.
      * @return The getters declared in the given interface (never {@code null}).
      */
-    private static Method[] getGetters(final Class<?> type, final Class<?> implementation) {
+    private static Method[] getGetters(final Class<?> type, final Class<?> implementation, final boolean onlyUML) {
         synchronized (SHARED_GETTERS) {
             Method[] getters = SHARED_GETTERS.get(type);
             if (getters == null) {
@@ -395,7 +432,7 @@ class PropertyAccessor {
                 boolean hasExtraGetter = false;
                 int count = 0;
                 for (final Method candidate : getters) {
-                    if (Classes.isPossibleGetter(candidate)) {
+                    if (Classes.isPossibleGetter(candidate) && (!onlyUML || candidate.isAnnotationPresent(UML.class))) {
                         final String name = candidate.getName();
                         if (name.startsWith(SET)) { // Paranoiac check.
                             continue;
@@ -448,6 +485,8 @@ class PropertyAccessor {
 
     /**
      * Returns the number of properties that can be read.
+     * This is the properties to show in map or tree, <strong>not</strong> including
+     * hidden properties like deprecated methods or {@link #EXTRA_GETTER} method.
      *
      * @see #count(Object, ValueExistencePolicy, int)
      */
@@ -539,7 +578,7 @@ class PropertyAccessor {
      * @return The type of property values, or {@code null} if unknown.
      */
     Class<?> type(final int index, final TypeValuePolicy policy) {
-        if (index >= 0 && index < standardCount) {
+        if (index >= 0 && index < allCount) {
             switch (policy) {
                 case ELEMENT_TYPE: {
                     return elementTypes[index];
@@ -570,13 +609,20 @@ class PropertyAccessor {
      * Returns {@code true} if the type at the given index is {@link Collection}.
      */
     final boolean isCollection(final int index) {
-        if (index >= 0 && index < standardCount) {
+        if (index >= 0 && index < allCount) {
             return Collection.class.isAssignableFrom(getters[index].getReturnType());
         }
         return false;
     }
 
     /**
+     * Returns {@code true} if the property at the given index is deprecated.
+     */
+    private boolean isDeprecated(final int index) {
+        return getters[index].isAnnotationPresent(Deprecated.class);
+    }
+
+    /**
      * Returns the information for the property at the given index.
      * The information are created when first needed.
      *
@@ -621,7 +667,7 @@ class PropertyAccessor {
      * Returns {@code true} if the property at the given index is writable.
      */
     final boolean isWritable(final int index) {
-        return (index >= 0) && (index < standardCount) && (setters != null) && (setters[index] != null);
+        return (index >= 0) && (index < allCount) && (setters != null) && (setters[index] != null);
     }
 
     /**
@@ -636,7 +682,7 @@ class PropertyAccessor {
      * @throws BackingStoreException If the implementation threw a checked exception.
      */
     Object get(final int index, final Object metadata) throws BackingStoreException {
-        return (index >= 0 && index < standardCount) ? get(getters[index], metadata) : null;
+        return (index >= 0 && index < allCount) ? get(getters[index], metadata) : null;
     }
 
     /**
@@ -709,7 +755,7 @@ class PropertyAccessor {
     Object set(final int index, final Object metadata, final Object value, final int mode)
             throws UnmodifiableMetadataException, ClassCastException, BackingStoreException
     {
-        if (index < 0 || index >= standardCount) {
+        if (index < 0 || index >= allCount) {
             return null;
         }
         if (setters != null) {
@@ -1021,7 +1067,7 @@ class PropertyAccessor {
             return count();
         }
         int count = 0;
-        for (int i=0; i<standardCount; i++) {
+        for (int i=0; i<standardCount; i++) { // Use 'standardCount' instead of 'allCount' for ignoring deprecated methods.
             final Object value = get(getters[i], metadata);
             if (!valuePolicy.isSkipped(value)) {
                 switch (mode) {
@@ -1063,9 +1109,7 @@ class PropertyAccessor {
     {
         assert type.isInstance(metadata1) : metadata1;
         assert type.isInstance(metadata2) : metadata2;
-        final int count = (mode == ComparisonMode.STRICT &&
-                EXTRA_GETTER.getDeclaringClass().isInstance(metadata2)) ? allCount : standardCount;
-        for (int i=0; i<count; i++) {
+        for (int i=0; i<standardCount; i++) {
             final Method method = getters[i];
             final Object value1 = get(method, metadata1);
             final Object value2 = get(method, metadata2);
@@ -1081,6 +1125,16 @@ class PropertyAccessor {
                 return false;
             }
         }
+        /*
+         * One final check for the IdentifiedObjects.getIdentifiers() collection.
+         */
+        if (mode == ComparisonMode.STRICT && EXTRA_GETTER.getDeclaringClass().isInstance(metadata2)) {
+            final Object value1 = get(EXTRA_GETTER, metadata1);
+            final Object value2 = get(EXTRA_GETTER, metadata2);
+            if (!isNullOrEmpty(value1) || !isNullOrEmpty(value2)) {
+                return Utilities.deepEquals(value1, value2, mode);
+            }
+        }
         return true;
     }
 
@@ -1098,6 +1152,19 @@ class PropertyAccessor {
             for (int i=0; i<allCount; i++) {
                 final Method setter = setters[i];
                 if (setter != null) {
+                    if (setter.isAnnotationPresent(Deprecated.class)) {
+                        /*
+                         * We need to skip deprecated setter methods, because those methods may delegate
+                         * their work to other setter methods in different objects and those objects may
+                         * have been made unmodifiable by previous iteration in this loop.  If we do not
+                         * skip them, we get an UnmodifiableMetadataException in the call to set(…).
+                         *
+                         * Note that in some cases, only the setter method is deprecated, not the getter.
+                         * This happen when Apache SIS classes represent a more recent ISO standard than
+                         * the GeoAPI interfaces.
+                         */
+                        continue;
+                    }
                     final Method getter = getters[i];
                     final Object source = get(getter, metadata);
                     final Object target = cloner.clone(source);
@@ -1105,7 +1172,7 @@ class PropertyAccessor {
                         arguments[0] = target;
                         set(setter, metadata, arguments);
                         /*
-                         * We invoke the set(...) method which do not perform type conversion
+                         * We invoke the set(…) method variant that do not perform type conversion
                          * because we don't want it to replace the immutable collection created
                          * by ModifiableMetadata.unmodifiable(source). Conversion should not be
                          * required anyway because the getter method should have returned a value

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyComparator.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyComparator.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyComparator.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyComparator.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -33,6 +33,7 @@ import org.opengis.annotation.Obligation
  *
  * <p>This comparator uses the following criterion, in priority order:</p>
  * <ol>
+ *   <li>Deprecated properties are last.</li>
  *   <li>If the property order is specified by a {@link XmlType} annotation,
  *       then this comparator complies to that order.</li>
  *   <li>Otherwise this comparator sorts mandatory methods first, followed by
@@ -43,7 +44,7 @@ import org.opengis.annotation.Obligation
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-2.4)
- * @version 0.4
+ * @version 0.5
  * @module
  */
 final class PropertyComparator implements Comparator<Method> {
@@ -115,6 +116,10 @@ final class PropertyComparator implement
      */
     @Override
     public int compare(final Method m1, final Method m2) {
+        final boolean deprecated = m1.isAnnotationPresent(Deprecated.class);
+        if (deprecated != m2.isAnnotationPresent(Deprecated.class)) {
+            return deprecated ? +1 : -1;
+        }
         int c = indexOf(m2) - indexOf(m1); // indexOf(…) are sorted in descending order.
         if (c == 0) {
             final UML a1 = m1.getAnnotation(UML.class);
@@ -157,13 +162,31 @@ final class PropertyComparator implement
      * If positive, the index returned by this method correspond to a sorting in descending order.
      */
     private int indexOf(final Method method) {
+        /*
+         * Check the cached value computed by previous call to 'indexOf(…)'.
+         * Example: "getExtents"
+         */
         Integer index = order.get(method);
         if (index == null) {
+            /*
+             * Check the value computed from @XmlType.propOrder() value.
+             * Inferred from the method name, so name is often plural.
+             * Example: "extents"
+             */
             String name = method.getName();
             name = toPropertyName(name, prefix(name).length());
             index = order.get(name);
             if (index == null) {
-                index = -1;
+                /*
+                 * Do not happen, except when we have private methods or deprecated public methods
+                 * used as bridge between legacy and more recent standards (e.g. ISO 19115:2003 to
+                 * ISO 19115:2014), especially when cardinality changed between the two standards.
+                 * Example: "extent"
+                 */
+                final UML uml = method.getAnnotation(UML.class);
+                if (uml == null || (index = order.get(uml.identifier())) == null) {
+                    index = -1;
+                }
             }
             order.put(method, index);
         }

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -55,7 +55,7 @@ import org.apache.sis.util.logging.Loggi
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.05)
- * @version 0.3
+ * @version 0.5
  * @module
  *
  * @see InformationMap
@@ -179,7 +179,7 @@ final class PropertyInformation<E> exten
      * Unconditionally returns {@code null}.
      *
      * @deprecated This property was defined in the 2003 edition of ISO 19115,
-     *             but has been removed in the 2013 edition.
+     *             but has been removed in the 2014 edition.
      */
     @Override
     @Deprecated
@@ -191,7 +191,7 @@ final class PropertyInformation<E> exten
      * Unconditionally returns {@code null}.
      *
      * @deprecated This property was defined in the 2003 edition of ISO 19115,
-     *             but has been removed in the 2013 edition.
+     *             but has been removed in the 2014 edition.
      */
     @Override
     @Deprecated
@@ -319,9 +319,17 @@ final class PropertyInformation<E> exten
     }
 
     /**
+     * Unconditionally returns {@code null}.
+     */
+    public InternationalString getRationale() {
+        return null;
+    }
+
+    /**
      * Unconditionally returns an empty list.
      */
     @Override
+    @Deprecated
     public Collection<InternationalString> getRationales() {
         return Collections.emptyList();
     }

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/SpecialCases.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/SpecialCases.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/SpecialCases.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/SpecialCases.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -49,7 +49,7 @@ final class SpecialCases extends Propert
      * @param  implementation The class of metadata implementations, or {@code type} if none.
      */
     SpecialCases(final Citation standard, final Class<?> type, final Class<?> implementation) {
-        super(standard, type, implementation);
+        super(standard, type, implementation, false);
         assert isSpecialCase(type) : type;
         westBoundLongitude = indexOf("westBoundLongitude", true);
         eastBoundLongitude = indexOf("eastBoundLongitude", true);

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/StandardImplementation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -18,6 +18,7 @@ package org.apache.sis.metadata;
 
 import java.util.Map;
 import java.util.IdentityHashMap;
+import org.opengis.annotation.UML;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.logging.Logging;
 
@@ -90,14 +91,25 @@ final class StandardImplementation exten
     }
 
     /**
+     * Accepts Apache SIS implementation classes as "pseudo-interfaces" if they are annotated with {@link UML}.
+     * We use this feature for example in the transition from ISO 19115:2003 to ISO 19115:2014, when new API is
+     * defined in Apache SIS but not yet available in GeoAPI interfaces.
+     */
+    @Override
+    boolean isPendingAPI(final Class<?> type) {
+        return type.getName().startsWith(implementationPackage) && type.isAnnotationPresent(UML.class);
+    }
+
+    /**
      * Returns the implementation class for the given interface, or {@code null} if none.
      * This class uses heuristic rules based on naming conventions.
      *
+     * @param  <T>  The compile-time {@code type}.
      * @param  type The interface, typically from the {@code org.opengis.metadata} package.
      * @return The implementation class, or {@code null} if none.
      */
     @Override
-    public Class<?> getImplementation(final Class<?> type) {
+    public <T> Class<? extends T> getImplementation(final Class<T> type) {
         /*
          * We require the type to be an interface in order to exclude
          * CodeLists, Enums and Exceptions.
@@ -108,7 +120,7 @@ final class StandardImplementation exten
                 synchronized (implementations) {
                     Class<?> candidate = implementations.get(type);
                     if (candidate != null) {
-                        return (candidate != Void.TYPE) ? candidate : null;
+                        return (candidate != Void.TYPE) ? candidate.asSubclass(type) : null;
                     }
                     /*
                      * Prepares a buffer with a copy of the class name in which the interface
@@ -143,11 +155,14 @@ final class StandardImplementation exten
                         }
                         if (candidate.isAnnotationPresent(Deprecated.class)) {
                             // Skip deprecated implementations.
-                            length = p.length();
-                            continue;
+                            candidate = candidate.getSuperclass();
+                            if (!type.isAssignableFrom(candidate) || candidate.isAnnotationPresent(Deprecated.class)) {
+                                length = p.length();
+                                continue;
+                            }
                         }
                         implementations.put(type, candidate);
-                        return candidate;
+                        return candidate.asSubclass(type);
                     }
                     implementations.put(type, Void.TYPE); // Marker for "class not found".
                 }

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/TypeMap.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/TypeMap.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/TypeMap.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/TypeMap.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -69,11 +69,10 @@ final class TypeMap extends PropertyMap<
         return new Iter() {
             @Override
             public Map.Entry<String,Class<?>> next() {
-                final Class<?> value = accessor.type(index, valuePolicy);
-                if (value == null) {
-                    // PropertyAccessor.type(int) never return null if the index is valid.
+                if (index >= accessor.count()) {
                     throw new NoSuchElementException();
                 }
+                final Class<?> value = accessor.type(index, valuePolicy);
                 return new SimpleImmutableEntry<String,Class<?>>(accessor.name(index++, keyPolicy), value);
             }
         };

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -22,16 +22,26 @@ import javax.xml.bind.annotation.XmlElem
 import javax.xml.bind.annotation.XmlRootElement;
 import org.opengis.metadata.ApplicationSchemaInformation;
 import org.opengis.metadata.citation.Citation;
+import org.opengis.metadata.citation.OnlineResource;
 
 
 /**
  * Information about the application schema used to build the dataset.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)
  * @since   0.3 (derived from geotk-2.1)
- * @version 0.3
+ * @version 0.5
  * @module
  */
 @XmlType(name = "MD_ApplicationSchemaInformation_Type", propOrder = {
@@ -222,6 +232,10 @@ public class DefaultApplicationSchemaInf
     /**
      * Full application schema given as an ASCII file.
      *
+     * <div class="warning"><b>Upcoming API change</b><br>
+     * {@code URI} may be replaced by {@link CharSequence} in GeoAPI 4.0.
+     * </div>
+     *
      * @return Application schema as an ASCII file, or {@code null}.
      */
     @Override
@@ -233,6 +247,10 @@ public class DefaultApplicationSchemaInf
     /**
      * Sets the full application schema given as an ASCII file.
      *
+     * <div class="warning"><b>Upcoming API change</b><br>
+     * {@code URI} may be replaced by {@link CharSequence} in GeoAPI 4.0.
+     * </div>
+     *
      * @param newValue The new ASCII file.
      */
     public void setSchemaAscii(final URI newValue) {
@@ -243,6 +261,11 @@ public class DefaultApplicationSchemaInf
     /**
      * Full application schema given as a graphics file.
      *
+     * <div class="warning"><b>Upcoming API change</b><br>
+     * As of ISO 19115:2014, {@code URI} is replaced by {@link OnlineResource}.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
+     *
      * @return Application schema as a graphics file, or {@code null}.
      */
     @Override
@@ -254,6 +277,11 @@ public class DefaultApplicationSchemaInf
     /**
      * Sets the full application schema given as a graphics file.
      *
+     * <div class="warning"><b>Upcoming API change</b><br>
+     * As of ISO 19115:2014, {@code URI} is replaced by {@link OnlineResource}.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
+     *
      * @param newValue The new graphics file.
      */
     public void setGraphicsFile(final URI newValue) {
@@ -264,6 +292,11 @@ public class DefaultApplicationSchemaInf
     /**
      * Full application schema given as a software development file.
      *
+     * <div class="warning"><b>Upcoming API change</b><br>
+     * As of ISO 19115:2014, {@code URI} is replaced by {@link OnlineResource}.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
+     *
      * @return Application schema as a software development file, or {@code null}.
      */
     @Override
@@ -275,6 +308,11 @@ public class DefaultApplicationSchemaInf
     /**
      * Sets the full application schema given as a software development file.
      *
+     * <div class="warning"><b>Upcoming API change</b><br>
+     * As of ISO 19115:2014, {@code URI} is replaced by {@link OnlineResource}.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
+     *
      * @param newValue The new software development file.
      */
     public void setSoftwareDevelopmentFile(final URI newValue) {

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -26,17 +26,28 @@ import org.opengis.metadata.citation.Res
 import org.opengis.metadata.ExtendedElementInformation;
 import org.opengis.util.InternationalString;
 import org.apache.sis.measure.ValueRange;
+import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.iso.Types;
 
 
 /**
  * New metadata element, not found in ISO 19115, which is required to describe geographic data.
+ * Metadata elements are contained in a {@linkplain DefaultMetadataExtensionInformation metadata extension information}.
+ *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)
  * @since   0.3 (derived from geotk-2.1)
- * @version 0.3
+ * @version 0.5
  * @module
  */
 @XmlType(name = "MD_ExtendedElementInformation_Type", propOrder = {
@@ -184,6 +195,7 @@ public class DefaultExtendedElementInfor
      *
      * @see #castOrCopy(ExtendedElementInformation)
      */
+    @SuppressWarnings("deprecation")
     public DefaultExtendedElementInformation(final ExtendedElementInformation object) {
         super(object);
         if (object != null) {
@@ -253,8 +265,11 @@ public class DefaultExtendedElementInfor
      * Short form suitable for use in an implementation method such as XML or SGML.
      *
      * @return Short form suitable for use in an implementation method such as XML or SGML, or {@code null}.
+     *
+     * @deprecated Removed as of ISO 19115:2014.
      */
     @Override
+    @Deprecated
     @XmlElement(name = "shortName")
     public String getShortName()  {
         return shortName;
@@ -264,7 +279,10 @@ public class DefaultExtendedElementInfor
      * Sets a short form suitable for use in an implementation method such as XML or SGML.
      *
      * @param newValue The new short name.
+     *
+     * @deprecated Removed as of ISO 19115:2014.
      */
+    @Deprecated
     public void setShortName(final String newValue)  {
         checkWritePermission();
         shortName = newValue;
@@ -276,8 +294,11 @@ public class DefaultExtendedElementInfor
      * is {@linkplain Datatype#CODE_LIST_ELEMENT code list element}.
      *
      * @return Three digit code assigned to the extended element, or {@code null}.
+     *
+     * @deprecated Removed as of ISO 19115:2014.
      */
     @Override
+    @Deprecated
     @XmlElement(name = "domainCode")
     public Integer getDomainCode() {
         return domainCode;
@@ -287,7 +308,10 @@ public class DefaultExtendedElementInfor
      * Sets a three digit code assigned to the extended element.
      *
      * @param newValue The new domain code.
+     *
+     * @deprecated Removed as of ISO 19115:2014.
      */
+    @Deprecated
     public void setDomainCode(final Integer newValue) {
         checkWritePermission();
         domainCode = newValue;
@@ -389,7 +413,7 @@ public class DefaultExtendedElementInfor
      * @return Maximum occurrence of the extended element, or {@code null}.
      */
     @Override
-    @ValueRange(minimum=0)
+    @ValueRange(minimum = 0)
     @XmlElement(name = "maximumOccurrence")
     public Integer getMaximumOccurrence() {
         return maximumOccurrence;
@@ -399,9 +423,13 @@ public class DefaultExtendedElementInfor
      * Sets the maximum occurrence of the extended element.
      *
      * @param newValue The new maximum occurrence.
+     * @throws IllegalArgumentException if the given value is negative.
      */
-    public void setMaximumOccurrence(final Integer newValue) {
+    public void setMaximumOccurrence(final Integer newValue) throws IllegalArgumentException {
         checkWritePermission();
+        if (newValue != null) {
+            ArgumentChecks.ensurePositive("maximumOccurrence", newValue);
+        }
         maximumOccurrence = newValue;
     }
 
@@ -495,6 +523,11 @@ public class DefaultExtendedElementInfor
     /**
      * Name of the person or organization creating the extended element.
      *
+     * <div class="warning"><b>Upcoming API change — generalization</b><br>
+     * As of ISO 19115:2014, {@code ResponsibleParty} is replaced by the {@link Responsibility} parent interface.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
+     *
      * @return Name of the person or organization creating the extended element.
      */
     @Override
@@ -506,6 +539,11 @@ public class DefaultExtendedElementInfor
     /**
      * Sets the name of the person or organization creating the extended element.
      *
+     * <div class="warning"><b>Upcoming API change — generalization</b><br>
+     * As of ISO 19115:2014, {@code ResponsibleParty} is replaced by the {@link Responsibility} parent interface.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
+     *
      * @param newValues The new sources.
      */
     public void setSources(final Collection<? extends ResponsibleParty> newValues) {

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultFeatureTypeList.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultFeatureTypeList.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultFeatureTypeList.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultFeatureTypeList.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -25,6 +25,15 @@ import org.opengis.metadata.FeatureTypeL
 /**
  * List of names of feature types with the same spatial representation (same as spatial attributes).
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -63,6 +63,15 @@ import org.opengis.metadata.citation.Cit
  *   </gmd:MD_Identifier>
  * }
  *
+ * {@section Limitations}
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -19,6 +19,7 @@ package org.apache.sis.metadata.iso;
 import java.util.Date;
 import java.util.Locale;
 import java.util.Collection;
+import java.nio.charset.Charset;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlSeeAlso;
@@ -60,6 +61,15 @@ import static org.apache.sis.internal.me
  * INSPIRE rules. If no language were specified, then the default locale will be the one
  * defined in the {@link org.apache.sis.xml.XML#LOCALE} marshaller property, if any.
  *
+ * {@section Limitations}
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)
@@ -383,9 +393,16 @@ public class DefaultMetadata extends ISO
     }
 
     /**
-     * Returns the full name of the character coding standard used for the metadata set.
+     * Returns the character coding standard used for the metadata set.
+     *
+     * <div class="warning"><b>Upcoming API change — JDK integration</b><br>
+     * As of ISO 19115:2014, {@code CharacterSet} is replaced by a reference to the
+     * <a href="http://www.iana.org/assignments/character-sets">IANA Character Set register</a>,
+     * which is represented in Java by {@link Charset}.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
      *
-     * @return character coding standard used for the metadata, or {@code null}.
+     * @return Character coding standard used for the metadata, or {@code null}.
      */
     @Override
     @XmlElement(name = "characterSet")
@@ -394,7 +411,14 @@ public class DefaultMetadata extends ISO
     }
 
     /**
-     * Sets the full name of the character coding standard used for the metadata set.
+     * Sets the character coding standard used for the metadata set.
+     *
+     * <div class="warning"><b>Upcoming API change — JDK integration</b><br>
+     * As of ISO 19115:2014, {@code CharacterSet} is replaced by a reference to the
+     * <a href="http://www.iana.org/assignments/character-sets">IANA Character Set register</a>,
+     * which is represented in Java by {@link Charset}.
+     * This change may be applied in GeoAPI 4.0.
+     * </div>
      *
      * @param newValue The new character set.
      */

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataExtensionInformation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataExtensionInformation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataExtensionInformation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataExtensionInformation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -28,6 +28,15 @@ import org.opengis.metadata.MetadataExte
 /**
  * Information describing metadata extensions.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)
@@ -110,7 +119,7 @@ public class DefaultMetadataExtensionInf
 
     /**
      * Information about on-line sources containing the community profile name and
-     * the extended metadata elements. Information for all new metadata elements.
+     * the extended metadata elements and information for all new metadata elements.
      *
      * @return Online sources to community profile name and extended metadata elements, or {@code null}.
      */
@@ -131,8 +140,8 @@ public class DefaultMetadataExtensionInf
     }
 
     /**
-     * Provides information about a new metadata element, not found in ISO 19115, which is
-     * required to describe geographic data.
+     * Provides information about a new metadata element, not found in ISO 19115,
+     * which is required to describe resource.
      *
      * @return New metadata elements not found in ISO 19115.
      */

Copied: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java (from r1625241, sis/branches/JDK6/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java)
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java?p2=sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java&p1=sis/branches/JDK6/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java&r1=1625241&r2=1626345&rev=1626345&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadataScope.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -20,13 +20,26 @@ import javax.xml.bind.annotation.XmlType
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import org.opengis.util.InternationalString;
-import org.opengis.metadata.MetadataScope;
 import org.opengis.metadata.maintenance.ScopeCode;
 
+// Branch-specific imports
+import org.opengis.annotation.UML;
+import static org.opengis.annotation.Obligation.OPTIONAL;
+import static org.opengis.annotation.Obligation.MANDATORY;
+import static org.opengis.annotation.Specification.ISO_19115;
+
 
 /**
  * Information about the scope of the resource.
  *
+ * <div class="warning"><b>Note on International Standard versions</b><br>
+ * This class is derived from a new type defined in the ISO 19115 international standard published in 2014,
+ * while GeoAPI 3.0 is based on the version published in 2003. Consequently this implementation class does
+ * not yet implement a GeoAPI interface, but is expected to do so after the next GeoAPI releases.
+ * When the interface will become available, all references to this implementation class in Apache SIS will
+ * be replaced be references to the corresponding interface.
+ * </div>
+ *
  * <p><b>Limitations:</b></p>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
@@ -47,7 +60,8 @@ import org.opengis.metadata.maintenance.
     "name"
 })
 @XmlRootElement(name = "MD_MetadataScope")
-public class DefaultMetadataScope extends ISOMetadata implements MetadataScope {
+@UML(identifier="MD_MetadataScope", specification=ISO_19115)
+public class DefaultMetadataScope extends ISOMetadata {
     /**
      * Serial number for inter-operability with different versions.
      */
@@ -84,10 +98,8 @@ public class DefaultMetadataScope extend
      * given object are not recursively copied.
      *
      * @param object The metadata to copy values from, or {@code null} if none.
-     *
-     * @see #castOrCopy(MetadataScope)
      */
-    public DefaultMetadataScope(final MetadataScope object) {
+    public DefaultMetadataScope(final DefaultMetadataScope object) {
         super(object);
         if (object != null) {
             resourceScope = object.getResourceScope();
@@ -96,37 +108,12 @@ public class DefaultMetadataScope extend
     }
 
     /**
-     * Returns a SIS metadata implementation with the values of the given arbitrary implementation.
-     * This method performs the first applicable action in the following choices:
-     *
-     * <ul>
-     *   <li>If the given object is {@code null}, then this method returns {@code null}.</li>
-     *   <li>Otherwise if the given object is already an instance of
-     *       {@code DefaultMetadataScope}, then it is returned unchanged.</li>
-     *   <li>Otherwise a new {@code DefaultMetadataScope} instance is created using the
-     *       {@linkplain #DefaultMetadataScope(MetadataScope) copy constructor} and returned.
-     *       Note that this is a <cite>shallow</cite> copy operation, since the other
-     *       metadata contained in the given object are not recursively copied.</li>
-     * </ul>
-     *
-     * @param  object The object to get as a SIS implementation, or {@code null} if none.
-     * @return A SIS implementation containing the values of the given object (may be the
-     *         given object itself), or {@code null} if the argument was null.
-     */
-    public static DefaultMetadataScope castOrCopy(final MetadataScope object) {
-        if (object == null || object instanceof DefaultMetadataScope) {
-            return (DefaultMetadataScope) object;
-        }
-        return new DefaultMetadataScope(object);
-    }
-
-    /**
      * Return the code for the scope.
      *
      * @return The ode for the scope.
      */
-    @Override
     @XmlElement(name = "resourceScope", required = true)
+    @UML(identifier="resourceScope", obligation=MANDATORY, specification=ISO_19115)
     public ScopeCode getResourceScope() {
         return resourceScope;
     }
@@ -146,8 +133,8 @@ public class DefaultMetadataScope extend
      *
      * @return Description of the scope, or {@code null} if none.
      */
-    @Override
     @XmlElement(name = "name")
+    @UML(identifier="name", obligation=OPTIONAL, specification=ISO_19115)
     public InternationalString getName() {
         return name;
     }

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultPortrayalCatalogueReference.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultPortrayalCatalogueReference.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultPortrayalCatalogueReference.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultPortrayalCatalogueReference.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -27,6 +27,15 @@ import org.opengis.metadata.PortrayalCat
 /**
  * Information identifying the portrayal catalogue used.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Cédric Briançon (Geomatys)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -42,6 +42,15 @@ import static org.apache.sis.util.collec
  * The base class of ISO 19115 implementation classes. Each sub-classes implements one
  * of the ISO Metadata interface provided by <a href="http://www.geoapi.org">GeoAPI</a>.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-2.1)
  * @version 0.3

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ImmutableIdentifier.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ImmutableIdentifier.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ImmutableIdentifier.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ImmutableIdentifier.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -217,10 +217,10 @@ public class ImmutableIdentifier extends
      *
      * @param authority
      *          Organization or party responsible for definition and maintenance of the code
-     *          space or code.
+     *          space or code, or {@code null} if not available.
      * @param codeSpace
-     *          Name or identifier of the person or organization responsible for namespace.
-     *          This is often an abbreviation of the authority name.
+     *          Name or identifier of the person or organization responsible for namespace, or
+     *          {@code null} if not available. This is often an abbreviation of the authority name.
      * @param code
      *          Identifier code or name, optionally from a controlled list or pattern defined by
      *          a code space. The code can not be null.

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultAcquisitionInformation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultAcquisitionInformation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultAcquisitionInformation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultAcquisitionInformation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -35,6 +35,15 @@ import org.apache.sis.metadata.iso.ISOMe
  * Designations for the measuring instruments, the platform carrying them, and the mission to
  * which the data contributes.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEnvironmentalRecord.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEnvironmentalRecord.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEnvironmentalRecord.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEnvironmentalRecord.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -23,11 +23,21 @@ import org.opengis.metadata.acquisition.
 import org.opengis.util.InternationalString;
 import org.apache.sis.measure.ValueRange;
 import org.apache.sis.metadata.iso.ISOMetadata;
+import org.apache.sis.util.ArgumentChecks;
 
 
 /**
  * Information about the environmental conditions during the acquisition.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)
@@ -144,7 +154,7 @@ public class DefaultEnvironmentalRecord 
      * @return Maximum relative humidity along the flight pass during the photo flight, or {@code null}.
      */
     @Override
-    @ValueRange(minimum=0, maximum=100)
+    @ValueRange(minimum = 0, maximum = 100)
     @XmlElement(name = "maxRelativeHumidity", required = true)
     public Double getMaxRelativeHumidity() {
         return maxRelativeHumidity;
@@ -157,6 +167,9 @@ public class DefaultEnvironmentalRecord 
      */
     public void setMaxRelativeHumidity(final Double newValue) {
         checkWritePermission();
+        if (newValue != null) {
+            ArgumentChecks.ensureBetween("maxRelativeHumidity", 0, 100, newValue);
+        }
         maxRelativeHumidity = newValue;
     }
 

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEvent.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEvent.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEvent.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultEvent.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -39,6 +39,15 @@ import static org.apache.sis.internal.me
 /**
  * Identification of a significant collection point within an operation.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultInstrument.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultInstrument.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultInstrument.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultInstrument.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -32,6 +32,15 @@ import org.apache.sis.internal.jaxb.NonM
 /**
  * Designations for the measuring instruments.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -36,6 +36,15 @@ import org.apache.sis.internal.jaxb.NonM
 /**
  * Describes the characteristics, spatial and temporal extent of the intended object to be observed.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultOperation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultOperation.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultOperation.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultOperation.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -37,6 +37,15 @@ import org.apache.sis.internal.jaxb.NonM
 /**
  * Designations for the operation used to acquire the dataset.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlan.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlan.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlan.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlan.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -32,6 +32,15 @@ import org.apache.sis.metadata.iso.ISOMe
 /**
  * Designations for the planning information related to meeting the data acquisition requirements.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -33,6 +33,15 @@ import org.apache.sis.internal.jaxb.NonM
 /**
  * Designation of the platform used to acquire the dataset.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatformPass.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatformPass.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatformPass.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatformPass.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -31,6 +31,15 @@ import org.apache.sis.internal.jaxb.NonM
 /**
  * Identification of collection coverage.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequestedDate.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequestedDate.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequestedDate.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequestedDate.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -30,6 +30,15 @@ import static org.apache.sis.internal.me
 /**
  * Range of date validity.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -38,6 +38,15 @@ import static org.apache.sis.internal.me
 /**
  * Requirement to be satisfied by the planned data acquisition.
  *
+ * <p><b>Limitations:</b></p>
+ * <ul>
+ *   <li>Instances of this class are not synchronized for multi-threading.
+ *       Synchronization, if needed, is caller's responsibility.</li>
+ *   <li>Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
+ *       Serialization support is appropriate for short term storage or RMI between applications running the
+ *       same version of Apache SIS. For long term storage, use {@link org.apache.sis.xml.XML} instead.</li>
+ * </ul>
+ *
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3 (derived from geotk-3.03)

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java?rev=1626345&r1=1626344&r2=1626345&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java [UTF-8] Fri Sep 19 21:46:39 2014
@@ -71,7 +71,7 @@
  * </td></tr></table>
  *
  * {@section Null values, nil objects and collections}
- * All constructors (except the <cite>copy constructors</cite>) and setter methods accept {@code null} arguments.
+ * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
  * {@link org.apache.sis.xml.NilReason#createNilObject NilReason.createNilObject(Class)}.



Mime
View raw message