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)));
      }

Reply via email to