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 64feb29631199ab613320fa9ac40babaf16a1774 Merge: 4c5563faad f797799d32 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Fri Jan 24 17:39:56 2025 +0100 Merge branch 'geoapi-4.0' into geoapi-3.1 .../apache/sis/buildtools/gradle/Assembler.java | 2 +- .../org/apache/sis/coverage/SampleRangeFormat.java | 6 +- .../sis/coverage/grid/BufferedGridCoverage.java | 4 +- .../apache/sis/coverage/grid/DomainLinearizer.java | 4 +- .../apache/sis/coverage/grid/GridCoverage2D.java | 23 +- .../apache/sis/coverage/grid/GridDerivation.java | 257 ++++++++---- .../org/apache/sis/coverage/grid/GridExtent.java | 235 +++++++---- .../org/apache/sis/coverage/grid/GridGeometry.java | 237 +++++++++-- .../apache/sis/coverage/grid/PixelTranslation.java | 28 +- .../sis/coverage/grid/ResampledGridCoverage.java | 10 +- .../apache/sis/coverage/grid/SliceGeometry.java | 2 +- .../sis/coverage/privy/CommonDomainFinder.java | 18 +- .../main/org/apache/sis/feature/FeatureFormat.java | 9 +- .../main/org/apache/sis/image/ComputedImage.java | 2 +- .../main/org/apache/sis/image/ComputedTiles.java | 12 +- .../main/org/apache/sis/image/ImageOverlay.java | 59 ++- .../main/org/apache/sis/image/ImageProcessor.java | 9 +- .../main/org/apache/sis/image/PlanarImage.java | 9 +- .../main/org/apache/sis/image/TileCache.java | 5 +- .../apache/sis/image/privy/AssertionMessages.java | 87 ++++ .../grid => image/privy}/ReshapedImage.java | 51 ++- .../apache/sis/image/privy/TilePlaceholder.java | 5 +- .../sis/coverage/grid/GridDerivationTest.java | 138 ++++--- .../apache/sis/coverage/grid/GridExtentTest.java | 60 ++- .../apache/sis/coverage/grid/GridGeometryTest.java | 87 +++- .../coverage/grid/ResampledGridCoverageTest.java | 1 + .../grid => image/privy}/ReshapedImageTest.java | 12 +- .../org/apache/sis/metadata/privy/Identifiers.java | 2 +- .../main/org/apache/sis/metadata/sql/Citations.sql | 2 +- .../apache/sis/xml/bind/lan/LocaleAndCharset.java | 10 +- .../org/apache/sis/xml/bind/lan/PT_FreeText.java | 10 +- .../apache/sis/xml/bind/gco/StringAdapterTest.java | 2 +- .../sis/xml/bind/lan/FreeTextMarshallingTest.java | 2 +- .../coverage/MultiResolutionCoverageLoader.java | 2 +- .../org/apache/sis/map/coverage/RenderingData.java | 30 +- .../sis/referencing/gazetteer/LocationFormat.java | 7 +- .../org/apache/sis/geometry/EnvelopeReducer.java | 7 +- .../main/org/apache/sis/geometry/Envelopes.java | 30 +- .../org/apache/sis/parameter/ParameterFormat.java | 41 +- .../main/org/apache/sis/referencing/CRS.java | 6 +- .../apache/sis/referencing/GeodeticCalculator.java | 6 +- .../sis/referencing/ImmutableIdentifier.java | 131 +++--- .../apache/sis/referencing/NamedIdentifier.java | 24 +- .../sis/referencing/StandardDefinitions.java | 14 +- .../org/apache/sis/referencing/cs/AxisName.java | 2 +- .../main/org/apache/sis/referencing/cs/Codes.java | 6 +- .../sis/referencing/cs/CoordinateSystems.java | 33 +- .../cs/DefaultCoordinateSystemAxis.java | 4 +- .../sis/referencing/cs/DirectionAlongMeridian.java | 4 +- .../org/apache/sis/referencing/cs/Normalizer.java | 12 +- .../operation/builder/LinearTransformBuilder.java | 28 +- .../referencing/operation/builder/Linearizer.java | 11 +- .../operation/builder/ProjectedTransformTry.java | 6 +- .../sis/referencing/operation/gridded/Tile.java | 6 +- .../operation/provider/MapProjection.java | 19 +- .../operation/provider/PseudoMercator.java | 10 + .../operation/provider/PseudoSinusoidal.java | 10 + .../sis/referencing/privy/AxisDirections.java | 2 +- .../sis/referencing/NamedIdentifierTest.java | 2 +- .../sis/referencing/cs/CoordinateSystemsTest.java | 22 +- .../operation/builder/LinearizerTest.java | 3 +- .../projection/MercatorMethodComparison.java | 10 +- .../operation/transform/MathTransformTestCase.java | 2 +- .../sis/test/integration/ConsistencyTest.java | 12 +- .../org/apache/sis/storage/geotiff/DataCube.java | 6 +- .../org/apache/sis/storage/geotiff/DataSubset.java | 2 +- .../apache/sis/storage/geotiff/GeoTiffStore.java | 14 + .../sis/storage/geotiff/ImageFileDirectory.java | 2 +- .../sis/storage/geotiff/MultiResolutionImage.java | 2 +- .../sis/storage/geotiff/reader/CRSBuilder.java | 4 +- .../sis/storage/geotiff/writer/GeoEncoder.java | 158 +++++--- .../apache/sis/storage/netcdf/MetadataReader.java | 16 +- .../apache/sis/storage/netcdf/base/Dimension.java | 2 +- .../sis/storage/netcdf/base/RasterResource.java | 14 +- .../sis/storage/netcdf/MetadataReaderTest.java | 2 - .../main/org/apache/sis/storage/gpx/Metadata.java | 10 +- .../org/apache/sis/io/stream/ByteRangeChannel.java | 4 +- .../org/apache/sis/io/stream/ChannelDataInput.java | 135 ++++++- .../apache/sis/io/stream/FileCacheByteChannel.java | 2 +- .../apache/sis/io/stream/HyperRectangleWriter.java | 34 +- .../main/org/apache/sis/io/stream/Region.java | 2 +- .../apache/sis/storage/GridCoverageResource.java | 4 +- .../main/org/apache/sis/storage/URLDataSource.java | 25 +- .../sis/storage/aggregate/AggregatedResource.java | 182 ++++++++- .../aggregate/BandAggregateGridResource.java | 78 ++-- .../aggregate/ConcatenatedGridCoverage.java | 391 ++++++++---------- .../aggregate/ConcatenatedGridResource.java | 442 +++++++++++---------- .../sis/storage/aggregate/CoverageAggregator.java | 77 ++-- .../sis/storage/aggregate/DimensionSelector.java | 99 +++-- .../apache/sis/storage/aggregate/GridSlice.java | 233 +++++++---- .../sis/storage/aggregate/GridSliceLocator.java | 210 ++++------ .../org/apache/sis/storage/aggregate/Group.java | 79 +++- .../sis/storage/aggregate/GroupAggregate.java | 175 ++------ .../apache/sis/storage/aggregate/GroupByCRS.java | 50 +-- .../sis/storage/aggregate/GroupBySample.java | 57 ++- .../sis/storage/aggregate/GroupByTransform.java | 121 ++++-- .../sis/storage/aggregate/MergeStrategy.java | 222 ++++++++--- .../sis/storage/base/GridResourceWrapper.java | 1 + .../org/apache/sis/storage/base/LegalSymbols.java | 107 ++++- .../sis/storage/base/MemoryGridResource.java | 44 +- .../apache/sis/storage/base/MetadataBuilder.java | 8 +- .../apache/sis/storage/base/TiledGridCoverage.java | 201 +++++++--- .../apache/sis/storage/base/TiledGridResource.java | 16 +- .../apache/sis/storage/image/WritableStore.java | 6 +- .../org/apache/sis/storage/internal/Resources.java | 11 +- .../sis/storage/internal/Resources.properties | 5 +- .../sis/storage/internal/Resources_fr.properties | 5 +- .../apache/sis/io/stream/ChannelDataInputTest.java | 111 +++++- .../sis/io/stream/HyperRectangleWriterTest.java | 44 ++ .../aggregate/BandAggregateGridResourceTest.java | 4 +- .../storage/aggregate/CoverageAggregatorTest.java | 107 ++++- .../sis/storage/aggregate/CoverageMosaicTest.java | 379 ++++++++++++++++++ .../sis/storage/aggregate/OpaqueGridResource.java | 11 +- .../sis/storage/base/MetadataBuilderTest.java | 63 +-- .../main/org/apache/sis/io/TableAppender.java | 7 +- .../main/org/apache/sis/io/TabularFormat.java | 10 +- .../main/org/apache/sis/math/StatisticsFormat.java | 9 +- .../main/org/apache/sis/util/CharSequences.java | 16 +- .../sis/util/DefaultInternationalString.java | 39 +- .../sis/util/collection/DefaultTreeTable.java | 25 +- .../org/apache/sis/util/collection/TreeTable.java | 21 +- .../sis/util/collection/TreeTableFormat.java | 12 +- .../org/apache/sis/util/privy/AbstractMap.java | 8 +- .../main/org/apache/sis/util/privy/Strings.java | 61 ++- .../org/apache/sis/test/LogRecordCollector.java | 2 +- .../sis/util/DefaultInternationalStringTest.java | 8 +- .../sis/util/SimpleInternationalStringTest.java | 8 +- .../sis/util/collection/TreeTableFormatTest.java | 2 +- .../org.apache.sis.map.service.StylePainter | 5 + ...che.sis.map.service.se1.SymbolizerToScene2D$Spi | 9 + .../sis/map/service/se1/RasterToScene2D.java | 3 +- .../sis/storage/shapefile/shp/ShapeRecord.java | 6 +- netbeans-project/ivy.xml | 2 +- optional/src/org.apache.sis.gui/bundle/bin/sisfx | 12 + .../apache/sis/gui/coverage/CoverageCanvas.java | 4 +- .../apache/sis/gui/internal/io/FileAccessItem.java | 2 +- .../main/org/apache/sis/gui/map/MapCanvas.java | 2 +- .../main/org/apache/sis/gui/map/StatusBar.java | 6 +- .../main/org/apache/sis/storage/gdal/Band.java | 17 +- .../org/apache/sis/storage/gdal/TiledCoverage.java | 34 +- .../org/apache/sis/storage/gdal/TiledResource.java | 17 +- settings.gradle.kts | 2 +- 142 files changed, 4205 insertions(+), 2023 deletions(-) diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java index e4bdab0792,5cf677f6af..d6421475bc --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java @@@ -1307,8 -1304,8 +1307,8 @@@ choice: if (intersect != 0) * for letting SIS create or associate new ones, which will be two-dimensional now. */ if (crs instanceof ProjectedCRS) { - final ProjectedCRS proj = (ProjectedCRS) crs; - final GeographicCRS base = (GeographicCRS) getHorizontalComponent(proj.getBaseCRS()); + final var proj = (ProjectedCRS) crs; - final var base = (GeodeticCRS) getHorizontalComponent(proj.getBaseCRS()); ++ final var base = (GeographicCRS) getHorizontalComponent(proj.getBaseCRS()); Conversion fromBase = proj.getConversionFromBase(); fromBase = new DefaultConversion(IdentifiedObjects.getProperties(fromBase), fromBase.getMethod(), null, fromBase.getParameterValues()); diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java index 2c66f32531,ac942698a4..bfd2f368e4 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java @@@ -122,11 -119,11 +122,11 @@@ final class StandardDefinitions */ static final Citation AUTHORITY; static { - final DefaultCitation c = new DefaultCitation(); + final var c = new DefaultCitation(); c.setTitle(Vocabulary.formatInternational(Vocabulary.Keys.SubsetOf_1, Constants.EPSG)); - c.setEdition(new SimpleInternationalString(StandardDefinitions.VERSION)); + c.setEdition(new SimpleInternationalString(VERSION)); c.getPresentationForms().add(PresentationForm.DOCUMENT_DIGITAL); - c.getOtherCitationDetails().add(NOTICE); + c.setOtherCitationDetails(NOTICE); c.transitionTo(DefaultCitation.State.FINAL); AUTHORITY = c; } diff --cc endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/gpx/Metadata.java index 439c0c75a7,9a84519b8f..f49e0e1e9b --- a/endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/gpx/Metadata.java +++ b/endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/gpx/Metadata.java @@@ -316,10 -313,10 +316,10 @@@ public final class Metadata extends Sim * @return means of communication with person(s) and organisations(s) associated with the resource. */ @Override - public Collection<Responsibility> getPointOfContacts() { + public Collection<ResponsibleParty> getPointOfContacts() { if (creator != null) { - final Person p = new Person(creator); + final var p = new Person(creator); - return (author != null) ? UnmodifiableArrayList.wrap(new Responsibility[] {p, author}) + return (author != null) ? UnmodifiableArrayList.wrap(new ResponsibleParty[] {p, author}) : Collections.singletonList(author); } return (author != null) ? Collections.singletonList(author) : Collections.emptyList(); diff --cc endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java index b71b7cc956,457e23abe3..4399710240 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java @@@ -27,10 -30,9 +30,9 @@@ import org.apache.sis.metadata.iso.cita import org.apache.sis.metadata.iso.citation.DefaultCitation; import org.apache.sis.metadata.iso.citation.DefaultCitationDate; import org.apache.sis.metadata.iso.constraint.DefaultLegalConstraints; - import static org.apache.sis.util.privy.Constants.MILLISECONDS_PER_DAY; -// Specific to the geoapi-4.0 branch: -import org.apache.sis.metadata.iso.citation.DefaultResponsibility; +// Specific to the main and geoapi-3.1 branches: +import org.apache.sis.metadata.iso.citation.DefaultResponsibleParty; /** @@@ -205,19 -213,91 +213,92 @@@ parse: for (int i = 0; i < length;) if (!isSpaceOrPunctuation(c)) break; i -= Character.charCount(c); } - final var c = new DefaultCitation(notice); + DefaultCitation citation = null; + if (locale != null) { + for (Citation c : constraints.getReferences()) { + if (c instanceof DefaultCitation) { + if (update(c.getTitle(), locale, notice)) { + citation = (DefaultCitation) c; // Set only on success. + break; + } + } + } + } + if (citation == null) { + citation = new DefaultCitation(i18n(locale, notice)); + constraints.getReferences().add(citation); + } if (year != 0) { - final Date date = new Date(LocalDate.of(year, 1, 1).toEpochDay() * MILLISECONDS_PER_DAY); - c.setDates(Collections.singleton(new DefaultCitationDate(date, DateType.IN_FORCE))); + final var date = new DefaultCitationDate(Year.of(year), DateType.IN_FORCE); + final var dates = citation.getDates(); + if (!dates.contains(date)) { + dates.add(date); + } } + /* + * At this point, the citation has been created and added to the contraints. + * If a party already exists, try to update the owner's name. This is based + * on the assumption that `LegalSymbols` is the only code putting 'i18n' in + * the constraints. + */ if (i != 0) { buffer.setLength(i); + final String owner = buffer.toString(); + if (locale != null) { + for (final var cited : citation.getCitedResponsibleParties()) { + if (cited.getRole() == Role.OWNER) { + for (final var party : cited.getParties()) { + final var i18n = party.getName(); + if (CharSequences.startsWith(owner, i18n.toString(Locale.ENGLISH), true)) { + /* + * Use case: name is followed by unwanted text because the + * `VALUES` special cases are provided in English only. + * Example: "John Smith, Tous droits réservés." + */ + return; + } + if (update(i18n, locale, owner)) { + return; + } + } + } + } + } // Same limitation as MetadataBuilder.party(). - final var party = new AbstractParty(buffer, null); - final var r = new DefaultResponsibleParty(Role.OWNER); - r.setParties(Collections.singleton(party)); - c.setCitedResponsibleParties(Collections.singleton(r)); + var party = new AbstractParty(i18n(locale, owner), null); - var cited = new DefaultResponsibility(Role.OWNER, null, party); ++ var cited = new DefaultResponsibleParty(Role.OWNER); ++ cited.getParties().add(party); + citation.getCitedResponsibleParties().add(cited); } - constraints.getReferences().add(c); + } + + /** + * If the given international string is an instance of {@link DefaultInternationalString}, + * add the language to it and returns {@code true}. Otherwise, returns {@code false} for + * notifying the caller that it needs to update the metadata itself. + * + * @param i18n the international string to update if possible. + * @param locale locale of the text. + * @param text the localized text. + */ + private static boolean update(final InternationalString i18n, final Locale locale, final String text) { + if (i18n instanceof DefaultInternationalString) try { + ((DefaultInternationalString) i18n).add(locale, text); + return true; + } catch (IllegalArgumentException e) { + Logging.ignorableException(StoreUtilities.LOGGER, MetadataBuilder.class, "parseLegalNotice", e); + } + return (i18n != null) && text.equalsIgnoreCase(i18n.toString()); + } + + /** + * Creates a potentially international string for the given text. + * + * @param locale locale of the text, or {@code null} if unspecified. + * @param text the text to internationalize. + * @return the potentially international text. + */ + private static CharSequence i18n(final Locale locale, final String text) { + return (locale != null) ? new DefaultInternationalString(locale, text) : text; } } diff --cc endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/MetadataBuilder.java index 21479d6858,b7ea27fe0a..4695f8b8c3 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/MetadataBuilder.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/MetadataBuilder.java @@@ -3133,8 -3132,7 +3134,7 @@@ public class MetadataBuilder } } final DefaultCitation c = getFormatCitation(); - addIfNotPresent(c.getIdentifiers(), driver); - addIfNotPresent(c.getOtherCitationDetails(), + c.setOtherCitationDetails( Resources.formatInternational(Resources.Keys.ReadBy_2, (title != null) ? title : driver.getCodeSpace(), (version != null) ? version : Vocabulary.formatInternational(Vocabulary.Keys.Unspecified))); }