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/19 16:22:18 UTC

[sis] branch geoapi-4.0 updated (6dc1c33f57 -> ec0eaa68d9)

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

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


    from 6dc1c33f57 Post-merge cleaning.
     add 38740ce45e Fix common spelling errors.
     add a4bd0da7f8 Upgrade dependencies.
     new ec0eaa68d9 Bug fixes related to unmarshalling of GML documents. Those bugs were identified by OGC TestBed 18 D025 scenario. This is a port of 3 commits on `master` branch.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/sis/console/AboutCommand.java  |   2 +-
 .../java/org/apache/sis/console/CommandRunner.java |   8 +-
 .../org/apache/sis/console/IdentifierCommand.java  |   2 +-
 .../apache/sis/console/ResourcesDownloader.java    |   2 +-
 .../java/org/apache/sis/console/package-info.java  |   2 +-
 .../apache/sis/console/IdentifierState.properties  |   2 +-
 application/sis-javafx/pom.xml                     |   2 +-
 .../main/java/org/apache/sis/gui/DataViewer.java   |   4 +-
 .../org/apache/sis/gui/coverage/CellFormat.java    |   4 +-
 .../apache/sis/gui/coverage/CoverageCanvas.java    |   6 +-
 .../apache/sis/gui/coverage/CoverageControls.java  |   2 +-
 .../org/apache/sis/gui/coverage/GridControls.java  |   2 +-
 .../org/apache/sis/gui/coverage/GridError.java     |   2 +-
 .../apache/sis/gui/coverage/GridSliceSelector.java |   2 +-
 .../java/org/apache/sis/gui/coverage/GridView.java |   2 +-
 .../org/apache/sis/gui/coverage/GridViewSkin.java  |   4 +-
 .../apache/sis/gui/coverage/IsolineRenderer.java   |   2 +-
 .../sis/gui/coverage/StyledRenderingData.java      |   2 +-
 .../apache/sis/gui/coverage/ViewAndControls.java   |   2 +-
 .../org/apache/sis/gui/dataset/ExpandableList.java |   2 +-
 .../org/apache/sis/gui/dataset/FeatureList.java    |   4 +-
 .../org/apache/sis/gui/dataset/FeatureLoader.java  |   2 +-
 .../org/apache/sis/gui/dataset/FeatureTable.java   |   4 +-
 .../org/apache/sis/gui/dataset/PathAction.java     |   2 +-
 .../apache/sis/gui/dataset/ResourceExplorer.java   |   6 +-
 .../org/apache/sis/gui/dataset/ResourceItem.java   |   6 +-
 .../org/apache/sis/gui/dataset/ResourceTree.java   |   4 +-
 .../java/org/apache/sis/gui/map/MapCanvas.java     |  10 +-
 .../org/apache/sis/gui/map/OperationFinder.java    |   2 +-
 .../java/org/apache/sis/gui/map/StatusBar.java     |  12 +--
 .../org/apache/sis/gui/map/ValuesFormatter.java    |   2 +-
 .../sis/gui/metadata/IdentificationInfo.java       |   2 +-
 .../apache/sis/gui/metadata/MetadataSummary.java   |   2 +-
 .../org/apache/sis/gui/metadata/MetadataTree.java  |   2 +-
 .../sis/gui/metadata/RepresentationInfo.java       |   2 +-
 .../sis/gui/metadata/StandardMetadataTree.java     |   2 +-
 .../apache/sis/gui/referencing/AuthorityCodes.java |   4 +-
 .../gui/referencing/RecentReferenceSystems.java    |   8 +-
 .../apache/sis/internal/gui/DataStoreOpener.java   |   6 +-
 .../apache/sis/internal/gui/ExceptionReporter.java |   8 +-
 .../org/apache/sis/internal/gui/Resources.java     |  22 ++--
 .../apache/sis/internal/gui/Resources.properties   |  18 ++--
 .../internal/gui/control/ColorColumnHandler.java   |   2 +-
 .../sis/internal/gui/control/FormatApplicator.java |   2 +-
 .../org/apache/sis/internal/setup/FXFinder.java    |   8 +-
 .../org/apache/sis/internal/setup/Inflater.java    |   2 +-
 .../java/org/apache/sis/internal/setup/Wizard.java |  12 +--
 .../java/org/apache/sis/openoffice/CalcAddins.java |   2 +-
 .../org/apache/sis/openoffice/Registration.java    |   2 +-
 .../org/apache/sis/openoffice/Transformer.java     |   2 +-
 .../apache/sis/cloud/aws/internal/Resources.java   |   6 +-
 .../sis/cloud/aws/internal/Resources.properties    |   4 +-
 .../apache/sis/cloud/aws/s3/CachedByteChannel.java |   2 +-
 .../org/apache/sis/cloud/aws/s3/FileService.java   |   4 +-
 .../java/org/apache/sis/cloud/aws/s3/KeyPath.java  |   8 +-
 .../apache/sis/cloud/aws/s3/ObjectAttributes.java  |   4 +-
 core/sis-build-helper/pom.xml                      |   2 +-
 .../org/apache/sis/internal/book/Assembler.java    |   2 +-
 .../apache/sis/internal/book/CodeColorizer.java    |   6 +-
 .../org/apache/sis/internal/doclet/Doclet.java     |   2 +-
 .../org/apache/sis/internal/doclet/Preformat.java  |   2 +-
 .../org/apache/sis/internal/doclet/Taglet.java     |   2 +-
 .../apache/sis/internal/maven/JarCollector.java    |   4 +-
 .../util/resources/IndexedResourceCompiler.java    |   4 +-
 .../sis/util/resources/ResourceCompilerMojo.java   |   2 +-
 .../src/main/java/org/apache/sis/cql/CQL.java      |   2 +-
 .../main/java/org/apache/sis/cql/CQLException.java |   2 +-
 .../org/apache/sis/cql/FilterToCQLVisitor.java     |   4 +-
 .../org/apache/sis/coverage/BandedCoverage.java    |   4 +-
 .../java/org/apache/sis/coverage/Category.java     |   6 +-
 .../java/org/apache/sis/coverage/CategoryList.java |  22 ++--
 .../org/apache/sis/coverage/ConvertedRange.java    |   2 +-
 .../coverage/IllegalSampleDimensionException.java  |   2 +-
 .../org/apache/sis/coverage/RegionOfInterest.java  |   2 +-
 .../org/apache/sis/coverage/SampleDimension.java   |  26 ++---
 .../sis/coverage/grid/BufferedGridCoverage.java    |   2 +-
 .../sis/coverage/grid/ConvertedGridCoverage.java   |   8 +-
 .../coverage/grid/CoordinateOperationFinder.java   |  12 +--
 .../apache/sis/coverage/grid/DefaultEvaluator.java |  10 +-
 .../apache/sis/coverage/grid/DimensionReducer.java |   8 +-
 .../apache/sis/coverage/grid/DomainLinearizer.java |   4 +-
 .../apache/sis/coverage/grid/EvaluatorWrapper.java |   2 +-
 .../coverage/grid/FractionalGridCoordinates.java   |  10 +-
 .../org/apache/sis/coverage/grid/GridCoverage.java |   4 +-
 .../apache/sis/coverage/grid/GridCoverage2D.java   |   8 +-
 .../sis/coverage/grid/GridCoverageBuilder.java     |   8 +-
 .../sis/coverage/grid/GridCoverageProcessor.java   |  14 +--
 .../apache/sis/coverage/grid/GridDerivation.java   |  22 ++--
 .../org/apache/sis/coverage/grid/GridExtent.java   |  14 +--
 .../apache/sis/coverage/grid/GridExtentCRS.java    |   4 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |  26 ++---
 .../apache/sis/coverage/grid/ImageRenderer.java    |  10 +-
 .../grid/IncompleteGridGeometryException.java      |   2 +-
 .../sis/coverage/grid/ResampledGridCoverage.java   |  16 +--
 .../apache/sis/coverage/grid/SliceGeometry.java    |   6 +-
 .../apache/sis/feature/AbstractAssociation.java    |   2 +-
 .../org/apache/sis/feature/AbstractAttribute.java  |   2 +-
 .../org/apache/sis/feature/AbstractFeature.java    |  14 +--
 .../org/apache/sis/feature/AbstractOperation.java  |   4 +-
 .../apache/sis/feature/CharacteristicTypeMap.java  |   2 +-
 .../apache/sis/feature/DefaultAssociationRole.java |   2 +-
 .../apache/sis/feature/DefaultAttributeType.java   |   2 +-
 .../org/apache/sis/feature/DefaultFeatureType.java |   4 +-
 .../java/org/apache/sis/feature/DenseFeature.java  |   6 +-
 .../org/apache/sis/feature/EnvelopeOperation.java  |   4 +-
 .../java/org/apache/sis/feature/FeatureFormat.java |   2 +-
 .../sis/feature/FeatureOperationException.java     |   2 +-
 .../org/apache/sis/feature/FeatureOperations.java  |   6 +-
 .../main/java/org/apache/sis/feature/Features.java |   2 +-
 .../java/org/apache/sis/feature/FieldType.java     |   4 +-
 .../apache/sis/feature/MultiValuedAssociation.java |   4 +-
 .../apache/sis/feature/MultiValuedAttribute.java   |   4 +-
 .../java/org/apache/sis/feature/PropertyView.java  |   2 +-
 .../java/org/apache/sis/feature/SparseFeature.java |   6 +-
 .../apache/sis/feature/StringJoinOperation.java    |   4 +-
 .../java/org/apache/sis/feature/Validator.java     |   4 +-
 .../apache/sis/feature/builder/AttributeRole.java  |   8 +-
 .../sis/feature/builder/AttributeTypeBuilder.java  |  12 +--
 .../feature/builder/CharacteristicTypeBuilder.java |   6 +-
 .../sis/feature/builder/FeatureTypeBuilder.java    |   6 +-
 .../sis/feature/builder/OperationWrapper.java      |   2 +-
 .../apache/sis/feature/builder/TypeBuilder.java    |   2 +-
 .../org/apache/sis/filter/AssociationValue.java    |   4 +-
 .../java/org/apache/sis/filter/BinaryFunction.java |  14 +--
 .../apache/sis/filter/BinaryGeometryFilter.java    |   2 +-
 .../org/apache/sis/filter/BinarySpatialFilter.java |   2 +-
 .../org/apache/sis/filter/ComparisonFilter.java    |   4 +-
 .../org/apache/sis/filter/ConvertFunction.java     |   6 +-
 .../apache/sis/filter/DefaultFilterFactory.java    |   2 +-
 .../java/org/apache/sis/filter/DistanceFilter.java |   2 +-
 .../java/org/apache/sis/filter/FilterNode.java     |   2 +-
 .../java/org/apache/sis/filter/LeafExpression.java |   4 +-
 .../java/org/apache/sis/filter/Optimization.java   |   6 +-
 .../java/org/apache/sis/filter/PropertyValue.java  |   6 +-
 .../java/org/apache/sis/filter/UnaryFunction.java  |   2 +-
 .../java/org/apache/sis/image/AnnotatedImage.java  |   6 +-
 .../java/org/apache/sis/image/BandedIterator.java  |   4 +-
 .../apache/sis/image/BandedSampleConverter.java    |   2 +-
 .../java/org/apache/sis/image/ComputedImage.java   |   4 +-
 .../java/org/apache/sis/image/ComputedTiles.java   |   2 +-
 .../main/java/org/apache/sis/image/DataType.java   |   4 +-
 .../java/org/apache/sis/image/ImageCombiner.java   |   4 +-
 .../java/org/apache/sis/image/ImageProcessor.java  |  18 ++--
 .../java/org/apache/sis/image/Interpolation.java   |   2 +-
 .../java/org/apache/sis/image/PlanarImage.java     |   2 +-
 .../java/org/apache/sis/image/PrefetchedImage.java |   2 +-
 .../java/org/apache/sis/image/RecoloredImage.java  |   4 +-
 .../java/org/apache/sis/image/ResampledImage.java  |  14 +--
 .../java/org/apache/sis/image/ResamplingGrid.java  |   6 +-
 .../main/java/org/apache/sis/image/TileCache.java  |   2 +-
 .../main/java/org/apache/sis/image/Transferer.java |   4 +-
 .../java/org/apache/sis/image/Visualization.java   |   6 +-
 .../org/apache/sis/index/tree/NodeIterator.java    |   4 +-
 .../java/org/apache/sis/index/tree/PointTree.java  |   4 +-
 .../sis/internal/coverage/CompoundTransform.java   |   4 +-
 .../internal/coverage/CompoundTransformOf1D.java   |   2 +-
 .../sis/internal/coverage/CoverageCombiner.java    |   4 +-
 .../internal/coverage/j2d/ColorModelFactory.java   |   6 +-
 .../sis/internal/coverage/j2d/ColorModelType.java  |   2 +-
 .../sis/internal/coverage/j2d/Colorizer.java       |   8 +-
 .../internal/coverage/j2d/DeferredProperty.java    |   2 +-
 .../sis/internal/coverage/j2d/FillValues.java      |   2 +-
 .../sis/internal/coverage/j2d/ImageLayout.java     |   4 +-
 .../sis/internal/coverage/j2d/ImageUtilities.java  |   6 +-
 .../sis/internal/coverage/j2d/TileOpExecutor.java  |   8 +-
 .../sis/internal/coverage/j2d/TilePlaceholder.java |   4 +-
 .../sis/internal/feature/FeatureExpression.java    |   6 +-
 .../apache/sis/internal/feature/Geometries.java    |  10 +-
 .../sis/internal/feature/GeometryWrapper.java      |  32 +++---
 .../sis/internal/feature/MovingFeatures.java       |   2 +-
 .../org/apache/sis/internal/feature/Resources.java |  38 +++----
 .../sis/internal/feature/Resources.properties      |  36 +++----
 .../internal/feature/SpatialOperationContext.java  |   4 +-
 .../apache/sis/internal/feature/j2d/Factory.java   |   2 +-
 .../apache/sis/internal/feature/j2d/Wrapper.java   |   4 +-
 .../apache/sis/internal/feature/jts/Factory.java   |   4 +-
 .../org/apache/sis/internal/feature/jts/JTS.java   |  16 +--
 .../sis/internal/feature/jts/ShapeConverter.java   |   2 +-
 .../apache/sis/internal/feature/jts/Wrapper.java   |  12 +--
 .../apache/sis/internal/feature/package-info.java  |   2 +-
 .../sis/internal/filter/GeometryConverter.java     |   2 +-
 .../sis/internal/filter/sqlmm/ST_Transform.java    |   2 +-
 .../sis/internal/filter/sqlmm/SpatialFunction.java |   2 +-
 .../internal/processing/image/TiledProcess.java    |   2 +-
 .../sis/internal/processing/isoline/Isolines.java  |   4 +-
 .../sis/internal/processing/isoline/Joiner.java    |   2 +-
 .../sis/internal/processing/isoline/Tracer.java    |   6 +-
 .../org/apache/sis/coverage/CategoryListTest.java  |   2 +-
 .../apache/sis/coverage/grid/GridGeometryTest.java |   6 +-
 .../coverage/grid/ResampledGridCoverageTest.java   |  36 +++----
 .../apache/sis/feature/AbstractFeatureTest.java    |   2 +-
 .../sis/feature/DefaultAssociationRoleTest.java    |   4 +-
 .../apache/sis/feature/DefaultFeatureTypeTest.java |  14 +--
 .../org/apache/sis/feature/FeatureTestCase.java    |   4 +-
 .../apache/sis/feature/PropertySingletonTest.java  |   2 +-
 .../java/org/apache/sis/image/ImageTestCase.java   |   4 +-
 .../org/apache/sis/image/ResamplingGridTest.java   |   6 +-
 .../apache/sis/index/tree/PointTreeNodeTest.java   |   2 +-
 .../sis/internal/coverage/j2d/ColorizerTest.java   |   4 +-
 .../coverage/j2d/SampleModelFactoryTest.java       |   2 +-
 .../apache/sis/internal/feature/jts/JTSTest.java   |  16 +--
 .../internal/processing/isoline/IsolinesTest.java  |  14 +--
 .../sis/internal/jaxb/AdapterReplacement.java      |   6 +-
 .../sis/internal/jaxb/IdentifierMapAdapter.java    |  30 +++++-
 .../sis/internal/jaxb/ModifiableIdentifierMap.java |   4 +-
 .../sis/internal/jaxb/PrimitiveTypeProperties.java |   6 +-
 .../sis/internal/jaxb/SpecializedIdentifier.java   |   4 +-
 .../apache/sis/internal/jaxb/cat/CodeListUID.java  |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_DateTime.java  |   2 +-
 .../sis/internal/jaxb/gco/GO_GenericName.java      |   2 +-
 .../sis/internal/jaxb/gco/ObjectReference.java     |   2 +-
 .../apache/sis/internal/jaxb/gco/PropertyType.java |  18 ++--
 .../org/apache/sis/internal/jaxb/gcx/Anchor.java   |   2 +-
 .../sis/internal/jaxb/geometry/package-info.java   |   2 +-
 .../org/apache/sis/internal/jaxb/gml/Measure.java  |   4 +-
 .../apache/sis/internal/jaxb/gml/MeasureList.java  |   2 +-
 .../apache/sis/internal/jaxb/gml/package-info.java |   2 +-
 .../org/apache/sis/internal/jaxb/lan/Country.java  |   2 +-
 .../apache/sis/internal/jaxb/lan/LanguageCode.java |   2 +-
 .../sis/internal/jaxb/lan/LocaleAndCharset.java    |   4 +-
 .../apache/sis/internal/jaxb/lan/TextGroup.java    |   2 +-
 .../sis/internal/jaxb/metadata/package-info.java   |   2 +-
 .../internal/jaxb/metadata/replace/Parameter.java  |   2 +-
 .../jaxb/metadata/replace/QualityParameter.java    |   2 +-
 .../jaxb/metadata/replace/ServiceParameter.java    |   2 +-
 .../jaxb/metadata/replace/package-info.java        |   2 +-
 .../org/apache/sis/internal/jaxb/package-info.java |   2 +-
 .../apache/sis/internal/metadata/AxisNames.java    |   4 +-
 .../apache/sis/internal/metadata/ExcludedSet.java  |   2 +-
 .../apache/sis/internal/metadata/Identifiers.java  |   2 +-
 .../org/apache/sis/internal/metadata/Merger.java   |  10 +-
 .../apache/sis/internal/metadata/NameMeaning.java  |   2 +-
 .../sis/internal/metadata/ReferencingServices.java |   2 +-
 .../apache/sis/internal/metadata/Resources.java    |   2 +-
 .../apache/sis/internal/metadata/SensorType.java   |   2 +-
 .../metadata/legacy/LegacyPropertyAdapter.java     |   4 +-
 .../apache/sis/internal/metadata/sql/Dialect.java  |   4 +-
 .../sis/internal/metadata/sql/Initializer.java     |   4 +-
 .../sis/internal/metadata/sql/LocalDataSource.java |   2 +-
 .../sis/internal/metadata/sql/ScriptRunner.java    |   2 +-
 .../apache/sis/internal/simple/SimpleCitation.java |   2 +-
 .../org/apache/sis/internal/xml/XmlUtilities.java  |   4 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |   6 +-
 .../org/apache/sis/metadata/MetadataCopier.java    |   4 +-
 .../org/apache/sis/metadata/MetadataStandard.java  |   8 +-
 .../apache/sis/metadata/ModifiableMetadata.java    |   8 +-
 .../org/apache/sis/metadata/PropertyAccessor.java  |   6 +-
 .../apache/sis/metadata/PropertyComparator.java    |   6 +-
 .../sis/metadata/StandardImplementation.java       |   4 +-
 .../org/apache/sis/metadata/TitleProperty.java     |   2 +-
 .../java/org/apache/sis/metadata/TreeNode.java     |  22 ++--
 .../org/apache/sis/metadata/TreeNodeChildren.java  |   2 +-
 .../apache/sis/metadata/iso/DefaultMetadata.java   |   2 +-
 .../org/apache/sis/metadata/iso/ISOMetadata.java   |   2 +-
 .../sis/metadata/iso/acquisition/package-info.java |   2 +-
 .../sis/metadata/iso/citation/Citations.java       |   4 +-
 .../metadata/iso/citation/DefaultTelephone.java    |   4 +-
 .../sis/metadata/iso/citation/package-info.java    |   2 +-
 .../sis/metadata/iso/constraint/package-info.java  |   2 +-
 .../sis/metadata/iso/content/package-info.java     |   2 +-
 .../metadata/iso/distribution/DefaultFormat.java   |   4 +-
 .../metadata/iso/distribution/package-info.java    |   2 +-
 .../iso/extent/DefaultGeographicBoundingBox.java   |   8 +-
 .../iso/extent/DefaultSpatialTemporalExtent.java   |   2 +-
 .../metadata/iso/extent/DefaultTemporalExtent.java |   2 +-
 .../metadata/iso/extent/DefaultVerticalExtent.java |   4 +-
 .../apache/sis/metadata/iso/extent/Extents.java    |   2 +-
 .../sis/metadata/iso/extent/package-info.java      |   6 +-
 .../metadata/iso/identification/OperationName.java |   2 +-
 .../metadata/iso/identification/package-info.java  |   2 +-
 .../sis/metadata/iso/lineage/package-info.java     |   2 +-
 .../sis/metadata/iso/maintenance/package-info.java |   2 +-
 .../org/apache/sis/metadata/iso/package-info.java  |   2 +-
 .../sis/metadata/iso/quality/package-info.java     |   2 +-
 .../sis/metadata/iso/spatial/package-info.java     |   2 +-
 .../java/org/apache/sis/metadata/package-info.java |   4 +-
 .../apache/sis/metadata/sql/CachedStatement.java   |   6 +-
 .../org/apache/sis/metadata/sql/Dispatcher.java    |   2 +-
 .../org/apache/sis/metadata/sql/LookupInfo.java    |   2 +-
 .../apache/sis/metadata/sql/MetadataFallback.java  |   2 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  24 ++---
 .../apache/sis/metadata/sql/MetadataWriter.java    |   6 +-
 .../apache/sis/metadata/sql/TableHierarchy.java    |   2 +-
 .../java/org/apache/sis/util/iso/AbstractName.java |   2 +-
 .../org/apache/sis/util/iso/DefaultLocalName.java  |   4 +-
 .../org/apache/sis/util/iso/DefaultMemberName.java |   2 +-
 .../apache/sis/util/iso/DefaultNameFactory.java    |   2 +-
 .../org/apache/sis/util/iso/DefaultNameSpace.java  |   2 +-
 .../org/apache/sis/util/iso/DefaultRecord.java     |   4 +-
 .../apache/sis/util/iso/DefaultRecordSchema.java   |   2 +-
 .../org/apache/sis/util/iso/DefaultRecordType.java |   2 +-
 .../org/apache/sis/util/iso/DefaultScopedName.java |   2 +-
 .../org/apache/sis/util/iso/DefaultTypeName.java   |   8 +-
 .../main/java/org/apache/sis/util/iso/Names.java   |   4 +-
 .../org/apache/sis/util/iso/RecordDefinition.java  |   2 +-
 .../java/org/apache/sis/xml/IdentifierSpace.java   |   2 +-
 .../main/java/org/apache/sis/xml/InputFactory.java |  12 +--
 .../java/org/apache/sis/xml/MarshallerPool.java    |   4 +-
 .../main/java/org/apache/sis/xml/Namespaces.java   |   6 +-
 .../org/apache/sis/xml/NilInternationalString.java |   2 +-
 .../main/java/org/apache/sis/xml/NilObject.java    |   2 +-
 .../java/org/apache/sis/xml/NilObjectHandler.java  |   2 +-
 .../main/java/org/apache/sis/xml/NilReason.java    |  10 +-
 .../java/org/apache/sis/xml/OutputFactory.java     |  12 +--
 .../java/org/apache/sis/xml/ReferenceResolver.java |  14 +--
 .../java/org/apache/sis/xml/TransformedEvent.java  |   6 +-
 .../main/java/org/apache/sis/xml/Transformer.java  |   2 +-
 .../org/apache/sis/xml/TransformingNamespaces.java |   2 +-
 .../java/org/apache/sis/xml/ValueConverter.java    |  16 +--
 .../src/main/java/org/apache/sis/xml/XLink.java    |   6 +-
 .../src/main/java/org/apache/sis/xml/XML.java      |   8 +-
 .../src/main/java/org/apache/sis/xml/XPointer.java |   2 +-
 .../org/apache/sis/metadata/sql/Citations.sql      |   2 +-
 .../internal/jaxb/lan/FreeTextMarshallingTest.java |   6 +-
 .../sis/internal/jaxb/lan/OtherLocalesTest.java    |   2 +-
 .../apache/sis/internal/xml/XmlUtilitiesTest.java  |   2 +-
 .../apache/sis/metadata/AbstractMetadataTest.java  |   2 +-
 .../java/org/apache/sis/metadata/HashCodeTest.java |   2 +-
 .../apache/sis/metadata/MetadataStandardTest.java  |   4 +-
 .../apache/sis/metadata/PropertyAccessorTest.java  |  14 +--
 .../sis/metadata/PropertyConsistencyCheck.java     |   6 +-
 .../java/org/apache/sis/metadata/PrunerTest.java   |   2 +-
 .../java/org/apache/sis/metadata/TreeNodeTest.java |   2 +-
 .../org/apache/sis/metadata/TreeTableViewTest.java |   2 +-
 .../metadata/iso/citation/DefaultContactTest.java  |   4 +-
 .../sis/metadata/iso/extent/ExtentsTest.java       |   2 +-
 .../metadata/iso/quality/AbstractElementTest.java  |   4 +-
 .../sis/test/xml/AnnotationConsistencyCheck.java   |   2 +-
 .../apache/sis/test/xml/DocumentComparator.java    |  10 +-
 .../org/apache/sis/test/xml/PackageVerifier.java   |   2 +-
 .../org/apache/sis/test/xml/SchemaCompliance.java  |   2 +-
 .../apache/sis/util/iso/NameMarshallingTest.java   |   6 +-
 .../java/org/apache/sis/util/iso/NamesTest.java    |   2 +-
 .../apache/sis/xml/NilReasonMarshallingTest.java   |   2 +-
 .../java/org/apache/sis/xml/NilReasonTest.java     |   6 +-
 .../test/java/org/apache/sis/xml/XLinkTest.java    |  22 ++--
 .../org/apache/sis/internal/map/SEPortrayer.java   |  12 +--
 .../coverage/MultiResolutionCoverageLoader.java    |   6 +-
 .../sis/internal/map/coverage/RenderingData.java   |   6 +-
 .../main/java/org/apache/sis/portrayal/Canvas.java |  24 ++---
 .../org/apache/sis/portrayal/CanvasExtent.java     |   4 +-
 .../org/apache/sis/portrayal/CanvasFollower.java   |   6 +-
 .../java/org/apache/sis/portrayal/Observable.java  |   2 +-
 .../apache/sis/portrayal/TransformChangeEvent.java |   2 +-
 .../apache/sis/internal/gazetteer/Resources.java   |   4 +-
 .../sis/internal/gazetteer/Resources.properties    |   4 +-
 .../referencing/gazetteer/GazetteerException.java  |   2 +-
 .../referencing/gazetteer/GazetteerFactory.java    |   4 +-
 .../gazetteer/GeohashReferenceSystem.java          |   6 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |  12 +--
 .../gazetteer/ModifiableLocationType.java          |   2 +-
 .../gazetteer/GazetteerFactoryTest.java            |   2 +-
 .../sis/referencing/gazetteer/LocationViewer.java  |   6 +-
 .../gazetteer/MilitaryGridReferenceSystemTest.java |   2 +-
 .../sis/geometry/AbstractDirectPosition.java       |   2 +-
 .../org/apache/sis/geometry/AbstractEnvelope.java  |   2 +-
 .../org/apache/sis/geometry/ArrayEnvelope.java     |   2 +-
 .../org/apache/sis/geometry/CoordinateFormat.java  |  12 +--
 .../org/apache/sis/geometry/CurveExtremum.java     |   2 +-
 .../org/apache/sis/geometry/DirectPosition1D.java  |   2 +-
 .../org/apache/sis/geometry/DirectPosition2D.java  |   2 +-
 .../java/org/apache/sis/geometry/Envelope2D.java   |  16 +--
 .../org/apache/sis/geometry/EnvelopeReducer.java   |   2 +-
 .../java/org/apache/sis/geometry/Envelopes.java    |  20 ++--
 .../apache/sis/geometry/GeneralDirectPosition.java |   2 +-
 .../org/apache/sis/geometry/GeneralEnvelope.java   |  12 +--
 .../org/apache/sis/geometry/ImmutableEnvelope.java |   4 +-
 .../java/org/apache/sis/geometry/Shapes2D.java     |   2 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |   4 +-
 .../referencing/CC_GeneralOperationParameter.java  |  55 +++++++---
 .../jaxb/referencing/CC_GeneralParameterValue.java |  13 +--
 .../jaxb/referencing/CC_OperationMethod.java       |  15 +--
 .../jaxb/referencing/CC_OperationParameter.java    |  54 +++++++---
 .../referencing/CC_OperationParameterGroup.java    |   6 +-
 .../apache/sis/internal/jaxb/referencing/Code.java |   6 +-
 .../jaxb/referencing/SecondDefiningParameter.java  |   2 +-
 .../internal/jaxb/referencing/package-info.java    |   4 +-
 .../sis/internal/referencing/AxesMapper.java       |   2 +-
 .../sis/internal/referencing/AxisDirections.java   |  67 +++++++++---
 .../internal/referencing/CoordinateOperations.java |   2 +-
 .../internal/referencing/DefinitionVerifier.java   |   2 +-
 .../apache/sis/internal/referencing/Formulas.java  |   2 +-
 .../referencing/GeodeticObjectBuilder.java         |  16 +--
 .../referencing/MathTransformsOrFactory.java       |   8 +-
 .../sis/internal/referencing/MergedProperties.java |  14 +--
 .../internal/referencing/PositionTransformer.java  |   2 +-
 .../referencing/ReferencingFactoryContainer.java   |   8 +-
 .../internal/referencing/ReferencingUtilities.java |   2 +-
 .../apache/sis/internal/referencing/Resources.java |  56 +++++-----
 .../sis/internal/referencing/Resources.properties  |  56 +++++-----
 .../internal/referencing/ServicesForMetadata.java  |   6 +-
 .../internal/referencing/VerticalDatumTypes.java   |   6 +-
 .../sis/internal/referencing/WKTKeywords.java      |   2 +-
 .../sis/internal/referencing/WKTUtilities.java     |   6 +-
 .../internal/referencing/WraparoundApplicator.java |   6 +-
 .../referencing/j2d/AffineTransform2D.java         |   2 +-
 .../sis/internal/referencing/j2d/Bezier.java       |  14 +--
 .../referencing/j2d/ImmutableAffineTransform.java  |   2 +-
 .../referencing/j2d/IntervalRectangle.java         |   2 +-
 .../referencing/j2d/LinearTransform2D.java         |   2 +-
 .../apache/sis/internal/referencing/j2d/Tile.java  |   4 +-
 .../internal/referencing/j2d/TileOrganizer.java    |   4 +-
 .../referencing/provider/AbridgedMolodensky.java   |   2 +-
 .../referencing/provider/AbstractProvider.java     |   2 +-
 .../provider/DatumShiftGridCompressed.java         |   2 +-
 .../referencing/provider/DatumShiftGridGroup.java  |   2 +-
 .../referencing/provider/DatumShiftGridLoader.java |   2 +-
 .../referencing/provider/Equirectangular.java      |   2 +-
 .../provider/FranceGeocentricInterpolation.java    |   4 +-
 .../referencing/provider/GeocentricAffine.java     |   6 +-
 .../GeocentricAffineBetweenGeographic.java         |   2 +-
 .../referencing/provider/GeodeticOperation.java    |   4 +-
 .../provider/GeographicAndVerticalOffsets.java     |   2 +-
 .../referencing/provider/LambertConformal2SP.java  |   2 +-
 .../referencing/provider/MapProjection.java        |   2 +-
 .../internal/referencing/provider/Mercator2SP.java |   4 +-
 .../internal/referencing/provider/Molodensky.java  |   4 +-
 .../sis/internal/referencing/provider/NTv2.java    |   2 +-
 .../referencing/provider/NorthPoleRotation.java    |   2 +-
 .../referencing/provider/PolarStereographicB.java  |   2 +-
 .../referencing/provider/PseudoSinusoidal.java     |   2 +-
 .../referencing/provider/SouthPoleRotation.java    |   2 +-
 .../internal/referencing/provider/Wraparound.java  |   2 +-
 .../provider/ZonedTransverseMercator.java          |   2 +-
 .../java/org/apache/sis/io/wkt/AbstractParser.java |  12 +--
 .../java/org/apache/sis/io/wkt/Convention.java     |   2 +-
 .../main/java/org/apache/sis/io/wkt/Element.java   |   8 +-
 .../org/apache/sis/io/wkt/FormattableObject.java   |  14 +--
 .../main/java/org/apache/sis/io/wkt/Formatter.java |  14 +--
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  78 +++++++-------
 .../org/apache/sis/io/wkt/MathTransformParser.java |  24 ++---
 .../org/apache/sis/io/wkt/SingletonElement.java    |   2 +-
 .../java/org/apache/sis/io/wkt/StoredTree.java     |   2 +-
 .../main/java/org/apache/sis/io/wkt/Symbols.java   |   4 +-
 .../java/org/apache/sis/io/wkt/Transliterator.java |   4 +-
 .../sis/io/wkt/UnformattableObjectException.java   |   6 +-
 .../sis/io/wkt/UnparsableObjectException.java      |   6 +-
 .../java/org/apache/sis/io/wkt/VerticalInfo.java   |   6 +-
 .../java/org/apache/sis/io/wkt/WKTDictionary.java  |   8 +-
 .../main/java/org/apache/sis/io/wkt/WKTFormat.java |   8 +-
 .../main/java/org/apache/sis/io/wkt/Warnings.java  |   4 +-
 .../sis/parameter/AbstractParameterDescriptor.java |   6 +-
 .../sis/parameter/DefaultParameterDescriptor.java  |  78 +++++++++++---
 .../parameter/DefaultParameterDescriptorGroup.java |   2 +-
 .../sis/parameter/DefaultParameterValue.java       |  21 ++--
 .../sis/parameter/DefaultParameterValueGroup.java  |  10 +-
 .../sis/parameter/MapProjectionParameters.java     |   4 +-
 .../org/apache/sis/parameter/ParameterBuilder.java |   8 +-
 .../org/apache/sis/parameter/ParameterFormat.java  |   9 +-
 .../apache/sis/parameter/ParameterValueList.java   |   4 +-
 .../java/org/apache/sis/parameter/Parameters.java  |  11 +-
 .../org/apache/sis/parameter/TensorParameters.java |   6 +-
 .../sis/parameter/UnmodifiableParameterValue.java  |  15 +--
 .../parameter/UnmodifiableParameterValueGroup.java |   2 +-
 .../java/org/apache/sis/parameter/Verifier.java    |   2 +-
 .../org/apache/sis/parameter/package-info.java     |   2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |  14 +--
 .../sis/referencing/AbstractReferenceSystem.java   |   2 +-
 .../java/org/apache/sis/referencing/Builder.java   |  14 +--
 .../main/java/org/apache/sis/referencing/CRS.java  |  16 +--
 .../java/org/apache/sis/referencing/CommonCRS.java |   2 +-
 .../sis/referencing/EPSGFactoryFallback.java       |   4 +-
 .../referencing/EllipsoidalHeightSeparator.java    |   8 +-
 .../sis/referencing/GeodesicsOnEllipsoid.java      |   6 +-
 .../apache/sis/referencing/GeodeticCalculator.java |  38 +++----
 .../apache/sis/referencing/GeodeticException.java  |   2 +-
 .../apache/sis/referencing/IdentifiedObjects.java  |   8 +-
 .../sis/referencing/ImmutableIdentifier.java       |   6 +-
 .../org/apache/sis/referencing/NameIterator.java   |   2 +-
 .../apache/sis/referencing/NamedIdentifier.java    |   6 +-
 .../sis/referencing/StandardDefinitions.java       |   4 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |   4 +-
 .../sis/referencing/crs/AbstractDerivedCRS.java    |  17 ++-
 .../apache/sis/referencing/crs/ConversionKeys.java |   6 +-
 .../sis/referencing/crs/DefaultCompoundCRS.java    |   2 +-
 .../sis/referencing/crs/DefaultDerivedCRS.java     |   6 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |   2 +-
 .../sis/referencing/crs/DefaultGeocentricCRS.java  |   2 +-
 .../sis/referencing/crs/DefaultGeodeticCRS.java    |   6 +-
 .../sis/referencing/crs/DefaultGeographicCRS.java  |   2 +-
 .../sis/referencing/crs/DefaultImageCRS.java       |   2 +-
 .../sis/referencing/crs/DefaultParametricCRS.java  |   2 +-
 .../sis/referencing/crs/DefaultProjectedCRS.java   |   2 +-
 .../sis/referencing/crs/DefaultTemporalCRS.java    |   6 +-
 .../sis/referencing/crs/DefaultVerticalCRS.java    |   2 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |   4 +-
 .../java/org/apache/sis/referencing/cs/Codes.java  |   2 +-
 .../sis/referencing/cs/CoordinateSystems.java      |  11 +-
 .../apache/sis/referencing/cs/DefaultAffineCS.java |   2 +-
 .../sis/referencing/cs/DefaultCartesianCS.java     |   2 +-
 .../sis/referencing/cs/DefaultCompoundCS.java      |   2 +-
 .../cs/DefaultCoordinateSystemAxis.java            |   8 +-
 .../sis/referencing/cs/DefaultCylindricalCS.java   |   2 +-
 .../sis/referencing/cs/DefaultEllipsoidalCS.java   |   2 +-
 .../apache/sis/referencing/cs/DefaultLinearCS.java |   2 +-
 .../sis/referencing/cs/DefaultParametricCS.java    |   2 +-
 .../apache/sis/referencing/cs/DefaultPolarCS.java  |   2 +-
 .../sis/referencing/cs/DefaultSphericalCS.java     |   2 +-
 .../apache/sis/referencing/cs/DefaultTimeCS.java   |   2 +-
 .../sis/referencing/cs/DefaultUserDefinedCS.java   |   2 +-
 .../sis/referencing/cs/DefaultVerticalCS.java      |   2 +-
 .../org/apache/sis/referencing/cs/Normalizer.java  |  28 ++---
 .../sis/referencing/datum/AbstractDatum.java       |   2 +-
 .../sis/referencing/datum/BursaWolfParameters.java |   2 +-
 .../sis/referencing/datum/DatumShiftGrid.java      |   4 +-
 .../sis/referencing/datum/DefaultEllipsoid.java    |   6 +-
 .../referencing/datum/DefaultEngineeringDatum.java |   2 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |   8 +-
 .../sis/referencing/datum/DefaultImageDatum.java   |   2 +-
 .../referencing/datum/DefaultParametricDatum.java  |   2 +-
 .../referencing/datum/DefaultPrimeMeridian.java    |   4 +-
 .../referencing/datum/DefaultTemporalDatum.java    |   2 +-
 .../referencing/datum/DefaultVerticalDatum.java    |   4 +-
 .../referencing/factory/AuthorityFactoryProxy.java |   4 +-
 .../factory/CommonAuthorityFactory.java            |   6 +-
 .../factory/ConcurrentAuthorityFactory.java        |  14 +--
 .../factory/GeodeticAuthorityFactory.java          |  82 +++++++--------
 .../referencing/factory/GeodeticObjectFactory.java |   6 +-
 .../factory/IdentifiedObjectFinder.java            |   4 +-
 .../referencing/factory/IdentifiedObjectSet.java   |   2 +-
 .../factory/MissingFactoryResourceException.java   |   4 +-
 .../factory/MultiAuthoritiesFactory.java           |   6 +-
 .../factory/UnavailableFactoryException.java       |   6 +-
 .../sis/referencing/factory/package-info.java      |   2 +-
 .../referencing/factory/sql/AuthorityCodes.java    |   2 +-
 .../sis/referencing/factory/sql/BursaWolfInfo.java |   2 +-
 .../factory/sql/CoordinateOperationSet.java        |   2 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  20 ++--
 .../sis/referencing/factory/sql/EPSGFactory.java   |   6 +-
 .../sis/referencing/factory/sql/EPSGInstaller.java |   2 +-
 .../sis/referencing/factory/sql/SQLTranslator.java |   4 +-
 .../operation/AbstractCoordinateOperation.java     |  28 ++---
 .../operation/AbstractSingleOperation.java         |  29 ++++--
 .../operation/CoordinateOperationContext.java      |   4 +-
 .../operation/CoordinateOperationFinder.java       |  32 +++---
 .../operation/CoordinateOperationRegistry.java     |  24 ++---
 .../operation/DefaultConcatenatedOperation.java    |  12 +--
 .../referencing/operation/DefaultConversion.java   |  24 +++--
 .../DefaultCoordinateOperationFactory.java         |   6 +-
 .../operation/DefaultOperationMethod.java          |  40 +++++---
 .../operation/DefaultPassThroughOperation.java     | 114 +++++++++++++++------
 .../operation/DefaultTransformation.java           |   2 +-
 .../operation/InverseOperationMethod.java          |   2 +-
 .../referencing/operation/SubOperationInfo.java    |   6 +-
 .../apache/sis/referencing/operation/SubTypes.java |   2 +-
 .../operation/builder/LinearTransformBuilder.java  |  24 ++---
 .../referencing/operation/builder/Linearizer.java  |   4 +-
 .../operation/builder/LocalizationGridBuilder.java |  12 +--
 .../builder/LocalizationGridException.java         |   4 +-
 .../operation/builder/ProjectedTransformTry.java   |   4 +-
 .../operation/builder/ResidualGrid.java            |   4 +-
 .../operation/builder/TransformBuilder.java        |   4 +-
 .../operation/matrix/AffineTransforms2D.java       |   6 +-
 .../operation/matrix/GeneralMatrix.java            |   8 +-
 .../sis/referencing/operation/matrix/Matrices.java |  10 +-
 .../sis/referencing/operation/matrix/Matrix1.java  |   2 +-
 .../sis/referencing/operation/matrix/Matrix2.java  |   2 +-
 .../sis/referencing/operation/matrix/Matrix3.java  |   2 +-
 .../sis/referencing/operation/matrix/Matrix4.java  |   2 +-
 .../referencing/operation/matrix/MatrixSIS.java    |   2 +-
 .../matrix/MismatchedMatrixSizeException.java      |   2 +-
 .../matrix/NoninvertibleMatrixException.java       |   2 +-
 .../sis/referencing/operation/matrix/Solver.java   |   2 +-
 .../sis/referencing/operation/package-info.java    |   2 +-
 .../operation/projection/AlbersEqualArea.java      |   4 +-
 .../operation/projection/AuthalicConversion.java   |   2 +-
 .../operation/projection/AuthalicMercator.java     |   4 +-
 .../operation/projection/AzimuthalEquidistant.java |   4 +-
 .../operation/projection/CassiniSoldner.java       |   4 +-
 .../operation/projection/ConformalProjection.java  |   2 +-
 .../operation/projection/CylindricalEqualArea.java |   6 +-
 .../operation/projection/Initializer.java          |   6 +-
 .../projection/LambertAzimuthalEqualArea.java      |   6 +-
 .../projection/LambertConicConformal.java          |   8 +-
 .../operation/projection/LongitudeWraparound.java  |   4 +-
 .../referencing/operation/projection/Mercator.java |  10 +-
 .../operation/projection/MeridianArcBased.java     |   2 +-
 .../projection/ModifiedAzimuthalEquidistant.java   |   2 +-
 .../operation/projection/Mollweide.java            |   2 +-
 .../operation/projection/NormalizedProjection.java |  12 +--
 .../operation/projection/ObliqueMercator.java      |   4 +-
 .../operation/projection/ObliqueStereographic.java |  12 +--
 .../operation/projection/Orthographic.java         |   2 +-
 .../operation/projection/PolarStereographic.java   |   4 +-
 .../operation/projection/Polyconic.java            |   4 +-
 .../operation/projection/ProjectionException.java  |   2 +-
 .../operation/projection/SatelliteTracking.java    |   8 +-
 .../operation/projection/Sinusoidal.java           |   2 +-
 .../operation/projection/TransverseMercator.java   |  14 +--
 .../operation/projection/ZonedGridSystem.java      |   4 +-
 .../operation/transform/AbstractMathTransform.java |  28 ++---
 .../transform/AbstractMathTransform1D.java         |   8 +-
 .../transform/AbstractMathTransform2D.java         |   8 +-
 .../operation/transform/ConcatenatedTransform.java |   6 +-
 .../operation/transform/ContextualParameters.java  |   4 +-
 .../operation/transform/DatumShiftTransform.java   |   2 +-
 .../transform/DefaultMathTransformFactory.java     |  18 ++--
 .../operation/transform/DomainDefinition.java      |  10 +-
 .../transform/EllipsoidToCentricTransform.java     |   6 +-
 .../transform/InterpolatedGeocentricTransform.java |   6 +-
 .../transform/InterpolatedMolodenskyTransform.java |  12 +--
 .../operation/transform/InterpolatedTransform.java |  24 ++---
 .../operation/transform/LinearTransform.java       |   4 +-
 .../operation/transform/MathTransformProvider.java |   2 +-
 .../operation/transform/MathTransforms.java        |   6 +-
 .../operation/transform/MolodenskyFormula.java     |   2 +-
 .../operation/transform/MolodenskyTransform.java   |   4 +-
 .../operation/transform/PassThroughTransform.java  |   6 +-
 .../operation/transform/PoleRotation.java          |   2 +-
 .../operation/transform/TransferFunction.java      |   2 +-
 .../operation/transform/TransformSeparator.java    |   8 +-
 .../operation/transform/WraparoundTransform.java   |   4 +-
 .../org/apache/sis/referencing/package-info.java   |   2 +-
 .../sis/referencing/factory/sql/EPSG_Finish.sql    |   2 +-
 .../org/apache/sis/geometry/EnvelopesTest.java     |   2 +-
 .../apache/sis/geometry/GeneralEnvelopeTest.java   |   4 +-
 .../java/org/apache/sis/geometry/Shapes2DTest.java |   2 +-
 .../org/apache/sis/geometry/TransformTestCase.java |   2 +-
 .../referencing/EllipsoidalHeightCombinerTest.java |   4 +-
 .../sis/internal/referencing/WKTKeywordsTest.java  |   2 +-
 .../internal/referencing/provider/AffineTest.java  |   2 +-
 .../referencing/provider/DatumShiftTestCase.java   |   6 +-
 .../FranceGeocentricInterpolationTest.java         |   6 +-
 .../internal/referencing/provider/NADCONTest.java  |   2 +-
 .../internal/referencing/provider/NTv2Test.java    |   2 +-
 .../org/apache/sis/io/wkt/ComparisonWithEPSG.java  |   2 +-
 .../java/org/apache/sis/io/wkt/ElementTest.java    |   6 +-
 .../sis/io/wkt/GeodeticObjectParserTest.java       |   2 +-
 .../org/apache/sis/io/wkt/WKTDictionaryTest.java   |   6 +-
 .../java/org/apache/sis/io/wkt/WKTFormatTest.java  |   2 +-
 .../java/org/apache/sis/io/wkt/WKTParserTest.java  |   1 +
 .../java/org/apache/sis/io/wkt/package-info.txt    |   2 +-
 .../parameter/DefaultParameterDescriptorTest.java  |   6 +-
 .../parameter/DefaultParameterValueGroupTest.java  |   2 +-
 .../sis/parameter/DefaultParameterValueTest.java   |   4 +-
 .../org/apache/sis/parameter/ParametersTest.java   |   2 +-
 .../parameter/UnmodifiableParameterValueTest.java  |   2 +-
 .../sis/referencing/AuthorityFactoriesTest.java    |   2 +-
 .../java/org/apache/sis/referencing/CRSTest.java   |   8 +-
 .../sis/referencing/EPSGFactoryFallbackTest.java   |  16 +--
 .../sis/referencing/GeodeticCalculatorTest.java    |   4 +-
 .../sis/referencing/ImmutableIdentifierTest.java   |   6 +-
 .../referencing/crs/DefaultCompoundCRSTest.java    |   2 +-
 .../referencing/crs/DefaultGeographicCRSTest.java  |   2 +-
 .../cs/DefaultCoordinateSystemAxisTest.java        |   2 +-
 .../referencing/cs/DefaultCylindricalCSTest.java   |   2 +-
 .../sis/referencing/cs/DefaultPolarCSTest.java     |   2 +-
 .../apache/sis/referencing/cs/HardCodedAxes.java   |   2 +-
 .../apache/sis/referencing/cs/NormalizerTest.java  |   2 +-
 .../referencing/datum/BursaWolfParametersTest.java |   2 +-
 .../datum/DefaultPrimeMeridianTest.java            |   2 +-
 .../datum/DefaultVerticalDatumTest.java            |   2 +-
 .../factory/ConcurrentAuthorityFactoryTest.java    |   2 +-
 .../referencing/factory/sql/EPSGFactoryTest.java   |   4 +-
 .../factory/sql/epsg/DataScriptFormatter.java      |   2 +-
 .../sis/referencing/factory/sql/epsg/package.html  |   2 +-
 .../referencing/geoapi/AuthorityFactoryTest.java   |   2 +-
 .../geoapi/ParameterizedTransformTest.java         |   8 +-
 .../operation/CoordinateOperationFinderTest.java   |  56 +++++-----
 .../operation/CoordinateOperationRegistryTest.java |  20 ++--
 .../DefaultCoordinateOperationFactoryTest.java     |  16 +--
 .../builder/LinearTransformBuilderTest.java        |  20 ++--
 .../operation/matrix/GeneralMatrixTest.java        |   2 +-
 .../operation/matrix/MatrixTestCase.java           |  10 +-
 .../operation/matrix/NonSquareMatrixTest.java      |  12 +--
 .../referencing/operation/matrix/SolverTest.java   |   2 +-
 .../operation/projection/AlbersEqualAreaTest.java  |   2 +-
 .../projection/LambertAzimuthalEqualAreaTest.java  |   2 +-
 .../projection/LambertConicConformalTest.java      |   2 +-
 .../projection/MapProjectionTestCase.java          |   4 +-
 .../operation/projection/MercatorTest.java         |   4 +-
 .../operation/projection/MeridianArcTest.java      |   2 +-
 .../operation/projection/PolyconicTest.java        |   2 +-
 .../transform/AbstractMathTransformTest.java       |   4 +-
 .../operation/transform/CartesianToPolarTest.java  |  24 ++---
 .../transform/CartesianToSphericalTest.java        |  12 +--
 .../transform/ConcatenatedTransformTest.java       |   8 +-
 .../transform/MathTransformFactoryMock.java        |   2 +-
 .../operation/transform/MathTransformWrapper.java  |   4 +-
 .../transform/OperationMethodSetTest.java          |   2 +-
 .../transform/PassThroughTransformTest.java        |   2 +-
 .../operation/transform/PolarToCartesianTest.java  |  24 ++---
 .../operation/transform/PoleRotationTest.java      |  20 ++--
 .../transform/ProjectiveTransformTest.java         |   4 +-
 .../operation/transform/PseudoTransform.java       |   4 +-
 .../transform/SphericalToCartesianTest.java        |  12 +--
 .../transform/TransformSeparatorTest.java          |   4 +-
 .../transform/WraparoundTransformTest.java         |   6 +-
 .../report/CoordinateReferenceSystems.java         |   4 +-
 .../sis/referencing/report/HTMLGenerator.java      |   2 +-
 .../sis/test/integration/ConsistencyTest.java      |  10 +-
 .../apache/sis/test/integration/MetadataTest.java  |   4 +-
 .../apache/sis/test/widget/SwingAssertions.java    |   2 +-
 .../sis/internal/converter/ArrayConverter.java     |   4 +-
 .../internal/converter/CharSequenceConverter.java  |   2 +-
 .../sis/internal/converter/ConverterRegistry.java  |  12 +--
 .../sis/internal/converter/FallbackConverter.java  |   8 +-
 .../sis/internal/converter/NumberConverter.java    |   2 +-
 .../sis/internal/converter/ObjectToString.java     |   2 +-
 .../sis/internal/converter/SystemConverter.java    |   8 +-
 .../sis/internal/converter/SystemRegistry.java     |   2 +-
 .../apache/sis/internal/system/DaemonThread.java   |   2 +-
 .../apache/sis/internal/system/OSGiActivator.java  |   2 +-
 .../org/apache/sis/internal/system/Shutdown.java   |   2 +-
 .../apache/sis/internal/system/SystemListener.java |   2 +-
 .../org/apache/sis/internal/system/Threads.java    |   2 +-
 .../org/apache/sis/internal/util/AbstractMap.java  |  10 +-
 .../java/org/apache/sis/internal/util/Bag.java     |   2 +-
 .../apache/sis/internal/util/CheckedArrayList.java |   2 +-
 .../apache/sis/internal/util/CheckedHashSet.java   |   2 +-
 .../java/org/apache/sis/internal/util/Cloner.java  |  10 +-
 .../apache/sis/internal/util/CollectionsExt.java   |   6 +-
 .../apache/sis/internal/util/DefinitionURI.java    |   2 +-
 .../org/apache/sis/internal/util/DoubleDouble.java |  30 +++---
 .../apache/sis/internal/util/FinalFieldSetter.java |   4 +-
 .../sis/internal/util/LocalizedParseException.java |   6 +-
 .../apache/sis/internal/util/PropertyFormat.java   |   2 +-
 .../apache/sis/internal/util/SetOfUnknownSize.java |   6 +-
 .../sis/internal/util/StandardDateFormat.java      |   6 +-
 .../java/org/apache/sis/io/AppendableWriter.java   |   2 +-
 .../main/java/org/apache/sis/io/ClassFormat.java   |   2 +-
 .../java/org/apache/sis/io/CompoundFormat.java     |   2 +-
 .../org/apache/sis/io/IdentifiedObjectFormat.java  |   2 +-
 .../org/apache/sis/io/InvalidSeekException.java    |   2 +-
 .../main/java/org/apache/sis/io/LineAppender.java  |   2 +-
 .../main/java/org/apache/sis/io/TableAppender.java |   2 +-
 .../main/java/org/apache/sis/io/TabularFormat.java |   2 +-
 .../main/java/org/apache/sis/math/ArrayVector.java |   8 +-
 .../java/org/apache/sis/math/DecimalFunctions.java |  18 ++--
 .../main/java/org/apache/sis/math/Fraction.java    |  20 ++--
 .../java/org/apache/sis/math/FunctionProperty.java |   4 +-
 .../java/org/apache/sis/math/MathFunctions.java    |   8 +-
 .../java/org/apache/sis/math/PackedVector.java     |   2 +-
 .../java/org/apache/sis/math/RepeatedVector.java   |   2 +-
 .../java/org/apache/sis/math/SequenceVector.java   |   2 +-
 .../main/java/org/apache/sis/math/Statistics.java  |   6 +-
 .../src/main/java/org/apache/sis/math/Vector.java  |  32 +++---
 .../java/org/apache/sis/measure/AbstractUnit.java  |   4 +-
 .../main/java/org/apache/sis/measure/Angle.java    |   2 +-
 .../java/org/apache/sis/measure/AngleFormat.java   |  14 +--
 .../org/apache/sis/measure/ConventionalUnit.java   |   4 +-
 .../java/org/apache/sis/measure/FormatField.java   |   2 +-
 .../org/apache/sis/measure/LinearConverter.java    |   2 +-
 .../org/apache/sis/measure/MeasurementRange.java   |   8 +-
 .../java/org/apache/sis/measure/NumberRange.java   |  18 ++--
 .../java/org/apache/sis/measure/Quantities.java    |   4 +-
 .../main/java/org/apache/sis/measure/Range.java    |   4 +-
 .../java/org/apache/sis/measure/RangeFormat.java   |  12 +--
 .../java/org/apache/sis/measure/ScalarFactory.java |   2 +-
 .../apache/sis/measure/SexagesimalConverter.java   |   6 +-
 .../java/org/apache/sis/measure/SystemUnit.java    |  10 +-
 .../java/org/apache/sis/measure/UnitFormat.java    |   8 +-
 .../java/org/apache/sis/measure/UnitServices.java  |   2 +-
 .../main/java/org/apache/sis/measure/Units.java    |  22 ++--
 .../java/org/apache/sis/measure/ValueRange.java    |   2 +-
 .../src/main/java/org/apache/sis/setup/About.java  |   2 +-
 .../java/org/apache/sis/setup/Configuration.java   |   2 +-
 .../main/java/org/apache/sis/setup/OptionKey.java  |   2 +-
 .../apache/sis/setup/OptionalInstallations.java    |   2 +-
 .../java/org/apache/sis/util/ArgumentChecks.java   |   2 +-
 .../main/java/org/apache/sis/util/ArraysExt.java   |  22 ++--
 .../java/org/apache/sis/util/CharSequences.java    |  26 ++---
 .../main/java/org/apache/sis/util/Characters.java  |   8 +-
 .../src/main/java/org/apache/sis/util/Classes.java |  18 ++--
 .../java/org/apache/sis/util/ComparisonMode.java   |   2 +-
 .../apache/sis/util/CorruptedObjectException.java  |   2 +-
 .../sis/util/DefaultInternationalString.java       |  10 +-
 .../main/java/org/apache/sis/util/Disposable.java  |   2 +-
 .../org/apache/sis/util/LocalizedException.java    |   2 +-
 .../src/main/java/org/apache/sis/util/Numbers.java |  12 +--
 .../java/org/apache/sis/util/ObjectConverter.java  |   8 +-
 .../java/org/apache/sis/util/ObjectConverters.java |   2 +-
 .../sis/util/ResourceInternationalString.java      |   8 +-
 .../sis/util/UnconvertibleObjectException.java     |   2 +-
 .../org/apache/sis/util/UnknownNameException.java  |   2 +-
 .../util/UnsupportedImplementationException.java   |   2 +-
 .../main/java/org/apache/sis/util/Utilities.java   |   2 +-
 .../src/main/java/org/apache/sis/util/Version.java |   4 +-
 .../main/java/org/apache/sis/util/Workaround.java  |   2 +-
 .../java/org/apache/sis/util/collection/Cache.java |   4 +-
 .../apache/sis/util/collection/CodeListSet.java    |   4 +-
 .../org/apache/sis/util/collection/Containers.java |  14 +--
 .../sis/util/collection/DefaultTreeTable.java      |  18 ++--
 .../sis/util/collection/DerivedIterator.java       |   2 +-
 .../org/apache/sis/util/collection/DerivedMap.java |   2 +-
 .../org/apache/sis/util/collection/DerivedSet.java |   2 +-
 .../sis/util/collection/FrequencySortedSet.java    |   4 +-
 .../apache/sis/util/collection/TableColumn.java    |   4 +-
 .../apache/sis/util/collection/TreeNodeList.java   |  12 +--
 .../org/apache/sis/util/collection/TreeTable.java  |  10 +-
 .../sis/util/collection/TreeTableFormat.java       |   8 +-
 .../org/apache/sis/util/collection/TreeTables.java |   4 +-
 .../org/apache/sis/util/collection/WeakEntry.java  |   2 +-
 .../apache/sis/util/collection/WeakHashSet.java    |   2 +-
 .../sis/util/collection/WeakValueHashMap.java      |  10 +-
 .../apache/sis/util/collection/package-info.java   |   4 +-
 .../java/org/apache/sis/util/logging/Logging.java  |   2 +-
 .../apache/sis/util/logging/MonolineFormatter.java |   4 +-
 .../java/org/apache/sis/util/resources/Errors.java |  90 ++++++++--------
 .../apache/sis/util/resources/Errors.properties    |  84 +++++++--------
 .../sis/util/resources/IndexedResourceBundle.java  |   4 +-
 .../org/apache/sis/util/resources/Messages.java    |   8 +-
 .../apache/sis/util/resources/Messages.properties  |   8 +-
 .../resources/ResourceInternationalString.java     |   2 +-
 .../org/apache/sis/util/resources/Vocabulary.java  |   2 +-
 .../internal/converter/NumberConverterTest.java    |   2 +-
 .../sis/internal/util/CheckedArrayListTest.java    |  10 +-
 .../internal/util/LocalizedParseExceptionTest.java |   2 +-
 .../java/org/apache/sis/io/EchoAppendable.java     |   2 +-
 .../java/org/apache/sis/io/TableAppenderTest.java  |   2 +-
 .../org/apache/sis/math/DecimalFunctionsTest.java  |   2 +-
 .../org/apache/sis/measure/AngleFormatTest.java    |   2 +-
 .../java/org/apache/sis/measure/PrefixesTest.java  |   4 +-
 .../sis/measure/SexagesimalConverterTest.java      |   4 +-
 .../org/apache/sis/measure/SystemUnitTest.java     |   6 +-
 .../org/apache/sis/measure/UnitFormatTest.java     |   2 +-
 .../java/org/apache/sis/measure/UnitsTest.java     |   4 +-
 .../java/org/apache/sis/setup/OptionKeyTest.java   |   2 +-
 .../src/test/java/org/apache/sis/test/Assert.java  |   2 +-
 .../test/java/org/apache/sis/test/DependsOn.java   |   2 +-
 .../java/org/apache/sis/test/DependsOnMethod.java  |   4 +-
 .../test/java/org/apache/sis/test/TestCase.java    |   2 +-
 .../test/java/org/apache/sis/test/TestSuite.java   |   2 +-
 .../java/org/apache/sis/test/TestUtilities.java    |   2 +-
 .../test/foreigner/SerializableTableColumn.java    |   2 +-
 .../java/org/apache/sis/test/package-info.java     |   2 +-
 .../java/org/apache/sis/util/CharactersTest.java   |   2 +-
 .../java/org/apache/sis/util/ExceptionsTest.java   |   8 +-
 .../org/apache/sis/util/collection/CacheTest.java  |   4 +-
 .../sis/util/collection/CodeListSetTest.java       |   4 +-
 .../sis/util/collection/DefaultTreeTableTest.java  |   2 +-
 .../sis/util/collection/WeakHashSetTest.java       |   2 +-
 .../sis/util/collection/WeakValueHashMapTest.java  |   4 +-
 ide-project/NetBeans/build.xml                     |   4 +-
 ide-project/NetBeans/nbproject/project.properties  |   4 +-
 non-free/README                                    |   2 +-
 pom.xml                                            |   8 +-
 .../profile/fra/DirectReferenceSystemTest.java     |   2 +-
 .../apache/sis/internal/earth/netcdf/GCOM_C.java   |   4 +-
 .../apache/sis/internal/earth/netcdf/GCOM_W.java   |   4 +-
 .../apache/sis/storage/landsat/LandsatStore.java   |   2 +-
 .../apache/sis/storage/landsat/MetadataReader.java |   6 +-
 .../storage/landsat/doc-files/MetadataMapping.html |   2 +-
 .../sis/storage/landsat/MetadataReaderTest.java    |   2 +-
 .../apache/sis/internal/geotiff/Compression.java   |   2 +-
 .../org/apache/sis/internal/geotiff/Resources.java |   6 +-
 .../sis/internal/geotiff/Resources.properties      |   4 +-
 .../sis/internal/storage/inflater/CCITTRLE.java    |   4 +-
 .../storage/inflater/CompressionChannel.java       |   2 +-
 .../storage/inflater/HorizontalPredictor.java      |   4 +-
 .../sis/internal/storage/inflater/Inflater.java    |   4 +-
 .../apache/sis/internal/storage/inflater/LZW.java  |  10 +-
 .../sis/internal/storage/inflater/PackBits.java    |   4 +-
 .../internal/storage/inflater/PixelChannel.java    |   2 +-
 .../storage/inflater/PredictorChannel.java         |   2 +-
 .../apache/sis/internal/storage/inflater/ZIP.java  |   4 +-
 .../org/apache/sis/storage/geotiff/CRSBuilder.java |  32 +++---
 .../org/apache/sis/storage/geotiff/DataSubset.java |   6 +-
 .../apache/sis/storage/geotiff/GeoKeysLoader.java  |   2 +-
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |   6 +-
 .../sis/storage/geotiff/GridGeometryBuilder.java   |   6 +-
 .../sis/storage/geotiff/ImageFileDirectory.java    |  14 +--
 .../apache/sis/storage/geotiff/Localization.java   |   2 +-
 .../apache/sis/storage/geotiff/NativeMetadata.java |   2 +-
 .../org/apache/sis/storage/geotiff/Reader.java     |   8 +-
 .../java/org/apache/sis/storage/geotiff/Type.java  |  26 ++---
 .../java/org/apache/sis/internal/netcdf/Axis.java  |  20 ++--
 .../org/apache/sis/internal/netcdf/CRSBuilder.java |  12 +--
 .../org/apache/sis/internal/netcdf/Convention.java |   6 +-
 .../org/apache/sis/internal/netcdf/DataType.java   |   2 +-
 .../org/apache/sis/internal/netcdf/Decoder.java    |   8 +-
 .../org/apache/sis/internal/netcdf/Dimension.java  |   2 +-
 .../sis/internal/netcdf/DiscreteSampling.java      |   2 +-
 .../org/apache/sis/internal/netcdf/FeatureSet.java |   8 +-
 .../java/org/apache/sis/internal/netcdf/Grid.java  |   8 +-
 .../apache/sis/internal/netcdf/GridMapping.java    |   6 +-
 .../org/apache/sis/internal/netcdf/Linearizer.java |   8 +-
 .../apache/sis/internal/netcdf/RasterResource.java |   6 +-
 .../org/apache/sis/internal/netcdf/Resources.java  |  26 ++---
 .../sis/internal/netcdf/Resources.properties       |  20 ++--
 .../org/apache/sis/internal/netcdf/Variable.java   |  16 +--
 .../sis/internal/netcdf/impl/DimensionInfo.java    |   2 +-
 .../sis/internal/netcdf/impl/VariableInfo.java     |   6 +-
 .../sis/internal/netcdf/ucar/DecoderWrapper.java   |   2 +-
 .../sis/internal/netcdf/ucar/GridWrapper.java      |   6 +-
 .../sis/internal/netcdf/ucar/VariableWrapper.java  |   6 +-
 .../apache/sis/storage/netcdf/AttributeNames.java  |   2 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |   6 +-
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |   4 +-
 .../sis/storage/netcdf/NetcdfStoreProvider.java    |   4 +-
 .../apache/sis/storage/netcdf/package-info.java    |   2 +-
 .../apache/sis/internal/sql/feature/Column.java    |   4 +-
 .../apache/sis/internal/sql/feature/Database.java  |  12 +--
 .../sis/internal/sql/feature/FeatureAdapter.java   |   4 +-
 .../sis/internal/sql/feature/FeatureAnalyzer.java  |   2 +-
 .../sis/internal/sql/feature/FeatureIterator.java  |   6 +-
 .../sis/internal/sql/feature/FeatureStream.java    |   8 +-
 .../sis/internal/sql/feature/GeometryGetter.java   |   2 +-
 .../sis/internal/sql/feature/InfoStatements.java   |  16 +--
 .../sis/internal/sql/feature/QueryAnalyzer.java    |   2 +-
 .../apache/sis/internal/sql/feature/Relation.java  |   2 +-
 .../apache/sis/internal/sql/feature/Resources.java |   6 +-
 .../sis/internal/sql/feature/Resources.properties  |   4 +-
 .../sis/internal/sql/feature/SelectionClause.java  |   4 +-
 .../sql/feature/SelectionClauseWriter.java         |   4 +-
 .../sis/internal/sql/feature/TableReference.java   |   2 +-
 .../sis/internal/sql/feature/ValueGetter.java      |   2 +-
 .../apache/sis/internal/sql/postgis/Postgres.java  |   2 +-
 .../sis/internal/sql/postgis/RasterGetter.java     |   2 +-
 .../apache/sis/internal/stream/DeferredStream.java |   2 +-
 .../apache/sis/internal/stream/StreamWrapper.java  |   2 +-
 .../org/apache/sis/storage/sql/package-info.java   |   2 +-
 .../internal/sql/feature/GeometryGetterTest.java   |   2 +-
 .../org/apache/sis/storage/sql/SQLStoreTest.java   |   4 +-
 .../apache/sis/internal/storage/Capability.java    |   2 +-
 .../org/apache/sis/internal/storage/CodeType.java  |   6 +-
 .../sis/internal/storage/GridResourceWrapper.java  |   8 +-
 .../sis/internal/storage/MemoryGridResource.java   |   2 +-
 .../sis/internal/storage/MetadataBuilder.java      |   2 +-
 .../apache/sis/internal/storage/PRJDataStore.java  |  10 +-
 .../apache/sis/internal/storage/RangeArgument.java |   6 +-
 .../org/apache/sis/internal/storage/Resources.java |  42 ++++----
 .../sis/internal/storage/Resources.properties      |  40 ++++----
 .../apache/sis/internal/storage/StoreMetadata.java |   2 +-
 .../sis/internal/storage/StoreUtilities.java       |   8 +-
 .../sis/internal/storage/TiledGridCoverage.java    |  10 +-
 .../apache/sis/internal/storage/URIDataStore.java  |   8 +-
 .../internal/storage/WritableResourceSupport.java  |   8 +-
 .../storage/csv/MovingFeatureIterator.java         |   3 +-
 .../org/apache/sis/internal/storage/csv/Store.java |   4 +-
 .../sis/internal/storage/esri/AsciiGridStore.java  |   8 +-
 .../sis/internal/storage/esri/CharactersView.java  |   4 +-
 .../sis/internal/storage/esri/RasterStore.java     |   6 +-
 .../sis/internal/storage/esri/RawRasterReader.java |   2 +-
 .../sis/internal/storage/esri/RawRasterStore.java  |   6 +-
 .../sis/internal/storage/esri/WritableStore.java   |   4 +-
 .../apache/sis/internal/storage/folder/Store.java  |   4 +-
 .../sis/internal/storage/folder/StoreProvider.java |   2 +-
 .../storage/folder/UnstructuredAggregate.java      |   2 +-
 .../sis/internal/storage/folder/WritableStore.java |   6 +-
 .../sis/internal/storage/folder/package-info.java  |   2 +-
 .../sis/internal/storage/image/WorldFileStore.java |  24 ++---
 .../sis/internal/storage/image/WritableStore.java  |   6 +-
 .../sis/internal/storage/io/ChannelData.java       |  10 +-
 .../sis/internal/storage/io/ChannelDataInput.java  |  16 +--
 .../sis/internal/storage/io/ChannelDataOutput.java |  10 +-
 .../sis/internal/storage/io/ChannelFactory.java    |  14 +--
 .../sis/internal/storage/io/DataTransfer.java      |   2 +-
 .../sis/internal/storage/io/IOUtilities.java       |  34 +++---
 .../internal/storage/io/InputStreamAdapter.java    |   8 +-
 .../apache/sis/internal/storage/io/Markable.java   |   8 +-
 .../internal/storage/io/OutputStreamAdapter.java   |   6 +-
 .../internal/storage/io/RewindableLineReader.java  |  12 +--
 .../sis/internal/storage/wkt/StoreFormat.java      |   4 +-
 .../sis/internal/storage/xml/AbstractProvider.java |   2 +-
 .../sis/internal/storage/xml/MimeTypeDetector.java |   4 +-
 .../sis/storage/AbstractGridCoverageResource.java  |   2 +-
 .../org/apache/sis/storage/AbstractResource.java   |   8 +-
 .../apache/sis/storage/CanNotProbeException.java   |   4 +-
 .../sis/storage/ConcurrentReadException.java       |   4 +-
 .../sis/storage/ConcurrentWriteException.java      |   4 +-
 .../java/org/apache/sis/storage/CoverageQuery.java |   2 +-
 .../org/apache/sis/storage/CoverageSubset.java     |   4 +-
 .../main/java/org/apache/sis/storage/DataSet.java  |   2 +-
 .../java/org/apache/sis/storage/DataStore.java     |   8 +-
 .../sis/storage/DataStoreContentException.java     |   8 +-
 .../org/apache/sis/storage/DataStoreException.java |  14 +--
 .../org/apache/sis/storage/DataStoreProvider.java  |  10 +-
 .../sis/storage/DataStoreReferencingException.java |   2 +-
 .../org/apache/sis/storage/DataStoreRegistry.java  |   2 +-
 .../java/org/apache/sis/storage/FeatureNaming.java |   6 +-
 .../java/org/apache/sis/storage/FeatureQuery.java  |   6 +-
 .../java/org/apache/sis/storage/FeatureSet.java    |   2 +-
 .../java/org/apache/sis/storage/FeatureSubset.java |   2 +-
 .../sis/storage/IllegalFeatureTypeException.java   |   4 +-
 .../sis/storage/IllegalOpenParameterException.java |   2 +-
 .../sis/storage/IncompatibleResourceException.java |   2 +-
 .../org/apache/sis/storage/ProbeInputStream.java   |   2 +-
 .../java/org/apache/sis/storage/ProbeResult.java   |   8 +-
 .../main/java/org/apache/sis/storage/Query.java    |   2 +-
 .../sis/storage/ReadOnlyStorageException.java      |   2 +-
 .../main/java/org/apache/sis/storage/Resource.java |   6 +-
 .../storage/ResourceAlreadyExistsException.java    |   2 +-
 .../org/apache/sis/storage/StorageConnector.java   |  16 +--
 .../sis/storage/UnsupportedQueryException.java     |   2 +-
 .../sis/storage/UnsupportedStorageException.java   |   2 +-
 .../org/apache/sis/storage/WritableAggregate.java  |   2 +-
 .../org/apache/sis/storage/WritableFeatureSet.java |   2 +-
 .../sis/storage/WritableGridCoverageResource.java  |   4 +-
 .../storage/aggregate/ConcatenatedFeatureSet.java  |   2 +-
 .../aggregate/ConcatenatedGridCoverage.java        |   2 +-
 .../aggregate/ConcatenatedGridResource.java        |   2 +-
 .../sis/storage/aggregate/CoverageAggregator.java  |  14 +--
 .../sis/storage/aggregate/DimensionSelector.java   |   2 +-
 .../sis/storage/aggregate/GridSliceLocator.java    |   2 +-
 .../sis/storage/aggregate/GroupAggregate.java      |   4 +-
 .../apache/sis/storage/aggregate/GroupByCRS.java   |   4 +-
 .../sis/storage/aggregate/GroupBySample.java       |   6 +-
 .../sis/storage/aggregate/JoinFeatureSet.java      |   6 +-
 .../sis/storage/aggregate/MergeStrategy.java       |   2 +-
 .../apache/sis/storage/event/StoreListeners.java   |  12 +--
 .../org/apache/sis/storage/tiling/TileStatus.java  |   2 +-
 .../internal/storage/esri/WritableStoreTest.java   |   4 +-
 .../sis/internal/storage/folder/StoreTest.java     |   4 +-
 .../sis/internal/storage/io/IOUtilitiesTest.java   |  32 +++---
 .../storage/io/ImageInputStreamComparator.java     |   2 +-
 .../apache/sis/storage/DataStoreProviderTest.java  |   4 +-
 .../org/apache/sis/storage/FeatureQueryTest.java   |   2 +-
 .../org/apache/sis/storage/ProbeResultTest.java    |   2 +-
 .../apache/sis/storage/StorageConnectorTest.java   |   2 +-
 .../sis/test/storage/CoverageReadConsistency.java  |   6 +-
 .../apache/sis/test/storage/SubsampledImage.java   |   6 +-
 .../apache/sis/internal/storage/gpx/Metadata.java  |   2 +-
 .../apache/sis/internal/storage/gpx/Reader.java    |   6 +-
 .../apache/sis/internal/storage/gpx/Writer.java    |   2 +-
 .../internal/storage/xml/stream/OutputType.java    |   2 +-
 .../internal/storage/xml/stream/StaxDataStore.java |  10 +-
 .../internal/storage/xml/stream/StaxStreamIO.java  |   2 +-
 .../storage/xml/stream/StaxStreamReader.java       |  28 ++---
 .../storage/xml/stream/StaxStreamWriter.java       |   2 +-
 1020 files changed, 3415 insertions(+), 3186 deletions(-)


