This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 89be530257a55136deab6ff5e013e35620217672
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Fri Dec 19 18:38:54 2025 +0100

    Add a `CheckedContainer.getMutability()` method.
---
 .../sis/feature/internal/shared/InstantList.java   | 10 +++
 .../main/org/apache/sis/index/tree/PointTree.java  | 12 +++-
 .../apache/sis/metadata/PropertyInformation.java   | 16 +++--
 .../iso/quality/DefaultEvaluationMethod.java       | 14 +++-
 .../org/apache/sis/parameter/MatrixParameters.java | 13 +++-
 .../org/apache/sis/parameter/package-info.java     |  2 +-
 .../referencing/factory/IdentifiedObjectSet.java   | 13 +++-
 .../sis/referencing/factory/package-info.java      |  2 +-
 .../org/apache/sis/io/stream/UpdatableWrite.java   | 12 +++-
 .../main/org/apache/sis/math/ArrayVector.java      | 10 +++
 .../main/org/apache/sis/math/package-info.java     |  2 +-
 .../main/org/apache/sis/measure/Range.java         | 13 +++-
 .../main/org/apache/sis/measure/package-info.java  |  2 +-
 .../sis/util/collection/CheckedContainer.java      | 84 +++++++++++++++++++++-
 .../apache/sis/util/collection/CodeListSet.java    | 13 +++-
 .../org/apache/sis/util/collection/DerivedSet.java | 11 +++
 .../org/apache/sis/util/collection/RangeSet.java   | 13 +++-
 .../apache/sis/util/collection/TableColumn.java    | 13 ++++
 .../apache/sis/util/collection/TreeNodeList.java   | 10 +++
 .../apache/sis/util/collection/WeakHashSet.java    | 11 +++
 .../sis/util/internal/shared/CheckedArrayList.java | 10 +++
 .../sis/util/internal/shared/CheckedHashSet.java   | 10 +++
 .../internal/shared/UnmodifiableArrayList.java     | 12 +++-
 .../test/org/apache/sis/setup/OptionKeyTest.java   |  4 ++
 24 files changed, 291 insertions(+), 21 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/feature/internal/shared/InstantList.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/feature/internal/shared/InstantList.java
index bd8b5cab43..7e6f10b85f 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/feature/internal/shared/InstantList.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/feature/internal/shared/InstantList.java
@@ -57,6 +57,16 @@ final class InstantList extends AbstractList<Instant> 
implements CheckedContaine
         return Instant.class;
     }
 
+    /**
+     * Indicates that this vector is immutable.
+     *
+     * @return {@link Mutability#IMMUTABLE}.
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.IMMUTABLE;
+    }
+
     /**
      * Returns the number of instants in this list.
      *
diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/index/tree/PointTree.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/index/tree/PointTree.java
index eab845c693..23b4e3be44 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/index/tree/PointTree.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/index/tree/PointTree.java
@@ -73,7 +73,7 @@ import org.apache.sis.util.collection.CheckedContainer;
  *
  * @author  Chris Mattmann
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.4
+ * @version 1.6
  *
  * @param  <E>  the type of elements stored in this tree.
  *
@@ -275,6 +275,16 @@ public class PointTree<E> extends AbstractSet<E> 
implements CheckedContainer<E>
         return elementType;
     }
 
+    /**
+     * Indicates that this collection is modifiable (at least by default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
 
     /**
      * Removes all elements from this tree.
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/PropertyInformation.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/PropertyInformation.java
index f25dfcbfcb..48773e075e 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/PropertyInformation.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/PropertyInformation.java
@@ -56,15 +56,12 @@ import org.opengis.metadata.citation.Responsibility;
  * This final class is immutable and thus thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.4
  *
  * @param <E>  the value type, either the method return type if not a 
collection,
  *             or the type of elements in the collection otherwise.
  *
  * @see InformationMap
  * @see MetadataStandard#asInformationMap(Class, KeyNamePolicy)
- *
- * @since 0.3
  */
 final class PropertyInformation<E> extends SimpleIdentifier           // 
Implementing Identifier is part of SIS public API.
         implements ExtendedElementInformation, CheckedContainer<E>
@@ -129,7 +126,7 @@ final class PropertyInformation<E> extends SimpleIdentifier 
          // Impleme
      * @param  range        the range of valid values, or {@code null} if 
