IIRVFileWriter.java

  1. /* Copyright 2024-2025 The Johns Hopkins University Applied Physics Laboratory
  2.  * Licensed to CS GROUP (CS) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * CS licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *   http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.orekit.files.iirv;

  18. import org.orekit.errors.OrekitIllegalArgumentException;
  19. import org.orekit.errors.OrekitInternalError;
  20. import org.orekit.errors.OrekitMessages;
  21. import org.orekit.files.general.EphemerisFile;
  22. import org.orekit.files.general.EphemerisFileWriter;
  23. import org.orekit.utils.TimeStampedPVCoordinates;

  24. import java.io.IOException;
  25. import java.util.List;

  26. /**
  27.  * An {@link EphemerisFileWriter} for generating {@link IIRVMessage IIRV} files.
  28.  * <p>
  29.  * This class uses an inputted {@link IIRVBuilder} object to define the message metadata
  30.  * values that comprise an IIRV message.
  31.  * <p>
  32.  * This class can be used to write a list of {@link TimeStampedPVCoordinates} as an IIRV file as follows:
  33.  * <pre>{@code
  34.  *
  35.  * // 1. Create an IIRVBuilder class to define the spacecraft/mission metadata values
  36.  * IIRVBuilder iirvBuilder = new IIRVBuilder(TimeScalesFactory.getUTC());
  37.  * iirvBuilder.setSupportIdCode(1221);
  38.  * iirvBuilder.setDragCoefficient(2.2);
  39.  * iirvBuilder.setOriginIdentification(OriginIdentificationTerm.GSFC);
  40.  * iirvBuilder.setRoutingIndicator("MANY");
  41.  * // ... (additional fields here)
  42.  *
  43.  * // 2. Create an IIRVFileWriter with the builder object
  44.  * IIRVFileWriter writer = new IIRVFileWriter(iirvBuilder, IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
  45.  *
  46.  * // 3. Generate an IIRVEphemerisFile containing the ephemeris data
  47.  * IIRVEphemerisFile iirvFile = iirvBuilder.buildEphemerisFile(coordinates);
  48.  *
  49.  * // 4. Write to disk. Recommendation: embed the start year in the filename (year does not appear in the IIRV itself)
  50.  * String testFilename = "TestSatellite" + "_" +
  51.  *      iirvFile.getStartYear() + "_" +
  52.  *      iirvFile.getIIRV().get(0).getDayOfYear().toEncodedString() + "_" +
  53.  *      iirvFile.getIIRV().get(0).getVectorEpoch().toEncodedString() + ".iirv";
  54.  * writer.write(testFilename, iirvFile);
  55.  *  }
  56.  * </pre>
  57.  *
  58.  * @author Nick LaFarge
  59.  * @see StreamingIIRVFileWriter
  60.  * @see IIRVMessage
  61.  * @since 13.0
  62.  */
  63. public class IIRVFileWriter implements EphemerisFileWriter {

  64.     /** Builder class for IIRV. */
  65.     private final IIRVBuilder builder;

  66.     /** Setting for when message metadata terms appear in the created IIRV message. */
  67.     private final IIRVMessage.IncludeMessageMetadata includeMessageMetadataSetting;

  68.     /**
  69.      * Constructor.
  70.      *
  71.      * @param builder                       Builder class for IIRV
  72.      * @param includeMessageMetadataSetting Setting for when message metadata terms appear in the created IIRV message
  73.      */
  74.     public IIRVFileWriter(final IIRVBuilder builder, final IIRVMessage.IncludeMessageMetadata includeMessageMetadataSetting) {
  75.         this.builder = builder;
  76.         this.includeMessageMetadataSetting = includeMessageMetadataSetting;
  77.     }

  78.     /** {@inheritDoc} */
  79.     @Override
  80.     public <C extends TimeStampedPVCoordinates, S extends EphemerisFile.EphemerisSegment<C>> void write(final Appendable writer, final EphemerisFile<C, S> ephemerisFile) throws IOException {

  81.         if (writer == null) {
  82.             throw new OrekitIllegalArgumentException(OrekitMessages.NULL_ARGUMENT, "writer");
  83.         }

  84.         if (ephemerisFile == null) {
  85.             return;
  86.         }
  87.         final EphemerisFile.SatelliteEphemeris<C, S> satEphem = ephemerisFile.getSatellites().get(builder.getSatelliteID());

  88.         final List<S> segments = satEphem.getSegments();
  89.         if (segments.size() > 1) {
  90.             // This should never happen
  91.             throw new OrekitInternalError(null);
  92.         }

  93.         final StreamingIIRVFileWriter streamingWriter = new StreamingIIRVFileWriter(writer, includeMessageMetadataSetting);
  94.         final IIRVMessage iirvMessage = builder.buildIIRVMessage(segments.get(0).getCoordinates());
  95.         streamingWriter.writeIIRVMessage(iirvMessage);
  96.     }
  97. }