sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 01/01: Merge branch 'geoapi-4.0' into geoapi-3.1.
Date Tue, 03 Jul 2018 13:39:39 GMT
This is an automated email from the ASF dual-hosted git repository.

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

commit 585bdddc9547218d1cd42a3a96c964e8ecd9e141
Merge: fcd6c5d 22e0930
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Tue Jul 3 12:49:22 2018 +0200

    Merge branch 'geoapi-4.0' into geoapi-3.1.

 .gitattributes                                     |  44 ++
 .../java/org/apache/sis/console/package-info.java  |   2 +-
 .../src/main/java/org/apache/sis/gui/Main.java     | 204 ++++++
 .../org/apache/sis/gui/dataset/FeatureTable.java   | 169 +++++
 .../org/apache/sis/gui/dataset/ResourceTree.java   |  23 +-
 .../org/apache/sis/gui/metadata/MetadataNode.java  | 228 ++++++
 .../apache/sis/gui/metadata/MetadataOverview.java  | 430 +++++++++++
 .../org/apache/sis/gui/metadata/ResourceView.java  | 399 ++++++++++
 .../sis/gui/{crs => referencing}/CRSButton.java    |   2 +-
 .../sis/gui/{crs => referencing}/CRSChooser.java   |  81 +-
 .../sis/gui/{crs => referencing}/CRSTable.java     |  69 +-
 .../apache/sis/gui/{crs => referencing}/Code.java  |  54 +-
 .../WKTPane.java}                                  |  16 +-
 .../org/apache/sis/internal/gui/FXUtilities.java   |  91 +++
 .../org/apache/sis/internal/gui/FontGlyphs.java    |  13 +-
 .../apache/sis/internal/gui/JavaFxUtilities.java   |  98 ---
 .../apache/sis/{ => internal}/gui/Resources.java   |  94 +--
 .../sis/{ => internal}/gui/Resources.properties    |   9 +-
 .../sis/{ => internal}/gui/Resources_fr.properties |   9 +-
 .../org/apache/sis/internal/gui}/package-info.java |  10 +-
 .../org/apache/sis/gui/crs/CRSChooser.fxml         |  36 -
 .../apache/sis/gui/metadata/WorldMap360x180.png    | Bin 0 -> 1886 bytes
 .../org/apache/sis/gui/referencing/CRSChooser.fxml |  30 +
 .../sis/gui/{crs => referencing}/proj_conic.png    | Bin
 .../sis/gui/{crs => referencing}/proj_geo.png      | Bin
 .../sis/gui/{crs => referencing}/proj_square.png   | Bin
 .../sis/gui/{crs => referencing}/proj_stereo.png   | Bin
 .../sis/gui/{crs => referencing}/proj_utm.png      | Bin
 .../org/apache/sis/test/suite/package-info.txt     |   3 +
 .../apache/sis/feature/AbstractAssociation.java    |   2 -
 .../org/apache/sis/feature/AbstractAttribute.java  |   2 -
 .../org/apache/sis/feature/AbstractOperation.java  |   2 -
 .../apache/sis/feature/DefaultAssociationRole.java |   2 -
 .../apache/sis/feature/DefaultAttributeType.java   |   2 -
 .../java/org/apache/sis/feature/PropertyView.java  |   2 -
 .../apache/sis/feature/builder/TypeBuilder.java    |   2 -
 .../org/apache/sis/feature/CustomAttribute.java    |   2 +-
 .../java/org/apache/sis/internal/jaxb/Context.java |   1 +
 .../sis/internal/jaxb/IdentifierMapAdapter.java    |   3 -
 .../sis/internal/jaxb/NonMarshalledAuthority.java  |  18 +-
 .../sis/internal/jaxb/SpecializedIdentifier.java   |   2 -
 .../apache/sis/internal/jaxb/cat/CodeListUID.java  |   2 +-
 .../internal/jaxb/code/MD_CharacterSetLegacy.java  |   2 +-
 .../sis/internal/jaxb/code/MD_MediumNameCode.java  |   2 +-
 .../sis/internal/jaxb/code/package-info.java       |   2 +-
 .../sis/internal/jaxb/gco/GO_CharacterString.java  |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_DateTime.java  |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_Decimal.java   |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_Integer.java   |   7 +-
 .../apache/sis/internal/jaxb/gco/GO_Integer64.java |   4 +-
 ...GO_Integer64.java => GO_MultiplicityRange.java} |  53 +-
 .../apache/sis/internal/jaxb/gco/GO_Record.java    |   2 +-
 .../sis/internal/jaxb/gco/GO_RecordType.java       |   2 +-
 ...{GO_Integer64.java => GO_UnlimitedInteger.java} |  46 +-
 .../apache/sis/internal/jaxb/gco/Multiplicity.java |  92 +++
 .../sis/internal/jaxb/gco/MultiplicityRange.java   | 107 +++
 .../sis/internal/jaxb/gco/UnlimitedInteger.java    | 120 +++
 .../sis/internal/jaxb/gmi/LE_ProcessStep.java      |   1 -
 .../apache/sis/internal/jaxb/gmi/LE_Source.java    |   1 -
 .../org/apache/sis/internal/jaxb/gmi/MI_Band.java  |   1 -
 .../internal/jaxb/gmi/MI_CoverageDescription.java  |   1 -
 .../sis/internal/jaxb/gmi/MI_Georectified.java     |   1 -
 .../sis/internal/jaxb/gmi/MI_Georeferenceable.java |   1 -
 .../sis/internal/jaxb/gmi/MI_ImageDescription.java |   1 -
 .../apache/sis/internal/jaxb/gmi/MI_Metadata.java  |   3 +-
 .../apache/sis/internal/jaxb/gmi/package-info.java |   2 +-
 .../apache/sis/internal/jaxb/gml/DateAdapter.java  |   2 +-
 .../org/apache/sis/internal/jaxb/gml/Measure.java  |   2 +-
 .../apache/sis/internal/jaxb/gml/TM_Primitive.java |   2 +-
 .../apache/sis/internal/jaxb/gml/TimeInstant.java  |   2 +-
 .../apache/sis/internal/jaxb/gml/TimePeriod.java   |   2 +-
 .../internal/jaxb/gml/UniversalTimeAdapter.java    |   6 +-
 .../sis/internal/jaxb/gts/TM_PeriodDuration.java   |   2 +-
 .../org/apache/sis/internal/jaxb/lan/Country.java  |   2 +-
 .../jaxb/lan/LocalisedCharacterString.java         |   2 -
 .../apache/sis/internal/jaxb/lan/PT_Locale.java    |   2 +-
 .../apache/sis/internal/jaxb/lan/TextGroup.java    |   2 -
 .../jaxb/metadata/CI_ResponsibleParty.java         |   4 +-
 .../sis/internal/jaxb/metadata/RS_Identifier.java  |  11 +-
 .../metadata/replace/ReferenceSystemMetadata.java  |   2 +-
 .../jaxb/metadata/replace/ServiceParameter.java    |   2 +-
 .../jaxb/metadata/replace/package-info.java        |   2 +-
 .../org/apache/sis/internal/jaxb/package-info.java |   1 +
 .../sis/internal/metadata/MetadataTypes.java       |   4 +-
 .../sis/internal/metadata/ReferencingServices.java |  16 +-
 .../sis/internal/metadata/sql/SQLBuilder.java      |  16 +-
 .../sis/internal/simple/CitationConstant.java      |   2 -
 .../apache/sis/internal/simple/SimpleCitation.java |   2 -
 .../apache/sis/internal/simple/SimpleFormat.java   |   2 -
 .../sis/internal/simple/SimpleIdentifier.java      |   2 -
 .../internal/{jaxb => xml}/LegacyNamespaces.java   |   2 +-
 .../apache/sis/internal/{jaxb => xml}/Schemas.java |   2 +-
 .../sis/internal/xml}/StreamWriterDelegate.java    |   4 +-
 .../sis/internal/{jaxb => xml}/XmlUtilities.java   |   3 +-
 .../org/apache/sis/internal/xml}/package-info.java |  16 +-
 .../main/java/org/apache/sis/io/wkt/Element.java   |   1 -
 .../main/java/org/apache/sis/io/wkt/Formatter.java |   2 -
 .../org/apache/sis/metadata/AbstractMetadata.java  |  29 +-
 .../java/org/apache/sis/metadata/CacheKey.java     |   2 -
 .../java/org/apache/sis/metadata/HashCode.java     | 105 +++
 .../org/apache/sis/metadata/MetadataCopier.java    | 180 +++--
 .../org/apache/sis/metadata/MetadataStandard.java  |  57 +-
 .../org/apache/sis/metadata/MetadataVisitor.java   | 286 ++++++++
 .../sis/metadata/MetadataVisitorException.java     | 100 +++
 .../apache/sis/metadata/ModifiableMetadata.java    | 309 +++++---
 .../java/org/apache/sis/metadata/ObjectPair.java   |   2 -
 .../org/apache/sis/metadata/PropertyAccessor.java  | 205 +++---
 .../main/java/org/apache/sis/metadata/Pruner.java  | 281 +++----
 .../org/apache/sis/metadata/RecursivityGuard.java  |  69 --
 .../sis/metadata/StandardImplementation.java       |   2 +-
 .../metadata/{Freezer.java => StateChanger.java}   | 121 ++-
 .../java/org/apache/sis/metadata/TreeNode.java     |   2 -
 .../org/apache/sis/metadata/TreeNodeChildren.java  |   2 -
 .../metadata/UnmodifiableMetadataException.java    |   5 +-
 .../iso/DefaultApplicationSchemaInformation.java   |   1 -
 .../iso/DefaultExtendedElementInformation.java     |   3 +-
 .../apache/sis/metadata/iso/DefaultIdentifier.java |   1 -
 .../apache/sis/metadata/iso/DefaultMetadata.java   |  18 +-
 .../iso/DefaultMetadataExtensionInformation.java   |   1 -
 .../sis/metadata/iso/DefaultMetadataScope.java     |   1 -
 .../iso/DefaultPortrayalCatalogueReference.java    |   1 -
 .../org/apache/sis/metadata/iso/ISOMetadata.java   |  72 +-
 .../sis/metadata/iso/ImmutableIdentifier.java      |   2 +
 .../sis/metadata/iso/MetadataScopeAdapter.java     |   4 +-
 .../acquisition/DefaultAcquisitionInformation.java |   1 -
 .../acquisition/DefaultEnvironmentalRecord.java    |   1 -
 .../sis/metadata/iso/acquisition/DefaultEvent.java |   9 +-
 .../iso/acquisition/DefaultInstrument.java         |   9 +-
 .../metadata/iso/acquisition/DefaultObjective.java |   1 -
 .../metadata/iso/acquisition/DefaultOperation.java |   9 +-
 .../sis/metadata/iso/acquisition/DefaultPlan.java  |   1 -
 .../metadata/iso/acquisition/DefaultPlatform.java  |   9 +-
 .../iso/acquisition/DefaultPlatformPass.java       |   9 +-
 .../iso/acquisition/DefaultRequestedDate.java      |   1 -
 .../iso/acquisition/DefaultRequirement.java        |   9 +-
 .../sis/metadata/iso/citation/AbstractParty.java   |   1 -
 .../sis/metadata/iso/citation/Citations.java       |   2 +-
 .../sis/metadata/iso/citation/DefaultAddress.java  |   1 -
 .../sis/metadata/iso/citation/DefaultCitation.java |   3 +-
 .../metadata/iso/citation/DefaultCitationDate.java |   1 -
 .../sis/metadata/iso/citation/DefaultContact.java  |   3 +-
 .../metadata/iso/citation/DefaultIndividual.java   |   1 -
 .../iso/citation/DefaultOnlineResource.java        |   1 -
 .../metadata/iso/citation/DefaultOrganisation.java |   1 -
 .../iso/citation/DefaultResponsibility.java        |   2 +-
 .../iso/citation/DefaultResponsibleParty.java      |   3 +-
 .../sis/metadata/iso/citation/DefaultSeries.java   |   1 -
 .../metadata/iso/citation/DefaultTelephone.java    |   5 +-
 .../sis/metadata/iso/citation/package-info.java    |   2 +-
 .../iso/constraint/DefaultConstraints.java         |   1 -
 .../iso/constraint/DefaultLegalConstraints.java    |   1 -
 .../iso/constraint/DefaultReleasability.java       |   1 -
 .../iso/constraint/DefaultSecurityConstraints.java |   1 -
 .../iso/content/AbstractContentInformation.java    |   1 -
 .../iso/content/DefaultAttributeGroup.java         |   1 -
 .../sis/metadata/iso/content/DefaultBand.java      |   1 -
 .../iso/content/DefaultCoverageDescription.java    |   3 +-
 .../DefaultFeatureCatalogueDescription.java        |   3 +-
 .../iso/content/DefaultFeatureTypeInfo.java        |   1 -
 .../iso/content/DefaultImageDescription.java       |   3 +-
 .../iso/content/DefaultRangeDimension.java         |   3 +-
 .../content/DefaultRangeElementDescription.java    |   1 -
 .../iso/content/DefaultSampleDimension.java        |   1 -
 .../sis/metadata/iso/content/package-info.java     |   2 +-
 .../metadata/iso/distribution/DefaultDataFile.java |   3 +-
 .../DefaultDigitalTransferOptions.java             |   1 -
 .../iso/distribution/DefaultDistribution.java      |   1 -
 .../iso/distribution/DefaultDistributor.java       |   1 -
 .../metadata/iso/distribution/DefaultFormat.java   |   3 +-
 .../metadata/iso/distribution/DefaultMedium.java   |  11 +-
 .../distribution/DefaultStandardOrderProcess.java  |   1 -
 .../metadata/iso/distribution/package-info.java    |   2 +-
 .../iso/extent/AbstractGeographicExtent.java       |   1 -
 .../iso/extent/DefaultBoundingPolygon.java         |   1 -
 .../sis/metadata/iso/extent/DefaultExtent.java     |   1 -
 .../iso/extent/DefaultGeographicBoundingBox.java   |   1 -
 .../iso/extent/DefaultGeographicDescription.java   |   1 -
 .../iso/extent/DefaultSpatialTemporalExtent.java   |   1 -
 .../metadata/iso/extent/DefaultTemporalExtent.java |   1 -
 .../metadata/iso/extent/DefaultVerticalExtent.java |   1 -
 .../iso/identification/AbstractIdentification.java |   3 +-
 .../DefaultAggregateInformation.java               |   3 +-
 .../identification/DefaultAssociatedResource.java  |   1 -
 .../iso/identification/DefaultBrowseGraphic.java   |   1 -
 .../iso/identification/DefaultCoupledResource.java |   7 +-
 .../identification/DefaultDataIdentification.java  |   3 +-
 .../iso/identification/DefaultKeywordClass.java    |   1 -
 .../iso/identification/DefaultKeywords.java        |   1 -
 .../DefaultOperationChainMetadata.java             |   1 -
 .../identification/DefaultOperationMetadata.java   |   1 -
 .../iso/identification/DefaultResolution.java      |   1 -
 .../DefaultServiceIdentification.java              |   1 -
 .../metadata/iso/identification/DefaultUsage.java  |   1 -
 .../metadata/iso/identification/package-info.java  |   2 +-
 .../sis/metadata/iso/lineage/DefaultAlgorithm.java |   1 -
 .../sis/metadata/iso/lineage/DefaultLineage.java   |   1 -
 .../iso/lineage/DefaultNominalResolution.java      |   1 -
 .../metadata/iso/lineage/DefaultProcessStep.java   |   3 +-
 .../iso/lineage/DefaultProcessStepReport.java      |   1 -
 .../metadata/iso/lineage/DefaultProcessing.java    |   9 +-
 .../sis/metadata/iso/lineage/DefaultSource.java    |   5 +-
 .../sis/metadata/iso/lineage/package-info.java     |   2 +-
 .../maintenance/DefaultMaintenanceInformation.java |   3 +-
 .../sis/metadata/iso/maintenance/DefaultScope.java |   1 -
 .../iso/maintenance/DefaultScopeDescription.java   |   1 -
 .../sis/metadata/iso/maintenance/package-info.java |   2 +-
 .../org/apache/sis/metadata/iso/package-info.java  |   2 +-
 .../metadata/iso/quality/AbstractCompleteness.java |   1 -
 .../sis/metadata/iso/quality/AbstractElement.java  |   3 +-
 .../iso/quality/AbstractLogicalConsistency.java    |   1 -
 .../iso/quality/AbstractPositionalAccuracy.java    |   1 -
 .../sis/metadata/iso/quality/AbstractResult.java   |   1 -
 .../iso/quality/AbstractTemporalAccuracy.java      |   1 -
 .../iso/quality/AbstractThematicAccuracy.java      |   1 -
 .../DefaultAbsoluteExternalPositionalAccuracy.java |   1 -
 .../quality/DefaultAccuracyOfATimeMeasurement.java |   1 -
 .../iso/quality/DefaultCompletenessCommission.java |   1 -
 .../iso/quality/DefaultCompletenessOmission.java   |   1 -
 .../iso/quality/DefaultConceptualConsistency.java  |   1 -
 .../iso/quality/DefaultConformanceResult.java      |   1 -
 .../iso/quality/DefaultCoverageResult.java         |   1 -
 .../metadata/iso/quality/DefaultDataQuality.java   |   3 +-
 .../iso/quality/DefaultDomainConsistency.java      |   1 -
 .../iso/quality/DefaultFormatConsistency.java      |   1 -
 .../DefaultGriddedDataPositionalAccuracy.java      |   1 -
 .../DefaultNonQuantitativeAttributeAccuracy.java   |   1 -
 .../DefaultQuantitativeAttributeAccuracy.java      |   1 -
 .../iso/quality/DefaultQuantitativeResult.java     |   3 +-
 .../DefaultRelativeInternalPositionalAccuracy.java |   1 -
 .../sis/metadata/iso/quality/DefaultScope.java     |   1 -
 .../iso/quality/DefaultTemporalConsistency.java    |   1 -
 .../iso/quality/DefaultTemporalValidity.java       |   1 -
 .../DefaultThematicClassificationCorrectness.java  |   1 -
 .../iso/quality/DefaultTopologicalConsistency.java |   1 -
 .../sis/metadata/iso/quality/DefaultUsability.java |   3 +-
 .../sis/metadata/iso/quality/package-info.java     |   2 +-
 .../spatial/AbstractGeolocationInformation.java    |   1 -
 .../iso/spatial/AbstractSpatialRepresentation.java |   1 -
 .../sis/metadata/iso/spatial/DefaultDimension.java |   1 -
 .../sis/metadata/iso/spatial/DefaultGCP.java       |   1 -
 .../metadata/iso/spatial/DefaultGCPCollection.java |   1 -
 .../iso/spatial/DefaultGeometricObjects.java       |   1 -
 .../metadata/iso/spatial/DefaultGeorectified.java  |   1 -
 .../iso/spatial/DefaultGeoreferenceable.java       |   1 -
 .../spatial/DefaultGridSpatialRepresentation.java  |   1 -
 .../DefaultVectorSpatialRepresentation.java        |   1 -
 .../java/org/apache/sis/metadata/package-info.java |   2 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  42 +-
 .../apache/sis/metadata/sql/MetadataWriter.java    |  57 +-
 .../apache/sis/metadata/sql/TableHierarchy.java    | 118 +++
 .../org/apache/sis/util/iso/DefaultNameSpace.java  |   2 -
 .../org/apache/sis/util/iso/DefaultRecord.java     |   2 -
 .../apache/sis/util/iso/DefaultRecordSchema.java   |   2 -
 .../org/apache/sis/util/iso/RecordDefinition.java  |   2 -
 .../main/java/org/apache/sis/xml/InputFactory.java |  29 +-
 .../main/java/org/apache/sis/xml/Namespaces.java   |   5 +-
 .../java/org/apache/sis/xml/OutputFactory.java     |  31 +-
 .../src/main/java/org/apache/sis/xml/Pooled.java   |   2 +-
 .../java/org/apache/sis/xml/TransformVersion.java  |   2 +-
 .../main/java/org/apache/sis/xml/Transformer.java  |  22 +-
 .../org/apache/sis/xml/TransformingReader.java     |  29 +-
 .../org/apache/sis/xml/TransformingWriter.java     |  17 +-
 .../internal/jaxb/cat/CodeListMarshallingTest.java |   4 +-
 .../sis/internal/jaxb/gco/MultiplicityTest.java    | 124 ++++
 .../apache/sis/internal/jaxb/gml/MeasureTest.java  |   2 +-
 .../sis/internal/jaxb/gml/TimePeriodTest.java      |   2 +-
 .../internal/jaxb/lan/FreeTextMarshallingTest.java |   2 +-
 .../sis/internal/jaxb/lan/LanguageCodeTest.java    |   4 +-
 .../sis/internal/jaxb/lan/PT_LocaleTest.java       |  12 +-
 .../internal/{jaxb => xml}/XmlUtilitiesTest.java   |   2 +-
 .../java/org/apache/sis/metadata/HashCodeTest.java | 155 ++++
 .../apache/sis/metadata/PropertyAccessorTest.java  |  23 -
 .../java/org/apache/sis/metadata/PrunerTest.java   |   4 +-
 .../sis/metadata/iso/ImmutableIdentifierTest.java  |   2 +-
 .../metadata/iso/citation/DefaultCitationTest.java |  54 +-
 .../iso/citation/DefaultResponsibilityTest.java    |   2 +-
 .../constraint/DefaultLegalConstraintsTest.java    |   2 +-
 .../DefaultRepresentativeFractionTest.java         |   8 +-
 .../iso/identification/DefaultResolutionTest.java  |   4 +-
 .../metadata/iso/lineage/DefaultLineageTest.java   |   2 +-
 .../java/org/apache/sis/test/MetadataAssert.java   |   2 +-
 .../java/org/apache/sis/test/XMLComparator.java    |   2 +-
 .../test/java/org/apache/sis/test/XMLTestCase.java |  29 +-
 .../FeatureAttributeMock.java}                     |  32 +-
 .../org/apache/sis/test/mock/MetadataMock.java     |   2 +-
 .../org/apache/sis/test/mock/package-info.java     |   5 +-
 .../apache/sis/test/suite/MetadataTestSuite.java   |   4 +-
 .../sis/test/xml/AnnotationConsistencyCheck.java   |   4 +-
 .../org/apache/sis/test/xml/PackageVerifier.java   |  47 +-
 .../org/apache/sis/test/xml/SchemaCompliance.java  | 382 +---------
 .../apache/sis/util/iso/NameMarshallingTest.java   |   2 +-
 .../sis/xml/CharSequenceSubstitutionTest.java      |  14 +-
 .../org/apache/sis/xml/RenameListGenerator.java    |   4 +-
 .../apache/sis/xml/TransformingNamespacesTest.java |   2 +-
 .../apache/sis/metadata/xml/2007/Multiplicity.xml  |  56 ++
 .../apache/sis/metadata/xml/2016/Multiplicity.xml  |  55 ++
 .../java/org/apache/sis/internal/map/MapLayer.java |   2 +-
 .../org/apache/sis/test/suite/package-info.txt     |   3 +
 core/sis-raster/pom.xml                            |  16 +-
 .../sis/coverage/grid/GridCoordinatesView.java     | 136 ++++
 .../org/apache/sis/coverage/grid/GridExtent.java   | 510 +++++++++++++
 .../org/apache/sis/coverage/grid/GridGeometry.java | 815 +++++++++++++++++++++
 .../grid/IncompleteGridGeometryException.java      |  70 ++
 .../apache/sis/coverage/grid/PixelTranslation.java | 366 +++++++++
 .../apache/sis/coverage/grid/package-info.java}    |  17 +-
 .../java/org/apache/sis/image/DefaultIterator.java |   4 +-
 .../java/org/apache/sis/image/PixelIterator.java   |   4 +-
 .../java/org/apache/sis/image/TransferType.java    |   4 +-
 .../apache/sis/image/WritablePixelIterator.java    |   4 +-
 .../java/org/apache/sis/image/package-info.java    |   4 +-
 .../org/apache/sis/internal/raster/Resources.java  |  45 +-
 .../sis/internal/raster/Resources.properties       |   4 +
 .../sis/internal/raster/Resources_fr.properties    |   4 +
 .../apache/sis/internal/raster/package-info.java   |   4 +-
 .../apache/sis/coverage/grid/GridGeometryTest.java | 190 +++++
 .../sis/coverage/grid/PixelTranslationTest.java    | 124 ++++
 .../org/apache/sis/image/DefaultIteratorTest.java  |   4 +-
 .../org/apache/sis/test/suite/RasterTestSuite.java |   8 +-
 .../referencing/gazetteer/AbstractLocation.java    |   2 -
 .../gazetteer/MilitaryGridReferenceSystem.java     |   2 -
 .../sis/geometry/AbstractDirectPosition.java       |   3 +-
 .../org/apache/sis/geometry/AbstractEnvelope.java  |   3 +-
 .../org/apache/sis/geometry/DirectPosition1D.java  |   3 +-
 .../org/apache/sis/geometry/DirectPosition2D.java  |   4 +-
 .../org/apache/sis/geometry/GeneralEnvelope.java   |  12 +-
 .../referencing/CC_GeneralOperationParameter.java  |   2 +-
 .../referencing/PositionalAccuracyConstant.java    |   2 -
 .../internal/referencing/ServicesForMetadata.java  |  32 +-
 .../referencing/provider/DatumShiftGridFile.java   |   2 -
 .../sis/parameter/AbstractParameterDescriptor.java |   1 -
 .../java/org/apache/sis/parameter/Parameters.java  |   1 -
 .../org/apache/sis/parameter/TensorParameters.java |   9 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |   5 +-
 .../apache/sis/referencing/IdentifiedObjects.java  |  34 +-
 .../apache/sis/referencing/NamedIdentifier.java    |  60 +-
 .../sis/referencing/cs/DirectionAlongMeridian.java |   2 +-
 .../sis/referencing/datum/BursaWolfParameters.java |   2 +-
 .../referencing/datum/DefaultVerticalDatum.java    |   2 +-
 .../sis/referencing/datum/TimeDependentBWP.java    |   3 +-
 .../factory/AuthorityFactoryIdentifier.java        |   2 -
 .../factory/ConcurrentAuthorityFactory.java        |   4 +-
 .../factory/GeodeticAuthorityFactory.java          |   2 -
 .../referencing/factory/sql/AuthorityCodes.java    |   2 -
 .../sis/referencing/factory/sql/AxisName.java      |   2 -
 .../operation/CoordinateOperationRegistry.java     |   6 +-
 .../operation/DefaultPassThroughOperation.java     |   5 +-
 .../operation/builder/LinearTransformBuilder.java  |   2 -
 .../sis/referencing/operation/matrix/Matrix1.java  |   2 +-
 .../sis/referencing/operation/matrix/Matrix2.java  |   2 +-
 .../operation/projection/NormalizedProjection.java |   2 +-
 .../operation/projection/ZonedGridSystem.java      |   2 +-
 .../operation/transform/ConcatenatedTransform.java |   2 +-
 .../transform/DefaultMathTransformFactory.java     |   2 +-
 .../transform/EllipsoidToCentricTransform.java     |   2 +-
 .../transform/ExponentialTransform1D.java          |   2 +-
 .../operation/transform/LinearTransform1D.java     |   3 +-
 .../transform/LogarithmicTransform1D.java          |   2 +-
 .../operation/transform/MathTransforms.java        |  45 +-
 .../operation/transform/MolodenskyFormula.java     |   2 +-
 .../operation/transform/PassThroughTransform.java  |  64 +-
 .../operation/transform/PowerTransform1D.java      |   2 +-
 .../operation/transform/TransferFunction.java      |   2 -
 .../datum/DefaultPrimeMeridianTest.java            |   2 +-
 .../datum/DefaultVerticalDatumTest.java            |   2 +-
 .../transform/ConcatenatedTransformTest.java       |   2 +-
 .../operation/transform/MathTransformsTest.java    |   2 +-
 .../transform/PassThroughTransformTest.java        |   8 +-
 .../transform/TransformSeparatorTest.java          |   2 +-
 .../apache/sis/test/integration/MetadataTest.java  |   2 +-
 .../apache/sis/internal/converter/ClassPair.java   |   2 -
 .../sis/internal/converter/ConverterRegistry.java  |   2 -
 .../sis/internal/converter/FallbackConverter.java  |   2 -
 .../internal/converter/SurjectiveConverter.java    |   2 -
 .../org/apache/sis/internal/system/Supervisor.java |   2 +-
 .../apache/sis/internal/util/AbstractMapEntry.java |   2 -
 .../java/org/apache/sis/internal/util/Cloner.java  |  33 +-
 .../org/apache/sis/internal/util/DoubleDouble.java |   2 +-
 .../apache/sis/internal/util/FinalFieldSetter.java | 157 ++++
 .../org/apache/sis/internal/util/Numerics.java     |  10 -
 .../sis/internal/util/TemporalUtilities.java       |   2 +-
 .../org/apache/sis/internal/util/Utilities.java    |   2 +-
 .../src/main/java/org/apache/sis/math/Line.java    |   2 +-
 .../src/main/java/org/apache/sis/math/Plane.java   |   2 +-
 .../java/org/apache/sis/measure/AngleFormat.java   |   2 -
 .../org/apache/sis/measure/LinearConverter.java    |   8 +-
 .../java/org/apache/sis/measure/RangeFormat.java   |  20 +-
 .../java/org/apache/sis/measure/UnitFormat.java    |  21 +-
 .../java/org/apache/sis/util/CharSequences.java    |   2 +-
 .../apache/sis/util/CorruptedObjectException.java  |  13 +-
 .../src/main/java/org/apache/sis/util/Debug.java   |  20 +-
 .../main/java/org/apache/sis/util/Exceptions.java  |   4 +
 .../apache/sis/util/logging/WarningListeners.java  |   8 +-
 .../java/org/apache/sis/util/resources/Errors.java |  15 +
 .../apache/sis/util/resources/Errors.properties    |   3 +
 .../apache/sis/util/resources/Errors_fr.properties |   5 +-
 .../sis/util/resources/IndexedResourceBundle.java  |   1 -
 .../org/apache/sis/util/resources/Vocabulary.java  |  17 +-
 .../sis/util/resources/Vocabulary.properties       |   3 +
 .../sis/util/resources/Vocabulary_fr.properties    |   3 +
 .../org/apache/sis/internal/util/CitationMock.java |   2 -
 ide-project/NetBeans/nbproject/genfiles.properties |   2 +-
 ide-project/NetBeans/nbproject/project.xml         |   1 +
 pom.xml                                            |   4 +-
 .../sis/internal/profile/fra/Constraints.java      |   1 -
 .../internal/profile/fra/DataIdentification.java   |   1 -
 .../sis/internal/profile/fra/LegalConstraints.java |   1 -
 .../internal/profile/fra/SecurityConstraints.java  |   1 -
 .../sis/storage/earthobservation/LandsatStore.java |   2 -
 .../org/apache/sis/internal/geotiff/Resources.java |   5 +
 .../sis/internal/geotiff/Resources.properties      |   1 +
 .../sis/internal/geotiff/Resources_fr.properties   |   1 +
 .../org/apache/sis/storage/geotiff/CRSBuilder.java | 148 ++--
 .../org/apache/sis/storage/geotiff/GeoCodes.java   |   8 +-
 .../sis/storage/geotiff/GridGeometryBuilder.java   | 390 ++++++++++
 .../sis/storage/geotiff/ImageFileDirectory.java    | 191 ++---
 .../{GridGeometry.java => Localization.java}       | 123 +---
 .../java/org/apache/sis/storage/geotiff/Type.java  | 259 ++++---
 .../org/apache/sis/storage/geotiff/TypeTest.java   |  23 +-
 .../java/org/apache/sis/internal/netcdf/Axis.java  |  29 +-
 .../org/apache/sis/internal/netcdf/Decoder.java    |  25 +-
 .../apache/sis/internal/netcdf/GridGeometry.java   |   7 +-
 .../org/apache/sis/internal/netcdf/Variable.java   |   2 -
 .../sis/internal/netcdf/impl/ChannelDecoder.java   |   2 -
 .../apache/sis/internal/netcdf/impl/Dimension.java |   2 -
 .../sis/internal/netcdf/impl/GridGeometryInfo.java |   2 +-
 .../sis/internal/netcdf/impl/package-info.java     |   2 +-
 .../apache/sis/internal/netcdf/package-info.java   |   6 +-
 .../sis/internal/netcdf/ucar/DecoderWrapper.java   |   2 -
 .../sis/internal/netcdf/ucar/package-info.java     |   7 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  | 160 ++--
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |   2 -
 .../apache/sis/storage/netcdf/package-info.java    |   2 +-
 .../internal/netcdf/impl/ChannelDecoderTest.java   |   3 +-
 .../sis/internal/sql/reverse/SchemaMetaModel.java  |   2 -
 .../sis/internal/sql/reverse/TableMetaModel.java   |   2 -
 .../org/apache/sis/test/suite/package-info.txt     |   3 +
 storage/sis-storage/pom.xml                        |   5 +
 .../sis/internal/storage/MetadataBuilder.java      |  92 ++-
 .../sis/internal/storage/StoreUtilities.java       |   2 +-
 .../sis/internal/storage/io/ChannelData.java       |   2 -
 .../sis/internal/storage/io/IOUtilities.java       |   6 +-
 .../sis/internal/storage/query/SimpleQuery.java    |   2 -
 .../sis/internal/storage/xml/StoreProvider.java    |   2 +-
 .../org/apache/sis/storage/DataStoreRegistry.java  | 133 ++--
 .../apache/sis/storage/GridCoverageResource.java   |  21 +-
 .../org/apache/sis/storage/ProbeProviderPair.java  |   5 +-
 .../java/org/apache/sis/storage/ProbeResult.java   |   2 -
 .../org/apache/sis/storage/StorageConnector.java   |   2 -
 .../internal/storage/xml/MimeTypeDetectorTest.java |   2 +-
 .../apache/sis/internal/storage/xml/StoreTest.java |   2 +-
 .../storage/xml/stream/FormattedWriter.java        |   1 +
 .../storage/xml/stream/NamespaceEraser.java        |   1 +
 .../internal/storage/xml/stream/StaxDataStore.java |   2 -
 .../internal/storage/xml/stream/package-info.java  |   2 +-
 .../sis/internal/storage/gpx/WriterTest.java       |   2 -
 455 files changed, 8183 insertions(+), 2857 deletions(-)