none. This information is associated to the
      *                      implementation method rather than the interface 
one, because it is specific to SIS.
      */
-    @SuppressWarnings({"unchecked","rawtypes"})
+    
@SuppressWarnings({"unchecked","rawtypes","LocalVariableHidesMemberVariable"})
     PropertyInformation(final Citation standard, final String property, final 
Method getter,
                         final Class<E> elementType, final ValueRange range)
     {
@@ -239,6 +236,16 @@ final class PropertyInformation<E> extends 
SimpleIdentifier           // Impleme
         return elementType;
     }
 
+    /**
+     * Indicates that this vector is immutable.
+     *
+     * @return {@link Mutability#IMMUTABLE}.
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.IMMUTABLE;
+    }
+
     /**
      * Returns the maximum number of times that values are required.
      * This method returns 0 if the property is forbidden, {@link 
Integer#MAX_VALUE}
@@ -355,6 +362,7 @@ final class PropertyInformation<E> extends SimpleIdentifier 
          // Impleme
         } else {
             buffer.append('∞');
         }
+        @SuppressWarnings("LocalVariableHidesMemberVariable")
         final InternationalString domainValue = getDomainValue();
         if (domainValue != null) {
             buffer.append(", domain=").append(domainValue);
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java
index 9e444e196b..82afa9270a 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethod.java
@@ -140,6 +140,14 @@ public class DefaultEvaluationMethod extends ISOMetadata 
implements EvaluationMe
             return Temporal.class;
         }
 
+        /**
+         * Indicates that this list is modifiable.
+         */
+        @Override
+        public final Mutability getMutability() {
+            return Mutability.MODIFIABLE;
+        }
+
         /**
          * Removes all dates in this list.
          */
@@ -278,9 +286,9 @@ public class DefaultEvaluationMethod extends ISOMetadata 
implements EvaluationMe
     /**
      * Constructs an evaluation method initialized to the given description.
      *
-     * @param type  the method type, or {@code null} if none.
-     * @param name  the method description as a {@link String} or an {@link 
InternationalString} object,
-     *              or {@code null} if none.
+     * @param type         the method type, or {@code null} if none.
+     * @param description  the method description as a {@link String} or an 
{@link InternationalString} object,
+     *                     or {@code null} if none.
      * @since 1.5
      */
     public DefaultEvaluationMethod(final EvaluationMethodType type, final 
CharSequence description) {
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/MatrixParameters.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/MatrixParameters.java
index 9f685d0751..e3e34a3378 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/MatrixParameters.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/MatrixParameters.java
@@ -130,7 +130,7 @@ import org.apache.sis.util.resources.Errors;
  *     }
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.5
+ * @version 1.6
  *
  * @param <E>  the type of matrix element values.
  *
@@ -486,6 +486,17 @@ public class MatrixParameters<E> implements 
CheckedContainer<E>, Serializable {
         return elementType;
     }
 
