blob: 46b554dc6cec7723486dbd109487fbdd12e1fdda [file] [log] [blame]
/*
* 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.internal.util;
import java.util.Date;
import org.opengis.temporal.Instant;
import org.opengis.temporal.Period;
import org.opengis.temporal.TemporalFactory;
import org.opengis.temporal.TemporalPrimitive;
import org.apache.sis.util.Static;
import org.apache.sis.util.resources.Errors;
import org.apache.sis.internal.system.DefaultFactories;
/**
* Utilities related to ISO 19108 objects. This class may disappear after we reviewed
* the GeoAPI-pending temporal interfaces.
*
* @author Martin Desruisseaux (Geomatys)
* @author Guilhem Legal (Geomatys)
* @version 1.0
* @since 0.3
* @module
*/
public final class TemporalUtilities extends Static {
/**
* {@code true} if the SIS library should log the "This operation requires the sis-temporal module" warning.
* This flag can be {@code true} during development phase, but should be set to {@code false} in SIS releases
* until we can really provide a sis-temporal module.
*
* This constant will be removed after SIS release a sis-temporal module.
*/
public static final boolean REPORT_MISSING_MODULE = true;
/**
* Do not allow instantiation of this class.
*/
private TemporalUtilities() {
}
/**
* Returns a temporal factory if available.
*
* @return the temporal factory.
* @throws UnsupportedOperationException if the temporal factory is not available on the classpath.
*/
public static TemporalFactory getTemporalFactory() throws UnsupportedOperationException {
final TemporalFactory factory = DefaultFactories.forClass(TemporalFactory.class);
if (factory != null) {
return factory;
}
throw new UnsupportedOperationException(Errors.format(Errors.Keys.MissingRequiredModule_1, "sis-temporal"));
}
/**
* 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.
*
* @param time the date for which to create instant, or {@code null}.
* @return the instant, or {@code null} if the given time was null.
* @throws UnsupportedOperationException if the temporal factory is not available on the classpath.
*/
public static Instant createInstant(final Date time) throws UnsupportedOperationException {
return (time != null) ? createInstant(getTemporalFactory(), time) : null;
}
/**
* 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.
*
* @param begin the begin date, inclusive.
* @param end the end date, inclusive.
* @return the period.
* @throws UnsupportedOperationException if the temporal factory is not available on the classpath.
*/
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));
}
/**
* 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 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.
*
* @since 1.0
*/
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;
}
return instant.getDate();
}
/**
* Temporary method, to be removed after we upgraded metadata to {@link java.time}.
*
* @param instant the Java instant, or {@code null}.
* @return the legacy Java date, or {@code null}.
*/
public static Date toDate(final java.time.Instant instant) {
return (instant != null) ? Date.from(instant) : null;
}
}