diff --cc application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataOverview.java
index 0000000,90f5e4c..77df9a5
mode 000000,100644..100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataOverview.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataOverview.java
@@@ -1,0 -1,430 +1,430 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.sis.gui.metadata;
+ 
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.text.DateFormat;
+ import java.text.NumberFormat;
+ import java.util.Collection;
+ import java.util.HashMap;
+ import java.util.Iterator;
+ import java.util.Locale;
+ import java.util.Map;
+ import javafx.beans.value.ObservableValue;
+ import javafx.collections.FXCollections;
+ import javafx.collections.ObservableList;
+ import javafx.event.ActionEvent;
+ import javafx.event.Event;
+ import javafx.geometry.Insets;
+ import javafx.scene.Node;
+ import javafx.scene.canvas.Canvas;
+ import javafx.scene.control.ComboBox;
+ import javafx.scene.control.Label;
+ import javafx.scene.control.TitledPane;
+ import javafx.scene.control.Toggle;
+ import javafx.scene.control.ToggleButton;
+ import javafx.scene.control.ToggleGroup;
+ import javafx.scene.image.Image;
+ import javafx.scene.layout.GridPane;
+ import javafx.scene.layout.HBox;
+ import javafx.scene.layout.Priority;
+ import javafx.scene.layout.StackPane;
+ import javafx.scene.layout.VBox;
+ import javafx.scene.paint.Color;
+ import org.opengis.metadata.Metadata;
+ import org.opengis.metadata.citation.CitationDate;
+ import org.opengis.metadata.citation.Party;
+ import org.opengis.metadata.citation.Responsibility;
+ import org.opengis.metadata.extent.Extent;
+ import org.opengis.metadata.extent.GeographicBoundingBox;
+ import org.opengis.metadata.extent.GeographicDescription;
+ import org.opengis.metadata.extent.GeographicExtent;
+ import org.opengis.metadata.identification.DataIdentification;
+ import org.opengis.metadata.identification.Identification;
+ import org.opengis.metadata.identification.TopicCategory;
+ import org.opengis.metadata.spatial.Dimension;
+ import org.opengis.metadata.spatial.SpatialRepresentation;
+ import org.opengis.metadata.spatial.SpatialRepresentationType;
+ import org.opengis.referencing.ReferenceSystem;
+ import org.opengis.util.InternationalString;
+ import org.apache.sis.metadata.iso.DefaultMetadata;
+ import org.apache.sis.metadata.iso.citation.DefaultIndividual;
+ import org.apache.sis.metadata.iso.citation.DefaultOrganisation;
+ import org.apache.sis.metadata.iso.spatial.DefaultGridSpatialRepresentation;
+ import org.apache.sis.util.iso.Types;
+ 
+ 
+ /**
+  * Metadata Viewer.
+  *
+  * @author  Smaniotto Enzo
+  * @version 1.0
+  * @since   1.0
+  * @module
+  */
+ class MetadataOverview extends StackPane {
+ 
+     private final Metadata metadata;
+     final String fromFile;
+     private final Locale locale = Locale.getDefault();
+ 
+     public MetadataOverview(final DefaultMetadata md, final String fromFile) {
+         this.metadata = md;
+         this.fromFile = fromFile;
+         VBox root = new VBox();
+         root.setStyle("-fx-background-color: linear-gradient(to bottom right, #aeb7c4, #fafafa);");
+ 
+         // Creation of the differents views.
+         VBox summaryView = createSummaryView();
+         MetadataNode advancedView = new MetadataNode(md.asTreeTable());
+         advancedView.setMaxHeight(Double.MAX_VALUE);
+         VBox.setVgrow(advancedView, Priority.ALWAYS);
+ 
+         // Create and configure view selection buttons.
+         ToggleGroup buttonGroup = new ToggleGroup();
+         ToggleButton tb1 = new ToggleButton("Summary");
+         ToggleButton tb2 = new ToggleButton("Advanced");
+         tb1.setStyle("-fx-text-fill: white; -fx-font-family: Arial Narrow;-fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); -fx-padding: 0.8em;");
+         tb2.setStyle("-fx-text-fill: white; -fx-font-family: Arial Narrow;-fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); -fx-padding: 0.8em;");
+ 
+         tb1.setToggleGroup(buttonGroup);
+         tb1.setSelected(true);
+         tb1.setDisable(true);
+         tb2.setToggleGroup(buttonGroup);
+         buttonGroup.selectToggle(tb1);
+         buttonGroup.selectedToggleProperty().addListener((ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) -> {
+             if (tb2.isSelected()) {
+                 tb2.setDisable(true);
+                 root.getChildren().remove(summaryView);
+                 root.getChildren().add(advancedView);
+                 tb1.setDisable(false);
+             } else {
+                 tb1.setDisable(true);
+                 root.getChildren().add(summaryView);
+                 root.getChildren().remove(advancedView);
+                 tb2.setDisable(false);
+             }
+         });
+ 
+         HBox toggleGroupLayout = new HBox();
+         toggleGroupLayout.getChildren().addAll(tb1, tb2);
+         toggleGroupLayout.setPadding(new Insets(0, 0, 10, 0));
+ 
+         root.getChildren().add(toggleGroupLayout);
+         root.getChildren().add(summaryView);
+ 
+         this.getChildren().add(root);
+     }
+ 
+     private VBox createSummaryView() {
+         VBox vb = new VBox();
+         TitledPane idPane = new TitledPane("Identification info", createIdGridPane());
+         GridPane createSpatialGridPane = createSpatialGridPane();
+         vb.getChildren().add(idPane);
+         if (!createSpatialGridPane.getChildren().isEmpty()) {
+             TitledPane spatialPane = new TitledPane("Spatial representation", createSpatialGridPane);
+             vb.getChildren().add(spatialPane);
+         }
+         return vb;
+     }
+ 
+     private GridPane createIdGridPane() {
+         GridPane gp = new GridPane();
+         gp.setHgap(10.00);
+         int j = 0, k = 1;
+ 
+         HashMap<String, Identification> m = new HashMap<>();
+         ComboBox<String> comboBox = createComboBox(m);
+         comboBox.setStyle("-fx-font-weight: bold; -fx-font-size: 2em;");
+         if (!comboBox.isVisible()) {
+             Label la = new Label(comboBox.getValue());
+             la.setStyle("-fx-font-weight: bold; -fx-font-size: 2em;");
+             gp.add(la, j, k++, 2, 1);
+         } else {
+             gp.add(comboBox, j, k++, 2, 1);
+         }
+ 
+         // Show author information.
+         Collection<? extends Responsibility> contacts = this.metadata.getContacts();
+         if (!contacts.isEmpty()) {
+             Responsibility contact = contacts.iterator().next();
+             Collection<? extends Party> parties = contact.getParties();
+             if (!parties.isEmpty()) {
+                 Party party = parties.iterator().next();
+                 if (party.getName() != null) {
+                     Label partyType = new Label("Party");
+                     Label partyValue = new Label(party.getName().toString());
+                     partyValue.setWrapText(true);
+                     if (party instanceof DefaultOrganisation) {
+                         partyType.setText("Organisation");
+                     } else if (party instanceof DefaultIndividual) {
+                         partyType.setText("Author");
+                     }
+                     gp.add(partyType, j, k);
+                     gp.add(partyValue, ++j, k++);
+                     j = 0;
+                 }
+             }
+         }
+ 
+         GridPane gpi = new GridPane();
+         gpi.setHgap(10.00);
+ 
+         comboBox.setOnAction(e -> {
+             gpi.getChildren().clear();
+             Identification id = m.get(comboBox.getValue());
+             if (comboBox.getValue().equals("No data to show")) {
+                 return;
+             }
+ 
+             // Show the abstract or the credit, the topic category, the creation date, the type of data, the representation system info and also the geographical area.
+             Object ab = id.getAbstract();
+             if (ab != null) {
+                 InternationalString abs = (InternationalString) ab;
+                 Label crd = new Label("Abstract");
+                 Label crdValue = new Label(abs.toString(locale));
+                 crdValue.setWrapText(true);
+                 gpi.add(crd, 0, 1);
+                 gpi.add(crdValue, 1, 1);
+             } else {
 -                Collection<? extends InternationalString> credits = id.getCredits();
++                Collection<String> credits = id.getCredits();
+                 if (!credits.isEmpty()) {
 -                    InternationalString credit = credits.iterator().next();
++                    String credit = credits.iterator().next();
+                     Label crd = new Label("Credit");
+                     Label crdValue = new Label(credit.toString());
+                     crdValue.setWrapText(true);
+                     gpi.add(crd, 0, 1);
+                     gpi.add(crdValue, 1, 1);
+                 }
+             }
+ 
+             Collection<TopicCategory> tcs = id.getTopicCategories();
+             if (!tcs.isEmpty()) {
+                 TopicCategory tc = tcs.iterator().next();
+                 Label topicC = new Label("Topic Category");
+                 Label topicValue = new Label(tc.toString());
+                 topicValue.setWrapText(true);
+                 gpi.add(topicC, 0, 2);
+                 gpi.add(topicValue, 1, 2);
+             }
+ 
+             if (!id.getCitation().getDates().isEmpty()) {
+                 CitationDate dateAndType = id.getCitation().getDates().iterator().next();
+                 DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, locale);
+                 String dateStr = dateFormat.format(dateAndType.getDate());
+                 String s = dateAndType.getDateType().toString();
+                 s = s.replace("DateType[", "");
+                 s = s.replace("]", "");
+                 Label dt = new Label("Date type: " + s.toLowerCase());
+                 Label dtValue = new Label(dateStr);
+                 dtValue.setWrapText(true);
+                 gpi.add(dt, 0, 3);
+                 gpi.add(dtValue, 1, 3);
+             }
+ 
+             if (id instanceof DataIdentification) {
+                 Label topicC = new Label("Object type");
+                 Label topicValue = new Label("Data");
+                 topicValue.setWrapText(true);
+                 gpi.add(topicC, 0, 4);
+                 gpi.add(topicValue, 1, 4);
+             } else {
+                 Label topicC = new Label("Object type");
+                 Label topicValue = new Label("Service");
+                 topicValue.setWrapText(true);
+                 gpi.add(topicC, 0, 4);
+                 gpi.add(topicValue, 1, 4);
+             }
+ 
+             Collection<SpatialRepresentationType> spatialRepresentationTypes = id.getSpatialRepresentationTypes();
+             Iterator<SpatialRepresentationType> its = spatialRepresentationTypes.iterator();
+             String typeList = "Spatial representation type: ";
+             while (its.hasNext()) {
+                 SpatialRepresentationType spatialRepresentationType = its.next();
+                 typeList += spatialRepresentationType.toString().toLowerCase(locale).replace("spatialrepresentationtype[", "").replace(']', '\0') + ", ";
+             }
+             if (!typeList.equals("Spatial representation type: ")) {
+                 Label list = new Label(typeList.substring(0, typeList.length() - 2));
+                 list.setWrapText(true);
+                 gpi.add(list, 0, 5, 2, 1);
+             }
+ 
+             Collection<? extends Extent> exs = id.getExtents();
+             if (!exs.isEmpty()) {
+                 Extent ex = exs.iterator().next();
+                 Collection<? extends GeographicExtent> ges = ex.getGeographicElements();
+                 Iterator<? extends GeographicExtent> it = ges.iterator();
+                 while (it.hasNext()) {
+                     GeographicExtent ge = it.next();
+                     Label geoEx = new Label("Zone");
+                     Label geoExValue = new Label(ge.toString());
+                     geoExValue.setWrapText(true);
+                     if (ge instanceof GeographicBoundingBox) {
+                         geoEx.setText("");
+                         GeographicBoundingBox gbd = (GeographicBoundingBox) ge;
+                         geoExValue.setText("");
+                         Canvas c = createMap(gbd.getNorthBoundLatitude(), gbd.getEastBoundLongitude(), gbd.getSouthBoundLatitude(), gbd.getWestBoundLongitude());
+                         if (c != null) {
+                             gpi.add(c, 0, 6, 2, 1);
+                         } else {
+                             geoEx.setText("Impossible to load the map.");
+                             gpi.add(geoEx, 0, 6);
+                             gpi.add(geoExValue, 1, 6);
+                         }
+                     } else if (ge instanceof GeographicDescription) {
+                         geoEx.setText("Geographic description");
+                         GeographicDescription gd = (GeographicDescription) ge;
+                         geoExValue.setText(gd.getGeographicIdentifier().getCode());
+                     }
+                 }
+             }
+         });
+ 
+         Event.fireEvent(comboBox, new ActionEvent());
+         gp.add(gpi, j, k++, 2, 1);
+ 
+         int ind = 0;
+         for (Node n : gp.getChildren()) {
+             if (ind++ != 0) {
+                 n.setStyle("-fx-padding: 0 83 10 0;");
+             } else {
+                 n.setStyle("-fx-padding: 0 0 10 0; -fx-font-weight: bold; -fx-font-size: 2em;");
+             }
+         }
+         gpi.getChildren().forEach(n -> n.setStyle("-fx-padding: 0 0 10 0;"));
+ 
+         return gp;
+     }
+ 
+     private Canvas createMap(double north, double east, double south, double west) {
+         Canvas can = new Canvas();
+         Image image = null;
+         try (InputStream in = MetadataOverview.class.getResourceAsStream("WorldMap360x180.png")) {
+             image = new Image(in);
+         } catch (IOException e) {
+             // TODO
+         }
+         if (image.errorProperty().getValue()) {
+             return null;
+         }
+ 
+         double height = image.getHeight();
+         double width = image.getWidth();
+ 
+         can.setHeight(height);
+         can.setWidth(width);
+         can.getGraphicsContext2D().drawImage(image, 0, 0, width, height);
+         can.getGraphicsContext2D().setStroke(Color.DARKBLUE);
+         can.getGraphicsContext2D().setGlobalAlpha(0.1);
+         double x = west + width / 2, y = height / 2 - north, w = east - west, h = north - south;
+         can.getGraphicsContext2D().strokeRect(x, y, w, h);
+         final double minRectSize = 6.0;
+         if (w < minRectSize) {
+             double difX = minRectSize - w;
+             x -= difX / 2;
+             w = minRectSize;
+         }
+         if (h < minRectSize) {
+             double difY = minRectSize - h;
+             y -= difY / 2;
+             h = minRectSize;
+         }
+         can.getGraphicsContext2D().fillRect(x, y, w, h);
+         can.getGraphicsContext2D().setGlobalAlpha(1.0);
+         can.getGraphicsContext2D().setStroke(Color.DARKBLUE);
+         can.getGraphicsContext2D().strokeRect(x, y, w, h);
+ 
+         return can;
+     }
+ 
+     private GridPane createSpatialGridPane() {
+         GridPane gp = new GridPane();
+         gp.setHgap(10.00);
+         gp.setVgap(10.00);
+         int j = 0, k = 1;
+ 
+         Collection<? extends ReferenceSystem> referenceSystemInfos = metadata.getReferenceSystemInfo();
+         if (!referenceSystemInfos.isEmpty()) {
+             ReferenceSystem referenceSystemInfo = referenceSystemInfos.iterator().next();
+             Label rsiValue = new Label("Reference system infos: " + referenceSystemInfo.getName().toString());
+             rsiValue.setWrapText(true);
+             gp.add(rsiValue, j, k++);
+         }
+ 
+         Collection<? extends SpatialRepresentation> sris = this.metadata.getSpatialRepresentationInfo();
+         if (sris.isEmpty()) {
+             return gp;
+         }
+         NumberFormat numberFormat = NumberFormat.getIntegerInstance(locale);
+         for (SpatialRepresentation sri : sris) {
+             String currentValue = "• ";
+             if (sri instanceof DefaultGridSpatialRepresentation) {
+                 DefaultGridSpatialRepresentation sr = (DefaultGridSpatialRepresentation) sri;
+ 
+                 Iterator<? extends Dimension> it = sr.getAxisDimensionProperties().iterator();
+                 while (it.hasNext()) {
+                     Dimension dim = it.next();
+                     currentValue += numberFormat.format(dim.getDimensionSize()) + " " + Types.getCodeTitle(dim.getDimensionName()) + " * ";
+                 }
+                 currentValue = currentValue.substring(0, currentValue.length() - 3);
+                 Label spRep = new Label(currentValue);
+                 gp.add(spRep, j, k++, 2, 1);
+                 if (sr.getCellGeometry() != null) {
+                     Label cellGeo = new Label("Cell geometry:");
+                     Label cellGeoValue = new Label(Types.getCodeTitle(sr.getCellGeometry()).toString());
+                     cellGeoValue.setWrapText(true);
+                     gp.add(cellGeo, j, k);
+                     gp.add(cellGeoValue, ++j, k++);
+                     j = 0;
+                 }
+             }
+         }
+         return gp;
+     }
+ 
+     private ComboBox<String> createComboBox(final Map<String, Identification> m) {
+         ComboBox<String> cb = new ComboBox<>();
+         Collection<? extends Identification> ids = this.metadata.getIdentificationInfo();
+         ObservableList<String> options = FXCollections.observableArrayList();
+         int i = 1;
+         if (ids.size() > 1) {
+             for (Identification id : ids) {
+                 String currentName;
+                 if (id.getCitation() != null) {
+                     currentName = id.getCitation().getTitle().toString();
+                 } else {
+                     currentName = Integer.toString(i);
+                 }
+                 options.add(currentName);
+                 m.put(currentName, id);
+             }
+             cb.setItems(options);
+             cb.setValue(ids.iterator().next().getCitation().getTitle().toString());
+         } else if (ids.size() == 1) {
+             if (ids.iterator().next().getCitation() != null) {
+                 m.put(ids.iterator().next().getCitation().getTitle().toString(), ids.iterator().next());
+                 cb.setValue(ids.iterator().next().getCitation().getTitle().toString());
+                 cb.setVisible(false);
+             }
+         } else {
+             cb.setValue("No data to show");
+             cb.setVisible(false);
+         }
+         return cb;
+     }
+ }
diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/CI_ResponsibleParty.java
index 7a57029,22306ac..ac543c4
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/CI_ResponsibleParty.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/CI_ResponsibleParty.java
@@@ -30,9 -30,13 +30,9 @@@ import org.apache.sis.internal.jaxb.Fil
  
  
  /**
-  * JAXB adapter mapping implementing class to the GeoAPI interface. See
-  * package documentation for more information about JAXB and interface.
+  * JAXB adapter mapping implementing class to a legacy GeoAPI interface.
+  * See package documentation for more information about JAXB and interface.
   *
 - * @deprecated This adapter is not used anymore for ISO 19115-3:2014 metadata.
 - * However it is needed for branches that depend on GeoAPI 3.x, and is also needed
 - * for implementing web services that have not yet been upgraded to latest ISO standard.
 - *
   * @author  Cédric Briançon (Geomatys)
   * @author  Martin Desruisseaux (Geomatys)
   * @version 1.0
diff --cc core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
index 0ca7508,623bd7b..1b06d31
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
@@@ -31,10 -31,9 +31,10 @@@ import org.opengis.metadata.Identifier
  import org.opengis.parameter.ParameterValue;
  import org.opengis.parameter.ParameterDirection;
  import org.opengis.parameter.ParameterDescriptor;
 +import org.opengis.referencing.ReferenceIdentifier;
  import org.apache.sis.internal.simple.SimpleIdentifiedObject;
  import org.apache.sis.internal.jaxb.FilterByVersion;
- import org.apache.sis.internal.jaxb.LegacyNamespaces;
+ import org.apache.sis.internal.xml.LegacyNamespaces;
  import org.apache.sis.internal.jaxb.gco.GO_GenericName;
  import org.apache.sis.internal.metadata.ReferencingServices;
  import org.apache.sis.internal.metadata.NameToIdentifier;
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
index f1c6f0b,6635325..b16b150
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
@@@ -188,14 -187,9 +187,9 @@@ public class DefaultMetadata extends IS
      /**
       * Serial number for inter-operability with different versions.
       */
 -    private static final long serialVersionUID = -4935599812744534502L;
 +    private static final long serialVersionUID = 7337533776231004504L;
  
      /**
-      * Unique identifier for this metadata record, or {@code null} if none.
-      */
-     private Identifier metadataIdentifier;
- 
-     /**
       * Language(s) used for documenting metadata.
       */
      private Collection<Locale> languages;
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
index 5e5e70c,34bed9c..3c11889
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
@@@ -24,10 -24,9 +24,9 @@@ import org.opengis.metadata.Identifier
  import org.opengis.metadata.acquisition.Instrument;
  import org.opengis.metadata.acquisition.Platform;
  import org.opengis.metadata.citation.Citation;
 -import org.opengis.metadata.citation.Responsibility;
 +import org.opengis.metadata.citation.ResponsibleParty;
  import org.opengis.util.InternationalString;
  import org.apache.sis.metadata.iso.ISOMetadata;