+    /**
+     * Indicates that this collection is modifiable (at least by default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Returns the number of dimensions of the multi-dimensional array for 
which this builder will create parameters.
      * The number of array dimensions (matrix order) determines the type of 
objects represented by the parameters:
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/package-info.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/package-info.java
index 85309408ff..cd7a6e708e 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/package-info.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/package-info.java
@@ -85,7 +85,7 @@
  * if the given value is not assignable to the expected class or is not inside 
the value domain.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.5
+ * @version 1.6
  * @since   0.4
  */
 @XmlSchema(elementFormDefault= XmlNsForm.QUALIFIED, namespace = 
Namespaces.GML, xmlns = {
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
index 9056d04d0a..c3c4f5c59f 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
@@ -78,7 +78,7 @@ import org.apache.sis.util.collection.CheckedContainer;
  * if they intent to cache {@code IdentifiedObjectSet} instances.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.5
+ * @version 1.6
  *
  * @param <T>  the type of objects to be included in this set.
  *
@@ -149,6 +149,17 @@ public class IdentifiedObjectSet<T extends 
IdentifiedObject> extends AbstractSet
         return type;
     }
 
+    /**
+     * Indicates that this collection is modifiable (at least by default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Removes all of the elements from this collection.
      */
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/package-info.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/package-info.java
index 594d22f423..f2f3bf9e41 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/package-info.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/package-info.java
@@ -56,7 +56,7 @@
  * </table>
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.5
+ * @version 1.6
  * @since   0.6
  */
 package org.apache.sis.referencing.factory;
diff --git 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/UpdatableWrite.java
 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/UpdatableWrite.java
index e62bcbccd2..fa6ea3c694 100644
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/UpdatableWrite.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/UpdatableWrite.java
@@ -65,9 +65,7 @@ public abstract class UpdatableWrite<V> implements 
CheckedContainer<V> {
      * This variant can be used when the caller only want to record the 
position, with no write operation.
      *
      * @param  output  stream where to write the value.
-     * @param  value   the unsigned short value to write.
      * @return handler for modifying the value later.
-     * @throws IOException if an error occurred while writing the value.
      */
     public static UpdatableWrite<Void> of(final ChannelDataOutput output) {
         return new OfVoid(output);
@@ -236,6 +234,16 @@ public abstract class UpdatableWrite<V> implements 
CheckedContainer<V> {
         }
     }
 
+    /**
+     * Indicates that this container is modifiable.
+     *
+     * @return {@link Mutability#MODIFIABLE}.
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Returns the value size in number of bytes.
      * This is used for checking if there is enough room in a buffer.
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/ArrayVector.java 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/ArrayVector.java
index e562c67688..351af7ba51 100644
--- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/ArrayVector.java
+++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/ArrayVector.java
@@ -163,6 +163,16 @@ abstract class ArrayVector<E extends Number> extends 
Vector implements CheckedCo
         return null;
     }
 
+    /**
+     * Indicates that this vector is modifiable.
+     *
+     * @return {@link Mutability#MODIFIABLE}.
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Default implementation for the convenience of wrapper of integer types.
      */
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/package-info.java 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/package-info.java
index 4d8485cb46..55c9097561 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/package-info.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/math/package-info.java
@@ -40,7 +40,7 @@
  * </ul>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.4
+ * @version 1.6
  * @since   0.3
  */
 package org.apache.sis.math;
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/Range.java 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/Range.java
index 5f62b5e48b..21334eab86 100644
--- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/Range.java
+++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/Range.java
@@ -81,7 +81,7 @@ import org.apache.sis.util.collection.CheckedContainer;
  * @author  Joe White
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Jody Garnett (for parameterized type inspiration)
- * @version 1.4
+ * @version 1.6
  *
  * @param <E>  the type of range elements, typically a {@link Number} subclass 
or {@link java.util.Date}.
  *
@@ -211,6 +211,17 @@ public class Range<E extends Comparable<? super E>> 
implements CheckedContainer<
         return Comparable.class.isAssignableFrom(elementType);
     }
 
+    /**
+     * Indicates that this range is immutable (at least by default).
+     *
+     * @return {@link Mutability#IMMUTABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.IMMUTABLE;
+    }
+
     /**
      * Returns the base type of elements in this range.
      * This is the type specified at construction time.
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/package-info.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/package-info.java
index 4f26b26f98..bff8e1a62c 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/package-info.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/package-info.java
@@ -97,7 +97,7 @@
  *
  * @author  Martin Desruisseaux (MPO, IRD, Geomatys)
  * @author  Alexis Manin (Geomatys)
- * @version 1.5
+ * @version 1.6
  * @since   0.3
  */
 package org.apache.sis.measure;
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CheckedContainer.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CheckedContainer.java
index 5fb9dd05b2..dd132e0457 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CheckedContainer.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CheckedContainer.java
@@ -16,7 +16,13 @@
  */
 package org.apache.sis.util.collection;
 
+import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
 
 
 /**
@@ -32,7 +38,7 @@ import java.util.Collection;
  *     }
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.3
+ * @version 1.6
  *
  * @param <E>  the base type of elements in the container.
  *
@@ -45,4 +51,80 @@ public interface CheckedContainer<E> {
      * @return the element type.
      */
     Class<E> getElementType();
+
+    /**
+     * Returns whether this container is modifiable, unmodifiable or immutable.
+     *
+     * @return the mutability status of this container.
+     *
+     * @since 1.6
+     */
+    Mutability getMutability();
+
+    /**
+     * Mutability status of a container.
+     *
+     * @since 1.6
+     */
+    enum Mutability {
+        /**
+         * The container is modifiable.
+         * Invoking a setter method should not cause {@link 
UnsupportedOperationException} to be thrown.
+         */
+        MODIFIABLE,
+
+        /**
+         * The container supports only the removal of elements.
+         * Attempts to add or modify an element will cause {@link 
UnsupportedOperationException} to be thrown.
+         */
+        REMOVE_ONLY,
+
+        /**
+         * The container is unmodifiable, but not necessarily immutable.
+         * Attempts to add, remove or add an element will cause {@link 
UnsupportedOperationException} to be thrown.
+         * However, the content of the collection way still change with time, 
for example if the collection is a view
+         * and the underlying view changes.
+         */
+        UNMODIFIABLE,
+
+        /**
+         * The container is immutable. Its content does not change, and 
attempts to change
+         * the content will cause {@link UnsupportedOperationException} to be 
thrown.
+         */
+        IMMUTABLE,
+
+        /**
+         * The mutability status of the container is unknown.
+         */
+        UNKNOWN;
+
+        /**
+         * Hard-coded implementation classes considered as modifiable. We 
require the exact classes without accepting
+         * subclasses because the latter may override methods in a way that 
change the mutability of the collection.
+         * This is set is not exhaustive. Its content is determined by Apache 
<abbr>SIS</abbr> needs.
+         */
+        private static final Set<Class<?>> MUTABLES = Set.of(ArrayDeque.class, 
ArrayList.class, HashSet.class, LinkedHashSet.class);
+
+        /**
+         * Returns the mutability status of the given collection.
+         * If the given collection implements the {@link CheckedContainer} 
interface,
+         * then this method returns the {@link #getMutability()} status.
+         * Otherwise, this method tries to guess from the implementation class.
+         * In case of doubt, this method returns {@link #UNKNOWN}.
+         *
+         * @param  collection  the collection for which to get the mutability 
status.
+         * @return mutability status of the given collection.
+         */
+        public static Mutability of(final Collection<?> collection) {
+            if (collection != null) {
+                if (collection instanceof CheckedContainer<?>) {
+                    return ((CheckedContainer<?>) collection).getMutability();
+                }
+                if (collection instanceof EnumSet<?> || 
MUTABLES.contains(collection.getClass())) {
+                    return MODIFIABLE;
+                }
+            }
+            return UNKNOWN;
+        }
+    }
 }
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CodeListSet.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CodeListSet.java
index 5ae3c3bf2f..8e23bdcdfe 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CodeListSet.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/CodeListSet.java
@@ -49,7 +49,7 @@ import org.apache.sis.util.resources.Errors;
  *   }
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.5
+ * @version 1.6
  *
  * @param <E>  the type of code list elements in the set.
  *