[sis] 01/01: Bug fixes related to unmarshalling of GML documents. Those bugs were identified by OGC TestBed 18 D025 scenario. This is a port of 3 commits on `master` branch.

Posted by de...@apache.org.
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 ec0eaa68d945dadbc82f028fd79dc46b296aa2cb
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sat Nov 19 17:04:11 2022 +0100

    Bug fixes related to unmarshalling of GML documents.
    Those bugs were identified by OGC TestBed 18 D025 scenario.
    This is a port of 3 commits on `master` branch.
---
 .../sis/internal/jaxb/IdentifierMapAdapter.java    |  30 +++++-
 .../sis/internal/jaxb/SpecializedIdentifier.java   |   2 +
 .../org/apache/sis/internal/jaxb/package-info.java |   2 +-
 .../org/apache/sis/internal/metadata/Merger.java   |   6 +-
 .../java/org/apache/sis/xml/NilObjectHandler.java  |   2 +-
 .../java/org/apache/sis/xml/ReferenceResolver.java |   8 +-
 .../referencing/CC_GeneralOperationParameter.java  |  39 +++++--
 .../jaxb/referencing/CC_GeneralParameterValue.java |  11 +-
 .../jaxb/referencing/CC_OperationMethod.java       |  11 +-
 .../jaxb/referencing/CC_OperationParameter.java    |  54 +++++++---
 .../internal/jaxb/referencing/package-info.java    |   2 +-
 .../sis/internal/referencing/AxisDirections.java   |  57 +++++++++--
 .../sis/parameter/AbstractParameterDescriptor.java |   4 +-
 .../sis/parameter/DefaultParameterDescriptor.java  |  70 ++++++++++---
 .../sis/parameter/DefaultParameterValue.java       |  13 ++-
 .../sis/parameter/DefaultParameterValueGroup.java  |   8 +-
 .../org/apache/sis/parameter/ParameterFormat.java  |   3 +-
 .../java/org/apache/sis/parameter/Parameters.java  |   9 +-
 .../sis/parameter/UnmodifiableParameterValue.java  |  13 ++-
 .../sis/referencing/crs/AbstractDerivedCRS.java    |  13 +--
 .../sis/referencing/cs/CoordinateSystems.java      |   7 ++
 .../org/apache/sis/referencing/cs/Normalizer.java  |  26 +++--
 .../operation/AbstractCoordinateOperation.java     |  20 +---
 .../operation/AbstractSingleOperation.java         |   9 +-
 .../operation/DefaultConcatenatedOperation.java    |   2 +-
 .../referencing/operation/DefaultConversion.java   |  16 +--
 .../operation/DefaultOperationMethod.java          |  26 +++--
 .../operation/DefaultPassThroughOperation.java     | 112 +++++++++++++++------
 .../apache/sis/referencing/operation/SubTypes.java |   2 +-
 .../java/org/apache/sis/io/wkt/WKTParserTest.java  |   1 +
 .../storage/csv/MovingFeatureIterator.java         |   3 +-
 .../org/apache/sis/internal/storage/csv/Store.java |   2 +-
 32 files changed, 406 insertions(+), 177 deletions(-)

diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
index 95dcf08a4c..2dc9ae3436 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
@@ -18,8 +18,10 @@ package org.apache.sis.internal.jaxb;
 
 import java.net.URI;
 import java.util.Set;
+import java.util.List;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Collection;
 import java.util.Collections;
@@ -81,7 +83,7 @@ import static org.apache.sis.util.collection.Containers.hashMapCapacity;
  * This class is thread safe if the underlying identifier collection is thread safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.7
+ * @version 1.3
  *
  * @see org.apache.sis.xml.IdentifiedObject
  *
@@ -101,7 +103,10 @@ public class IdentifierMapAdapter extends AbstractMap<Citation,String> implement
 
     /**
      * The identifiers to wrap in a map view.
+     *
+     * @see #getIdentifiers(Class)
      */
+    @SuppressWarnings("serial")         // Not statically typed as Serializable.
     public final Collection<Identifier> identifiers;
 
     /**
@@ -113,6 +118,29 @@ public class IdentifierMapAdapter extends AbstractMap<Citation,String> implement
         this.identifiers = identifiers;
     }
 
+    /**
+     * Returns the identifiers as a collection of the specified type.
+     * The given type is the return type of the {@code getIdentifiers()} method which is delegating to this method.
+     * The returned collection is modifiable only if {@link #identifiers} is already of the desired type.
+     * This is the case for {@link org.apache.sis.metadata.iso.ISOMetadata#getIdentifiers()},
+     * which is the API for which we want modifiable collections.
+     *
+     * @param  type  {@code Collection.class}, {@code List.class} or {@code Set.class}.
+     * @return the identifiers as a collection of the specified type.
+     */
+    @SuppressWarnings("ReturnOfCollectionOrArrayField")
+    public final Collection<Identifier> getIdentifiers(final Class<?> type) {
+        if (!type.isInstance(identifiers)) {
+            if (type.isAssignableFrom(Set.class)) {
+                return new HashSet<>(identifiers);      // TODO: use Set.copyOf in JDK10.
+            }
+            if (type.isAssignableFrom(List.class)) {
+                return new ArrayList<>(identifiers);    // TODO: use List.copyOf in JDK10.
+            }
+        }
+        return identifiers;
+    }
+
     /**
      * If the given authority is a special case, returns its {@link NonMarshalledAuthority} integer enum.
      * Otherwise returns -1. See javadoc for more information about special cases.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java
index 235660151b..1f6f91b95d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java
@@ -60,6 +60,7 @@ public final class SpecializedIdentifier<T> implements Identifier, Cloneable, Se
      *
      * @see #getAuthority()
      */
