EphemerisFileWriter.java

/* Copyright 2016 Applied Defense Solutions (ADS)
 * 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.
 * ADS 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.files.general;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

import org.orekit.utils.TimeStampedPVCoordinates;

/**
 * An interface for writing out ephemeris files to disk.
 *
 * <p>
 * An {@link EphemerisFile} consists of one or more satellites each an ID unique
 * within the file. The ephemeris for each satellite consists of one or more
 * segments.
 *
 * <p>
 * Ephemeris file formats may have additional settings that need to be
 * configured to be compliant with their formats.
 *
 * @author Hank Grabowski
 * @since 9.0
 *
 */
public interface EphemerisFileWriter {

    /**
     * Write the passed in {@link EphemerisFile} using the passed in
     * {@link Appendable}.
     *
     * @param writer
     *            a configured Appendable to feed with text
     * @param ephemerisFile
     *            a populated ephemeris file to serialize into the buffer
     * @param <C> type of the Cartesian coordinates
     * @param <S> type of the segment
     * @throws IOException
     *             if any buffer writing operations fail or if the underlying
     *             format doesn't support a configuration in the EphemerisFile
     *             (for example having multiple satellites in one file, having
     *             the origin at an unspecified celestial body, etc.)
     */
    <C extends TimeStampedPVCoordinates, S extends EphemerisFile.EphemerisSegment<C>>
        void write(Appendable writer, EphemerisFile<C, S> ephemerisFile) throws IOException;

    /**
     * Write the passed in {@link EphemerisFile} to a file at the output path
     * specified.
     *
     * @param outputFilePath
     *            a file path that the corresponding file will be written to
     * @param ephemerisFile
     *            a populated ephemeris file to serialize into the buffer
     * @param <C> type of the Cartesian coordinates
     * @param <S> type of the segment
     * @throws IOException
     *             if any file writing operations fail or if the underlying
     *             format doesn't support a configuration in the EphemerisFile
     *             (for example having multiple satellites in one file, having
     *             the origin at an unspecified celestial body, etc.)
     */
    default <C extends TimeStampedPVCoordinates, S extends EphemerisFile.EphemerisSegment<C>>
        void write(final String outputFilePath, EphemerisFile<C, S> ephemerisFile)
            throws IOException {
        try (BufferedWriter writer =
                        Files.newBufferedWriter(Paths.get(outputFilePath), StandardCharsets.UTF_8)) {
            write(writer, ephemerisFile);
        }
    }

}