TimeScalesFactory.java

/* Copyright 2002-2024 CS GROUP
 * Licensed to CS GROUP (CS) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * CS 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.orekit.time;

import java.io.Serializable;

import org.orekit.annotation.DefaultDataContext;
import org.orekit.data.DataContext;
import org.orekit.frames.EOPHistory;
import org.orekit.frames.LazyLoadedEop;
import org.orekit.utils.IERSConventions;


/** Factory for predefined time scales.
 * <p>
 * This is a utility class, so its constructor is private.
 * </p>
 * @author Luc Maisonobe
 * @see TimeScales
 * @see LazyLoadedTimeScales
 */
public class TimeScalesFactory implements Serializable {

    /** Serializable UID. */
    private static final long serialVersionUID = 20190927L;

    /** Private constructor.
     * <p>This class is a utility class, it should neither have a public
     * nor a default constructor. This private constructor prevents
     * the compiler from generating one automatically.</p>
     */
    private TimeScalesFactory() {
    }

    /**
     * Get the instance of {@link TimeScales} that is called by all of the static methods
     * in this class.
     *
     * @return the time scales used by this factory.
     */
    @DefaultDataContext
    public static LazyLoadedTimeScales getTimeScales() {
        return DataContext.getDefault().getTimeScales();
    }

    /** Add a loader for UTC-TAI offsets history files.
     * @param loader custom loader to add
     * @see TAIUTCDatFilesLoader
     * @see UTCTAIHistoryFilesLoader
     * @see UTCTAIBulletinAFilesLoader
     * @see #getUTC()
     * @see #clearUTCTAIOffsetsLoaders()
     * @since 7.1
     */
    @DefaultDataContext
    public static void addUTCTAIOffsetsLoader(final UTCTAIOffsetsLoader loader) {
        getTimeScales().addUTCTAIOffsetsLoader(loader);
    }

    /** Add the default loaders for UTC-TAI offsets history files (both IERS and USNO).
     * <p>
     * The default loaders are {@link TAIUTCDatFilesLoader} that looks for
     * a file named {@code tai-utc.dat} that must be in USNO format and
     * {@link UTCTAIHistoryFilesLoader} that looks fir a file named
     * {@code UTC-TAI.history} that must be in the IERS format. The
     * {@link UTCTAIBulletinAFilesLoader} is <em>not</em> added by default
     * as it is not recommended. USNO warned us that the TAI-UTC data present
     * in bulletin A was for convenience only and was not reliable, there
     * have been errors in several bulletins regarding these data.
     * </p>
     * @see <a href="http://maia.usno.navy.mil/ser7/tai-utc.dat">USNO tai-utc.dat file</a>
     * @see <a href="http://hpiers.obspm.fr/eoppc/bul/bulc/UTC-TAI.history">IERS UTC-TAI.history file</a>
     * @see TAIUTCDatFilesLoader
     * @see UTCTAIHistoryFilesLoader
     * @see #getUTC()
     * @see #clearUTCTAIOffsetsLoaders()
     * @since 7.1
     */
    @DefaultDataContext
    public static void addDefaultUTCTAIOffsetsLoaders() {
        getTimeScales().addDefaultUTCTAIOffsetsLoaders();
    }

    /** Clear loaders for UTC-TAI offsets history files.
     * @see #getUTC()
     * @see #addUTCTAIOffsetsLoader(UTCTAIOffsetsLoader)
     * @see #addDefaultUTCTAIOffsetsLoaders()
     * @since 7.1
     */
    @DefaultDataContext
    public static void clearUTCTAIOffsetsLoaders() {
        getTimeScales().clearUTCTAIOffsetsLoaders();
    }

    /** Get the International Atomic Time scale.
     * @return International Atomic Time scale
     */
    @DefaultDataContext
    public static TAIScale getTAI() {
        return getTimeScales().getTAI();
    }

    /** Get the Universal Time Coordinate scale.
     * <p>
     * If no {@link UTCTAIOffsetsLoader} has been added by calling {@link
     * #addUTCTAIOffsetsLoader(UTCTAIOffsetsLoader) addUTCTAIOffsetsLoader} or if {@link
     * #clearUTCTAIOffsetsLoaders() clearUTCTAIOffsetsLoaders} has been called afterwards,
     * the {@link #addDefaultUTCTAIOffsetsLoaders() addDefaultUTCTAILoaders} method
     * will be called automatically.
     * </p>
     * @return Universal Time Coordinate scale
     * @see #addDefaultUTCTAIOffsetsLoaders()
     */
    @DefaultDataContext
    public static UTCScale getUTC() {
        return getTimeScales().getUTC();
    }

