This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 24277ad9f9ddb0e4d814faecfae0d140f45d051a Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Mon May 6 17:55:02 2024 +0200 Adapt for the removal of the `Duration`, `PeriodDuration` and `IntervalLength` interfaces from the `org.opengis.temporal` package. Those interfaces are replaced by `java.time.temporal.TemporalAmount`, `java.time.Period` and `java.time.Duration` respectively. https://github.com/opengeospatial/geoapi/issues/94 --- .../test/org/apache/sis/filter/PeriodLiteral.java | 10 +- .../DefaultDigitalTransferOptions.java | 17 +- .../metadata/iso/distribution/package-info.java | 2 +- .../iso/identification/AbstractIdentification.java | 25 +-- .../metadata/iso/identification/package-info.java | 2 +- .../maintenance/DefaultMaintenanceInformation.java | 12 +- .../sis/metadata/iso/maintenance/package-info.java | 6 +- .../apache/sis/metadata/simple/SimpleDuration.java | 76 -------- .../org/apache/sis/xml/bind/gts/TM_Duration.java | 127 ++++++++++--- .../apache/sis/xml/bind/gts/TM_PeriodDuration.java | 203 --------------------- .../apache/sis/metadata/PropertyAccessorTest.java | 4 +- .../apache/sis/storage/base/MetadataBuilder.java | 10 +- .../pending/temporal/DefaultPeriodDuration.java | 87 --------- .../pending/temporal/DefaultTemporalFactory.java | 15 -- .../org/apache/sis/pending/temporal/Primitive.java | 6 +- geoapi/snapshot | 2 +- 16 files changed, 153 insertions(+), 451 deletions(-) diff --git a/endorsed/src/org.apache.sis.feature/test/org/apache/sis/filter/PeriodLiteral.java b/endorsed/src/org.apache.sis.feature/test/org/apache/sis/filter/PeriodLiteral.java index 5624bfe21e..3afd405583 100644 --- a/endorsed/src/org.apache.sis.feature/test/org/apache/sis/filter/PeriodLiteral.java +++ b/endorsed/src/org.apache.sis.feature/test/org/apache/sis/filter/PeriodLiteral.java @@ -27,13 +27,13 @@ import org.opengis.feature.Feature; import org.opengis.filter.Expression; import org.opengis.filter.Literal; import org.opengis.temporal.Period; -import org.opengis.temporal.Duration; import org.opengis.temporal.RelativePosition; import org.opengis.temporal.TemporalPosition; import org.opengis.temporal.TemporalPrimitive; import org.opengis.temporal.TemporalGeometricPrimitive; // Specific to the geoapi-4.0 branch: +import java.time.temporal.TemporalAmount; import org.opengis.metadata.Identifier; @@ -75,16 +75,16 @@ final class PeriodLiteral implements Period, Literal<Feature,Period>, Serializab @Override public Identifier getName() {throw new UnsupportedOperationException();} @Override public TemporalPosition getTemporalPosition() {throw new UnsupportedOperationException();} @Override public RelativePosition relativePosition(TemporalPrimitive o) {throw new UnsupportedOperationException();} - @Override public Duration distance(TemporalGeometricPrimitive o) {throw new UnsupportedOperationException();} - @Override public Duration length() {throw new UnsupportedOperationException();} + @Override public TemporalAmount distance(TemporalGeometricPrimitive o) {throw new UnsupportedOperationException();} + @Override public TemporalAmount length() {throw new UnsupportedOperationException();} }; } /** Not needed for the tests. */ @Override public Identifier getName() {throw new UnsupportedOperationException();} @Override public RelativePosition relativePosition(TemporalPrimitive o) {throw new UnsupportedOperationException();} - @Override public Duration distance(TemporalGeometricPrimitive o) {throw new UnsupportedOperationException();} - @Override public Duration length() {throw new UnsupportedOperationException();} + @Override public TemporalAmount distance(TemporalGeometricPrimitive o) {throw new UnsupportedOperationException();} + @Override public TemporalAmount length() {throw new UnsupportedOperationException();} @Override public <N> Expression<Feature,N> toValueType(Class<N> target) {throw new UnsupportedOperationException();} /** diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDigitalTransferOptions.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDigitalTransferOptions.java index de564eff23..06708bb349 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDigitalTransferOptions.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDigitalTransferOptions.java @@ -17,12 +17,12 @@ package org.apache.sis.metadata.iso.distribution; import java.util.Collection; +import java.time.temporal.TemporalAmount; import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.opengis.util.InternationalString; -import org.opengis.temporal.PeriodDuration; import org.opengis.metadata.citation.OnlineResource; import org.opengis.metadata.distribution.DigitalTransferOptions; import org.opengis.metadata.distribution.Format; @@ -32,7 +32,7 @@ import org.apache.sis.metadata.iso.legacy.LegacyPropertyAdapter; import org.apache.sis.measure.ValueRange; import org.apache.sis.metadata.internal.Dependencies; import org.apache.sis.xml.bind.FilterByVersion; -import org.apache.sis.xml.bind.gts.TM_PeriodDuration; +import org.apache.sis.xml.bind.gts.TM_Duration; import org.apache.sis.util.privy.CollectionsExt; import static org.apache.sis.metadata.privy.ImplementationHelper.ensurePositive; @@ -53,7 +53,7 @@ import static org.apache.sis.metadata.privy.ImplementationHelper.ensurePositive; * @author Touraïvane (IRD) * @author Cédric Briançon (Geomatys) * @author Cullen Rombach (Image Matters) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlType(name = "MD_DigitalTransferOptions_Type", propOrder = { @@ -69,7 +69,7 @@ public class DefaultDigitalTransferOptions extends ISOMetadata implements Digita /** * Serial number for inter-operability with different versions. */ - private static final long serialVersionUID = -2901375920581273330L; + private static final long serialVersionUID = -7094568309031595844L; /** * Tiles, layers, geographic areas, etc., in which data is available. @@ -99,7 +99,7 @@ public class DefaultDigitalTransferOptions extends ISOMetadata implements Digita * Rate of occurrence of distribution. */ @SuppressWarnings("serial") - private PeriodDuration transferFrequency; + private TemporalAmount transferFrequency; /** * Formats of distribution. @@ -128,6 +128,7 @@ public class DefaultDigitalTransferOptions extends ISOMetadata implements Digita * * @see #castOrCopy(DigitalTransferOptions) */ + @SuppressWarnings("this-escape") public DefaultDigitalTransferOptions(final DigitalTransferOptions object) { super(object); if (object != null) { @@ -297,8 +298,8 @@ public class DefaultDigitalTransferOptions extends ISOMetadata implements Digita */ @Override @XmlElement(name = "transferFrequency") - @XmlJavaTypeAdapter(TM_PeriodDuration.Since2014.class) - public PeriodDuration getTransferFrequency() { + @XmlJavaTypeAdapter(TM_Duration.Since2014.class) + public TemporalAmount getTransferFrequency() { return transferFrequency; } @@ -309,7 +310,7 @@ public class DefaultDigitalTransferOptions extends ISOMetadata implements Digita * * @since 0.5 */ - public void setTransferFrequency(final PeriodDuration newValue) { + public void setTransferFrequency(final TemporalAmount newValue) { checkWritePermission(transferFrequency); transferFrequency = newValue; } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/package-info.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/package-info.java index 04079f2005..07becb2d25 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/package-info.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/package-info.java @@ -68,7 +68,7 @@ * @author Touraïvane (IRD) * @author Cédric Briançon (Geomatys) * @author Cullen Rombach (Image Matters) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlSchema(location="https://schemas.isotc211.org/19115/-3/mrd/1.0/mrd.xsd", diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/AbstractIdentification.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/AbstractIdentification.java index 8fde87b8ed..e3132e1663 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/AbstractIdentification.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/AbstractIdentification.java @@ -49,8 +49,8 @@ import org.apache.sis.xml.privy.LegacyNamespaces; import org.apache.sis.util.iso.Types; // Specific to the geoapi-3.1 and geoapi-4.0 branches: +import java.time.temporal.TemporalAmount; import org.opengis.metadata.identification.AssociatedResource; -import org.opengis.temporal.Duration; // Specific to the geoapi-4.0 branch: import org.opengis.metadata.citation.Responsibility; @@ -86,7 +86,7 @@ import org.opengis.metadata.citation.Responsibility; * @author Touraïvane (IRD) * @author Cédric Briançon (Geomatys) * @author Cullen Rombach (Image Matters) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlType(name = "AbstractMD_Identification_Type", propOrder = { @@ -127,7 +127,7 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio /** * Serial number for compatibility with different versions. */ - private static final long serialVersionUID = -1132210324047663554L; + private static final long serialVersionUID = 157053637951213015L; /** * Citation for the resource(s). @@ -182,7 +182,7 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio * Smallest resolvable temporal period in a resource. */ @SuppressWarnings("serial") - private Collection<Duration> temporalResolutions; + private Collection<TemporalAmount> temporalResolutions; /** * Main theme(s) of the resource. @@ -277,6 +277,7 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio * * @see #castOrCopy(Identification) */ + @SuppressWarnings("this-escape") public AbstractIdentification(final Identification object) { super(object); if (object != null) { @@ -288,7 +289,7 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio pointOfContacts = copyCollection(object.getPointOfContacts(), Responsibility.class); spatialRepresentationTypes = copyCollection(object.getSpatialRepresentationTypes(), SpatialRepresentationType.class); spatialResolutions = copyCollection(object.getSpatialResolutions(), Resolution.class); - temporalResolutions = copyCollection(object.getTemporalResolutions(), Duration.class); + temporalResolutions = copyCollection(object.getTemporalResolutions(), TemporalAmount.class); topicCategories = copyCollection(object.getTopicCategories(), TopicCategory.class); extents = copyCollection(object.getExtents(), Extent.class); additionalDocumentations = copyCollection(object.getAdditionalDocumentations(), Citation.class); @@ -520,12 +521,12 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio * * @return smallest resolvable temporal period in a resource. * - * @since 2.0 + * @since 1.5 */ @Override // @XmlElement at the end of this class. - public Collection<Duration> getTemporalResolutions() { - return temporalResolutions = nonNullCollection(temporalResolutions, Duration.class); + public Collection<TemporalAmount> getTemporalResolutions() { + return temporalResolutions = nonNullCollection(temporalResolutions, TemporalAmount.class); } /** @@ -533,10 +534,10 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio * * @param newValues the new temporal resolutions. * - * @since 2.0 + * @since 1.5 */ - public void setTemporalResolutions(final Collection<? extends Duration> newValues) { - temporalResolutions = writeCollection(newValues, temporalResolutions, Duration.class); + public void setTemporalResolutions(final Collection<? extends TemporalAmount> newValues) { + temporalResolutions = writeCollection(newValues, temporalResolutions, TemporalAmount.class); } /** @@ -852,7 +853,7 @@ public class AbstractIdentification extends ISOMetadata implements Identificatio * into {@code PeriodDuration} objects. Need to add support for {@code IntervalLength} in the future. */ @XmlElement(name = "temporalResolution") - private Collection<Duration> getTemporalResolution() { + private Collection<TemporalAmount> getTemporalResolution() { return FilterByVersion.CURRENT_METADATA.accept() ? getTemporalResolutions() : null; } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/package-info.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/package-info.java index 9a90e2ce77..8aa8ff4e99 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/package-info.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/identification/package-info.java @@ -96,7 +96,7 @@ * @author Touraïvane (IRD) * @author Cédric Briançon (Geomatys) * @author Cullen Rombach (Image Matters) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlSchema(location="https://schemas.isotc211.org/19115/-3/mri/1.0/mri.xsd", diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java index b2b4cdf4d9..9a6ca19e82 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java @@ -20,6 +20,7 @@ import java.util.Date; import java.util.Iterator; import java.util.Collection; import java.util.Collections; +import java.time.temporal.TemporalAmount; import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; @@ -29,7 +30,6 @@ import org.opengis.metadata.maintenance.MaintenanceFrequency; import org.opengis.metadata.maintenance.MaintenanceInformation; import org.opengis.metadata.maintenance.ScopeCode; import org.opengis.metadata.maintenance.ScopeDescription; -import org.opengis.temporal.PeriodDuration; import org.opengis.util.InternationalString; import org.apache.sis.metadata.iso.ISOMetadata; import org.apache.sis.metadata.iso.citation.DefaultCitationDate; @@ -69,7 +69,7 @@ import org.opengis.metadata.citation.Responsibility; * @author Guilhem Legal (Geomatys) * @author Rémi Maréchal (Geomatys) * @author Cullen Rombach (Image Matters) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlType(name = "MD_MaintenanceInformation_Type", propOrder = { @@ -88,7 +88,7 @@ public class DefaultMaintenanceInformation extends ISOMetadata implements Mainte /** * Serial number for inter-operability with different versions. */ - private static final long serialVersionUID = -8736825706141936429L; + private static final long serialVersionUID = -7934472150551882812L; /** * Frequency with which changes and additions are made to the resource after the @@ -106,7 +106,7 @@ public class DefaultMaintenanceInformation extends ISOMetadata implements Mainte * Maintenance period other than those defined, in milliseconds. */ @SuppressWarnings("serial") - private PeriodDuration userDefinedMaintenanceFrequency; + private TemporalAmount userDefinedMaintenanceFrequency; /** * Type of resource and / or extent to which the maintenance information applies. @@ -307,7 +307,7 @@ public class DefaultMaintenanceInformation extends ISOMetadata implements Mainte */ @Override @XmlElement(name = "userDefinedMaintenanceFrequency") - public PeriodDuration getUserDefinedMaintenanceFrequency() { + public TemporalAmount getUserDefinedMaintenanceFrequency() { return userDefinedMaintenanceFrequency; } @@ -316,7 +316,7 @@ public class DefaultMaintenanceInformation extends ISOMetadata implements Mainte * * @param newValue the new user defined maintenance frequency. */ - public void setUserDefinedMaintenanceFrequency(final PeriodDuration newValue) { + public void setUserDefinedMaintenanceFrequency(final TemporalAmount newValue) { checkWritePermission(userDefinedMaintenanceFrequency); userDefinedMaintenanceFrequency = newValue; } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/package-info.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/package-info.java index 2b7509128c..e72b18db41 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/package-info.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/package-info.java @@ -63,7 +63,7 @@ * @author Touraïvane (IRD) * @author Cédric Briançon (Geomatys) * @author Cullen Rombach (Image Matters) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlSchema(location="https://schemas.isotc211.org/19115/-3/mmi/1.0/mmi.xsd", @@ -83,7 +83,7 @@ @XmlJavaTypeAdapter(MD_Scope.class), @XmlJavaTypeAdapter(MD_ScopeCode.class), @XmlJavaTypeAdapter(MD_ScopeDescription.class), - @XmlJavaTypeAdapter(TM_PeriodDuration.class), + @XmlJavaTypeAdapter(TM_Duration.class), // Java types, primitive types and basic OGC types handling @XmlJavaTypeAdapter(StringAdapter.class), @@ -104,4 +104,4 @@ import org.apache.sis.xml.privy.LegacyNamespaces; import org.apache.sis.xml.bind.gco.*; import org.apache.sis.xml.bind.metadata.*; import org.apache.sis.xml.bind.metadata.code.*; -import org.apache.sis.xml.bind.gts.TM_PeriodDuration; +import org.apache.sis.xml.bind.gts.TM_Duration; diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/simple/SimpleDuration.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/simple/SimpleDuration.java deleted file mode 100644 index ca7d4a9c7e..0000000000 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/simple/SimpleDuration.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.simple; - -import org.apache.sis.util.privy.Numerics; - -// Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Duration; - - -/** - * A temporary implementation of {@link Duration}. - * Will probably be deleted in some future version. - * - * @author Martin Desruisseaux (Geomatys) - */ -public class SimpleDuration implements Duration { - /** - * Duration in days. - */ - public final double duration; - - /** - * Creates a new duration. - * - * @param duration the duration in days. - */ - public SimpleDuration(final double duration) { - this.duration = duration; - } - - /** - * Returns a string representation of this duration. - * - * @return the duration with its unit of measurement. - */ - @Override - public String toString() { - return duration + " days"; - } - - /** - * Returns a hash code value for this duration. - */ - @Override - public int hashCode() { - return Double.hashCode(duration) ^ 37; - } - - /** - * Compares this duration with the given object for equality. - * - * @param other the object to compare with this duration. - */ - @Override - public boolean equals(final Object other) { - if (other instanceof SimpleDuration) { - return Numerics.equals(duration, ((SimpleDuration) other).duration); - } - return false; - } -} diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_Duration.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_Duration.java index b2ae50530e..945dca99d8 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_Duration.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_Duration.java @@ -16,27 +16,31 @@ */ package org.apache.sis.xml.bind.gts; +import java.math.BigDecimal; +import java.math.BigInteger; +import javax.xml.datatype.Duration; +import javax.xml.datatype.DatatypeConfigurationException; import jakarta.xml.bind.annotation.XmlElement; -import org.opengis.temporal.PeriodDuration; import org.apache.sis.xml.bind.Context; +import org.apache.sis.xml.privy.XmlUtilities; import org.apache.sis.xml.bind.gco.PropertyType; -import org.apache.sis.util.Classes; import org.apache.sis.util.resources.Errors; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Duration; +import java.time.Period; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAmount; +import java.time.temporal.TemporalUnit; /** * Wraps a {@code gts:TM_Duration} element. * - * @todo Current implementation supports only ISO 19108 {@code Duration} that are instance of {@code DurationPeriod}. - * * @author Guilhem Legal (Geomatys) * @author Martin Desruisseaux (Geomatys) * @author Cullen Rombach (Image Matters) */ -public final class TM_Duration extends PropertyType<TM_Duration, Duration> { +public class TM_Duration extends PropertyType<TM_Duration, TemporalAmount> { /** * Empty constructor for JAXB. */ @@ -44,60 +48,135 @@ public final class TM_Duration extends PropertyType<TM_Duration, Duration> { } /** - * Wraps a Temporal Duration value at marshalling-time. + * Wraps a duration value at marshalling-time. * * @param metadata the metadata value to marshal. */ - private TM_Duration(final Duration metadata) { + private TM_Duration(final TemporalAmount metadata) { super(metadata); } /** - * Returns the Duration value wrapped by a {@code gts:TM_Duration} element. + * Returns the duration value wrapped by a {@code gts:TM_Duration} element. * * @param value the value to marshal. * @return the adapter which wraps the metadata value. */ @Override - protected TM_Duration wrap(final Duration value) { + protected TM_Duration wrap(final TemporalAmount value) { return new TM_Duration(value); } /** - * Returns the GeoAPI interface which is bound by this adapter. + * Returns the interface which is bound by this adapter. * - * @return {@code Duration.class} + * @return {@code TemporalAmount.class} */ @Override - protected Class<Duration> getBoundType() { - return Duration.class; + protected final Class<TemporalAmount> getBoundType() { + return TemporalAmount.class; } /** - * Returns the {@link Duration} generated from the metadata value. + * Returns the {@code Duration} generated from the metadata value. * This method is systematically called at marshalling time by JAXB. * * @return the time period, or {@code null}. */ @XmlElement(name = "TM_Duration") - public javax.xml.datatype.Duration getElement() { - if (metadata != null) { - if (metadata instanceof PeriodDuration) { - return TM_PeriodDuration.toXML((PeriodDuration) metadata); + public final Duration getElement() { + @SuppressWarnings("LocalVariableHidesMemberVariable") + final TemporalAmount metadata = this.metadata; + if (metadata != null) try { + BigInteger years = null; + BigInteger months = null; + BigInteger days = null; + BigInteger hours = null; + BigInteger minutes = null; + BigDecimal seconds = null; + for (TemporalUnit unit : metadata.getUnits()) { + if (unit instanceof ChronoUnit) { + final BigInteger value = BigInteger.valueOf(metadata.get(unit)); + switch ((ChronoUnit) unit) { + case YEARS: years = value; continue; + case MONTHS: months = value; continue; + case DAYS: days = value; continue; + case HOURS: hours = value; continue; + case MINUTES: minutes = value; continue; + case SECONDS: seconds = new BigDecimal(value); continue; + case MILLIS: seconds = addSeconds(seconds, value, 1000); continue; + case MICROS: seconds = addSeconds(seconds, value, 1_000_000); continue; + case NANOS: seconds = addSeconds(seconds, value, 1_000_000_000); continue; + } + } + Context.warningOccured(Context.current(), TM_Duration.class, "getElement", + Errors.class, Errors.Keys.UnsupportedType_1, unit); + return null; } - Context.warningOccured(Context.current(), TM_Duration.class, "getElement", Errors.class, - Errors.Keys.UnsupportedType_1, Classes.getClass(metadata)); + return XmlUtilities.getDatatypeFactory().newDuration(true, years, months, days, hours, minutes, seconds); + } catch (DatatypeConfigurationException e) { + Context.warningOccured(Context.current(), TM_Duration.class, "getElement", e, true); } return null; } /** - * Sets the value from the {@link Duration}. + * Returns <var>current</var> + (<var>numerator</var> / <var>denominator</var>) in seconds. + * If {@code current} is {@code null}, then it is considered zero. + * + * @param current the value to add to in number of seconds, or {@code null} if not yet defined. + * @param numerator numerator of the number of seconds to add. + * @param denominator denominator of the number of seconds to add. + * @return return of the addition, or {@code null} if none. + */ + private static BigDecimal addSeconds(final BigDecimal current, final BigInteger numerator, final int denominator) { + if (BigInteger.ZERO.equals(numerator)) { + return current; + } + BigDecimal toAdd = new BigDecimal(numerator).divide(BigDecimal.valueOf(denominator)); + return (current != null) ? current.add(toAdd) : toAdd; + } + + /** + * Sets the value from the {@code Duration}. * This method is called at unmarshalling time by JAXB. * * @param duration the value to set. */ - public void setElement(final javax.xml.datatype.Duration duration) { - metadata = TM_PeriodDuration.toISO(duration); + public void setElement(final Duration duration) { + if (duration != null) { + int years = duration.getYears(); // 0 if not present. + int months = duration.getMonths(); + int days = duration.getDays(); + if ((years | months | days) != 0) { + metadata = Period.of(years, months, days); + } else { + int hours = duration.getHours(); + int minutes = duration.getMinutes(); + int seconds = duration.getSeconds(); + if ((hours | minutes | seconds) != 0) { + metadata = java.time.Duration.ofSeconds(((hours * 24L) + minutes)*60 + seconds); + } + } + } + } + + /** + * Wraps the value only if marshalling an element from the ISO 19115:2014 metadata model. + * Otherwise (i.e. if marshalling according legacy ISO 19115:2003 model), omits the element. + */ + public static final class Since2014 extends TM_Duration { + /** Empty constructor used only by JAXB. */ + public Since2014() { + } + + /** + * Wraps the given value in an ISO 19115-3 element, unless we are marshalling an older document. + * + * @return a non-null value only if marshalling ISO 19115-3 or newer. + */ + @Override protected TM_Duration wrap(final TemporalAmount value) { + return accept2014() ? super.wrap(value) : null; + } } } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_PeriodDuration.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_PeriodDuration.java deleted file mode 100644 index 6024d50a5f..0000000000 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gts/TM_PeriodDuration.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * 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.xml.bind.gts; - -import java.math.BigDecimal; -import java.math.BigInteger; -import javax.xml.datatype.Duration; -import javax.xml.datatype.DatatypeFactory; -import javax.xml.datatype.DatatypeConfigurationException; -import jakarta.xml.bind.annotation.XmlElement; -import org.opengis.temporal.PeriodDuration; -import org.opengis.util.InternationalString; -import org.apache.sis.xml.bind.Context; -import org.apache.sis.xml.privy.XmlUtilities; -import org.apache.sis.xml.bind.gco.PropertyType; -import org.apache.sis.metadata.privy.TemporalUtilities; -import org.apache.sis.util.SimpleInternationalString; - -// Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.TemporalFactory; - - -/** - * Wraps a {@code gts:TM_PeriodDuration} element. - * - * @todo The work done in the {@link #getElement()} and {@link #setElement(Duration)} methods should move - * to {@link org.apache.sis.xml.ValueConverter}. However, they rely on the {@link org.opengis.temporal} - * API in geoapi-pending, which is not very clear... We prefer to hide this for now. - * - * @author Guilhem Legal (Geomatys) - * @author Martin Desruisseaux (Geomatys) - */ -public class TM_PeriodDuration extends PropertyType<TM_PeriodDuration, PeriodDuration> { - /** - * Empty constructor for JAXB. - */ - public TM_PeriodDuration() { - } - - /** - * Wraps a Temporal Period Duration value at marshalling-time. - * - * @param metadata the metadata value to marshal. - */ - private TM_PeriodDuration(final PeriodDuration metadata) { - super(metadata); - } - - /** - * Returns the Period Duration value wrapped by a {@code gts:TM_PeriodDuration} element. - * - * @param value the value to marshal. - * @return the adapter which wraps the metadata value. - */ - @Override - protected TM_PeriodDuration wrap(final PeriodDuration value) { - return new TM_PeriodDuration(value); - } - - /** - * Returns the GeoAPI interface which is bound by this adapter. - * - * @return {@code PeriodDuration.class} - */ - @Override - protected final Class<PeriodDuration> getBoundType() { - return PeriodDuration.class; - } - - /** - * Returns the {@link Duration} generated from the metadata value. - * This method is systematically called at marshalling time by JAXB. - * - * @return the time period, or {@code null}. - */ - @XmlElement(name = "TM_PeriodDuration") - public final Duration getElement() { - return toXML(metadata); - } - - /** - * Converts the given ISO 19108 duration into a Java XML duration. - */ - static Duration toXML(final PeriodDuration metadata) { - if (metadata != null) try { - /* - * Get the DatatypeFactory first because if not available, then we don't need to parse - * the calendar fields. This has the side effect of not validating the calendar fields - * syntax (which should be integer values), but maybe this is what the user wants. - */ - final DatatypeFactory factory = XmlUtilities.getDatatypeFactory(); - InternationalString value; - BigInteger years = null; - if ((value = metadata.getYears()) != null) { - years = new BigInteger(value.toString()); - } - BigInteger months = null; - if ((value = metadata.getMonths()) != null) { - months = new BigInteger(value.toString()); - } - BigInteger days = null; - if ((value = metadata.getDays()) != null) { - days = new BigInteger(value.toString()); - } - BigInteger hours = null; - if ((value = metadata.getHours()) != null) { - hours = new BigInteger(value.toString()); - } - BigInteger minutes = null; - if ((value = metadata.getMinutes()) != null) { - minutes = new BigInteger(value.toString()); - } - BigDecimal seconds = null; - if ((value = metadata.getSeconds()) != null) { - seconds = new BigDecimal(value.toString()); - } - return factory.newDuration(true, years, months, days, hours, minutes, seconds); - } catch (DatatypeConfigurationException e) { - Context.warningOccured(Context.current(), TM_PeriodDuration.class, "toXML", e, true); - } - return null; - } - - /** - * Sets the value from the {@link Duration}. - * This method is called at unmarshalling time by JAXB. - * - * @param duration the adapter to set. - */ - public final void setElement(final Duration duration) { - metadata = toISO(duration); - } - - /** - * Converts the given Java XML duration into an ISO 19108 duration. - */ - static PeriodDuration toISO(final Duration duration) { - if (duration != null) { - final TemporalFactory factory = TemporalUtilities.getTemporalFactory(); - InternationalString years = null; - int value; - if ((value = duration.getYears()) != 0) { - years = new SimpleInternationalString(Integer.toString(value)); - } - InternationalString months = null; - if ((value = duration.getMonths()) != 0) { - months = new SimpleInternationalString(Integer.toString(value)); - } - InternationalString weeks = null; // No weeks in javax.xml.datatype.Duration - InternationalString days = null; - if ((value = duration.getDays()) != 0) { - days = new SimpleInternationalString(Integer.toString(value)); - } - InternationalString hours = null; - if ((value = duration.getHours()) != 0) { - hours = new SimpleInternationalString(Integer.toString(value)); - } - InternationalString minutes = null; - if ((value = duration.getMinutes()) != 0) { - minutes = new SimpleInternationalString(Integer.toString(value)); - } - InternationalString seconds = null; - if ((value = duration.getSeconds()) != 0) { - seconds = new SimpleInternationalString(Integer.toString(value)); - } - return factory.createPeriodDuration(years, months, weeks, days, hours, minutes, seconds); - } - return null; - } - - /** - * Wraps the value only if marshalling an element from the ISO 19115:2014 metadata model. - * Otherwise (i.e. if marshalling according legacy ISO 19115:2003 model), omits the element. - */ - public static final class Since2014 extends TM_PeriodDuration { - /** Empty constructor used only by JAXB. */ - public Since2014() { - } - - /** - * Wraps the given value in an ISO 19115-3 element, unless we are marshalling an older document. - * - * @return a non-null value only if marshalling ISO 19115-3 or newer. - */ - @Override protected TM_PeriodDuration wrap(final PeriodDuration value) { - return accept2014() ? super.wrap(value) : null; - } - } -} diff --git a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java index 9bbd7005c4..f093384518 100644 --- a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java +++ b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java @@ -66,9 +66,9 @@ import static org.apache.sis.metadata.Assertions.assertTitleEquals; import org.opengis.metadata.content.AttributeGroup; import org.opengis.referencing.ObjectDomain; import org.opengis.referencing.datum.DatumEnsemble; -import org.opengis.temporal.Duration; // Specific to the geoapi-4.0 branch: +import java.time.temporal.TemporalAmount; import org.opengis.metadata.citation.Responsibility; @@ -215,7 +215,7 @@ public final class PropertyAccessorTest extends TestCase { Identification.class, "getPointOfContacts", "pointOfContacts", "pointOfContact", "Point of contacts", Responsibility[].class, Identification.class, "getSpatialRepresentationTypes", "spatialRepresentationTypes", "spatialRepresentationType", "Spatial representation types", SpatialRepresentationType[].class, Identification.class, "getSpatialResolutions", "spatialResolutions", "spatialResolution", "Spatial resolutions", Resolution[].class, - Identification.class, "getTemporalResolutions", "temporalResolutions", "temporalResolution", "Temporal resolutions", Duration[].class, + Identification.class, "getTemporalResolutions", "temporalResolutions", "temporalResolution", "Temporal resolutions", TemporalAmount[].class, Identification.class, "getTopicCategories", "topicCategories", "topicCategory", "Topic categories", TopicCategory[].class, Identification.class, "getExtents", "extents", "extent", "Extents", Extent[].class, Identification.class, "getAdditionalDocumentations", "additionalDocumentations", "additionalDocumentation", "Additional documentations", Citation[].class, diff --git 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 index 652d2bcf25..7ab125d63c 100644 --- 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 @@ -17,6 +17,8 @@ package org.apache.sis.storage.base; import java.time.Instant; +import java.time.Duration; +import java.time.temporal.TemporalAmount; import java.util.Date; import java.util.Locale; import java.util.Optional; @@ -68,6 +70,7 @@ import org.apache.sis.util.iso.Names; import org.apache.sis.util.iso.Types; import org.apache.sis.util.logging.Logging; import org.apache.sis.util.privy.CollectionsExt; +import org.apache.sis.util.privy.StandardDateFormat; import org.apache.sis.util.privy.Strings; import org.apache.sis.util.resources.Vocabulary; import org.apache.sis.metadata.ModifiableMetadata; @@ -102,9 +105,7 @@ import org.apache.sis.pending.jdk.JDK21; import org.apache.sis.measure.Units; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Duration; import org.opengis.feature.FeatureType; -import org.apache.sis.metadata.simple.SimpleDuration; /** @@ -2026,7 +2027,8 @@ public class MetadataBuilder { */ public final void addTemporalResolution(final double duration) { if (Double.isFinite(duration)) { - addIfNotPresent(identification().getTemporalResolutions(), new SimpleDuration(duration)); + addIfNotPresent(identification().getTemporalResolutions(), + Duration.ofMillis(Math.round(duration * StandardDateFormat.MILLISECONDS_PER_DAY))); } } @@ -3189,7 +3191,7 @@ public class MetadataBuilder { for (Resolution r : info.getSpatialResolutions()) { addIfNotPresent(identification.getSpatialResolutions(), r); } - for (Duration r : info.getTemporalResolutions()) { + for (TemporalAmount r : info.getTemporalResolutions()) { addIfNotPresent(identification.getTemporalResolutions(), r); } for (Format r : info.getResourceFormats()) { diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriodDuration.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriodDuration.java deleted file mode 100644 index 8464454ba2..0000000000 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriodDuration.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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.pending.temporal; - -import java.util.Objects; -import org.opengis.util.InternationalString; - -// Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.PeriodDuration; - - -/** - * Default implementation of GeoAPI period duration. This is a temporary class; - * GeoAPI temporal interfaces are expected to change a lot in a future revision. - * - * @author Martin Desruisseaux (Geomatys) - */ -final class DefaultPeriodDuration implements PeriodDuration { - /** Components of this period duration. */ - private final InternationalString years, months, week, days, hours, minutes, seconds; - - /** - * Creates a new duration. - */ - DefaultPeriodDuration( - final InternationalString years, final InternationalString months, - final InternationalString week, final InternationalString days, - final InternationalString hours, final InternationalString minutes, final InternationalString seconds) - { - this.years = years; - this.months = months; - this.week = week; - this.days = days; - this.hours = hours; - this.minutes = minutes; - this.seconds = seconds; - } - - - @Override public InternationalString getDesignator() {return null;} - @Override public InternationalString getYears() {return years;} - @Override public InternationalString getMonths() {return months;} - @Override public InternationalString getDays() {return days;} - @Override public InternationalString getTimeIndicator() {return null;} - @Override public InternationalString getHours() {return hours;} - @Override public InternationalString getMinutes() {return minutes;} - @Override public InternationalString getSeconds() {return seconds;} - - /** String representation. */ - @Override public String toString() { - return "PeriodDuration[" + years + '-' + months + '-' + days + ' ' + hours + ':' + minutes + ':' + seconds + ']'; - } - - /** Hash code value of the time position. */ - @Override public int hashCode() { - return Objects.hash(years, months, week, days, hours, minutes, seconds); - } - - /** Compares with given object for equality. */ - @Override public boolean equals(final Object obj) { - if (obj instanceof DefaultPeriodDuration) { - DefaultPeriodDuration other = (DefaultPeriodDuration) obj; - return Objects.equals(other.years, years) && - Objects.equals(other.months, months) && - Objects.equals(other.week, week) && - Objects.equals(other.days, days) && - Objects.equals(other.hours, hours) && - Objects.equals(other.minutes, minutes) && - Objects.equals(other.seconds, seconds); - } - return false; - } -} diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultTemporalFactory.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultTemporalFactory.java index 660f3d8e63..05ace753bf 100644 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultTemporalFactory.java +++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultTemporalFactory.java @@ -58,15 +58,6 @@ public final class DefaultTemporalFactory implements TemporalFactory { return new DefaultPeriod(begin, end); } - /** Creates a period duration. */ - @Override public PeriodDuration createPeriodDuration( - InternationalString years, InternationalString months, - InternationalString week, InternationalString days, - InternationalString hours, InternationalString minutes, InternationalString seconds) - { - return new DefaultPeriodDuration(years, months, week, days, hours, minutes, seconds); - } - /** Returns the exception to be thrown by all unsupported methods. */ static UnsupportedOperationException unsupported() { return new UnsupportedOperationException(Errors.format(Errors.Keys.MissingRequiredModule_1, "sis-temporal")); @@ -107,12 +98,6 @@ public final class DefaultTemporalFactory implements TemporalFactory { throw unsupported(); } - /** Unsupported. */ - @SuppressWarnings("rawtypes") - @Override public IntervalLength createIntervalLenght(Unit unit, int radix, int factor, int value) { - throw unsupported(); - } - /** Unsupported. */ @Override public JulianDate createJulianDate(TemporalReferenceSystem frame, IndeterminateValue indeterminatePosition, Number coordinateValue) { throw unsupported(); diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/Primitive.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/Primitive.java index d176fa6bc0..0287791d12 100644 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/Primitive.java +++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/Primitive.java @@ -16,12 +16,12 @@ */ package org.apache.sis.pending.temporal; -import org.opengis.temporal.Duration; import org.opengis.temporal.RelativePosition; import org.opengis.temporal.TemporalGeometricPrimitive; import org.opengis.temporal.TemporalPrimitive; // Specific to the geoapi-4.0 branch: +import java.time.temporal.TemporalAmount; import org.opengis.metadata.Identifier; @@ -63,12 +63,12 @@ class Primitive implements TemporalGeometricPrimitive, Identifier { } /** Absolute value of the difference between temporal positions. */ - @Override public final Duration distance(TemporalGeometricPrimitive other) { + @Override public final TemporalAmount distance(TemporalGeometricPrimitive other) { throw DefaultTemporalFactory.unsupported(); } /** Duration of this temporal geometric primitive. */ - @Override public final Duration length() { + @Override public final TemporalAmount length() { return null; // Do not throw an exception here; this is invoked by reflection. } } diff --git a/geoapi/snapshot b/geoapi/snapshot index 41a6799cb2..eba6172d3a 160000 --- a/geoapi/snapshot +++ b/geoapi/snapshot @@ -1 +1 @@ -Subproject commit 41a6799cb2940149f5f034db64365241198da439 +Subproject commit eba6172d3a3b555c40736fa23efae8ec865d1fba