@@ -159,6 +159,17 @@ public class CodeListSet<E extends CodeList<E>> extends 
AbstractSet<E>
         return elementType;
     }
 
+    /**
+     * Indicates that this collection is modifiable (at least by default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Returns the code list for the given ordinal value. This methods depends
      * only on the code list type; it does not depend on the content of this 
set.
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/DerivedSet.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/DerivedSet.java
index 802f660aee..ff0a6ae6ab 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/DerivedSet.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/DerivedSet.java
@@ -112,6 +112,17 @@ class DerivedSet<S,E> extends SetOfUnknownSize<E> 
implements CheckedContainer<E>
         return converter.getTargetClass();
     }
 
+    /**
+     * Indicates whether this container is modifiable (which is true by 
default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.of(storage);
+    }
+
     /**
      * Declares that this set excludes the null element.
      */
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/RangeSet.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/RangeSet.java
index 3cb37b7299..85b14f69b0 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/RangeSet.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/RangeSet.java
@@ -101,7 +101,7 @@ import static org.apache.sis.util.Numbers.*;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Rémi Maréchal (Geomatys)
- * @version 1.4
+ * @version 1.6
  *
  * @param <E>  the type of range elements.
  *
@@ -303,6 +303,17 @@ public class RangeSet<E extends Comparable<? super E>> 
extends AbstractSet<Range
         return (Class) Range.class;
     }
 
+    /**
+     * Indicates that this collection is modifiable (at least by default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Returns the comparator associated with this sorted set.
      */
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TableColumn.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TableColumn.java
index 7f188c629e..1984f92d5f 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TableColumn.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TableColumn.java
@@ -313,9 +313,22 @@ public class TableColumn<V> implements CheckedContainer<V> 
{
         return type;
     }
 