    /** Get the Universal Time 1 scale.
     * <p>
     * UT1 scale depends on both UTC scale and Earth Orientation Parameters,
     * so this method loads these data sets. See the {@link #getUTC()
     * TimeScalesFactory.getUTC()} and {@link
     * LazyLoadedEop#getEOPHistory(IERSConventions, boolean, TimeScales)} methods
     * for an explanation of how the corresponding data loaders can be configured.
     * </p>
     * @param conventions IERS conventions for which EOP parameters will provide dUT1
     * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
     * @return Universal Time 1 scale
     * @see #getUTC()
     * @see LazyLoadedEop#getEOPHistory(IERSConventions, boolean, TimeScales)
     */
    @DefaultDataContext
    public static UT1Scale getUT1(final IERSConventions conventions, final boolean simpleEOP) {
        return getTimeScales().getUT1(conventions, simpleEOP);
    }

    /** Get the Universal Time 1 scale.
     * <p>
     * As this method allow associating any history with the time scale,
     * it may involve large data sets. So this method does <em>not</em>
     * cache the resulting {@link UT1Scale UT1Scale} instance, a new
     * instance will be returned each time. In order to avoid wasting
     * memory, calling {@link #getUT1(IERSConventions, boolean)}
     * with the single enumerate corresponding to the conventions may be
     * a better solution. This method is made available only for expert use.
     * </p>
     * @param history EOP parameters providing dUT1
     * (may be null if no correction is desired)
     * @return Universal Time 1 scale
     * @see #getUT1(IERSConventions, boolean)
     */
    @DefaultDataContext
    public static UT1Scale getUT1(final EOPHistory history) {
        return getTimeScales().getUT1(history);
    }

    /** Get the Terrestrial Time scale.
     * @return Terrestrial Time scale
     */
    @DefaultDataContext
    public static TTScale getTT() {
        return getTimeScales().getTT();
    }

    /** Get the Galileo System Time scale.
     * @return Galileo System Time scale
     */
    @DefaultDataContext
    public static GalileoScale getGST() {
        return getTimeScales().getGST();
    }

    /** Get the GLObal NAvigation Satellite System time scale.
     * @return  GLObal NAvigation Satellite System time scale
     */
    @DefaultDataContext
    public static GLONASSScale getGLONASS() {
        return getTimeScales().getGLONASS();
    }

    /** Get the Quasi-Zenith Satellite System time scale.
     * @return  Quasi-Zenith Satellite System time scale
     */
    @DefaultDataContext
    public static QZSSScale getQZSS() {
        return getTimeScales().getQZSS();
    }

    /** Get the Global Positioning System scale.
     * @return Global Positioning System scale
     */
    @DefaultDataContext
    public static GPSScale getGPS() {
        return getTimeScales().getGPS();
    }

    /** Get the Geocentric Coordinate Time scale.
     * @return Geocentric Coordinate Time scale
     */
    @DefaultDataContext
    public static TCGScale getTCG() {
        return getTimeScales().getTCG();
    }

    /** Get the Barycentric Dynamic Time scale.
     * @return Barycentric Dynamic Time scale
     */
    @DefaultDataContext
    public static TDBScale getTDB() {
        return getTimeScales().getTDB();
    }

    /** Get the Barycentric Coordinate Time scale.
     * @return Barycentric Coordinate Time scale
     */
    @DefaultDataContext
    public static TCBScale getTCB() {
        return getTimeScales().getTCB();
    }

    /** Get the Greenwich Mean Sidereal Time scale.
     * @param conventions IERS conventions for which EOP parameters will provide dUT1
     * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
     * @return Greenwich Mean Sidereal Time scale
     * @since 7.0
     */
    @DefaultDataContext
    public static GMSTScale getGMST(final IERSConventions conventions, final boolean simpleEOP) {
        return getTimeScales().getGMST(conventions, simpleEOP);
    }

    /** Get the Indian Regional Navigation Satellite System time scale.
     * @return  Indian Regional Navigation Satellite System time scale
     */
    @DefaultDataContext
    public static IRNSSScale getIRNSS() {
        return getTimeScales().getIRNSS();
    }

    /** Get the BeiDou Navigation Satellite System time scale.
     * @return  BeiDou Navigation Satellite System time scale
     */
    @DefaultDataContext
    public static BDTScale getBDT() {
        return getTimeScales().getBDT();
    }


}