IIRVFileWriter.java
- /* Copyright 2024-2025 The Johns Hopkins University Applied Physics Laboratory
- * 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.files.iirv;
- import org.orekit.errors.OrekitIllegalArgumentException;
- import org.orekit.errors.OrekitInternalError;
- import org.orekit.errors.OrekitMessages;
- import org.orekit.files.general.EphemerisFile;
- import org.orekit.files.general.EphemerisFileWriter;
- import org.orekit.utils.TimeStampedPVCoordinates;
- import java.io.IOException;
- import java.util.List;
- /**
- * An {@link EphemerisFileWriter} for generating {@link IIRVMessage IIRV} files.
- * <p>
- * This class uses an inputted {@link IIRVBuilder} object to define the message metadata
- * values that comprise an IIRV message.
- * <p>
- * This class can be used to write a list of {@link TimeStampedPVCoordinates} as an IIRV file as follows:
- * <pre>{@code
- *
- * // 1. Create an IIRVBuilder class to define the spacecraft/mission metadata values
- * IIRVBuilder iirvBuilder = new IIRVBuilder(TimeScalesFactory.getUTC());
- * iirvBuilder.setSupportIdCode(1221);
- * iirvBuilder.setDragCoefficient(2.2);
- * iirvBuilder.setOriginIdentification(OriginIdentificationTerm.GSFC);
- * iirvBuilder.setRoutingIndicator("MANY");
- * // ... (additional fields here)
- *
- * // 2. Create an IIRVFileWriter with the builder object
- * IIRVFileWriter writer = new IIRVFileWriter(iirvBuilder, IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
- *
- * // 3. Generate an IIRVEphemerisFile containing the ephemeris data
- * IIRVEphemerisFile iirvFile = iirvBuilder.buildEphemerisFile(coordinates);
- *
- * // 4. Write to disk. Recommendation: embed the start year in the filename (year does not appear in the IIRV itself)
- * String testFilename = "TestSatellite" + "_" +
- * iirvFile.getStartYear() + "_" +
- * iirvFile.getIIRV().get(0).getDayOfYear().toEncodedString() + "_" +
- * iirvFile.getIIRV().get(0).getVectorEpoch().toEncodedString() + ".iirv";
- * writer.write(testFilename, iirvFile);
- * }
- * </pre>
- *
- * @author Nick LaFarge
- * @see StreamingIIRVFileWriter
- * @see IIRVMessage
- * @since 13.0
- */
- public class IIRVFileWriter implements EphemerisFileWriter {
- /** Builder class for IIRV. */
- private final IIRVBuilder builder;
- /** Setting for when message metadata terms appear in the created IIRV message. */
- private final IIRVMessage.IncludeMessageMetadata includeMessageMetadataSetting;
- /**
- * Constructor.
- *
- * @param builder Builder class for IIRV
- * @param includeMessageMetadataSetting Setting for when message metadata terms appear in the created IIRV message
- */
- public IIRVFileWriter(final IIRVBuilder builder, final IIRVMessage.IncludeMessageMetadata includeMessageMetadataSetting) {
- this.builder = builder;
- this.includeMessageMetadataSetting = includeMessageMetadataSetting;
- }
- /** {@inheritDoc} */
- @Override
- public <C extends TimeStampedPVCoordinates, S extends EphemerisFile.EphemerisSegment<C>> void write(final Appendable writer, final EphemerisFile<C, S> ephemerisFile) throws IOException {
- if (writer == null) {
- throw new OrekitIllegalArgumentException(OrekitMessages.NULL_ARGUMENT, "writer");
- }
- if (ephemerisFile == null) {
- return;
- }
- final EphemerisFile.SatelliteEphemeris<C, S> satEphem = ephemerisFile.getSatellites().get(builder.getSatelliteID());
- final List<S> segments = satEphem.getSegments();
- if (segments.size() > 1) {
- // This should never happen
- throw new OrekitInternalError(null);
- }
- final StreamingIIRVFileWriter streamingWriter = new StreamingIIRVFileWriter(writer, includeMessageMetadataSetting);
- final IIRVMessage iirvMessage = builder.buildIIRVMessage(segments.get(0).getCoordinates());
- streamingWriter.writeIIRVMessage(iirvMessage);
- }
- }