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
The following commit(s) were added to refs/heads/geoapi-4.0 by this push: new 458bb5e893 Remove dependency to `org.opengis.temporal.Instant`, replaced by `java.time.Instant`. https://github.com/opengeospatial/geoapi/issues/79 458bb5e893 is described below commit 458bb5e893f1aef0cd86ef37d7770f1dc1fe715b Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Wed May 8 13:54:32 2024 +0200 Remove dependency to `org.opengis.temporal.Instant`, replaced by `java.time.Instant`. https://github.com/opengeospatial/geoapi/issues/79 --- .../main/org/apache/sis/filter/TemporalFilter.java | 94 +++++----------------- .../test/org/apache/sis/filter/PeriodLiteral.java | 21 +---- .../metadata/iso/extent/DefaultTemporalExtent.java | 27 +++---- .../metadata/iso/lineage/DefaultProcessStep.java | 3 +- .../sis/metadata/privy/TemporalUtilities.java | 74 ++++++++--------- .../org/apache/sis/xml/bind/gml/TM_Primitive.java | 7 +- .../org/apache/sis/xml/bind/gml/TimeInstant.java | 21 +++-- .../apache/sis/xml/bind/gml/TimePeriodBound.java | 2 +- .../apache/sis/xml/bind/gml/TimePeriodTest.java | 26 +++--- .../sis/storage/geotiff/reader/XMLMetadata.java | 3 +- .../apache/sis/storage/netcdf/base/CRSBuilder.java | 4 +- .../apache/sis/storage/base/MetadataBuilder.java | 16 ++++ .../sis/pending/temporal/DefaultInstant.java | 65 --------------- .../apache/sis/pending/temporal/DefaultPeriod.java | 2 +- .../pending/temporal/DefaultTemporalFactory.java | 7 +- geoapi/snapshot | 2 +- 16 files changed, 117 insertions(+), 257 deletions(-) diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/filter/TemporalFilter.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/filter/TemporalFilter.java index a9d6d8c8a1..f6e567be64 100644 --- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/filter/TemporalFilter.java +++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/filter/TemporalFilter.java @@ -16,7 +16,6 @@ */ package org.apache.sis.filter; -import java.util.Date; import java.time.Instant; // Specific to the geoapi-3.1 and geoapi-4.0 branches: @@ -63,81 +62,28 @@ abstract class TemporalFilter<T> extends BinaryFunction<T,Object,Object> super(expression1, expression2); } - /** - * Converts a GeoAPI instant to a Java instant. This is a temporary method - * to be removed after we revisited {@link org.opengis.temporal} package. - * - * @param instant the GeoAPI instant, or {@code null}. - * @return the Java instant, or {@code null}. - */ - private static Instant toInstant(final org.opengis.temporal.Instant instant) { - if (instant != null) { - final Date t = instant.getDate(); - if (t != null) { - return t.toInstant(); - } - } - return null; - } - /** * Returns {@code true} if {@code self} is non null and before {@code other}. * This is an helper function for {@code evaluate(…)} methods implementations. */ - private static boolean isBefore(final org.opengis.temporal.Instant self, final Instant other) { - final Instant t = toInstant(self); - return (t != null) && t.isBefore(other); + private static boolean isBefore(final Instant self, final Instant other) { + return (self != null) && (other != null) && self.isBefore(other); } /** * Returns {@code true} if {@code self} is non null and after {@code other}. * This is an helper function for {@code evaluate(…)} methods implementations. */ - private static boolean isAfter(final org.opengis.temporal.Instant self, final Instant other) { - final Instant t = toInstant(self); - return (t != null) && t.isAfter(other); + private static boolean isAfter(final Instant self, final Instant other) { + return (self != null) && (other != null) && self.isAfter(other); } /** * Returns {@code true} if {@code self} is non null and equal to {@code other}. * This is an helper function for {@code evaluate(…)} methods implementations. */ - private static boolean isEqual(final org.opengis.temporal.Instant self, final Instant other) { - final Instant t = toInstant(self); - return (t != null) && t.equals(other); - } - - /** - * Returns {@code true} if {@code self} is non null and before {@code other}. - * This is an helper function for {@code evaluate(…)} methods implementations. - */ - private static boolean isBefore(final org.opengis.temporal.Instant self, - final org.opengis.temporal.Instant other) - { - final Instant t, o; - return ((t = toInstant(self)) != null) && ((o = toInstant(other)) != null) && t.isBefore(o); - } - - /** - * Returns {@code true} if {@code self} is non null and after {@code other}. - * This is an helper function for {@code evaluate(…)} methods implementations. - */ - private static boolean isAfter(final org.opengis.temporal.Instant self, - final org.opengis.temporal.Instant other) - { - final Instant t, o; - return ((t = toInstant(self)) != null) && ((o = toInstant(other)) != null) && t.isAfter(o); - } - - /** - * Returns {@code true} if {@code self} is non null and equal to {@code other}. - * This is an helper function for {@code evaluate(…)} methods implementations. - */ - private static boolean isEqual(final org.opengis.temporal.Instant self, - final org.opengis.temporal.Instant other) - { - final Instant t = toInstant(self); - return (t != null) && t.equals(toInstant(other)); + private static boolean isEqual(final Instant self, final Instant other) { + return (self != null) && self.equals(other); } /** @@ -735,11 +681,11 @@ abstract class TemporalFilter<T> extends BinaryFunction<T,Object,Object> /** Condition defined by ISO 19108:2006 (corrigendum) §5.2.3.5. */ @Override public boolean evaluate(final Period self, final Period other) { - final Instant selfEnd, otherBegin; - return ((selfEnd = toInstant(self .getEnding())) != null) && - ((otherBegin = toInstant(other.getBeginning())) != null) && selfEnd.isAfter(otherBegin) && - isBefore(self.getBeginning(), otherBegin) && - isAfter(other.getEnding(), selfEnd); + final Instant selfBegin, selfEnd, otherBegin, otherEnd; + return ((otherBegin = other.getBeginning()) != null) && + ((selfBegin = self .getBeginning()) != null) && selfBegin.isBefore(otherBegin) && + ((selfEnd = self .getEnding()) != null) && selfEnd .isAfter (otherBegin) && + ((otherEnd = other.getEnding()) != null) && otherEnd .isAfter (selfEnd); } } @@ -775,11 +721,11 @@ abstract class TemporalFilter<T> extends BinaryFunction<T,Object,Object> /** Condition defined by ISO 19108:2006 (corrigendum) §5.2.3.5. */ @Override public boolean evaluate(final Period self, final Period other) { - final Instant selfBegin, otherEnd; - return ((selfBegin = toInstant(self .getBeginning())) != null) && - ((otherEnd = toInstant(other.getEnding())) != null) && selfBegin.isBefore(otherEnd) && - isBefore(other.getBeginning(), selfBegin) && - isAfter (self .getEnding(), otherEnd); + final Instant selfBegin, selfEnd, otherBegin, otherEnd; + return ((selfBegin = self .getBeginning()) != null) && + ((otherBegin = other.getBeginning()) != null) && otherBegin.isBefore(selfBegin) && + ((otherEnd = other.getEnding()) != null) && selfBegin .isBefore(otherEnd) && + ((selfEnd = self .getEnding()) != null) && selfEnd .isAfter (otherEnd); } } @@ -814,10 +760,10 @@ abstract class TemporalFilter<T> extends BinaryFunction<T,Object,Object> /** Condition defined by OGC filter specification. */ @Override public boolean evaluate(final Period self, final Period other) { final Instant selfBegin, selfEnd, otherBegin, otherEnd; - return ((selfBegin = toInstant(self .getBeginning())) != null) && - ((otherEnd = toInstant(other.getEnding())) != null) && selfBegin.isBefore(otherEnd) && - ((selfEnd = toInstant(self .getEnding())) != null) && - ((otherBegin = toInstant(other.getBeginning())) != null) && selfEnd.isAfter(otherBegin); + return ((selfBegin = self .getBeginning()) != null) && + ((otherEnd = other.getEnding()) != null) && selfBegin.isBefore(otherEnd) && + ((selfEnd = self .getEnding()) != null) && + ((otherBegin = other.getBeginning()) != null) && selfEnd.isAfter(otherBegin); } } } 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 3afd405583..e9738893d7 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 @@ -28,11 +28,11 @@ import org.opengis.filter.Expression; import org.opengis.filter.Literal; import org.opengis.temporal.Period; 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.Instant; import java.time.temporal.TemporalAmount; import org.opengis.metadata.Identifier; @@ -62,23 +62,8 @@ final class PeriodLiteral implements Period, Literal<Feature,Period>, Serializab @Override public Period getValue() {return this;} /** Returns a bound of this period. */ - @Override public org.opengis.temporal.Instant getBeginning() {return instant(begin);} - @Override public org.opengis.temporal.Instant getEnding() {return instant(end);} - - /** Wraps the value that defines a period. */ - private static org.opengis.temporal.Instant instant(final long t) { - return new org.opengis.temporal.Instant() { - @Override public Date getDate() {return new Date(t);} - @Override public String toString() {return "Instant[" + TestUtilities.format(getDate()) + '[';} - - /** Not needed for the tests. */ - @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 TemporalAmount distance(TemporalGeometricPrimitive o) {throw new UnsupportedOperationException();} - @Override public TemporalAmount length() {throw new UnsupportedOperationException();} - }; - } + @Override public Instant getBeginning() {return Instant.ofEpochMilli(begin);} + @Override public Instant getEnding() {return Instant.ofEpochMilli(end);} /** Not needed for the tests. */ @Override public Identifier getName() {throw new UnsupportedOperationException();} diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java index f9b20ae538..cd5dd14d9a 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java @@ -33,8 +33,8 @@ import org.apache.sis.xml.NilObject; import org.apache.sis.xml.NilReason; // Specific to the geoapi-3.1 and geoapi-4.0 branches: +import java.time.Instant; import org.opengis.temporal.Period; -import org.opengis.temporal.Instant; /** @@ -64,7 +64,7 @@ import org.opengis.temporal.Instant; * @author Martin Desruisseaux (IRD, Geomatys) * @author Touraïvane (IRD) * @author Cédric Briançon (Geomatys) - * @version 1.4 + * @version 1.5 * @since 0.3 */ @XmlType(name = "EX_TemporalExtent_Type") @@ -168,15 +168,14 @@ public class DefaultTemporalExtent extends ISOMetadata implements TemporalExtent * @return the requested time as a Java date, or {@code null} if none. */ static Date getTime(final TemporalPrimitive extent, final boolean begin) { - final Instant instant; - if (extent instanceof Instant) { - instant = (Instant) extent; - } else if (extent instanceof Period) { - instant = begin ? ((Period) extent).getBeginning() : ((Period) extent).getEnding(); - } else { - return null; + if (extent instanceof Period) { + var p = (Period) extent; + Instant time = begin ? p.getBeginning() : p.getEnding(); + if (time != null) { + return Date.from(time); + } } - return instant.getDate(); + return null; } /** @@ -209,13 +208,7 @@ public class DefaultTemporalExtent extends ISOMetadata implements TemporalExtent public void setBounds(final Date startTime, final Date endTime) throws UnsupportedOperationException { TemporalPrimitive value = null; if (startTime != null || endTime != null) { - if (endTime == null || endTime.equals(startTime)) { - value = TemporalUtilities.createInstant(startTime); - } else if (startTime == null) { - value = TemporalUtilities.createInstant(endTime); - } else { - value = TemporalUtilities.createPeriod(startTime, endTime); - } + value = TemporalUtilities.createPeriod(startTime, endTime); } setExtent(value); } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java index 523a18c87a..7762e52c8c 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java @@ -180,6 +180,7 @@ public class DefaultProcessStep extends ISOMetadata implements ProcessStep { * * @see #castOrCopy(ProcessStep) */ + @SuppressWarnings("this-escape") public DefaultProcessStep(final ProcessStep object) { super(object); if (object != null) { @@ -299,7 +300,7 @@ public class DefaultProcessStep extends ISOMetadata implements ProcessStep { @Deprecated(since="1.0") @XmlElement(name = "dateTime", namespace = LegacyNamespaces.GMD) public Date getDate() { - return FilterByVersion.LEGACY_METADATA.accept() ? TemporalUtilities.getDate(getStepDateTime()) : null; + return FilterByVersion.LEGACY_METADATA.accept() ? TemporalUtilities.getAnyDate(getStepDateTime()) : null; } /** diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/privy/TemporalUtilities.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/privy/TemporalUtilities.java index 8274143c87..ee30445316 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/privy/TemporalUtilities.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/privy/TemporalUtilities.java @@ -25,7 +25,7 @@ import org.apache.sis.system.SystemListener; import org.apache.sis.pending.temporal.DefaultTemporalFactory; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Instant; +import java.time.Instant; import org.opengis.temporal.Period; import org.opengis.temporal.TemporalFactory; @@ -67,7 +67,7 @@ public final class TemporalUtilities extends SystemListener { * * @return the temporal factory. */ - public static TemporalFactory getTemporalFactory() { + private static TemporalFactory getTemporalFactory() { TemporalFactory factory = implementation; if (factory == null) { factory = ServiceLoader.load(TemporalFactory.class, Reflect.getContextClassLoader()) @@ -77,13 +77,6 @@ public final class TemporalUtilities extends SystemListener { return factory; } - /** - * Creates an instant for the given date using the given factory. - */ - private static Instant createInstant(final TemporalFactory factory, final Date date) { - return factory.createInstant(date); - } - /** * Creates an instant for the given date. * @@ -91,54 +84,61 @@ public final class TemporalUtilities extends SystemListener { * @return the instant, or {@code null} if the given time was null. * @throws UnsupportedOperationException if the temporal factory is not available on the module path. */ - public static Instant createInstant(final Date time) throws UnsupportedOperationException { - return (time != null) ? createInstant(getTemporalFactory(), time) : null; + public static TemporalPrimitive createInstant(final Date time) throws UnsupportedOperationException { + if (time == null) return null; + final Instant t = time.toInstant(); + return getTemporalFactory().createPeriod(t, t); } /** * Creates a period for the given begin and end dates. The given arguments can be null if the - * {@link TemporalFactory#createInstant(Date)} method accepts null dates, which stand for - * undetermined position. + * {@link TemporalFactory} methods accept null instants, which stand for undetermined position. * * @param begin the begin date, inclusive. * @param end the end date, inclusive. - * @return the period. + * @return the period, or {@code null} if both arguments are null. * @throws UnsupportedOperationException if the temporal factory is not available on the module path. */ - public static Period createPeriod(final Date begin, final Date end) throws UnsupportedOperationException { - final TemporalFactory factory = getTemporalFactory(); - return factory.createPeriod(createInstant(factory, begin), createInstant(factory, end)); + public static TemporalPrimitive createPeriod(final Date begin, final Date end) throws UnsupportedOperationException { + if (begin == null && end == null) return null; + return getTemporalFactory().createPeriod( + (begin != null) ? begin.toInstant() : null, + (end != null) ? end.toInstant() : null); } /** - * Infers a value from the extent as a {@link Date} object. - * This method is used for compatibility with legacy API and may disappear in future SIS version. + * Returns the given value as an instant if the period is a single point in time, or {@code null} otherwis. * * @param time the instant or period for which to get a date, or {@code null}. - * @return the requested time as a Java date, or {@code null} if none. + * @return the instant, or {@code null} if none. */ - public static Date getDate(final TemporalPrimitive time) { - Instant instant; - if (time instanceof Instant) { - instant = (Instant) time; - } else if (time instanceof Period) { - instant = ((Period) time).getEnding(); - if (instant == null) { - instant = ((Period) time).getBeginning(); - } - } else { - return null; + public static Instant getInstant(final TemporalPrimitive time) { + if (time instanceof Period) { + var p = (Period) time; + final Instant begin = p.getBeginning(); + final Instant end = p.getEnding(); + if (begin == null) return end; + if (end == null) return begin; + if (begin.equals(end)) return end; } - return instant.getDate(); + return null; } /** - * Temporary method, to be removed after we upgraded metadata to {@link java.time}. + * Infers a value from the extent as a {@link Date} object. + * This method is used for compatibility with legacy API and may disappear in future SIS version. * - * @param instant the Java instant, or {@code null}. - * @return the legacy Java date, or {@code null}. + * @param time the instant or period for which to get a date, or {@code null}. + * @return the requested time as a Java date, or {@code null} if none. */ - public static Date toDate(final java.time.Instant instant) { - return (instant != null) ? Date.from(instant) : null; + public static Date getAnyDate(final TemporalPrimitive time) { + if (time instanceof Period) { + var p = (Period) time; + Instant instant; + if ((instant = p.getEnding()) != null || (instant = p.getBeginning()) != null) { + return Date.from(instant); + } + } + return null; } } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TM_Primitive.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TM_Primitive.java index 51233a96ab..edea96f9cb 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TM_Primitive.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TM_Primitive.java @@ -26,8 +26,8 @@ import org.apache.sis.metadata.privy.TemporalUtilities; import org.apache.sis.util.resources.Errors; // Specific to the geoapi-3.1 and geoapi-4.0 branches: +import java.time.Instant; import org.opengis.temporal.Period; -import org.opengis.temporal.Instant; /** @@ -82,6 +82,7 @@ public class TM_Primitive extends PropertyType<TM_Primitive, TemporalPrimitive> */ @XmlElement(name = "TimePeriod") public final TimePeriod getTimePeriod() { + @SuppressWarnings("LocalVariableHidesMemberVariable") final TemporalPrimitive metadata = this.metadata; return (metadata instanceof Period) ? new TimePeriod((Period) metadata) : null; } @@ -94,8 +95,8 @@ public class TM_Primitive extends PropertyType<TM_Primitive, TemporalPrimitive> */ @XmlElement(name = "TimeInstant") public final TimeInstant getTimeInstant() { - final TemporalPrimitive metadata = this.metadata; - return (metadata instanceof Instant) ? new TimeInstant((Instant) metadata) : null; + Instant time = TemporalUtilities.getInstant(metadata); + return (time != null) ? new TimeInstant(time) : null; } /** diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimeInstant.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimeInstant.java index d643f739aa..3f3cbebe49 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimeInstant.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimeInstant.java @@ -27,7 +27,7 @@ import org.apache.sis.util.privy.Strings; import org.apache.sis.xml.privy.XmlUtilities; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Instant; +import java.time.Instant; /** @@ -78,18 +78,15 @@ public final class TimeInstant extends GMLAdapter { */ static XMLGregorianCalendar toXML(final Instant instant) { if (instant != null) { - final Date date = instant.getDate(); - if (date != null) { - final Context context = Context.current(); - try { - final XMLGregorianCalendar gc = XmlUtilities.toXML(context, date); - if (gc != null) { - XmlUtilities.trimTime(gc, false); - return gc; - } - } catch (DatatypeConfigurationException e) { - Context.warningOccured(context, TimeInstant.class, "toXML", e, true); + final Context context = Context.current(); + try { + final XMLGregorianCalendar gc = XmlUtilities.toXML(context, Date.from(instant)); + if (gc != null) { + XmlUtilities.trimTime(gc, false); + return gc; } + } catch (DatatypeConfigurationException | IllegalArgumentException e) { + Context.warningOccured(context, TimeInstant.class, "toXML", e, true); } } return null; diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java index c50166bd32..01fe46259c 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java @@ -23,7 +23,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlTransient; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Instant; +import java.time.Instant; /** diff --git a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java index e7f45e320f..3036090230 100644 --- a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java +++ b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java @@ -27,7 +27,6 @@ import org.apache.sis.xml.XML; import org.apache.sis.xml.Namespaces; import org.apache.sis.xml.MarshallerPool; import org.apache.sis.xml.privy.XmlUtilities; -import org.apache.sis.pending.temporal.DefaultTemporalFactory; // Test dependencies import org.junit.jupiter.api.Test; @@ -39,7 +38,7 @@ import static org.apache.sis.test.TestUtilities.date; import static org.apache.sis.test.TestUtilities.format; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Instant; +import java.time.Instant; /** @@ -76,13 +75,6 @@ public final class TimePeriodTest extends TestCase { createContext(true, Locale.FRANCE, "CET"); } - /** - * Creates a GeoAPI instant object for the given date. - */ - private static Instant instant(final String date) { - return DefaultTemporalFactory.provider().createInstant(date(date)); - } - /** * Tests time instant. The test is executed using an arbitrary locale and timezone. * @@ -118,8 +110,8 @@ public final class TimePeriodTest extends TestCase { @Test public void testPeriodGML2() throws JAXBException { createContext(); - final TimePeriodBound begin = new TimePeriodBound.GML2(instant("1992-01-01 00:00:00")); - final TimePeriodBound end = new TimePeriodBound.GML2(instant("2007-12-31 00:00:00")); + final TimePeriodBound begin = new TimePeriodBound.GML2(Instant.parse("1992-01-01T00:00:00Z")); + final TimePeriodBound end = new TimePeriodBound.GML2(Instant.parse("2007-12-31T00:00:00Z")); testPeriod(begin, end, "<gml:TimePeriod xmlns:gml=\"" + Namespaces.GML + "\">\n" + " <gml:begin>\n" + @@ -170,8 +162,8 @@ public final class TimePeriodTest extends TestCase { @Test public void testPeriodGML3() throws JAXBException { createContext(); - final TimePeriodBound begin = new TimePeriodBound.GML3(instant("1992-01-01 00:00:00"), "before"); - final TimePeriodBound end = new TimePeriodBound.GML3(instant("2007-12-31 00:00:00"), "after"); + final TimePeriodBound begin = new TimePeriodBound.GML3(Instant.parse("1992-01-01T00:00:00Z"), "before"); + final TimePeriodBound end = new TimePeriodBound.GML3(Instant.parse("2007-12-31T00:00:00Z"), "after"); testPeriod(begin, end, "<gml:TimePeriod xmlns:gml=\"" + Namespaces.GML + "\">\n" + " <gml:beginPosition>1992-01-01T01:00:00+01:00</gml:beginPosition>\n" + @@ -188,8 +180,8 @@ public final class TimePeriodTest extends TestCase { @Test public void testSimplifiedPeriodGML3() throws JAXBException { createContext(); - final TimePeriodBound begin = new TimePeriodBound.GML3(instant("1992-01-01 23:00:00"), "before"); - final TimePeriodBound end = new TimePeriodBound.GML3(instant("2007-12-30 23:00:00"), "after"); + final TimePeriodBound begin = new TimePeriodBound.GML3(Instant.parse("1992-01-01T23:00:00Z"), "before"); + final TimePeriodBound end = new TimePeriodBound.GML3(Instant.parse("2007-12-30T23:00:00Z"), "after"); testPeriod(begin, end, "<gml:TimePeriod xmlns:gml=\"" + Namespaces.GML + "\">\n" + " <gml:beginPosition>1992-01-02</gml:beginPosition>\n" + @@ -207,7 +199,7 @@ public final class TimePeriodTest extends TestCase { public void testBeforePeriodGML3() throws JAXBException { createContext(); final TimePeriodBound begin = new TimePeriodBound.GML3(null, "before"); - final TimePeriodBound end = new TimePeriodBound.GML3(instant("2007-12-30 23:00:00"), "after"); + final TimePeriodBound end = new TimePeriodBound.GML3(Instant.parse("2007-12-30T23:00:00Z"), "after"); testPeriod(begin, end, "<gml:TimePeriod xmlns:gml=\"" + Namespaces.GML + "\">\n" + " <gml:beginPosition indeterminatePosition=\"before\"/>\n" + @@ -224,7 +216,7 @@ public final class TimePeriodTest extends TestCase { @Test public void testAfterPeriodGML3() throws JAXBException { createContext(); - final TimePeriodBound begin = new TimePeriodBound.GML3(instant("1992-01-01 23:00:00"), "before"); + final TimePeriodBound begin = new TimePeriodBound.GML3(Instant.parse("1992-01-01T23:00:00Z"), "before"); final TimePeriodBound end = new TimePeriodBound.GML3(null, "after"); testPeriod(begin, end, "<gml:TimePeriod xmlns:gml=\"" + Namespaces.GML + "\">\n" + diff --git a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/reader/XMLMetadata.java b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/reader/XMLMetadata.java index d62da4e6d5..87fa31eaba 100644 --- a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/reader/XMLMetadata.java +++ b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/reader/XMLMetadata.java @@ -49,7 +49,6 @@ import org.apache.sis.util.collection.DefaultTreeTable; import org.apache.sis.util.collection.TableColumn; import org.apache.sis.util.resources.Errors; import org.apache.sis.xml.XML; -import static org.apache.sis.metadata.privy.TemporalUtilities.toDate; /** @@ -503,7 +502,7 @@ public final class XMLMetadata implements Filter { * Writes to {@link MetadataBuilder} all information that were pending parsing completion. */ void flush() { - metadata.addTemporalExtent(toDate(startTime), toDate(endTime)); + metadata.addTemporalExtent(startTime, endTime); } } diff --git a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/CRSBuilder.java b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/CRSBuilder.java index fbd2f01bb3..a437ffd0f2 100644 --- a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/CRSBuilder.java +++ b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/CRSBuilder.java @@ -18,6 +18,7 @@ package org.apache.sis.storage.netcdf.base; import java.util.Map; import java.util.List; +import java.util.Date; import java.util.Arrays; import java.util.ArrayList; import java.util.StringJoiner; @@ -51,7 +52,6 @@ import org.apache.sis.referencing.crs.DefaultGeocentricCRS; import org.apache.sis.referencing.factory.InvalidGeodeticParameterException; import org.apache.sis.referencing.operation.DefaultCoordinateOperationFactory; import org.apache.sis.referencing.operation.provider.Equirectangular; -import org.apache.sis.metadata.privy.TemporalUtilities; import org.apache.sis.storage.DataStoreContentException; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.netcdf.internal.Resources; @@ -967,7 +967,7 @@ previous: for (int i=components.size(); --i >= 0;) { datum = c.datum(); } else { properties = properties("Time since " + epoch); - datum = factory.createTemporalDatum(properties, TemporalUtilities.toDate(epoch)); + datum = factory.createTemporalDatum(properties, Date.from(epoch)); } } } 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 7ab125d63c..33dba9aa1b 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 @@ -18,6 +18,7 @@ package org.apache.sis.storage.base; import java.time.Instant; import java.time.Duration; +import java.time.temporal.Temporal; import java.time.temporal.TemporalAmount; import java.util.Date; import java.util.Locale; @@ -1782,6 +1783,21 @@ public class MetadataBuilder { } } + /** + * Adds a temporal extent covered by the data. + * Storage location is: + * + * <ul> + * <li>{@code metadata/identificationInfo/extent/temporalElement}</li> + * </ul> + * + * @param startTime when the data begins, or {@code null} if unbounded. + * @param endTime when the data ends, or {@code null} if unbounded. + */ + public final void addTemporalExtent(final Temporal startTime, final Temporal endTime) { + addTemporalExtent(StandardDateFormat.toDate(startTime), StandardDateFormat.toDate(endTime)); + } + /** * Adds a temporal extent covered by the data. * Storage location is: diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultInstant.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultInstant.java deleted file mode 100644 index 9c56da0adf..0000000000 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultInstant.java +++ /dev/null @@ -1,65 +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.Date; - -// Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Instant; -import org.opengis.temporal.TemporalPosition; - - -/** - * Default implementation of GeoAPI instant. This is a temporary class; - * GeoAPI temporal interfaces are expected to change a lot in a future revision. - * - * @author Martin Desruisseaux (Geomatys) - */ -final class DefaultInstant extends Primitive implements Instant { - /** The date in milliseconds since epoch. */ - private final long millis; - - /** Creates a new instant for the given date. */ - DefaultInstant(final Date time) { - millis = time.getTime(); - } - - /** Returns the date used for describing temporal position. */ - @Override public Date getDate() { - return new Date(millis); - } - - /** Association to a temporal reference system. */ - @Override public TemporalPosition getTemporalPosition() { - throw DefaultTemporalFactory.unsupported(); - } - - /** String representation in ISO format. */ - @Override public String toString() { - return java.time.Instant.ofEpochMilli(millis).toString(); - } - - /** Hash code value of the time position. */ - @Override public int hashCode() { - return Long.hashCode(millis) ^ 57; - } - - /** Compares with given object for equality. */ - @Override public boolean equals(final Object obj) { - return (obj instanceof DefaultInstant) && ((DefaultInstant) obj).millis == millis; - } -} diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriod.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriod.java index 1d046f5855..1973da502c 100644 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriod.java +++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/pending/temporal/DefaultPeriod.java @@ -19,7 +19,7 @@ package org.apache.sis.pending.temporal; import java.util.Objects; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.temporal.Instant; +import java.time.Instant; import org.opengis.temporal.Period; 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 eb05607337..b52df00f46 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 @@ -16,7 +16,7 @@ */ package org.apache.sis.pending.temporal; -import java.util.Date; +import java.time.Instant; // Specific to the geoapi-3.1 and geoapi-4.0 branches: import org.opengis.temporal.*; @@ -43,11 +43,6 @@ public final class DefaultTemporalFactory implements TemporalFactory { private DefaultTemporalFactory() { } - /** Creates an {@link Instant} for the given date. */ - @Override public Instant createInstant(Date date) { - return new DefaultInstant(date); - } - /** Creates a period for the two given instants. */ @Override public Period createPeriod(Instant begin, Instant end) { return new DefaultPeriod(begin, end); diff --git a/geoapi/snapshot b/geoapi/snapshot index b523de038f..268b27c27d 160000 --- a/geoapi/snapshot +++ b/geoapi/snapshot @@ -1 +1 @@ -Subproject commit b523de038f29cc88bc7ae8d6820848cec0410004 +Subproject commit 268b27c27dcc3b034dd7621a682bc4d432511f11