- import org.apache.sis.internal.jaxb.NonMarshalledAuthority;
  
  
  /**
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
index 8374339,f7bbc0b..2da1294
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
@@@ -27,9 -27,8 +27,8 @@@ import org.opengis.metadata.acquisition
  import org.opengis.metadata.acquisition.RequestedDate;
  import org.opengis.metadata.acquisition.Requirement;
  import org.opengis.metadata.citation.Citation;
 -import org.opengis.metadata.citation.Responsibility;
 +import org.opengis.metadata.citation.ResponsibleParty;
  import org.apache.sis.metadata.iso.ISOMetadata;
- import org.apache.sis.internal.jaxb.NonMarshalledAuthority;
  
  import static org.apache.sis.internal.metadata.MetadataUtilities.toDate;
  import static org.apache.sis.internal.metadata.MetadataUtilities.toMilliseconds;
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java
index 237466c,4149399..862495b
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java
@@@ -23,11 -23,12 +23,11 @@@ import javax.xml.bind.annotation.XmlRoo
  import org.opengis.metadata.lineage.Lineage;
  import org.opengis.metadata.quality.DataQuality;
  import org.opengis.metadata.quality.Element;
 -import org.opengis.metadata.maintenance.Scope;
 +import org.opengis.metadata.quality.Scope;
  import org.opengis.metadata.maintenance.ScopeCode;
  import org.apache.sis.metadata.iso.ISOMetadata;
 -import org.apache.sis.metadata.iso.maintenance.DefaultScope;
  import org.apache.sis.internal.jaxb.FilterByVersion;
- import org.apache.sis.internal.jaxb.LegacyNamespaces;
+ import org.apache.sis.internal.xml.LegacyNamespaces;
  
  
  /**
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java
index 0000000,bf2f284..6e49ec9
mode 000000,100644..100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java
@@@ -1,0 -1,154 +1,155 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.sis.metadata;
+ 
+ import java.util.Arrays;
+ import org.opengis.util.InternationalString;
+ import org.opengis.metadata.Identifier;
+ import org.opengis.metadata.citation.Role;
+ import org.opengis.metadata.citation.Citation;
+ import org.opengis.metadata.citation.Individual;
 -import org.opengis.metadata.citation.Responsibility;
++import org.opengis.metadata.citation.ResponsibleParty;
+ import org.opengis.metadata.acquisition.Instrument;
+ import org.opengis.metadata.acquisition.Platform;
+ import org.apache.sis.util.iso.SimpleInternationalString;
+ import org.apache.sis.metadata.iso.DefaultIdentifier;
+ import org.apache.sis.metadata.iso.citation.DefaultCitation;
+ import org.apache.sis.metadata.iso.citation.DefaultIndividual;
 -import org.apache.sis.metadata.iso.citation.DefaultResponsibility;
++import org.apache.sis.metadata.iso.citation.DefaultResponsibleParty;
+ import org.apache.sis.metadata.iso.acquisition.DefaultInstrument;
+ import org.apache.sis.metadata.iso.acquisition.DefaultPlatform;
+ import org.apache.sis.test.DependsOnMethod;
+ import org.apache.sis.test.DependsOn;
+ import org.apache.sis.test.TestCase;
+ import org.junit.Test;
+ 
+ import static java.util.Collections.singleton;
+ import static org.junit.Assert.*;
+ 
+ 
+ /**
+  * Tests the {@link HashCode} class. This is also used as a relatively simple {@link MetadataVisitor} test.
+  * The entry point is the {@link HashCode#walk(MetadataStandard, Class, Object, boolean)} method.
+  *
+  *
+  * @author  Martin Desruisseaux (Geomatys)
+  * @version 1.0
+  * @since   1.0
+  * @module
+  */
+ @DependsOn(PropertyAccessorTest.class)
+ public final strictfp class HashCodeTest extends TestCase {
+     /**
+      * Computes the hash code value of the given object.
+      */
+     private static Integer hash(final Object metadata) {
+         return HashCode.getOrCreate().walk(MetadataStandard.ISO_19115, null, metadata, true);
+     }
+ 
+     /**
+      * Tests hash code computation of an object that do not contain other metadata.
+      */
+     @Test
+     public void testSimple() {
+         final DefaultCitation instance = new DefaultCitation();
+         final int baseCode = Citation.class.hashCode();
+         assertEquals("Empty metadata.", Integer.valueOf(baseCode), hash(instance));
+ 
+         final InternationalString title = new SimpleInternationalString("Some title");
+         instance.setTitle(title);
+         assertEquals("Metadata with a single value.", Integer.valueOf(baseCode + title.hashCode()), hash(instance));
+ 
+         final InternationalString alternateTitle = new SimpleInternationalString("An other title");
+         instance.setAlternateTitles(singleton(alternateTitle));
+         assertEquals("Metadata with two values.",
+                      Integer.valueOf(baseCode + title.hashCode() + Arrays.asList(alternateTitle).hashCode()),
+                      hash(instance));
+     }
+ 
+     /**
+      * Tests hash code computation of an object containing another metadata object.
+      */
+     @Test
+     @DependsOnMethod("testSimple")
+     public void testNested() {
+         final InternationalString   title    = new SimpleInternationalString("Some title");
+         final InternationalString   person   = new SimpleInternationalString("Illustre inconnu");
+         final DefaultIndividual     party    = new DefaultIndividual(person, null, null);
 -        final DefaultResponsibility resp     = new DefaultResponsibility(Role.AUTHOR, null, party);
++        final DefaultResponsibleParty resp   = new DefaultResponsibleParty(Role.AUTHOR);
+         final DefaultCitation       instance = new DefaultCitation(title);
++        resp.getParties().add(party);
+         instance.getCitedResponsibleParties().add(resp);
+         /*
+          * Individual hash code is the sum of all its properties, none of them being a collection.
+          */
+         int expected = Individual.class.hashCode() + person.hashCode();
+         assertEquals("Individual", Integer.valueOf(expected), hash(party));
+         /*
+          * The +31 below come from java.util.List contract, since above Individual is a list member.
+          */
 -        expected += Responsibility.class.hashCode() + Role.AUTHOR.hashCode() + 31;
++        expected += ResponsibleParty.class.hashCode() + Role.AUTHOR.hashCode() + 31;
+         assertEquals("Responsibility", Integer.valueOf(expected), hash(resp));
+         /*
+          * The +31 below come from java.util.List contract, since above Responsibility is a list member.
+          */
+         expected += Citation.class.hashCode() + title.hashCode() + 31;
+         assertEquals("Citation", Integer.valueOf(expected), hash(instance));
+     }
+ 
+     /**
+      * Tests hash code computation of an object graph containing a cycle.
+      */
+     @Test
+     @DependsOnMethod("testNested")
+     public void testCycle() {
+         /*
+          * We will create a Platform and an Instrument, both of them with no other property than an identifier.
+          * The assertions verifying Identifier hash codes are not the main purpose of this test, but we perform
+          * those verifications for making sure that the assertion done at the end of this method has good premises.
+          */
+         final DefaultIdentifier platformID   = new DefaultIdentifier("P1");
+         final DefaultIdentifier instrumentID = new DefaultIdentifier("I1");
+         int platformHash   = Identifier.class.hashCode() +   platformID.getCode().hashCode();
+         int instrumentHash = Identifier.class.hashCode() + instrumentID.getCode().hashCode();
+         assertEquals("platformID",   Integer.valueOf(platformHash),   hash(platformID));
+         assertEquals("instrumentID", Integer.valueOf(instrumentHash), hash(instrumentID));
+         /*
+          * Verify Platform and Instrument hash codes before we link them together.
+          */
+         final DefaultPlatform   platform   = new DefaultPlatform();
+         final DefaultInstrument instrument = new DefaultInstrument();
+         platform  .setIdentifier(platformID);
+         instrument.setIdentifier(instrumentID);
+         platformHash   +=   Platform.class.hashCode();
+         instrumentHash += Instrument.class.hashCode();
+         assertEquals("Platform",   Integer.valueOf(platformHash),   hash(platform));
+         assertEquals("Instrument", Integer.valueOf(instrumentHash), hash(instrument));
+         /*
+          * Add the instrument to the platform. The +31 below come from java.util.List contract,
+          * since the Instrument is contained in a list.
+          */
+         platform.getInstruments().add(instrument);
+         platformHash += instrumentHash + 31;
+         assertEquals("Platform", Integer.valueOf(platformHash), hash(platform));
+         /*
+          * Add a reference from the instrument back to the platform. This is where the graph become cyclic.
+          * The hash code computation is expected to behave as if the platform was not specified.
+          */
+         instrument.setMountedOn(platform);
+         assertEquals("Platform", Integer.valueOf(platformHash), hash(platform));
+     }
+ }
diff --cc core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationMock.java
index c8513b9,5632c55..4b203ad
--- a/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationMock.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationMock.java
@@@ -25,13 -25,11 +25,12 @@@ import org.opengis.metadata.citation.Ci
  import org.opengis.metadata.citation.CitationDate;
  import org.opengis.metadata.citation.OnlineResource;
  import org.opengis.metadata.citation.PresentationForm;
 -import org.opengis.metadata.citation.Responsibility;
 +import org.opengis.metadata.citation.ResponsibleParty;
  import org.opengis.metadata.citation.Series;
  import org.opengis.metadata.identification.BrowseGraphic;
 +import org.opengis.referencing.ReferenceIdentifier;
  import org.opengis.util.InternationalString;
  import org.apache.sis.util.iso.SimpleInternationalString;