+    @SuppressWarnings("serial")         // Not statically typed as Serializable.
     private final IdentifierSpace<T> authority;
 
     /**
@@ -72,6 +73,7 @@ public final class SpecializedIdentifier<T> implements Identifier, Cloneable, Se
      * @see #getValue()
      * @see #getCode()
      */
+    @SuppressWarnings("serial")         // Not statically typed as Serializable.
     T value;
 
     /**
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java
index 24080ec8e7..ba864f8ea2 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java
@@ -35,7 +35,7 @@
  * @author  Cédric Briançon (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.0
+ * @version 1.3
  * @since   0.3
  * @module
  */
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
index d4e6d80b81..f1af008592 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
@@ -146,13 +146,13 @@ public class Merger {
          * we are going to merge those two metadata and verify that we are not in an infinite loop.
          * We will also verify that the target metadata does not contain a source, or vice-versa.
          */
-        {   // For keeping 'sourceDone' and 'targetDone' more local.
+        {   // For keeping `sourceDone` and `targetDone` more local.
             final Boolean sourceDone = done.put(source, Boolean.FALSE);
             final Boolean targetDone = done.put(target, Boolean.TRUE);
             if (sourceDone != null || targetDone != null) {
                 if (Boolean.FALSE.equals(sourceDone) && Boolean.TRUE.equals(targetDone)) {
                     /*
-                     * At least, the 'source' and 'target' status are consistent. Pretend that we have already
+                     * At least, the `source` and `target` status are consistent. Pretend that we have already
                      * merged those metadata since actually the merge operation is probably underway by the caller.
                      */
                     return true;
@@ -265,7 +265,7 @@ distribute:                 while (it.hasNext()) {
                     if (!success) {
                         if (dryRun) break;
                         merge(target, propertyName, sourceValue, targetValue);
-                        success = true;         // If no exception has been thrown by 'merged', assume the conflict solved.
+                        success = true;         // If no exception has been thrown by `merged`, assume the conflict solved.
                     }
                 }
             }
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObjectHandler.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObjectHandler.java
index bf4ce28745..4cb46aeeb6 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObjectHandler.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObjectHandler.java
@@ -134,7 +134,7 @@ final class NilObjectHandler implements InvocationHandler {
                 }
                 case "getIdentifiers": {
                     return (attribute instanceof IdentifierMapAdapter) ?
-                            ((IdentifierMapAdapter) attribute).identifiers : null;
+                            ((IdentifierMapAdapter) attribute).getIdentifiers(method.getReturnType()) : null;
                 }
                 case "toString": {
                     return Strings.bracket(getInterface(proxy), attribute);
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/ReferenceResolver.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/ReferenceResolver.java
index e570506272..9370c71f42 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/ReferenceResolver.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/ReferenceResolver.java
@@ -68,8 +68,8 @@ public class ReferenceResolver {
      *   <li>{@link IdentifiedObject#getIdentifierMap()} will return a {@link java.util.Map}
      *       view over the given identifiers.</li>
      *   <li>All other methods except the ones inherited from the {@link Object} class will return
-     *       an empty collection, an empty array, {@code null}, {@link Double#NaN NaN}, 0 or
-     *       {@code false}, depending on the method return type.</li>
+     *       an empty collection, an empty array, {@code null}, {@link Double#NaN}, 0 or {@code false},
+     *       depending on the method return type.</li>
      * </ul>
      *
      * @param  <T>          the compile-time type of the {@code type} argument.
@@ -135,10 +135,10 @@ public class ReferenceResolver {
                 return type.cast(object);
             } else {
                 final short key;
-                final Object args;
+                final Object[] args;
                 if (object == null) {
                     key = Errors.Keys.NotABackwardReference_1;
-                    args = id;
+                    args = new Object[] {id};
                 } else {
                     key = Errors.Keys.UnexpectedTypeForReference_3;
                     args = new Object[] {id, type, object.getClass()};
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralOperationParameter.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralOperationParameter.java
index 717cec4cd2..c67f5b7249 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralOperationParameter.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralOperationParameter.java
@@ -38,11 +38,15 @@ import org.apache.sis.parameter.DefaultParameterValueGroup;
 import org.apache.sis.parameter.Parameters;
 import org.apache.sis.referencing.NamedIdentifier;
 import org.apache.sis.referencing.IdentifiedObjects;
+import org.apache.sis.referencing.GeodeticException;
 import org.apache.sis.util.collection.Containers;
 import org.apache.sis.util.CorruptedObjectException;
 import org.apache.sis.internal.util.CollectionsExt;
 import org.apache.sis.internal.jaxb.gco.PropertyType;
 import org.apache.sis.internal.jaxb.Context;
+import org.apache.sis.util.resources.Errors;
+import org.apache.sis.xml.IdentifiedObject;
+import org.apache.sis.xml.IdentifierSpace;
 
 
 /**
@@ -61,7 +65,7 @@ import org.apache.sis.internal.jaxb.Context;
  * </ul>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.6
+ * @version 1.3
  * @since   0.6
  * @module
  */
@@ -107,7 +111,7 @@ public final class CC_GeneralOperationParameter extends PropertyType<CC_GeneralO
     }
 
     /**
-     * Constructor for the {@link #wrap} method only.
+     * Constructor for the {@link #wrap(GeneralParameterDescriptor)} method only.
      */
     private CC_GeneralOperationParameter(final GeneralParameterDescriptor parameter) {
         super(parameter);
@@ -161,9 +165,32 @@ public final class CC_GeneralOperationParameter extends PropertyType<CC_GeneralO
     /**
      * Verifies that the given descriptor is non-null and contains at least a name.
      * This method is used after unmarshalling.
+     * We do this validation because parameter descriptors are mandatory and SIS classes need them.
+     * So we provide an error message here instead of waiting for a {@link NullPointerException}
+     * to occur in some arbitrary place.
+     *
+     * @param  descriptor  the descriptor to validate.
+     * @param  parent      the name of the element to report as the parent of {@code property}.
+     * @param  property    the name of the property to report as missing if an exception is thrown.
+     * @throws GeodeticException if the parameters are missing or invalid.
      */
-    static boolean isValid(final GeneralParameterDescriptor descriptor) {
-        return descriptor != null && descriptor.getName() != null;
+    static void validate(final GeneralParameterDescriptor descriptor, final String parent, final String property) {
+        if (descriptor == null || descriptor.getName() == null) {
+            short key = Errors.Keys.MissingComponentInElement_2;
+            String[] args = {parent, property};
+            /*
+             * The exception thrown by this method must be unchecked,
+             * otherwise JAXB just reports is without propagating it.
+             */
+            if (descriptor instanceof IdentifiedObject) {
+                final String link = ((IdentifiedObject) descriptor).getIdentifierMap().get(IdentifierSpace.XLINK);
+                if (link != null) {
+                    key = Errors.Keys.NotABackwardReference_1;
+                    args = new String[] {link};
+                }
+            }
+            throw new GeodeticException(Errors.format(key, args));
+        }
     }
 
     /**
@@ -259,8 +286,8 @@ public final class CC_GeneralOperationParameter extends PropertyType<CC_GeneralO
          * be invoked recursively for each parameter in the group.
          */
         final Map<String,Object> merged = new HashMap<>(expected);
-        merged.putAll(actual);  // May overwrite predefined properties.
-        mergeArrays(GeneralParameterDescriptor.ALIAS_KEY,       GenericName.class, provided.getAlias(),       merged, complete.getName());
+        merged.putAll(actual);                                      // May overwrite predefined properties.
+        mergeArrays(GeneralParameterDescriptor.ALIAS_KEY,       GenericName.class, provided.getAlias(), merged, complete.getName());
         mergeArrays(GeneralParameterDescriptor.IDENTIFIERS_KEY, Identifier.class,  provided.getIdentifiers(), merged, null);
         if (isGroup) {
             final List<GeneralParameterDescriptor> descriptors = ((ParameterDescriptorGroup) provided).descriptors();
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralParameterValue.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralParameterValue.java
index 04ce67518b..7856c9dc1d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralParameterValue.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_GeneralParameterValue.java
@@ -24,7 +24,6 @@ import org.opengis.parameter.GeneralParameterValue;
 import org.apache.sis.parameter.DefaultParameterValue;
 import org.apache.sis.parameter.DefaultParameterValueGroup;
 import org.apache.sis.internal.jaxb.gco.PropertyType;
-import org.apache.sis.util.resources.Errors;
 
 
 /**
@@ -32,7 +31,7 @@ import org.apache.sis.util.resources.Errors;
  * package documentation for more information about JAXB and interface.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.6
+ * @version 1.3
  * @since   0.6
  * @module
  */
@@ -110,13 +109,7 @@ public final class CC_GeneralParameterValue extends PropertyType<CC_GeneralParam
      * @param  parameter  the unmarshalled element.
      */
     public void setElement(final GeneralParameterValue parameter) {
-        if (!CC_GeneralOperationParameter.isValid(parameter.getDescriptor())) {
-            /*
-             * Descriptors are mandatory and SIS classes need them. Provide an error message
-             * here instead of waiting for a NullPointerException in some arbitrary place.
-             */
-            throw new IllegalArgumentException(Errors.format(Errors.Keys.MissingValueForProperty_1, "operationParameter"));
-        }
         metadata = parameter;
+        CC_GeneralOperationParameter.validate(parameter.getDescriptor(), "ParameterValue", "operationParameter");
     }
 }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
index 0d565bc285..5d4ff2f852 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
@@ -32,7 +32,6 @@ import org.opengis.parameter.ParameterDescriptorGroup;
 import org.opengis.referencing.operation.OperationMethod;
 import org.apache.sis.internal.jaxb.Context;
 import org.apache.sis.internal.jaxb.gco.PropertyType;
-import org.apache.sis.internal.metadata.Identifiers;
 import org.apache.sis.internal.referencing.CoordinateOperations;
 import org.apache.sis.internal.referencing.provider.MapProjection;
 import org.apache.sis.parameter.DefaultParameterValue;
@@ -48,7 +47,7 @@ import org.apache.sis.util.ArraysExt;
  * package documentation for more information about JAXB and interface.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.3
  * @since   0.6
  * @module
  */
@@ -108,14 +107,8 @@ public final class CC_OperationMethod extends PropertyType<CC_OperationMethod, O
      * @param  method  the unmarshalled element.
      */
     public void setElement(final DefaultOperationMethod method) {
-        if (!CC_GeneralOperationParameter.isValid(method.getParameters())) {
-            /*
-             * Parameters are mandatory and SIS classes need them. Provide an error message
-             * here instead of waiting for a NullPointerException in some arbitrary place.
-             */
-            throw new IllegalArgumentException(Identifiers.missingValueForProperty(method.getName(), "parameters"));
-        }
         metadata = method;
+        CC_GeneralOperationParameter.validate(method.getParameters(), "OperationMethod", "parameter");
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameter.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameter.java
index a00d2a31f0..7970ef1f42 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameter.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameter.java
@@ -37,7 +37,7 @@ import org.apache.sis.parameter.DefaultParameterDescriptor;
  * infer it from the actual value.</p>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.3
  * @since   0.6
  * @module
  */
@@ -118,6 +118,40 @@ public final class CC_OperationParameter extends PropertyType<CC_OperationParame
         metadata = parameter;
     }
 
+    /**
+     * Returns the base class of parameter values, or {@code null} if unknown.
+     * This method assumes that the parameter value does not yet have a descriptor
+     * (which happens at GML unmarshalling time) and that the type must be derived
+     * from the actual value.
+     *
+     * @param  param  the parameter from which to get the value class.
+     * @return base class of values, or {@code null} if unknown.
+     */
+    public static Class<?> valueClass(final ParameterValue<?> param) {
+        final Object value = param.getValue();
+        return (value != null) ? value.getClass() : null;
+    }
+
+    /**
+     * Saves the unit of measurement in a boundless range. This method should be invoked only when
+     * {@link #valueClass} is {@link Double} or {@code double[]}. It is the case in a well-formed GML.
+     *
+     * @param  param  the parameter from which to get the unit of measurement.
+     * @return unit of measurement wrapped in a boundless range, or {@code null} if none.
+     */
+    public static MeasurementRange<?> valueDomain(final ParameterValue<?> param) {
+        Unit<?> unit = param.getUnit();
+        if (unit == null) {
+            return null;
+        }
+        unit = unit.getSystemUnit();
+        if (Units.RADIAN.equals(unit)) {
+            unit = Units.DEGREE;
+        }
+        return MeasurementRange.create(Double.NEGATIVE_INFINITY, false,
+                                       Double.POSITIVE_INFINITY, false, unit);
+    }
+
     /**
      * Invoked by JAXB during unmarshalling of the enclosing {@code <gml:OperationParameter>},
      * before the child {@link DefaultParameterDescriptor}. This method stores the class and
@@ -129,21 +163,9 @@ public final class CC_OperationParameter extends PropertyType<CC_OperationParame
      */
     private void beforeUnmarshal(final Unmarshaller unmarshaller, final Object parent) {
         if (parent instanceof ParameterValue<?>) {
-            final Object value = ((ParameterValue<?>) parent).getValue();
-            if (value != null) {
-                valueClass = value.getClass();
-                Unit<?> unit = ((ParameterValue<?>) parent).getUnit();
-                if (unit != null) {
-                    unit = unit.getSystemUnit();
-                    if (Units.RADIAN.equals(unit)) {
-                        unit = Units.DEGREE;
-                    }
-                    assert (valueClass == Double.class) || (valueClass == double[].class) : valueClass;
-                    valueDomain = MeasurementRange.create(Double.NEGATIVE_INFINITY, false,
-                                                          Double.POSITIVE_INFINITY, false, unit);
-                }
-                Context.setWrapper(Context.current(), this);
-            }
+            valueClass  = valueClass ((ParameterValue<?>) parent);
+            valueDomain = valueDomain((ParameterValue<?>) parent);
+            Context.setWrapper(Context.current(), this);
         }
     }
 
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/package-info.java
index 90b01e5d26..f1ca5cea95 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/package-info.java
@@ -24,7 +24,7 @@
  * @author  Guilhem Legal (Geomatys)
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.7
+ * @version 1.3
  *
  * @see javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/AxisDirections.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/AxisDirections.java
index 61b238cb1c..1ce30a6e87 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/AxisDirections.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/AxisDirections.java
@@ -44,7 +44,7 @@ import static org.apache.sis.util.CharSequences.*;
  * Utilities methods related to {@link AxisDirection}.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.3
  * @since   0.4
  * @module
  */
@@ -76,17 +76,31 @@ public final class AxisDirections extends Static {
     private static final int LAST_ORDINAL = DISPLAY_DOWN.ordinal();
 
     /**
-     * Distance from the origin in a polar coordinate system.
-     * Specified in ISO 19162 but not yet in ISO 19111.
+     * Forward direction.
+     * For an observer at the centre of the object this is will be towards its front, bow or nose.
+     * Added in ISO 19111:2019 (was not in ISO 19111:2007).
      *
-     * @since 0.7
+     * @since 1.3
+     */
+    @UML(identifier="forward", obligation=CONDITIONAL, specification=ISO_19162)
+    public static final AxisDirection FORWARD = AxisDirection.valueOf("FORWARD");
+    /*
+     * TODO: remove @Ignore in `WKTParserTest` after the code list values in this class have been removed.
      */
-    @UML(identifier="awayFrom", obligation=CONDITIONAL, specification=ISO_19162)
-    public static final AxisDirection AWAY_FROM = AxisDirection.valueOf("AWAY_FROM");
+
+    /**
+     * Starboard direction.
+     * For an observer at the centre of the object this will be towards its right.
+     * Added in ISO 19111:2019 (was not in ISO 19111:2007).
+     *
+     * @since 1.3
+     */
+    @UML(identifier="starboard", obligation=CONDITIONAL, specification=ISO_19162)
+    public static final AxisDirection STARBOARD = AxisDirection.valueOf("STARBOARD");
 
     /**
      * Direction of geographic angles (bearing).
-     * Specified in ISO 19162 but not yet in ISO 19111.
+     * Added in ISO 19111:2019 (was not in ISO 19111:2007).
      *
      * @since 0.7
      */
@@ -95,13 +109,22 @@ public final class AxisDirections extends Static {
 
     /**
      * Direction of arithmetic angles. Used in polar coordinate systems.
-     * Specified in ISO 19162 but not yet in ISO 19111.
+     * Added in ISO 19111:2019 (was not in ISO 19111:2007).
      *
      * @since 0.7
      */
     @UML(identifier="counterClockwise", obligation=CONDITIONAL, specification=ISO_19162)
     public static final AxisDirection COUNTER_CLOCKWISE = AxisDirection.valueOf("COUNTER_CLOCKWISE");
 
+    /**
+     * Distance from the origin in a polar coordinate system.
+     * Added in ISO 19111:2019 (was not in ISO 19111:2007).
+     *
+     * @since 0.7
+     */
+    @UML(identifier="awayFrom", obligation=CONDITIONAL, specification=ISO_19162)
+    public static final AxisDirection AWAY_FROM = AxisDirection.valueOf("AWAY_FROM");
+
     /**
      * For each direction, the opposite direction.
      * This map shall be immutable after construction.
@@ -345,6 +368,20 @@ public final class AxisDirections extends Static {
         return ordinal >= COLUMN_POSITIVE.ordinal() && ordinal <= ROW_NEGATIVE.ordinal();
     }
 
+    /**
+     * Arithmetic angle between forward/aft/port/starboard directions only.
+     * This is the angle as viewed from above the vehicle.
+     *
+     * @param  source  the start direction.
+     * @param  target  the final direction.
+     * @return the angle as a multiple of 90°, or {@link Integer#MIN_VALUE} if none.
+     */
+    public static int angleForVehicle(final AxisDirection source, final AxisDirection target) {
+        if (source == STARBOARD && target == FORWARD) return +1;
+        if (source == FORWARD && target == STARBOARD) return -1;
+        return Integer.MIN_VALUE;
+    }
+
     /**
      * Angle between geocentric directions only.
      *
@@ -367,7 +404,7 @@ public final class AxisDirections extends Static {
     }
 
     /**
-     * Angle between compass directions only (not for angle between direction along meridians).
+     * Arithmetic angle between compass directions only (not for angle between direction along meridians).
      *
      * @param  source  the start direction.
      * @param  target  the final direction.
@@ -394,7 +431,7 @@ public final class AxisDirections extends Static {
     }
 
     /**
-     * Angle between display directions only.
+     * Arithmetic angle between display directions only.
      *
      * @param  source  the start direction.
      * @param  target  the final direction.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/AbstractParameterDescriptor.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/AbstractParameterDescriptor.java
index 7ad14d59cf..4e2d96d22d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/AbstractParameterDescriptor.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/AbstractParameterDescriptor.java
@@ -124,7 +124,7 @@ public abstract class AbstractParameterDescriptor extends AbstractIdentifiedObje
      * The maximum number of times that values for this parameter group are required, as an unsigned short.
      * Value {@code 0xFFFF} (or -1) means an unrestricted number of occurrences.
      *
-     * <p>We use a short because this value is usually 1 or a very small number like 2 or 3. This also serve
+     * <p>We use a short because this value is usually 1 or a very small number like 2 or 3. It also serves
      * as a safety since a large number would be a bad idea with this parameter implementation.</p>
      *
      * <p><b>Consider this field as final!</b>
@@ -203,7 +203,7 @@ public abstract class AbstractParameterDescriptor extends AbstractIdentifiedObje
         maximumOccurs = crop(descriptor.getMaximumOccurs());
     }
 
-    // NOTE: There is no 'castOrCopy' static method in this class because AbstractParameterDescriptor is abstract.
+    // NOTE: There is no `castOrCopy` static method in this class because AbstractParameterDescriptor is abstract.
     // If nevertheless we choose to add such method in the future, then CC_GeneralOperationParameter.getElement()
     // should be simplified.
 
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java
index e3005a2139..4e0cc586da 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java
@@ -87,10 +87,12 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
 
     /**
      * The class that describe the type of parameter values.
+     * This field should be considered final after construction.
+     * This is declared non-final only for GML unmarshalling.
      *
      * @see #getValueClass()
      */
-    private final Class<T> valueClass;
+    private Class<T> valueClass;
 
     /**
      * A set of valid values (usually from a {@linkplain CodeList code list})
@@ -112,9 +114,12 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
      *       <code>valueClass.{@linkplain Class#getComponentType() getComponentType()}</code>.</li>
      * </ul>
      *
+     * This field should be considered final after construction.
+     * This is declared non-final only for GML unmarshalling.
+     *
      * @see #getValueDomain()
      */
-    private final Range<?> valueDomain;
+    private Range<?> valueDomain;
 
     /**
      * The default value for the parameter, or {@code null}.
@@ -272,7 +277,6 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
      *
      * @see #castOrCopy(ParameterDescriptor)
      */
-    @SuppressWarnings("unchecked")
     protected DefaultParameterDescriptor(final ParameterDescriptor<T> descriptor) {
         super(descriptor);
         valueClass   = descriptor.getValueClass();
@@ -399,6 +403,7 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
     @Override
     @SuppressWarnings("unchecked")
     public Comparable<T> getMinimumValue() {
+        final Range<?> valueDomain = this.valueDomain;
         return (valueDomain != null && valueDomain.getElementType() == valueClass)
                ? (Comparable<T>) valueDomain.getMinValue() : null;
     }
@@ -417,6 +422,7 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
     @Override
     @SuppressWarnings("unchecked")
     public Comparable<T> getMaximumValue() {
+        final Range<?> valueDomain = this.valueDomain;
         return (valueDomain != null && valueDomain.getElementType() == valueClass)
                ? (Comparable<T>) valueDomain.getMaxValue() : null;
     }
@@ -447,6 +453,7 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
      */
     @Override
     public Unit<?> getUnit() {
+        final Range<?> valueDomain = this.valueDomain;
         return (valueDomain instanceof MeasurementRange<?>) ? ((MeasurementRange<?>) valueDomain).unit() : null;
     }
 
@@ -517,10 +524,10 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
                 }
                 case STRICT: {
                     final DefaultParameterDescriptor<?> that = (DefaultParameterDescriptor<?>) object;
-                    return                    this.valueClass == that.valueClass   &&
-                           Objects.    equals(this.validValues,  that.validValues) &&
-                           Objects.    equals(this.valueDomain,  that.valueDomain) &&
-                           Objects.deepEquals(this.defaultValue, that.defaultValue);
+                    return                    valueClass == that.valueClass   &&
+                           Objects.    equals(validValues,  that.validValues) &&
+                           Objects.    equals(valueDomain,  that.valueDomain) &&
+                           Objects.deepEquals(defaultValue, that.defaultValue);
                 }
             }
         }
@@ -553,7 +560,7 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
 
 
     /**
-     * Constructs a new object in which every attributes are set to a null value.
+     * Constructs a new object in which attributes may be set to a null value.
      * <strong>This is not a valid object.</strong> This constructor is strictly
      * reserved to JAXB, which will assign values to the fields using reflection.
      *
@@ -570,16 +577,55 @@ public class DefaultParameterDescriptor<T> extends AbstractParameterDescriptor i
              * This unsafe cast would be forbidden if this constructor was public or used in any context where the
              * user can choose the value of <T>. But this constructor should be invoked only during unmarshalling,
              * after the creation of the ParameterValue (this is the reverse creation order than what we normally
-             * do through the public API). The 'valueClass' should be compatible with DefaultParameterValue.value,
+             * do through the public API). The `valueClass` should be compatible with DefaultParameterValue.value,
              * and the parameterized type visible to the user should be only <?>.
              */
             valueClass  = (Class) param.valueClass;
             valueDomain = param.valueDomain;
-        } else {
-            valueClass  = null;
-            valueDomain = null;
         }
         validValues  = null;
         defaultValue = null;
     }
+
+    /**
+     * Invoked by {@link DefaultParameterValue} when the descriptor is set after the value at unmarshalling time.
+     * There is two scenarios in a valid GML document. The first scenario is when the descriptor is defined inside
+     * the parameter value element, like below. In such case, {@link #valueClass} is defined at construction time
+     * by {@link #DefaultParameterDescriptor()} because the value is before the descriptor.
+     *
+     * {@preformat xml
+     *   <gml:ParameterValue>
+     *     <gml:value uom="…">…</gml:value>
+     *     <gml:operationParameter>
+     *       <gml:OperationParameter>
+     *         …
+     *       </gml:OperationParameter>
+     *     </gml:operationParameter>
+     *   </gml:ParameterValue>
+     * }
+     *
+     * In the second scenario shows below, the descriptor was defined before the value and is referenced by a link.
+     * In that case, {@link #valueClass} is {@code null} the first time that this method is invoked. It may become
+     * non-null if the same parameter descriptor is reused for many parameter values.
+     *
+     * {@preformat xml
+     *   <gml:ParameterValue>
+     *     <gml:value uom="…">…</gml:value>
+     *     <gml:operationParameter xlink:href="#LongitudeRotation"/>
+     *   </gml:ParameterValue>
+     * }
+     *
+     * This method modifies the state of this class despite the fact that it should be immutable.
+     * It is okay because we are updating an instance created during GML unmarshalling, and that
+     * instance should not have been given to user yet.
+     *
+     * @param  param  the parameter value from which to infer the value type.
+     */
+    @SuppressWarnings("unchecked")
+    final void setValueClass(final DefaultParameterValue<?> param) {
+        valueClass = (Class) Classes.findCommonClass(valueClass, CC_OperationParameter.valueClass(param));
+        if (valueDomain == null) {
+            valueDomain = CC_OperationParameter.valueDomain(param);
+        }
+    }
 }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
index 3a3fd6be37..6c423cdcd0 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
@@ -118,7 +118,7 @@ import static org.apache.sis.util.Utilities.deepEquals;
  * for modifying the behavior of all getter and setter methods.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.2
+ * @version 1.3
  *
  * @param  <T>  the type of the value stored in this parameter.
  *
@@ -1129,14 +1129,21 @@ convert:            if (componentType != null) {
 
     /**
      * Invoked by JAXB at unmarshalling time.
-     * May also be invoked by {@link DefaultParameterValueGroup} if the descriptor as been completed
+     * May also be invoked by {@link DefaultParameterValueGroup} if the descriptor has been completed
      * with additional information provided in the {@code <gml:group>} element of a descriptor group.
      *
      * @see #getDescriptor()
      */
     final void setDescriptor(final ParameterDescriptor<T> descriptor) {
         this.descriptor = descriptor;
-        assert (value == null) || descriptor.getValueClass().isInstance(value) : this;
+        if (descriptor instanceof DefaultParameterDescriptor<?>) {
+            ((DefaultParameterDescriptor<?>) descriptor).setValueClass(this);
+        }
+        /*
+         * A previous version was doing `assert descriptor.getValueClass().isInstance(value)`
+         * where the value class was inferred by `DefaultParameterDescriptor()`. But it does
+         * not always work, and the `NullPointerException` seems to be caught by JAXB.
+         */
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
index b0c28806aa..e28988010e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
@@ -559,7 +559,7 @@ scan:   for (final GeneralParameterValue param : actual.values()) {
     /**
      * Invoked by JAXB for setting the group parameter descriptor. Those parameter are redundant with
      * the parameters associated to the values given to {@link #setValues(GeneralParameterValue[])},
-     * except the the group identification (name, <i>etc.</i>) and for any optional parameters which
+     * except for the group identification (name, <i>etc.</i>) and for any optional parameters which
      * were not present in the above {@code GeneralParameterValue} array.
      *
      * @see #getDescriptor()
@@ -611,9 +611,9 @@ scan:   for (final GeneralParameterValue param : actual.values()) {
      * Appends all parameter values. In this process, we may need to update the descriptor of some values
      * if those descriptors changed as a result of the above merge process.
      *
-     * @param parameters   The parameters to add, or {@code null} for {@link #values}.
-     * @param replacements The replacements to apply in the {@code GeneralParameterValue} instances.
-     * @param addTo        Where to store the new values.
+     * @param parameters    the parameters to add, or {@code null} for {@link #values}.
+     * @param replacements  the replacements to apply in the {@code GeneralParameterValue} instances.
+     * @param addTo         where to store the new values.
      */
     @SuppressWarnings({"unchecked", "AssignmentToCollectionOrArrayFieldFromParameter"})
     private void setValues(GeneralParameterValue[] parameters,
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
index 7d7131bb37..e34af12dd4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
@@ -692,7 +692,8 @@ public class ParameterFormat extends TabularFormat<Object> {
                 /*
                  * Writes the values, each on its own line, together with their unit of measurement.
                  */
-                final byte alignment = Number.class.isAssignableFrom(valueClass) ? TableAppender.ALIGN_RIGHT : TableAppender.ALIGN_LEFT;
+                final byte alignment = (valueClass != null && Number.class.isAssignableFrom(valueClass))
+                                     ? TableAppender.ALIGN_RIGHT : TableAppender.ALIGN_LEFT;
                 table.setCellAlignment(alignment);
                 final int length = row.values.size();
                 for (int i=0; i<length; i++) {
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
index f20dd66569..ed74415469 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
@@ -38,6 +38,7 @@ import org.apache.sis.util.UnconvertibleObjectException;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.ObjectConverters;
 import org.apache.sis.util.resources.Errors;
+import org.apache.sis.util.Classes;
 import org.apache.sis.util.Debug;
 
 
@@ -356,9 +357,15 @@ public abstract class Parameters implements ParameterValueGroup, Cloneable {
             if (descriptor instanceof DefaultParameterDescriptor<?>) {
                 return ((DefaultParameterDescriptor<?>) descriptor).getValueDomain();
             }
-            final Class<?> valueClass = descriptor.getValueClass();
+            Class<?> valueClass = descriptor.getValueClass();
             final Comparable<?> minimumValue = descriptor.getMinimumValue();
             final Comparable<?> maximumValue = descriptor.getMaximumValue();
+            if (valueClass == null) {       // Should never be null, but invalid objects exist.
+                valueClass = Classes.findCommonClass(Classes.getClass(minimumValue), Classes.getClass(maximumValue));
+                if (valueClass == null) {
+                    valueClass = Object.class;
+                }
+            }
             if ((minimumValue == null || valueClass.isInstance(minimumValue)) &&
                 (maximumValue == null || valueClass.isInstance(maximumValue)))
             {
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java
index bccdeb3951..4fa432ec27 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java
@@ -49,7 +49,7 @@ import org.apache.sis.util.resources.Errors;
  * </div>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.6
+ * @version 1.3
  *
  * @param <T>  the type of the value stored in this parameter.
  *
@@ -100,10 +100,13 @@ final class UnmodifiableParameterValue<T> extends DefaultParameterValue<T> {
     @Override
     public T getValue() {
         T value = super.getValue();
-        if (value instanceof Cloneable) try {
-            value = getDescriptor().getValueClass().cast(Cloner.cloneIfPublic(value));
-        } catch (CloneNotSupportedException e) {
-            throw new UnsupportedOperationException(Errors.format(Errors.Keys.CloneNotSupported_1, value.getClass()), e);
+        if (value instanceof Cloneable) {
+            final Class<T> type = getDescriptor().getValueClass();      // May be null after GML unmarshalling.
+            if (type != null) try {
+                value = type.cast(Cloner.cloneIfPublic(value));
+            } catch (CloneNotSupportedException e) {
+                throw new UnsupportedOperationException(Errors.format(Errors.Keys.CloneNotSupported_1, value.getClass()), e);
+            }
         }
         return value;
     }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractDerivedCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractDerivedCRS.java
index 0f167cd410..4b3a1316d9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractDerivedCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractDerivedCRS.java
@@ -22,7 +22,6 @@ 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.ValidationException;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.datum.Datum;
 import org.opengis.referencing.crs.SingleCRS;
@@ -34,12 +33,12 @@ import org.opengis.referencing.operation.Conversion;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.operation.MathTransformFactory;
 import org.opengis.geometry.MismatchedDimensionException;
+import org.apache.sis.referencing.GeodeticException;
 import org.apache.sis.referencing.operation.DefaultConversion;
 import org.apache.sis.internal.jaxb.referencing.CC_Conversion;
 import org.apache.sis.internal.referencing.ReferencingFactoryContainer;
 import org.apache.sis.internal.metadata.ImplementationHelper;
 import org.apache.sis.internal.metadata.Identifiers;
-import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.internal.system.Semaphores;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.util.ArgumentChecks;
@@ -54,7 +53,7 @@ import static org.apache.sis.util.Utilities.deepEquals;
  * (not by a {@linkplain org.apache.sis.referencing.datum.AbstractDatum datum}).
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.2
+ * @version 1.3
  *
  * @param <C>  the conversion type, either {@code Conversion} or {@code Projection}.
  *
@@ -82,6 +81,7 @@ abstract class AbstractDerivedCRS<C extends Conversion> extends AbstractCRS impl
      *
      * @see #getConversionFromBase()
      */
+    @SuppressWarnings("serial")         // Not statically typed as Serializable.
     private C conversionFromBase;
 
     /**
@@ -162,9 +162,6 @@ abstract class AbstractDerivedCRS<C extends Conversion> extends AbstractCRS impl
         if (properties != null) {
             factory = (MathTransformFactory) properties.get(ReferencingFactoryContainer.MT_FACTORY);
         }
-        if (factory == null) {
-            factory = DefaultFactories.forBuildin(MathTransformFactory.class);
-        }
         try {
             return DefaultConversion.castOrCopy(conversion).specialize(getConversionType(), baseCRS, this, factory);
         } catch (FactoryException e) {
@@ -332,7 +329,7 @@ abstract class AbstractDerivedCRS<C extends Conversion> extends AbstractCRS impl
      * coordinate system (CS). The CS information is required by {@code createConversionFromBase(…)}
      * in order to create a {@link MathTransform} with correct axis swapping and unit conversions.
      */
-    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws ValidationException {
+    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
         String property = "conversion";
         if (conversionFromBase != null) {
             final SingleCRS baseCRS = CC_Conversion.setBaseCRS(conversionFromBase, null);  // Clear the temporary value now.
@@ -350,6 +347,6 @@ abstract class AbstractDerivedCRS<C extends Conversion> extends AbstractCRS impl
          * and call to `getConversionFromBase()` will throw a ClassCastException if this instance is actually
          * a ProjectedCRS (because of the method overriding with return type covariance).
          */
-        throw new ValidationException(Identifiers.missingValueForProperty(getName(), property));
+        throw new GeodeticException(Identifiers.missingValueForProperty(getName(), property));
     }
 }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
index d8134a7a9c..531b4a2401 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
@@ -239,6 +239,13 @@ public final class CoordinateSystems extends Static {
         if (c != Integer.MIN_VALUE) {
             return new Angle(c * 90);
         }
+        /*
+         * Check for FORWARD, AFT, PORT, STARBOARD.
+         */
+        c = AxisDirections.angleForVehicle(source, target);
+        if (c != Integer.MIN_VALUE) {
+            return new Angle(c * 90);
+        }
         /*
          * Check for DISPLAY_UP, DISPLAY_DOWN, etc. assuming a flat screen.
          * Note that we do not check for grid directions (COLUMN_POSITIVE,
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java
index dfdc5672c3..8010bc2365 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java
@@ -106,7 +106,7 @@ final class Normalizer implements Comparable<Normalizer> {
      *
      * @see #order(AxisDirection)
      */
-    private static final int SHIFT = 2;
+    private static final int SHIFT = 3;
 
     /**
      * Custom code list values to handle as if the where defined between two GeoAPI values.
@@ -115,12 +115,15 @@ final class Normalizer implements Comparable<Normalizer> {
      */
     private static final Map<AxisDirection,Integer> ORDER = new HashMap<>();
     static {
-        final Map<AxisDirection,Integer> m = ORDER;
         // Get ordinal of last compass direction defined by GeoAPI. We will continue on the horizontal plane.
-        final int horizontal = (AxisDirection.NORTH.ordinal() + (AxisDirections.COMPASS_COUNT - 1)) << SHIFT;
-        m.put(AxisDirections.AWAY_FROM,         horizontal + 1);
-        m.put(AxisDirections.COUNTER_CLOCKWISE, horizontal + 2);
-        m.put(AxisDirections.CLOCKWISE,         horizontal + 3);
+        int code = (AxisDirection.NORTH.ordinal() + (AxisDirections.COMPASS_COUNT - 1)) << SHIFT;
+        for (final AxisDirection d : new AxisDirection[] {
+            AxisDirections.FORWARD,
+            AxisDirections.STARBOARD,
+            AxisDirections.COUNTER_CLOCKWISE,
+            AxisDirections.CLOCKWISE,
+            AxisDirections.AWAY_FROM
+        }) ORDER.put(d, ++code);
     }
 
     /**
@@ -170,8 +173,9 @@ final class Normalizer implements Comparable<Normalizer> {
         if (d == 0) {
             final AxisDirection d1 = this.axis.getDirection();
             final AxisDirection d2 = that.axis.getDirection();
-            d = AxisDirections.angleForCompass(d2, d1);
-            if (d == Integer.MIN_VALUE) {
+            if ((d = AxisDirections.angleForCompass(d2, d1)) == Integer.MIN_VALUE &&
+                (d = AxisDirections.angleForVehicle(d2, d1)) == Integer.MIN_VALUE)
+            {
                 if (meridian != null) {
                     if (that.meridian != null) {
                         d = meridian.compareTo(that.meridian);
@@ -445,10 +449,10 @@ final class Normalizer implements Comparable<Normalizer> {
      */
     static AbstractCS forConvention(final CoordinateSystem cs, final AxesConvention convention) {
         switch (convention) {
-            case NORMALIZED:              // Fall through
+            case NORMALIZED:       // Fall through
             case DISPLAY_ORIENTED: return normalize(cs, convention, true);
-            case RIGHT_HANDED:            return normalize(cs, null, true);
-            case POSITIVE_RANGE:          return shiftAxisRange(cs);
+            case RIGHT_HANDED:     return normalize(cs, null, true);
+            case POSITIVE_RANGE:   return shiftAxisRange(cs);
             default: throw new AssertionError(convention);
         }
     }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
index 1528ffa922..6f7b8d5b96 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
@@ -670,23 +670,8 @@ check:      for (int isTarget=0; ; isTarget++) {        // 0 == source check; 1
     }
 
     /**
-     * Returns the object for transforming coordinates in the {@linkplain #getSourceCRS() source CRS}
-     * to coordinates in the {@linkplain #getTargetCRS() target CRS}.
-     *
-     * <h4>Use with interpolation CRS</h4>
-     * If the {@linkplain #getInterpolationCRS() interpolation CRS} is non-null, then the math transform
-     * input coordinates shall by (<var>interpolation</var>, <var>source</var>) tuples: for each value
-     * to transform, the interpolation point coordinates shall be first, followed by the source coordinates.
-     *
-     * <div class="note"><b>Example:</b>
-     * in a transformation between two {@linkplain org.apache.sis.referencing.crs.DefaultVerticalCRS vertical CRS},
-     * if the {@linkplain #getSourceCRS() source} coordinates are (<var>z</var>) values but the coordinate operation
-     * additionally requires (<var>x</var>,<var>y</var>) values for {@linkplain #getInterpolationCRS() interpolation}
-     * purpose, then the math transform input coordinates shall be (<var>x</var>,<var>y</var>,<var>z</var>) tuples in
-     * that order.</div>
-     *
-     * The interpolation coordinates will {@linkplain DefaultPassThroughOperation pass through the operation}
-     * and appear in the math transform outputs, in the same order than inputs.
+     * Returns the object for transforming coordinates in the source CRS to coordinates in the target CRS.
+     * The transform may be {@code null} if this coordinate operation is a defining conversion.
      *
      * @return the transform from source to target CRS, or {@code null} if not applicable.
      */
@@ -1208,6 +1193,7 @@ check:      for (int isTarget=0; ; isTarget++) {        // 0 == source check; 1
 
     /**
      * Invoked by JAXB after unmarshalling.
+     * May be overridden by subclasses.
      */
     void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
         computeTransientFields();
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
index 128cea0c0c..a44cc95a55 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
@@ -49,6 +49,7 @@ import org.apache.sis.internal.referencing.ReferencingUtilities;
 import org.apache.sis.internal.metadata.ImplementationHelper;
 import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.internal.metadata.Identifiers;
+import org.apache.sis.referencing.GeodeticException;
 import org.apache.sis.util.collection.Containers;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.ComparisonMode;
@@ -408,7 +409,7 @@ class AbstractSingleOperation extends AbstractCoordinateOperation implements Sin
     private void setParameters(final GeneralParameterValue[] values) {
         if (parameters == null) {
             if (!(method instanceof DefaultOperationMethod)) {  // May be a non-null proxy if defined only by xlink:href.
-                throw new IllegalStateException(Identifiers.missingValueForProperty(getName(), "method"));
+                throw new GeodeticException(Identifiers.missingValueForProperty(getName(), "method"));
             }
             /*
              * The descriptors in the <gml:method> element do not know the class of parameter value
@@ -463,6 +464,12 @@ class AbstractSingleOperation extends AbstractCoordinateOperation implements Sin
     @Override
     final void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
         super.afterUnmarshal(unmarshaller, parent);
+        if (parameters == null && method != null) {
+            final ParameterDescriptorGroup descriptor = method.getParameters();
+            if (descriptor != null && descriptor.descriptors().isEmpty()) {
+                parameters = descriptor.createValue();
+            }
+        }
         final CoordinateReferenceSystem sourceCRS = super.getSourceCRS();
         final CoordinateReferenceSystem targetCRS = super.getTargetCRS();
         if (transform == null && sourceCRS != null && targetCRS != null && parameters != null) try {
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java
index 33808373a9..6106052ceb 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java
@@ -242,7 +242,7 @@ final class DefaultConcatenatedOperation extends AbstractCoordinateOperation imp
             } else if (!step.isIdentity()) {
                 flattened.add(op);
             }
-            if (mtFactory != null && step != null) {
+            if (mtFactory != null) {
                 transform = (transform != null) ? mtFactory.createConcatenatedTransform(transform, step) : step;
             }
             /*
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java
index fe908c6503..ccc51273de 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java
@@ -36,6 +36,7 @@ import org.apache.sis.referencing.operation.transform.DefaultMathTransformFactor
 import org.apache.sis.referencing.operation.matrix.Matrices;
 import org.apache.sis.internal.referencing.ReferencingUtilities;
 import org.apache.sis.internal.referencing.Resources;
+import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.Utilities;
@@ -217,8 +218,8 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
 
     /**
      * Constructs a new conversion with the same values than the specified one, together with the
-     * specified source and target CRS. While the source conversion can be an arbitrary one, it is
-     * typically a defining conversion.
+     * specified source and target CRS. While the source conversion can be an arbitrary one,
+     * it is typically a defining conversion.
      *
      * @param definition  the defining conversion.
      * @param source      the new source CRS.
@@ -376,13 +377,14 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
      *
      * This {@code specialize(…)} method returns a conversion which implement at least the given {@code baseType}
      * interface, but may also implement a more specific GeoAPI interface if {@code specialize(…)} has been able
-     * to infer the type from this operation {@linkplain #getMethod() method}.
+     * to infer the type from the {@linkplain #getMethod() operation method}.
      *
      * @param  <T>        compile-time type of the {@code baseType} argument.
      * @param  baseType   the base GeoAPI interface to be implemented by the conversion to return.
      * @param  sourceCRS  the source CRS.
      * @param  targetCRS  the target CRS.
-     * @param  factory    the factory to use for creating a transform from the parameters or for performing axis changes.
+     * @param  factory    the factory to use for creating a transform from the parameters or for performing axis changes,
+     *                    or {@code null} for the default factory.
      * @return the conversion of the given type between the given CRS.
      * @throws ClassCastException if a contradiction is found between the given {@code baseType},
      *         the defining {@linkplain DefaultConversion#getInterface() conversion type} and
@@ -397,12 +399,11 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
      */
     public <T extends Conversion> T specialize(final Class<T> baseType,
             final CoordinateReferenceSystem sourceCRS, final CoordinateReferenceSystem targetCRS,
-            final MathTransformFactory factory) throws FactoryException
+            MathTransformFactory factory) throws FactoryException
     {
         ArgumentChecks.ensureNonNull("baseType",  baseType);
         ArgumentChecks.ensureNonNull("sourceCRS", sourceCRS);
         ArgumentChecks.ensureNonNull("targetCRS", targetCRS);
-        ArgumentChecks.ensureNonNull("factory",   factory);
         /*
          * Conceptual consistency check: verify that the new CRS use the same datum than the previous ones,
          * since the purpose of this method is not to apply datum changes. Datum changes are the purpose of
@@ -425,6 +426,9 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
                 ensureCompatibleDatum("targetCRS", sourceCRS, super.getTargetCRS());
             }
         }
+        if (factory == null) {
+            factory = DefaultFactories.forBuildin(MathTransformFactory.class);
+        }
         return SubTypes.create(baseType, this, sourceCRS, targetCRS, factory);
     }
 
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
index 9d6b58bde6..e195d20aaf 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
@@ -21,6 +21,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
 import java.util.Collections;
+import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -117,7 +118,7 @@ import static org.apache.sis.util.ArgumentChecks.*;
  * {@link org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory}.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.1
+ * @version 1.3
  *
  * @see DefaultConversion
  * @see DefaultTransformation
@@ -192,7 +193,8 @@ public class DefaultOperationMethod extends AbstractIdentifiedObject implements
      * The set of parameters, or {@code null} if none.
      *
      * <p><b>Consider this field as final!</b>
-     * This field is modified only at unmarshalling time by {@link #setDescriptors(GeneralParameterDescriptor[])}</p>
+     * This field is modified only at unmarshalling time by {@link #setDescriptors(GeneralParameterDescriptor[])}
+     * or {@link #afterUnmarshal(Unmarshaller, Object)}.</p>
      */
     @SuppressWarnings("serial")         // Not statically typed as Serializable.
     private ParameterDescriptorGroup parameters;
@@ -303,10 +305,7 @@ public class DefaultOperationMethod extends AbstractIdentifiedObject implements
         targetDimensions = transform.getTargetDimensions();
         if (transform instanceof Parameterized) {
             parameters = ((Parameterized) transform).getParameterDescriptors();
-        } else {
-            parameters = null;
         }
-        formula = null;
     }
 
     /**
@@ -632,9 +631,8 @@ public class DefaultOperationMethod extends AbstractIdentifiedObject implements
      * Returns the set of parameters.
      *
      * <div class="note"><b>Departure from the ISO 19111 standard:</b>
-     * this property is mandatory according ISO 19111, but may be null in Apache SIS if the
-     * {@link #DefaultOperationMethod(MathTransform)} constructor has been unable to infer it
-     * or if this {@code OperationMethod} has been read from an incomplete GML document.</div>
+     * this property is mandatory according ISO 19111, but may be {@code null} in Apache SIS if the
+     * {@link #DefaultOperationMethod(MathTransform)} constructor has been unable to infer it.</div>
      *
      * @return the parameters, or {@code null} if unknown.
      *
@@ -971,4 +969,16 @@ public class DefaultOperationMethod extends AbstractIdentifiedObject implements
         parameters = new DefaultParameterDescriptorGroup(IdentifiedObjects.getProperties(previous),
                 previous.getMinimumOccurs(), previous.getMaximumOccurs(), descriptors);
     }
+
+    /**
+     * Invoked by JAXB after unmarshalling. If the {@code <gml:OperationMethod>} element does not contain
+     * any {@code <gml:parameter>}, we assume that this is a valid parameterless operation (as opposed to
+     * an operation with unknown parameters). We need this assumption because, contrarily to GeoAPI model,
+     * the GML schema does not differentiate "no parameters" from "unspecified parameters".
+     */
+    private void afterUnmarshal(final Unmarshaller unmarshaller, final Object parent) {
+        if (parameters == null) {
+            parameters = CC_OperationMethod.group(super.getName(), new GeneralParameterDescriptor[0]);
+        }
+    }
 }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultPassThroughOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultPassThroughOperation.java
index 950731c638..1d3b09fc96 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultPassThroughOperation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultPassThroughOperation.java
@@ -19,24 +19,29 @@ package org.apache.sis.referencing.operation;
 import java.util.Map;
 import java.util.Arrays;
 import java.util.Objects;
+import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import org.opengis.util.FactoryException;
 import org.opengis.referencing.operation.MathTransform;
+import org.opengis.referencing.operation.Conversion;
 import org.opengis.referencing.operation.CoordinateOperation;
 import org.opengis.referencing.operation.PassThroughOperation;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.crs.CompoundCRS;
+import org.apache.sis.referencing.GeodeticException;
 import org.apache.sis.referencing.operation.transform.MathTransforms;
 import org.apache.sis.referencing.operation.transform.PassThroughTransform;
 import org.apache.sis.internal.referencing.ReferencingUtilities;
 import org.apache.sis.internal.metadata.ImplementationHelper;
 import org.apache.sis.util.UnsupportedImplementationException;
-import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.ArraysExt;
 import org.apache.sis.util.ComparisonMode;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.io.wkt.FormattableObject;
 import org.apache.sis.io.wkt.Formatter;
+import org.apache.sis.referencing.CRS;
 
 import static org.apache.sis.util.Utilities.deepEquals;
 
@@ -45,7 +50,7 @@ import static org.apache.sis.util.Utilities.deepEquals;
  * Specifies that a subset of a coordinate tuple is subject to a specific coordinate operation.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.7
+ * @version 1.3
  * @since   0.6
  * @module
  */
@@ -111,9 +116,8 @@ public class DefaultPassThroughOperation extends AbstractCoordinateOperation imp
                                        final int firstAffectedCoordinate,
                                        final int numTrailingCoordinates)
     {
-        super(properties, sourceCRS, targetCRS, null, MathTransforms.passThrough(
-                firstAffectedCoordinate, operation.getMathTransform(), numTrailingCoordinates));
-        ArgumentChecks.ensureNonNull("operation", operation);
+        super(properties, sourceCRS, targetCRS, null,
+              MathTransforms.passThrough(firstAffectedCoordinate, operation.getMathTransform(), numTrailingCoordinates));
         this.operation = operation;
     }
 
@@ -192,11 +196,11 @@ public class DefaultPassThroughOperation extends AbstractCoordinateOperation imp
         final MathTransform transform = super.getMathTransform();
         if (transform instanceof PassThroughTransform) {
             return ((PassThroughTransform) transform).getModifiedCoordinates();
-        } else {
+        } else if (operation != null) {
             /*
-             * Should not happen with objects created by public methods since the constructor created the transform
-             * itself. However may happen with operations parsed from GML. As a fallback, search in the components
-             * of CompoundCRS. This is not a universal fallback, but work for the most straightforward cases.
+             * Should not happen with objects created by public methods since the constructor created the transform itself.
+             * However may happen with operations parsed from GML. As a fallback, search in the components of CompoundCRS.
+             * This is not a universal fallback, but works for the most straightforward cases.
              */
             final CoordinateReferenceSystem sourceCRS = super.getSourceCRS();
             if (sourceCRS instanceof CompoundCRS) {
@@ -214,8 +218,8 @@ public class DefaultPassThroughOperation extends AbstractCoordinateOperation imp
                     firstAffectedCoordinate += dim;
                 }
             }
-            throw new UnsupportedImplementationException(transform.getClass());
         }
+        throw new UnsupportedImplementationException(transform.getClass());
     }
 
     /**
@@ -300,8 +304,8 @@ public class DefaultPassThroughOperation extends AbstractCoordinateOperation imp
     private DefaultPassThroughOperation() {
         /*
          * A sub-operation is mandatory for SIS working. We do not verify its presence here because the verification
-         * would have to be done in an 'afterMarshal(…)' method and throwing an exception in that method causes the
-         * whole unmarshalling to fail. But the CC_CoordinateOperation adapter does some verifications.
+         * would have to be done in an `afterMarshal(…)` method and throwing an exception in that method causes the
+         * whole unmarshalling to fail. But the `CC_CoordinateOperation` adapter does some verifications.
          */
     }
 
@@ -327,37 +331,79 @@ public class DefaultPassThroughOperation extends AbstractCoordinateOperation imp
      */
     @XmlElement(name = "modifiedCoordinate", required = true)
     private int[] getIndices() {
-        final int[] indices = getModifiedCoordinates();
-        for (int i=0; i<indices.length; i++) {
-            indices[i]++;
+        final int[] dimensions = getModifiedCoordinates();
+        for (int i=0; i<dimensions.length; i++) {
+            dimensions[i]++;
         }
-        return indices;
+        return dimensions;
     }
 
     /**
      * Invoked by JAXB at unmarshalling time for setting the modified coordinates.
+     * This method needs to be invoked last, even if the {@code <gml:modifiedCoordinate>}
+     * elements are not last in the GML document. It is the case when using JAXB because
+     * multiple occurrences of {@code <gml:modifiedCoordinate>} are aggregated in an array.
      */
-    private void setIndices(final int[] coordinates) {
-        String missing = "sourceCRS";
-        final CoordinateReferenceSystem sourceCRS = super.getSourceCRS();
-        if (sourceCRS != null) {
-            missing = "modifiedCoordinate";
-            if (coordinates != null && coordinates.length != 0) {
-                missing = "coordOperation";
-                if (operation != null) {
-                    for (int i=1; i<coordinates.length; i++) {
-                        final int previous = coordinates[i-1];
-                        if (previous < 1 || coordinates[i] != previous + 1) {
-                            throw new IllegalArgumentException(Errors.format(
-                                    Errors.Keys.CanNotAssign_2, missing, Arrays.toString(coordinates)));
+    private void setIndices(final int[] dimensions) {
+        /*
+         * Argument and state validation.
+         */
+        String missing = "modifiedCoordinate";
+        FactoryException cause = null;
+        final int n = dimensions.length;
+        if (n != 0) {
+            if (!ArraysExt.isRange(dimensions[0], dimensions))  {
+                throw new GeodeticException(Errors.format(Errors.Keys.CanNotAssign_2, missing, Arrays.toString(dimensions)));
+            }
+            missing = "sourceCRS";
+            final CoordinateReferenceSystem sourceCRS = super.getSourceCRS();
+            if (sourceCRS != null) {
+                missing = "targetCRS";
+                final CoordinateReferenceSystem targetCRS = super.getTargetCRS();
+                if (targetCRS != null) {
+                    missing = "coordOperation";
+                    if (operation != null) {
+                        /*
+                         * If the operation is a defining operation, we need to replace it by a full operation.
+                         * After that, we can store the modified coordinate indices in the transform field.
+                         */
+                        MathTransform subTransform = operation.getMathTransform();
+                        if (operation instanceof Conversion) {
+                            CoordinateReferenceSystem sourceSub = operation.getSourceCRS();
+                            CoordinateReferenceSystem targetSub = operation.getTargetCRS();
+                            if (subTransform == null || sourceSub == null || targetSub == null) try {
+                                final int[] zeroBased = dimensions.clone();
+                                for (int i=0; i<n; i++) zeroBased[i]--;
+                                if (sourceSub == null) sourceSub = CRS.selectDimensions(sourceCRS, zeroBased);
+                                if (targetSub == null) targetSub = CRS.selectDimensions(targetCRS, zeroBased);
+                                operation = DefaultConversion.castOrCopy((Conversion) operation)
+                                            .specialize(Conversion.class, sourceSub, targetSub, null);
+                                subTransform = operation.getMathTransform();
+                            } catch (FactoryException e) {
+                                cause = e;
+                            }
+                        }
+                        if (subTransform != null) {
+                            transform = MathTransforms.passThrough(dimensions[0] - 1, subTransform,
+                                    ReferencingUtilities.getDimension(sourceCRS) - dimensions[n-1]);
+                            return;
                         }
                     }
-                    transform = MathTransforms.passThrough(coordinates[0] - 1, operation.getMathTransform(),
-                            ReferencingUtilities.getDimension(sourceCRS) - coordinates[coordinates.length - 1]);
-                    return;
                 }
             }
         }
-        throw new IllegalStateException(Errors.format(Errors.Keys.MissingComponentInElement_2, missing, "PassThroughOperation"));
+        throw new GeodeticException(Errors.format(Errors.Keys.MissingComponentInElement_2, "PassThroughOperation", missing), cause);
+    }
+
+    /**
+     * Invoked by JAXB after unmarshalling. If needed, this method tries to infer source/target CRS
+     * of the nested operation from the source/target CRS if the enclosing pass-through operation.
+     */
+    @Override
+    void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
+        super.afterUnmarshal(unmarshaller, parent);
+        if (transform == null) {
+            setIndices(ArraysExt.EMPTY_INT);        // Cause an exception to be thrown.
+        }
     }
 }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubTypes.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubTypes.java
index 51e1e6445c..ea3e72e12f 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubTypes.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubTypes.java
@@ -168,7 +168,7 @@ final class SubTypes {
                     conversion = new DefaultConversion(definition, sourceCRS, targetCRS, factory, actual);
                 }
                 /*
-                 * The DefaultConversion constructor may have used by MathTransformFactory for creating the actual
+                 * The DefaultConversion constructor may have used MathTransformFactory for creating the actual
                  * MathTransform object. In such case, we can use the knownledge that the factory has about the
                  * coordinate operation for refining again the type of the object to be returned.
                  */
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTParserTest.java b/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTParserTest.java
index cb937dbd6c..9433d0f367 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTParserTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTParserTest.java
@@ -480,6 +480,7 @@ public final strictfp class WKTParserTest extends CRSParserTest {
      */
     @Test
     @Override
+    @org.junit.Ignore("Pending new AxisDirection code list in GeoAPI.")
     public void testEngineeringForShip() throws FactoryException {
         super.testEngineeringForShip();
         final CoordinateSystem cs = object.getCoordinateSystem();
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/MovingFeatureIterator.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/MovingFeatureIterator.java
index ad85cad854..6dfb161f0c 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/MovingFeatureIterator.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/MovingFeatureIterator.java
@@ -114,7 +114,8 @@ final class MovingFeatureIterator extends FeatureIterator implements Consumer<Lo
 
     /**
      * Executes the given action for the next moving feature or for all remaining moving features.
-     * This method assumes that the 4 first columns are as documented in the code inside constructor.
+     * This method assumes that the 4 first columns are identifier, start time, end time and
+     * optional attributes in that order.
      *
      * @param  action  the action to execute as soon as the {@code mfidref} change, or {@code null} if none.
      * @param  all     {@code true} for executing the given action on all remaining features.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
index 1322b78f86..27f9685fb7 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
@@ -263,7 +263,7 @@ final class Store extends URIDataStore implements FeatureSet {
                             throw new DataStoreContentException(Resources.forLocale(getLocale())
                                     .getString(Resources.Keys.ShallBeDeclaredBefore_2, "@columns", "@stboundedby"));
                         }
-                        envelope = parseEnvelope(elements);     // Also set 'timeEncoding' and 'spatialDimensionCount'.
+                        envelope = parseEnvelope(elements);     // Also set `timeEncoding` and `spatialDimensionCount`.
                         dissociate |= (timeEncoding == null);   // Need to be updated before parseFeatureType(…) execution.
                         break;
                     }