You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/11/28 14:10:56 UTC

[sis] 03/03: Merge branch 'geoapi-3.1'. This is documentation, ISO 19115 amendment 1 and minor bug fixes.

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

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

commit 1a8e38fd88929aa07d235ed7e47e761882dc8b00
Merge: f77cfeed91 0d88ef7e00
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Mon Nov 28 15:10:01 2022 +0100

    Merge branch 'geoapi-3.1'.
    This is documentation, ISO 19115 amendment 1 and minor bug fixes.

 .../apache/sis/gui/coverage/CoverageExplorer.java  |   2 +-
 .../org/apache/sis/gui/map/GestureFollower.java    |   2 +-
 .../gui/referencing/RecentReferenceSystems.java    |   1 +
 .../apache/sis/feature/AbstractAssociation.java    |   4 +-
 .../org/apache/sis/feature/AbstractAttribute.java  |   4 +-
 .../java/org/apache/sis/feature/AttributeView.java |   9 +-
 .../main/java/org/apache/sis/feature/Field.java    |   9 +-
 .../apache/sis/feature/MultiValuedAssociation.java |   4 +-
 .../apache/sis/feature/MultiValuedAttribute.java   |   4 +-
 .../java/org/apache/sis/feature/PropertyView.java  |   5 +-
 .../sis/feature/builder/AttributeTypeBuilder.java  |   4 +-
 .../sis/feature/builder/FeatureTypeBuilder.java    |   2 +-
 .../org/apache/sis/filter/ArithmeticFunction.java  |   8 ++
 .../org/apache/sis/filter/AssociationValue.java    |   5 +
 .../java/org/apache/sis/filter/BinaryFunction.java |   2 +
 .../apache/sis/filter/BinaryGeometryFilter.java    |   2 +
 .../org/apache/sis/filter/BinarySpatialFilter.java |   8 +-
 .../org/apache/sis/filter/ComparisonFilter.java    |  14 +++
 .../org/apache/sis/filter/ConvertFunction.java     |   1 +
 .../org/apache/sis/filter/DefaultSortProperty.java |   1 +
 .../java/org/apache/sis/filter/DistanceFilter.java |   1 +
 .../java/org/apache/sis/filter/LeafExpression.java |  10 +-
 .../java/org/apache/sis/filter/LikeFilter.java     |   1 +
 .../java/org/apache/sis/filter/LogicalFilter.java  |   8 ++
 .../java/org/apache/sis/filter/PropertyValue.java  |   6 ++
 .../java/org/apache/sis/filter/TemporalFilter.java |  30 +++++-
 .../java/org/apache/sis/filter/UnaryFunction.java  |   5 +
 .../jaxb/metadata/MI_RangeElementDescription.java  |  29 +++++-
 .../metadata/replace}/SensorType.java              |   6 +-
 .../sis/internal/metadata/RecordSchemaSIS.java     |  36 +++++--
 .../apache/sis/internal/metadata/Resources.java    |  15 +++
 .../sis/internal/metadata/Resources.properties     |   3 +
 .../sis/internal/metadata/Resources_fr.properties  |   3 +
 .../iso/DefaultApplicationSchemaInformation.java   |   4 +-
 .../iso/DefaultExtendedElementInformation.java     |   6 +-
 .../apache/sis/metadata/iso/DefaultIdentifier.java |   6 +-
 .../apache/sis/metadata/iso/DefaultMetadata.java   |   6 +-
 .../iso/DefaultMetadataExtensionInformation.java   |   4 +-
 .../sis/metadata/iso/DefaultMetadataScope.java     |   2 +-
 .../iso/DefaultPortrayalCatalogueReference.java    |   4 +-
 .../org/apache/sis/metadata/iso/ISOMetadata.java   |   2 +-
 .../acquisition/DefaultAcquisitionInformation.java |   4 +-
 .../acquisition/DefaultEnvironmentalRecord.java    |   6 +-
 .../sis/metadata/iso/acquisition/DefaultEvent.java |   6 +-
 .../iso/acquisition/DefaultInstrument.java         |   6 +-
 .../metadata/iso/acquisition/DefaultObjective.java |   6 +-
 .../metadata/iso/acquisition/DefaultOperation.java |   6 +-
 .../sis/metadata/iso/acquisition/DefaultPlan.java  |   6 +-
 .../metadata/iso/acquisition/DefaultPlatform.java  |   6 +-
 .../iso/acquisition/DefaultPlatformPass.java       |   6 +-
 .../iso/acquisition/DefaultRequestedDate.java      |   6 +-
 .../iso/acquisition/DefaultRequirement.java        |   6 +-
 .../sis/metadata/iso/acquisition/package-info.java |   2 +-
 .../sis/metadata/iso/citation/AbstractParty.java   |  47 ++++++++-
 .../sis/metadata/iso/citation/DefaultAddress.java  |   6 +-
 .../sis/metadata/iso/citation/DefaultCitation.java |   6 +-
 .../metadata/iso/citation/DefaultCitationDate.java |   6 +-
 .../sis/metadata/iso/citation/DefaultContact.java  |   6 +-
 .../metadata/iso/citation/DefaultIndividual.java   |   2 +-
 .../iso/citation/DefaultOnlineResource.java        |   6 +-
 .../metadata/iso/citation/DefaultOrganisation.java |   2 +-
 .../iso/citation/DefaultResponsibility.java        |   2 +-
 .../iso/citation/DefaultResponsibleParty.java      |   6 +-
 .../sis/metadata/iso/citation/DefaultSeries.java   |   6 +-
 .../metadata/iso/citation/DefaultTelephone.java    |   6 +-
 .../sis/metadata/iso/citation/package-info.java    |   4 +-
 .../iso/constraint/DefaultConstraints.java         |   6 +-
 .../iso/constraint/DefaultLegalConstraints.java    |   6 +-
 .../iso/constraint/DefaultReleasability.java       |   2 +-
 .../iso/constraint/DefaultSecurityConstraints.java |   6 +-
 .../sis/metadata/iso/constraint/package-info.java  |   2 +-
 .../iso/content/AbstractContentInformation.java    |   6 +-
 .../iso/content/DefaultAttributeGroup.java         |   2 +-
 .../sis/metadata/iso/content/DefaultBand.java      |   6 +-
 .../iso/content/DefaultCoverageDescription.java    |   6 +-
 .../DefaultFeatureCatalogueDescription.java        |   4 +-
 .../iso/content/DefaultFeatureTypeInfo.java        |   2 +-
 .../iso/content/DefaultImageDescription.java       |   6 +-
 .../iso/content/DefaultRangeDimension.java         |   6 +-
 .../content/DefaultRangeElementDescription.java    |   6 +-
 .../iso/content/DefaultSampleDimension.java        |  41 +++++++-
 .../sis/metadata/iso/content/package-info.java     |   4 +-
 .../metadata/iso/distribution/DefaultDataFile.java |   6 +-
 .../DefaultDigitalTransferOptions.java             |   4 +-
 .../iso/distribution/DefaultDistribution.java      |   6 +-
 .../iso/distribution/DefaultDistributor.java       |   6 +-
 .../metadata/iso/distribution/DefaultFormat.java   |   6 +-
 .../metadata/iso/distribution/DefaultMedium.java   |   6 +-
 .../distribution/DefaultStandardOrderProcess.java  |   6 +-
 .../metadata/iso/distribution/package-info.java    |   2 +-
 .../iso/extent/AbstractGeographicExtent.java       |   6 +-
 .../iso/extent/DefaultBoundingPolygon.java         |   6 +-
 .../sis/metadata/iso/extent/DefaultExtent.java     |   6 +-
 .../iso/extent/DefaultGeographicBoundingBox.java   |   6 +-
 .../iso/extent/DefaultGeographicDescription.java   |   6 +-
 .../iso/extent/DefaultSpatialTemporalExtent.java   |   6 +-
 .../metadata/iso/extent/DefaultTemporalExtent.java |   6 +-
 .../metadata/iso/extent/DefaultVerticalExtent.java |   6 +-
 .../sis/metadata/iso/extent/package-info.java      |   2 +-
 .../iso/identification/AbstractIdentification.java |   6 +-
 .../DefaultAggregateInformation.java               |   6 +-
 .../identification/DefaultAssociatedResource.java  |   2 +-
 .../iso/identification/DefaultBrowseGraphic.java   |   6 +-
 .../iso/identification/DefaultCoupledResource.java |   2 +-
 .../identification/DefaultDataIdentification.java  |   6 +-
 .../iso/identification/DefaultKeywordClass.java    |   2 +-
 .../iso/identification/DefaultKeywords.java        |   6 +-
 .../DefaultOperationChainMetadata.java             |   2 +-
 .../identification/DefaultOperationMetadata.java   |   2 +-
 .../DefaultRepresentativeFraction.java             |   2 +-
 .../iso/identification/DefaultResolution.java      |   6 +-
 .../DefaultServiceIdentification.java              |   6 +-
 .../metadata/iso/identification/DefaultUsage.java  |   6 +-
 .../metadata/iso/identification/package-info.java  |   2 +-
 .../sis/metadata/iso/lineage/DefaultAlgorithm.java |   6 +-
 .../sis/metadata/iso/lineage/DefaultLineage.java   |   6 +-
 .../iso/lineage/DefaultNominalResolution.java      |   6 +-
 .../metadata/iso/lineage/DefaultProcessStep.java   |   6 +-
 .../iso/lineage/DefaultProcessStepReport.java      |   6 +-
 .../metadata/iso/lineage/DefaultProcessing.java    |   6 +-
 .../sis/metadata/iso/lineage/DefaultSource.java    |   6 +-
 .../sis/metadata/iso/lineage/package-info.java     |   2 +-
 .../maintenance/DefaultMaintenanceInformation.java |   4 +-
 .../sis/metadata/iso/maintenance/DefaultScope.java |   6 +-
 .../iso/maintenance/DefaultScopeDescription.java   |   6 +-
 .../sis/metadata/iso/maintenance/package-info.java |   2 +-
 .../org/apache/sis/metadata/iso/package-info.java  |   2 +-
 .../metadata/iso/quality/AbstractCompleteness.java |   6 +-
 .../iso/quality/AbstractDataEvaluation.java        |   4 +-
 .../sis/metadata/iso/quality/AbstractElement.java  |   4 +-
 .../iso/quality/AbstractLogicalConsistency.java    |   6 +-
 .../metadata/iso/quality/AbstractMetaquality.java  |   2 +-
 .../iso/quality/AbstractPositionalAccuracy.java    |   6 +-
 .../sis/metadata/iso/quality/AbstractResult.java   |   4 +-
 .../iso/quality/AbstractTemporalAccuracy.java      |   6 +-
 .../iso/quality/AbstractTemporalQuality.java       |   4 +-
 .../iso/quality/AbstractThematicAccuracy.java      |   6 +-
 .../DefaultAbsoluteExternalPositionalAccuracy.java |   4 +-
 .../quality/DefaultAccuracyOfATimeMeasurement.java |   4 +-
 .../iso/quality/DefaultAggregationDerivation.java  |   2 +-
 .../metadata/iso/quality/DefaultBasicMeasure.java  |   2 +-
 .../iso/quality/DefaultCompletenessCommission.java |   4 +-
 .../iso/quality/DefaultCompletenessOmission.java   |   4 +-
 .../iso/quality/DefaultConceptualConsistency.java  |   4 +-
 .../metadata/iso/quality/DefaultConfidence.java    |   2 +-
 .../iso/quality/DefaultConformanceResult.java      |   6 +-
 .../iso/quality/DefaultCoverageResult.java         |   6 +-
 .../metadata/iso/quality/DefaultDataQuality.java   |   6 +-
 .../metadata/iso/quality/DefaultDescription.java   |   2 +-
 .../iso/quality/DefaultDescriptiveResult.java      |   2 +-
 .../iso/quality/DefaultDomainConsistency.java      |   6 +-
 .../iso/quality/DefaultEvaluationMethod.java       |   2 +-
 .../iso/quality/DefaultFormatConsistency.java      |   6 +-
 .../iso/quality/DefaultFullInspection.java         |   2 +-
 .../DefaultGriddedDataPositionalAccuracy.java      |   4 +-
 .../metadata/iso/quality/DefaultHomogeneity.java   |   2 +-
 .../iso/quality/DefaultIndirectEvaluation.java     |   2 +-
 .../sis/metadata/iso/quality/DefaultMeasure.java   |   2 +-
 .../iso/quality/DefaultMeasureReference.java       |   2 +-
 .../DefaultNonQuantitativeAttributeAccuracy.java   |   4 +-
 ...DefaultNonQuantitativeAttributeCorrectness.java |   4 +-
 .../DefaultQuantitativeAttributeAccuracy.java      |   4 +-
 .../iso/quality/DefaultQuantitativeResult.java     |   6 +-
 .../DefaultRelativeInternalPositionalAccuracy.java |   4 +-
 .../iso/quality/DefaultRepresentativity.java       |   2 +-
 .../iso/quality/DefaultSampleBasedInspection.java  |  10 +-
 .../sis/metadata/iso/quality/DefaultScope.java     |   6 +-
 .../iso/quality/DefaultSourceReference.java        |   2 +-
 .../DefaultStandaloneQualityReportInformation.java |   2 +-
 .../iso/quality/DefaultTemporalConsistency.java    |   6 +-
 .../iso/quality/DefaultTemporalValidity.java       |   6 +-
 .../DefaultThematicClassificationCorrectness.java  |   4 +-
 .../iso/quality/DefaultTopologicalConsistency.java |   4 +-
 .../sis/metadata/iso/quality/DefaultUsability.java |   6 +-
 .../iso/quality/DefaultUsabilityElement.java       |   4 +-
 .../sis/metadata/iso/quality/package-info.java     |   2 +-
 .../spatial/AbstractGeolocationInformation.java    |   4 +-
 .../iso/spatial/AbstractSpatialRepresentation.java |  44 +++++++-
 .../sis/metadata/iso/spatial/DefaultDimension.java |   6 +-
 .../sis/metadata/iso/spatial/DefaultGCP.java       |   6 +-
 .../metadata/iso/spatial/DefaultGCPCollection.java |   6 +-
 .../iso/spatial/DefaultGeometricObjects.java       |   6 +-
 .../metadata/iso/spatial/DefaultGeorectified.java  |   6 +-
 .../iso/spatial/DefaultGeoreferenceable.java       |   6 +-
 .../spatial/DefaultGridSpatialRepresentation.java  |   6 +-
 .../DefaultVectorSpatialRepresentation.java        |   4 +-
 .../sis/metadata/iso/spatial/package-info.java     |   4 +-
 .../org/apache/sis/util/iso/DefaultMemberName.java |   2 +-
 .../apache/sis/util/iso/DefaultNameFactory.java    |   2 +-
 .../apache/sis/util/iso/DefaultRecordSchema.java   |  22 +++-
 .../org/apache/sis/util/iso/DefaultRecordType.java |  13 ++-
 .../main/java/org/apache/sis/util/iso/Names.java   |  14 +++
 .../main/java/org/apache/sis/util/iso/Types.java   |   2 +-
 .../iso/quality/DefaultQuantitativeResultTest.java | 116 +++++++++++++++++++++
 .../sis/test/xml/AnnotationConsistencyCheck.java   |   5 +-
 .../sis/xml/CharSequenceSubstitutionTest.java      |   2 +-
 .../sis/parameter/DefaultParameterValueGroup.java  |   2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |   6 +-
 .../sis/referencing/ImmutableIdentifier.java       |   2 +-
 .../apache/sis/referencing/NamedIdentifier.java    |   4 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |   4 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |   4 +-
 .../sis/referencing/datum/AbstractDatum.java       |   2 +-
 .../operation/AbstractCoordinateOperation.java     |   4 +-
 .../operation/DefaultConcatenatedOperation.java    |   2 +-
 .../referencing/operation/DefaultConversion.java   |   4 +-
 .../operation/DefaultPassThroughOperation.java     |   2 +-
 .../operation/DefaultTransformation.java           |   2 +-
 .../main/java/org/apache/sis/math/ArrayVector.java |   5 +-
 .../org/apache/sis/measure/ConventionalUnit.java   |   5 +-
 .../java/org/apache/sis/measure/DerivedScalar.java |   6 +-
 .../main/java/org/apache/sis/measure/Scalar.java   |   3 +-
 .../org/apache/sis/measure/ScalarFallback.java     |   5 +-
 .../org/apache/sis/util/collection/DerivedMap.java |  21 ++++
 .../org/apache/sis/util/collection/DerivedSet.java |   3 +
 .../sis/util/collection/FrequencySortedSet.java    |   3 +
 .../org/apache/sis/util/collection/RangeSet.java   |   3 +
 .../org/apache/sis/util/collection/TreeTable.java  |   2 +-
 .../apache/sis/util/resources/package-info.java    |  10 +-
 ide-project/NetBeans/nbproject/project.properties  |   2 +-
 pom.xml                                            |   4 +-
 .../storage/aggregate/AggregatedFeatureSet.java    |   9 +-
 .../sis/storage/aggregate/CoverageAggregator.java  |   1 +
 .../apache/sis/internal/storage/gpx/Copyright.java |  23 ++--
 224 files changed, 933 insertions(+), 464 deletions(-)

diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
index 7fd9ce8b02,136c58ec32..848d091e67
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
@@@ -145,10 -148,10 +145,10 @@@ public abstract class AbstractAssociati
       * <p>The default implementation returns a collection which will delegate its work to
       * {@link #getValue()} and {@link #setValue(Object)}.</p>
       *
-      * @return the features in a <cite>live</cite> collection.
+      * @return the features in a <em>live</em> collection.
       */
      @Override
 -    public Collection<Feature> getValues() {
 +    public Collection<AbstractFeature> getValues() {
          return super.getValues();
      }
  
diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/AttributeView.java
index c93e657d39,be0758cde5..399c2dcd34
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AttributeView.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AttributeView.java
@@@ -36,10 -38,14 +36,14 @@@ import java.util.Objects
   *
   * @author  Martin Desruisseaux (Geomatys)
   * @version 0.8
-  * @since   0.8
+  *
+  * @param <V> the type of attribute values. If the attribute supports multi-occurrences,
+  *            then this is the type of elements (not the collection type).
+  *
+  * @since 0.8
   * @module
   */
 -class AttributeView<V> extends PropertyView<V> implements Attribute<V> {
 +class AttributeView<V> extends AbstractAttribute<V> {
      /**
       * For cross-version compatibility.
       */
diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/Field.java
index df704eece4,53c280d8bf..40d410060c
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/Field.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/Field.java
@@@ -29,10 -35,13 +29,13 @@@ import org.apache.sis.util.Deprecable
   *
   * @author  Martin Desruisseaux (Geomatys)
   * @version 0.8
-  * @since   0.5
+  *
+  * @param <V> the type of property values.
+  *
+  * @since 0.5
   * @module
   */
 -abstract class Field<V> implements Property {
 +abstract class Field<V> extends Property {
      /**
       * For subclass constructors.
       */
diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/PropertyView.java
index 04e191eba5,732776ed54..26807d750f
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyView.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyView.java
@@@ -39,14 -48,39 +39,17 @@@ import org.apache.sis.internal.feature.
   *
   * @author  Martin Desruisseaux (Geomatys)
   * @version 0.8
-  * @since   0.8
+  *
+  * @param <V> the type of property values.
+  *
+  * @since 0.8
   * @module
   */
 -abstract class PropertyView<V> extends Field<V> implements Property, Serializable {
 -    /**
 -     * For cross-version compatibility.
 -     */
 -    private static final long serialVersionUID = -5605415150581699255L;
 -
 +final class PropertyView {
      /**
 -     * The feature from which to read and where to write the attribute or association value.
 -     */
 -    @SuppressWarnings("serial")         // Not statically typed as Serializable.
 -    final Feature feature;
 -
 -    /**
 -     * The string representation of the property name. This is the value to be given in calls to
 -     * {@link Feature#getPropertyValue(String)} and {@link Feature#setPropertyValue(String, Object)}.
 -     */
 -    final String name;
 -
 -    /**
 -     * Creates a new property which will delegate its work to the given feature.
 -     *
 -     * @param feature  the feature from which to read and where to write the property value.
 -     * @param name     the string representation of the property name.
 +     * Do not allow instantiation of this class.
       */
 -    PropertyView(final Feature feature, final String name) {
 -        this.feature = feature;
 -        this.name = name;
 +    private PropertyView() {
      }
  
      /**
diff --cc core/sis-feature/src/main/java/org/apache/sis/filter/AssociationValue.java
index ae65d82973,67914b95d6..ee0652794e
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/AssociationValue.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/AssociationValue.java
@@@ -51,12 -51,17 +51,17 @@@ import org.apache.sis.internal.geoapi.f
   * @since 1.2
   * @module
   */
 -final class AssociationValue<V> extends LeafExpression<Feature, V>
 -        implements ValueReference<Feature, V>, Optimization.OnExpression<Feature, V>
 +final class AssociationValue<V> extends LeafExpression<AbstractFeature, V>
 +        implements ValueReference<AbstractFeature, V>, Optimization.OnExpression<AbstractFeature, V>
  {
+     /**
+      * For cross-version compatibility.
+      */
+     private static final long serialVersionUID = 2082322712413854288L;
+ 
      /**
       * Path to the property from which to retrieve the value.
 -     * Each element in the array is an argument to give in a call to {@link Feature#getProperty(String)}.
 +     * Each element in the array is an argument to give in a call to {@code Feature.getProperty(String)}.
       * This array should be considered read-only because it may be shared.
       */
      private final String[] path;
diff --cc core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
index ac7287a3bf,741ebfc587..c1c497e70b
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
@@@ -59,12 -65,18 +59,14 @@@ abstract class BinaryGeometryFilter<R,G
  
      /**
       * The first of the two expressions to be used by this function.
 -     *
 -     * @see BinarySpatialOperator#getOperand1()
       */
+     @SuppressWarnings("serial")         // Not statically typed as Serializable.
      protected final Expression<? super R, GeometryWrapper<G>> expression1;
  
      /**
       * The second of the two expressions to be used by this function.
 -     *
 -     * @see BinarySpatialOperator#getOperand2()
       */
+     @SuppressWarnings("serial")         // Not statically typed as Serializable.
      protected final Expression<? super R, GeometryWrapper<G>> expression2;
  
      /**
diff --cc core/sis-feature/src/main/java/org/apache/sis/filter/LeafExpression.java
index bff8fae7b9,76dd982fc1..db1ed31b08
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/LeafExpression.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/LeafExpression.java
@@@ -76,8 -77,11 +76,11 @@@ abstract class LeafExpression<R,V> exte
      /**
       * A constant, literal value that can be used in expressions.
       * The {@link #apply(Object)} method ignores the argument and always returns {@link #getValue()}.
+      *
+      * @param  <R>  the type of resources used as inputs.
+      * @param  <V>  the type of value computed by the expression.
       */
 -    static class Literal<R,V> extends LeafExpression<R,V> implements org.opengis.filter.Literal<R,V> {
 +    static class Literal<R,V> extends LeafExpression<R,V> implements org.apache.sis.internal.geoapi.filter.Literal<R,V> {
          /** For cross-version compatibility. */
          private static final long serialVersionUID = -8383113218490957822L;
  
diff --cc core/sis-feature/src/main/java/org/apache/sis/filter/UnaryFunction.java
index fcf3f88e9a,62b0d4c76f..a8ac6ffa9c
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/UnaryFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/UnaryFunction.java
@@@ -95,10 -99,12 +96,12 @@@ class UnaryFunction<R,V> extends Node 
       * Filter operator that checks if an expression's value is {@code null}.  A {@code null}
       * is equivalent to no value present. The value 0 is a valid value and is not considered
       * {@code null}.
+      *
+      * @param  <R>  the type of resources used as inputs.
       */
      static final class IsNull<R> extends UnaryFunction<R,Object>
 -            implements NullOperator<R>, Optimization.OnFilter<R>
 -    {
 +            implements Filter<R>, Optimization.OnFilter<R>
 + {
          /** For cross-version compatibility. */
          private static final long serialVersionUID = 2960285515924533419L;
  
@@@ -132,9 -134,11 +135,11 @@@
       * Filter operator that checks if an expression's value is nil.
       * The difference with {@link IsNull} is that a value should exist but
       * cannot be provided for the reason given by {@link #getNilReason()}.
+      *
+      * @param  <R>  the type of resources used as inputs.
       */
      static final class IsNil<R> extends UnaryFunction<R,Object>
 -            implements NilOperator<R>, Optimization.OnFilter<R>
 +            implements Filter<R>, Optimization.OnFilter<R>
      {
          /** For cross-version compatibility. */
          private static final long serialVersionUID = -7540765433296725888L;
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/AbstractParty.java
index d8acf195c1,1b53fcf885..af084ce29f
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/AbstractParty.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/AbstractParty.java
@@@ -22,17 -22,17 +22,20 @@@ import javax.xml.bind.annotation.XmlEle
  import javax.xml.bind.annotation.XmlRootElement;
  import javax.xml.bind.annotation.XmlSeeAlso;
  import org.opengis.util.InternationalString;
+ import org.opengis.metadata.Identifier;
  import org.opengis.metadata.citation.Contact;
 -import org.opengis.metadata.citation.Individual;
 -import org.opengis.metadata.citation.Organisation;
 -import org.opengis.metadata.citation.Party;
  import org.apache.sis.metadata.iso.ISOMetadata;
  import org.apache.sis.metadata.TitleProperty;
  import org.apache.sis.util.iso.Types;
+ import org.apache.sis.xml.IdentifierSpace;
+ import org.apache.sis.internal.jaxb.NonMarshalledAuthority;
  
 +// Branch-specific imports
 +import org.opengis.annotation.UML;
 +import static org.opengis.annotation.Obligation.OPTIONAL;
 +import static org.opengis.annotation.Obligation.CONDITIONAL;
 +import static org.opengis.annotation.Specification.ISO_19115;
 +
  
  /**
   * Information about the individual and / or organization of the party.
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultResponsibleParty.java
index 3ee470f80a,dc9359aa13..2b9c948b1e
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultResponsibleParty.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultResponsibleParty.java
@@@ -125,8 -112,8 +125,8 @@@ public class DefaultResponsibleParty ex
       *   <li>Otherwise if the given object is already an instance of
       *       {@code DefaultResponsibleParty}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code DefaultResponsibleParty} instance is created using the
-      *       {@linkplain #DefaultResponsibleParty(ResponsibleParty) copy constructor}
-      *       and returned. Note that this is a <dfn>shallow</dfn> copy operation, because the other
 -     *       {@linkplain #DefaultResponsibleParty(Responsibility) copy constructor} and returned.
++     *       {@linkplain #DefaultResponsibleParty(ResponsibleParty) copy constructor} and returned.
+      *       Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/DefaultSampleDimension.java
index 35d121ae94,eab7d2ddfb..bb2f5f29d9
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/DefaultSampleDimension.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/DefaultSampleDimension.java
@@@ -23,8 -24,10 +24,9 @@@ import javax.xml.bind.annotation.XmlSee
  import javax.xml.bind.annotation.XmlType;
  import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  import org.opengis.metadata.content.Band;
 -import org.opengis.metadata.content.SampleDimension;
  import org.opengis.metadata.content.CoverageContentType;
  import org.opengis.metadata.content.TransferFunctionType;
+ import org.opengis.metadata.content.RangeElementDescription;
  import org.opengis.util.Record;
  import org.opengis.util.RecordType;
  import org.apache.sis.measure.ValueRange;
@@@ -481,6 -485,32 +491,31 @@@ public class DefaultSampleDimension ext
          }
      }
  
+     /**
+      * Provides the description and values of the specific range elements of a sample dimension.
+      * Example: missing data.
+      *
+      * @return description and values of the specific range elements.
+      *
+      * @since 1.3
+      */
 -    @Override
+     @XmlElement(name = "rangeElementDescription")
+     @XmlJavaTypeAdapter(MI_RangeElementDescription.Since2014.class)
+     public Collection<RangeElementDescription> getRangeElementDescriptions() {
+         return rangeElementDescriptions = nonNullCollection(rangeElementDescriptions, RangeElementDescription.class);
+     }
+ 
+     /**
+      * Sets the description and values of the specific range elements of a sample dimension.
+      *
+      * @param  newValues  the new range element description.
+      *
+      * @since 1.3
+      */
+     public void setRangeElementDescriptions(final Collection<? extends RangeElementDescription> newValues) {
+         rangeElementDescriptions = writeCollection(newValues, rangeElementDescriptions, RangeElementDescription.class);
+     }
+ 
      /**
       * Returns the smallest distance between which separate points can be distinguished,
       * as specified in instrument design.
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java
index a279870e63,6f644b555a..c1478819c1
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java
@@@ -91,18 -89,9 +91,18 @@@ public class DefaultAggregateInformatio
      public DefaultAggregateInformation() {
      }
  
 +    /**
 +     * Constructs a new instance initialized with the values from the specified metadata object.
 +     *
 +     * @param object The metadata to copy values from.
 +     */
 +    DefaultAggregateInformation(final DefaultAssociatedResource object) {
 +        super(object);
 +    }
 +
      /**
       * Constructs a new instance initialized with the values from the specified metadata object.
-      * This is a <dfn>shallow</dfn> copy constructor, because the other metadata contained in the
+      * This is a <em>shallow</em> copy constructor, because the other metadata contained in the
       * given object are not recursively copied.
       *
       * @param  object  the metadata to copy values from, or {@code null} if none.
@@@ -124,8 -111,8 +124,8 @@@
       *   <li>Otherwise if the given object is already an instance of
       *       {@code DefaultAggregateInformation}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code DefaultAggregateInformation} instance is created using the
-      *       {@linkplain #DefaultAggregateInformation(AggregateInformation) copy constructor}
-      *       and returned. Note that this is a <dfn>shallow</dfn> copy operation, because the other
 -     *       {@linkplain #DefaultAggregateInformation(AssociatedResource) copy constructor} and returned.
++     *       {@linkplain #DefaultAggregateInformation(AggregateInformation) copy constructor} and returned.
+      *       Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
index 8ab487335e,6e6d8b7bac..f801fa3593
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
@@@ -121,22 -113,9 +121,22 @@@ public class DefaultAssociatedResource 
          this.associationType = associationType;
      }
  
 +    /**
 +     * Constructs a new instance initialized with the values from the specified metadata object.
 +     * This is a constructor for {@link DefaultAggregateInformation} constructor only.
 +     *
 +     * @param object The metadata to copy values from.
 +     */
 +    DefaultAssociatedResource(final DefaultAssociatedResource object) {
 +        this.associationType   = object.associationType;
 +        this.initiativeType    = object.initiativeType;
 +        this.name              = object.name;
 +        this.metadataReference = object.metadataReference;
 +    }
 +
      /**
       * Constructs a new instance initialized with the values from the specified metadata object.
-      * This is a <dfn>shallow</dfn> copy constructor, because the other metadata contained in the
+      * This is a <em>shallow</em> copy constructor, because the other metadata contained in the
       * given object are not recursively copied.
       *
       * @param  object  the metadata to copy values from, or {@code null} if none.
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultOperationMetadata.java
index 1728155a94,e0bab1129b..ff4b6a1d1d
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultOperationMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultOperationMetadata.java
@@@ -137,9 -121,25 +137,9 @@@ public class DefaultOperationMetadata e
      public DefaultOperationMetadata() {
      }
  
 -    /**
 -     * Constructs a new operation metadata initialized to the specified values.
 -     *
 -     * @param operationName  an unique identifier for this interface.
 -     * @param platform       distributed computing platforms on which the operation has been implemented.
 -     * @param connectPoint   handle for accessing the service interface.
 -     */
 -    public DefaultOperationMetadata(final String operationName,
 -                                    final DistributedComputingPlatform platform,
 -                                    final OnlineResource connectPoint)
 -    {
 -        this.operationName                 = operationName;
 -        this.distributedComputingPlatforms = singleton(platform, DistributedComputingPlatform.class);
 -        this.connectPoints                 = singleton(connectPoint, OnlineResource.class);
 -    }
 -
      /**
       * Constructs a new instance initialized with the values from the specified metadata object.
-      * This is a <dfn>shallow</dfn> copy constructor, because the other metadata contained in the
+      * This is a <em>shallow</em> copy constructor, because the other metadata contained in the
       * given object are not recursively copied.
       *
       * @param  object  the metadata to copy values from, or {@code null} if none.
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/AbstractDataEvaluation.java
index 78b60fd1dc,0421e47f54..4edc07846a
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/AbstractDataEvaluation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/AbstractDataEvaluation.java
@@@ -48,11 -48,10 +48,11 @@@ import static org.opengis.annotation.Sp
  @XmlRootElement(name = "AbstractDQ_DataEvaluation")
  @XmlSeeAlso({
      DefaultFullInspection.class,
-     DefaultIndirectEvaluation .class,
+     DefaultIndirectEvaluation.class,
      DefaultSampleBasedInspection.class
  })
 -public class AbstractDataEvaluation extends DefaultEvaluationMethod implements DataEvaluation {
 +@UML(identifier="DQ_DataEvaluation", specification=UNSPECIFIED)
 +public class AbstractDataEvaluation extends DefaultEvaluationMethod {
      /**
       * Serial number for inter-operability with different versions.
       */
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/AbstractTemporalQuality.java
index 4bf707b888,3144d1d2b0..4a6eda966f
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/AbstractTemporalQuality.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/AbstractTemporalQuality.java
@@@ -100,8 -95,8 +100,8 @@@ public class AbstractTemporalQuality ex
       *   <li>Otherwise if the given object is already an instance of
       *       {@code AbstractTemporalQuality}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code AbstractTemporalQuality} instance is created using the
 -     *       {@linkplain #AbstractTemporalQuality(TemporalQuality) copy constructor} and returned.
 +     *       {@linkplain #AbstractTemporalQuality(TemporalAccuracy) copy constructor} and returned.
-      *       Note that this is a <dfn>shallow</dfn> copy operation, because the other
+      *       Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultNonQuantitativeAttributeCorrectness.java
index 0e9364294d,a6f1f1a4f5..6051e556c0
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultNonQuantitativeAttributeCorrectness.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultNonQuantitativeAttributeCorrectness.java
@@@ -91,8 -87,8 +91,8 @@@ public class DefaultNonQuantitativeAttr
       *   <li>Otherwise if the given object is already an instance of
       *       {@code DefaultNonQuantitativeAttributeCorrectness}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code DefaultNonQuantitativeAttributeCorrectness} instance is created using the
 -     *       {@linkplain #DefaultNonQuantitativeAttributeCorrectness(NonQuantitativeAttributeCorrectness) copy constructor}
 +     *       {@linkplain #DefaultNonQuantitativeAttributeCorrectness(NonQuantitativeAttributeAccuracy) copy constructor}
-      *       and returned. Note that this is a <dfn>shallow</dfn> copy operation, because the other
+      *       and returned. Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultSampleBasedInspection.java
index 96366fbb99,eeb2268fc9..bb5649054b
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultSampleBasedInspection.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultSampleBasedInspection.java
@@@ -89,9 -83,9 +89,9 @@@ public class DefaultSampleBasedInspecti
      public DefaultSampleBasedInspection() {
      }
  
--   /**
++    /**
       * Constructs a new instance initialized with the values from the specified metadata object.
-      * This is a <dfn>shallow</dfn> copy constructor, because the other metadata contained in the
+      * This is a <em>shallow</em> copy constructor, because the other metadata contained in the
       * given object are not recursively copied.
       *
       * @param  object  the metadata to copy values from, or {@code null} if none.
@@@ -105,7 -101,32 +105,7 @@@
          }
      }
  
-      /**
+     /**
 -     * 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 DefaultSampleBasedInspection}, then it is returned unchanged.</li>
 -     *   <li>Otherwise a new {@code DefaultSampleBasedInspection} instance is created using the
 -     *       {@linkplain #DefaultSampleBasedInspection(SampleBasedInspection) copy constructor} and returned.
 -     *       Note that this is a <em>shallow</em> copy operation, because 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 DefaultSampleBasedInspection castOrCopy(final SampleBasedInspection object) {
 -        if (object == null || object instanceof DefaultSampleBasedInspection) {
 -            return (DefaultSampleBasedInspection) object;
 -        }
 -        return new DefaultSampleBasedInspection(object);
 -    }
 -
 -     /**
       * Returns the information of the type of sampling scheme and description of the sampling procedure.
       *
       * @return sampling scheme and sampling procedure.
@@@ -126,7 -147,7 +126,7 @@@
          samplingScheme = newValue;
      }
  
--     /**
++    /**
       * Returns the information of how lots are defined.
       *
       * @return information on lots.
@@@ -147,7 -168,7 +147,7 @@@
          lotDescription = newValue;
      }
  
--     /**
++    /**
       * Returns the information on how many samples on average are extracted for inspection from each lot of population.
       *
       * @return average number of samples extracted for inspection.
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultUsabilityElement.java
index b93e3fba3d,5d104a9e3c..82f62c996f
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultUsabilityElement.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultUsabilityElement.java
@@@ -89,8 -84,8 +89,8 @@@ public class DefaultUsabilityElement ex
       *   <li>Otherwise if the given object is already an instance of
       *       {@code DefaultUsabilityElement}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code DefaultUsabilityElement} instance is created using the
 -     *       {@linkplain #DefaultUsabilityElement(UsabilityElement) copy constructor} and returned.
 +     *       {@linkplain #DefaultUsabilityElement(Usability) copy constructor} and returned.
-      *       Note that this is a <dfn>shallow</dfn> copy operation, because the other
+      *       Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/AbstractSpatialRepresentation.java
index bba38d3bf6,6ac5fbe269..5d3bc0b9d8
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/AbstractSpatialRepresentation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/AbstractSpatialRepresentation.java
@@@ -18,7 -18,10 +18,10 @@@ package org.apache.sis.metadata.iso.spa
  
  import javax.xml.bind.annotation.XmlType;
  import javax.xml.bind.annotation.XmlSeeAlso;
+ import javax.xml.bind.annotation.XmlElement;
  import javax.xml.bind.annotation.XmlRootElement;
+ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 -import org.opengis.metadata.maintenance.Scope;
++import org.opengis.metadata.quality.Scope;
  import org.opengis.metadata.spatial.SpatialRepresentation;
  import org.opengis.metadata.spatial.GridSpatialRepresentation;
  import org.opengis.metadata.spatial.VectorSpatialRepresentation;
@@@ -73,6 -83,32 +83,34 @@@ public class AbstractSpatialRepresentat
       */
      public AbstractSpatialRepresentation(final SpatialRepresentation object) {
          super(object);
++        if (object instanceof AbstractSpatialRepresentation) {
++            scope = ((AbstractSpatialRepresentation) object).getScope();
++        }
+     }
+ 
+     /**
+      * Returns the level and extent of the spatial representation.
+      *
+      * @return level and extent of the spatial representation, or {@code null} if none.
+      *
+      * @since 1.3
+      */
 -    @Override
+     @XmlElement(name = "scope")
+     @XmlJavaTypeAdapter(MD_Scope.Since2014.class)
+     public Scope getScope() {
+         return scope;
+     }
+ 
+     /**
+      * Sets the level and extent of the spatial representation.
+      *
+      * @param  newValue  the new type of resource.
+      *
+      * @since 1.3
+      */
+     public void setScope(final Scope newValue) {
+         checkWritePermission(scope);
+         scope = newValue;
      }
  
      /**
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
index d24c5ebac8,78f21b9fbd..ba7284fead
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
@@@ -47,4 -62,105 +62,105 @@@ public final strictfp class DefaultQuan
          r.setErrorStatistic(new SimpleInternationalString("a description"));
          assertFalse(r.isEmpty());
      }
+ 
+     /**
+      * Creates a {@code DefaultQuantitativeResult} instance wrapped in an element.
+      * The returned element is as below:
+      *
+      * {@preformat text
+      *   Quantitative attribute accuracy
+      *     ├─Measure
+      *     │   └─Name of measure…………………… Some quality flag
+      *     └─Quantitative result
+      *         ├─Value……………………………………………… The quality is okay
+      *         └─Value record type……………… CharacterSequence
+      * }
+      */
+     @SuppressWarnings("deprecation")
+     private static Element createResultInsideElement() {
+         /*
+          * The `RecordType` constructor invoked at unmarshalling time sets the name
+          * to the hard-coded "Multiline record" string. We need to use the same name.
+          */
+         final RecordType recordType = RecordSchemaSIS.INSTANCE.createRecordType(
+                 RecordSchemaSIS.MULTILINE.toInternationalString(),
+                 Collections.singletonMap("Result of quality measurement", String.class));
+         /*
+          * The `Record` constructor invoked at unmarshalling time sets the type
+          * to the hard-coded "Single text" value. We need to use the same type.
+          */
+         final RecordType singleText = RecordSchemaSIS.STRING;
+         final DefaultRecord  record = new DefaultRecord(singleText);
+         record.set(TestUtilities.getSingleton(singleText.getMembers()), "The quality is okay");
+         /*
+          * Record type and record value are set independently in two properties.
+          * In current implementation, `record.type` is not equal to `recordType`.
+          */
+         assertNotEquals(recordType, record.getRecordType());        // Actually a limitation, not an intended behavior.
+         final DefaultQuantitativeResult result = new DefaultQuantitativeResult();
+         result.setValues(Collections.singletonList(record));
+         result.setValueType(recordType);
+         /*
+          * Opportunistically test the redirection implemented in deprecated methods.
+          */
+         final DefaultQuantitativeAttributeAccuracy element = new DefaultQuantitativeAttributeAccuracy();
+         element.setNamesOfMeasure(Collections.singleton(new SimpleInternationalString("Some quality flag")));
+         element.setResults(Collections.singleton(result));
+         return element;
+     }
+ 
+     /**
+      * Tests unmarshalling of an XML element containing result records.
+      *
+      * @throws JAXBException if an error occurred during unmarshalling.
+      */
+     @Test
+     public void testUnmarshallingLegacy() throws JAXBException {
+         final String xml =  // Following XML shall match the object built by `createResultInsideElement()`.
+                 "<gmd:DQ_QuantitativeAttributeAccuracy xmlns:gmd=\"" + LegacyNamespaces.GMD + '"'
+                                                    + " xmlns:gco=\"" + LegacyNamespaces.GCO + "\">\n" +
+                 "  <gmd:nameOfMeasure>\n" +
+                 "    <gco:CharacterString>Some quality flag</gco:CharacterString>\n" +
+                 "  </gmd:nameOfMeasure>\n" +
+                 "  <gmd:result>\n" +
+                 "    <gmd:DQ_QuantitativeResult>\n" +
+                 "      <gmd:value>\n" +
+                 "        <gco:Record>The quality is okay</gco:Record>\n" +
+                 "      </gmd:value>\n" +
+                 "      <gmd:valueType>\n" +
+                 "        <gco:RecordType>Result of quality measurement</gco:RecordType>\n" +
+                 "      </gmd:valueType>\n" +
+                 "    </gmd:DQ_QuantitativeResult>\n" +
+                 "  </gmd:result>\n" +
+                 "</gmd:DQ_QuantitativeAttributeAccuracy>";
+ 
+         final Element unmarshalled = (Element) XML.unmarshal(xml);
+         final Element programmatic = createResultInsideElement();
+         /*
+          * Before to compare the two `Element`, compare some individual components.
+          * The intent is to identify which metadata is not equal in case of test failure.
+          */
+         final QuantitativeResult   uResult = (QuantitativeResult) TestUtilities.getSingleton(unmarshalled.getResults());
+         final QuantitativeResult   pResult = (QuantitativeResult) TestUtilities.getSingleton(programmatic.getResults());
+         final RecordType           uType   = uResult.getValueType();
+         final RecordType           pType   = pResult.getValueType();
 -        final Map<MemberName,Type> uFields = uType.getFieldTypes();
 -        final Map<MemberName,Type> pFields = pType.getFieldTypes();
++        final Map<MemberName,Type> uFields = uType.getMemberTypes();
++        final Map<MemberName,Type> pFields = pType.getMemberTypes();
+         final Iterator<MemberName> uIter   = uFields.keySet().iterator();
+         final Iterator<MemberName> pIter   = pFields.keySet().iterator();
+         assertEquals(uFields.size(), pFields.size());
+         while (uIter.hasNext() | pIter.hasNext()) {
+             final MemberName uName = uIter.next();
+             final MemberName pName = pIter.next();
+             assertEquals(uName.scope(), pName.scope());
+             assertEquals(uName, pName);
+             assertEquals(uFields.get(uName), pFields.get(pName));
+         }
+         assertEquals(uFields,             pFields);
+         assertEquals(uType.getMembers(),  pType.getMembers());
+         assertEquals(uType.getTypeName(), pType.getTypeName());
+         assertEquals(uType,               pType);
+         assertEquals(uResult,             pResult);
+         assertEquals(unmarshalled, programmatic);
+     }
  }
diff --cc core/sis-metadata/src/test/java/org/apache/sis/test/xml/AnnotationConsistencyCheck.java
index 0040bba469,b9dedd91e2..8b67c34e96
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/xml/AnnotationConsistencyCheck.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/xml/AnnotationConsistencyCheck.java
@@@ -324,17 -323,25 +324,18 @@@ public abstract strictfp class Annotati
           * General cases (after we processed all the special cases)
           * based on which standard defines the type or property.
           */
 -        final short version = uml.version();
+         final Specification specification = uml.specification();
 -        if (version != 0 && version < specification.defaultVersion()) {
 +        if (/*uml.version()*/ 0 != 0) {
-             switch (uml.specification()) {
+             switch (specification) {
                  case ISO_19115:   return LegacyNamespaces.GMD;
                  case ISO_19115_2: return LegacyNamespaces.GMI;
              }
          }
-         switch (uml.specification()) {
+         switch (specification) {
              case ISO_19115:
 -            case ISO_19115_2:
 -            case ISO_19115_3: return CodeListUID.METADATA_ROOT;
 +            case ISO_19115_2: return CodeListUID.METADATA_ROOT;
              case ISO_19139:   return LegacyNamespaces.GMX;
              case ISO_19108:   return LegacyNamespaces.GMD;
 -            case ISO_19157: {
 -                // Case for a method. By contrast, above `identifier.startsWith(…)` checks were for types.
 -                final UML parent = TestUtilities.getSingleton(impl.getInterfaces()).getAnnotation(UML.class);
 -                return parent.identifier().startsWith("DQM_") ? Namespaces.DQM : Namespaces.MDQ;
 -            }
              default: throw new IllegalArgumentException(uml.toString());
          }
      }
diff --cc core/sis-metadata/src/test/java/org/apache/sis/xml/CharSequenceSubstitutionTest.java
index 4dc4213918,8614382ce0..ae3947bc1b
--- a/core/sis-metadata/src/test/java/org/apache/sis/xml/CharSequenceSubstitutionTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/xml/CharSequenceSubstitutionTest.java
@@@ -21,10 -21,10 +21,10 @@@ import org.opengis.metadata.citation.Ad
  import org.opengis.metadata.acquisition.Instrument;
  import org.opengis.metadata.identification.DataIdentification;
  import org.opengis.metadata.identification.InitiativeType;
 +import org.apache.sis.metadata.iso.DefaultIdentifier;
  import org.apache.sis.internal.jaxb.metadata.replace.ReferenceSystemMetadata;
+ import org.apache.sis.internal.jaxb.metadata.replace.SensorType;
  import org.apache.sis.internal.xml.LegacyNamespaces;
- import org.apache.sis.internal.metadata.SensorType;
  import org.apache.sis.util.iso.Types;
  import org.apache.sis.test.DependsOnMethod;
  import org.apache.sis.test.xml.TestCase;
diff --cc core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
index 812d0ecfbb,8fe3a505dc..83c6fceb19
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
@@@ -338,8 -327,8 +338,8 @@@ public class ImmutableIdentifier extend
       *   <li>Otherwise if the given object is already an instance of
       *       {@code ImmutableIdentifier}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code ImmutableIdentifier} instance is created using the
 -     *       {@linkplain #ImmutableIdentifier(Identifier) copy constructor} and returned.
 +     *       {@linkplain #ImmutableIdentifier(ReferenceIdentifier) copy constructor} and returned.
-      *       Note that this is a <dfn>shallow</dfn> copy operation, because the other
+      *       Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
index 02745661c1,f50f3172ef..eeab97e536
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
@@@ -340,8 -340,8 +340,8 @@@ public class NamedIdentifier extends Im
       *   <li>Otherwise if the given object is already an instance of
       *       {@code NamedIdentifier}, then it is returned unchanged.</li>
       *   <li>Otherwise a new {@code NamedIdentifier} instance is created using the
 -     *       {@linkplain #NamedIdentifier(Identifier) copy constructor} and returned.
 +     *       {@linkplain #NamedIdentifier(ReferenceIdentifier) copy constructor} and returned.
-      *       Note that this is a <dfn>shallow</dfn> copy operation, because the other
+      *       Note that this is a <em>shallow</em> copy operation, because the other
       *       metadata contained in the given object are not recursively copied.</li>
       * </ul>
       *
diff --cc storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Copyright.java
index 4cdf96d007,a544011381..f493afd918
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Copyright.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Copyright.java
@@@ -229,21 -247,20 +229,31 @@@ resp:   for (final DefaultResponsibilit
       * @return name of the party, or {@code null} if none.
       */
      @Override
 -    public InternationalString getName() {
 -        return (author != null) ? new SimpleInternationalString(author) : null;
 +    public String getIndividualName() {
 +        return author;
 +    }
 +
 +    /**
 +     * ISO 19115 metadata property not specified by GPX.
 +     * This is part of the properties returned by {@code getParties()}.
 +     *
 +     * @return contact information for the party.
 +     */
 +    @Override
 +    public Contact getContactInfo() {
 +        return null;
      }
  
+     /**
+      * Returns citation or party identifiers, which is an empty list.
+      *
+      * @return empty.
+      */
+     @Override
+     public Collection<Identifier> getIdentifiers() {
+         return Collections.emptyList();
+     }
+ 
  
      /* -----------------------------------------------------------------------------------
       * Implementation of the Citation object returned by LegalConstraints.getReferences().
@@@ -311,52 -317,7 +321,41 @@@
       */
      @Override
      public DateType getDateType() {
 -        return DateType.IN_FORCE;
 +        return DateType.valueOf("IN_FORCE");
 +    }
 +
 +    /**
 +     * ISO 19115 metadata property not specified by GPX.
 +     * This is part of the properties returned by {@code getReferences()}.
 +     *
 +     * @return the license version, or {@code null} if none.
 +     */
 +    @Override
 +    public InternationalString getEdition() {
 +        return null;
 +    }
 +
 +    /**
 +     * ISO 19115 metadata property not specified by GPX.
 +     * This is part of the properties returned by {@code getReferences()}.
 +     *
 +     * @return the license edition date, or {@code null} if none.
 +     */
 +    @Override
 +    public Date getEditionDate() {
 +        return null;
 +    }
 +
 +    /**
 +     * ISO 19115 metadata property not specified by GPX.
 +     * This is part of the properties returned by {@code getReferences()}.
-      *
-      * @return the identifiers of the license.
-      */
-     @Override
-     public Collection<Identifier> getIdentifiers() {
-         return Collections.emptySet();
-     }
- 
-     /**
-      * ISO 19115 metadata property not specified by GPX.
-      * This is part of the properties returned by {@code getReferences()}.
 +     * It would be the license author if that information was provided.
 +     *
 +     * @return the information for individuals or organisations that are responsible for the license.
 +     */
 +    @Override
 +    public Collection<ResponsibleParty> getCitedResponsibleParties() {
 +        return Collections.emptySet();
      }
  
      /**