- import org.apache.sis.util.Debug;
  
  
  /**
diff --cc ide-project/NetBeans/nbproject/genfiles.properties
index c89c1fe,f1aa966..11e6a4b
--- a/ide-project/NetBeans/nbproject/genfiles.properties
+++ b/ide-project/NetBeans/nbproject/genfiles.properties
@@@ -3,6 -3,6 +3,6 @@@
  build.xml.data.CRC32=58e6b21c
  build.xml.script.CRC32=462eaba0
  build.xml.stylesheet.CRC32=28e38971@1.53.1.46
- nbproject/build-impl.xml.data.CRC32=5a0e9d09
 -nbproject/build-impl.xml.data.CRC32=fe2883d9
 -nbproject/build-impl.xml.script.CRC32=b7ab89c5
++nbproject/build-impl.xml.data.CRC32=5c9f3b18
 +nbproject/build-impl.xml.script.CRC32=fb8d24ed
  nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48
diff --cc storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index b3b6c0d,4f0a4e2..f9d9c9c
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@@ -619,13 -630,9 +631,9 @@@ split:  while ((start = CharSequences.s
              if (contributor != pointOfContact) {
                  addCitedResponsibleParty(contributor, null);
              }
 -            final Responsibility r = createResponsibleParty(PUBLISHER, false);
 +            final ResponsibleParty r = createResponsibleParty(PUBLISHER, false);
              if (r != null) {
                  addDistributor(r);
-                 /*
-                  * TODO: There is some transfert option, etc. that we could set there.
-                  * See UnidataDD2MI.xsl for options for OPeNDAP, THREDDS, etc.
-                  */
                  for (final Party party : r.getParties()) {
                      publisher = addIfNonNull(publisher, party.getName());
                  }


Mime
View raw message