+    /**
+     * Indicates that a table header is an immutable object (at least by 
default).
+     *
+     * @return {@link Mutability#IMMUTABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.IMMUTABLE;
+    }
+
     /**
      * Returns a string representation of this table column.
      * The default implementation returns the {@linkplain #getHeader() header} 
in its default locale.
+     *
+     * @return a string representation of this table column.
      */
     @Override
     public String toString() {
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TreeNodeList.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TreeNodeList.java
index 21986080f8..218c8e67c4 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TreeNodeList.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/TreeNodeList.java
@@ -145,6 +145,16 @@ abstract class TreeNodeList extends 
AbstractList<TreeTable.Node>
         return TreeTable.Node.class;
     }
 
+    /**
+     * Indicates that this container is modifiable.
+     *
+     * @return {@link Mutability#MODIFIABLE}.
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Returns the number of nodes in this list.
      *
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/WeakHashSet.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/WeakHashSet.java
index 1407176957..dab319793c 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/WeakHashSet.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/collection/WeakHashSet.java
@@ -150,6 +150,17 @@ public class WeakHashSet<E> extends AbstractSet<E> 
implements CheckedContainer<E
         return elementType;
     }
 
+    /**
+     * Indicates that this collection is modifiable (at least by default).
+     *
+     * @return {@link Mutability#MODIFIABLE} by default.
+     * @since 1.6
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Invoked by {@link Entry} when an element has been collected by the 
garbage
      * collector. This method removes the weak reference from the {@link 
#table}.
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedArrayList.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedArrayList.java
index 647f5dd526..56aa175387 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedArrayList.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedArrayList.java
@@ -112,6 +112,16 @@ public final class CheckedArrayList<E> extends 
ArrayList<E> implements CheckedCo
         return type;
     }
 
+    /**
+     * Indicates that this collection is modifiable.
+     *
+     * @return {@link Mutability#MODIFIABLE}.
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Invoked when an illegal element has been given to the {@code add(E)} 
method.
      * The element may be illegal either because null or because of invalid 
type.
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedHashSet.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedHashSet.java
index 219045667a..0822930f61 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedHashSet.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/CheckedHashSet.java
@@ -81,6 +81,16 @@ public final class CheckedHashSet<E> extends 
LinkedHashSet<E> implements Checked
         return type;
     }
 
+    /**
+     * Indicates that this collection is modifiable.
+     *
+     * @return {@link Mutability#MODIFIABLE}.
+     */
+    @Override
+    public Mutability getMutability() {
+        return Mutability.MODIFIABLE;
+    }
+
     /**
      * Adds the specified element to this set if it is not already present.
      *
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/UnmodifiableArrayList.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/UnmodifiableArrayList.java
index ece5bb7535..30b0456db3 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/UnmodifiableArrayList.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/UnmodifiableArrayList.java
@@ -158,10 +158,20 @@ public class UnmodifiableArrayList<E> extends 
AbstractList<E> implements RandomA
     @Override
     @ConditionallySafe
     @SuppressWarnings("unchecked")
-    public Class<E> getElementType() {
+    public final Class<E> getElementType() {
         return (Class<E>) array.getClass().getComponentType();
     }
 
+    /**
+     * Indicates that this collection is unmodifiable.
+     *
+     * @return {@link Mutability#UNMODIFIABLE}.
+     */
+    @Override
+    public final Mutability getMutability() {
+        return Mutability.UNMODIFIABLE;
+    }
+
     /**
      * Returns the index of the first valid element.
      * To be overridden by {@link SubList} only.
diff --git 
a/endorsed/src/org.apache.sis.util/test/org/apache/sis/setup/OptionKeyTest.java 
b/endorsed/src/org.apache.sis.util/test/org/apache/sis/setup/OptionKeyTest.java
index bece3adb64..cb5205fcf8 100644
--- 
a/endorsed/src/org.apache.sis.util/test/org/apache/sis/setup/OptionKeyTest.java
+++ 
b/endorsed/src/org.apache.sis.util/test/org/apache/sis/setup/OptionKeyTest.java
@@ -47,6 +47,10 @@ public final class OptionKeyTest extends TestCase {
         CustomKey(final String name, final Class<T> type) {
             super(name, type);
         }
+
+        @Override public final Mutability getMutability() {
+            return Mutability.IMMUTABLE;
+        }
     }
 
     /**

Reply via email to