IIRVBuilder.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.OrekitMessages;
import org.orekit.files.iirv.terms.CoordinateSystemTerm;
import org.orekit.files.iirv.terms.CrossSectionalAreaTerm;
import org.orekit.files.iirv.terms.DataSourceTerm;
import org.orekit.files.iirv.terms.DayOfYearTerm;
import org.orekit.files.iirv.terms.DragCoefficientTerm;
import org.orekit.files.iirv.terms.MassTerm;
import org.orekit.files.iirv.terms.MessageClassTerm;
import org.orekit.files.iirv.terms.MessageIDTerm;
import org.orekit.files.iirv.terms.MessageSourceTerm;
import org.orekit.files.iirv.terms.MessageTypeTerm;
import org.orekit.files.iirv.terms.OriginIdentificationTerm;
import org.orekit.files.iirv.terms.OriginatorRoutingIndicatorTerm;
import org.orekit.files.iirv.terms.PositionVectorComponentTerm;
import org.orekit.files.iirv.terms.RoutingIndicatorTerm;
import org.orekit.files.iirv.terms.SequenceNumberTerm;
import org.orekit.files.iirv.terms.SolarReflectivityCoefficientTerm;
import org.orekit.files.iirv.terms.SupportIdCodeTerm;
import org.orekit.files.iirv.terms.VectorEpochTerm;
import org.orekit.files.iirv.terms.VectorTypeTerm;
import org.orekit.files.iirv.terms.VehicleIdCodeTerm;
import org.orekit.files.iirv.terms.VelocityVectorComponentTerm;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.UTCScale;
import org.orekit.utils.TimeStampedPVCoordinates;

import java.util.ArrayList;
import java.util.List;

/**
 * Builder for {@link IIRVVector}.
 *
 * @author Nick LaFarge
 * @since 13.0
 */
public class IIRVBuilder {

    /** UTC time scale. */
    private final UTCScale utc;
    /**
     * Message type, default: "00".
     */
    private MessageTypeTerm messageType = MessageTypeTerm.DEFAULT;
    /**
     * Message Identification, default: "0000000".
     */
    private MessageIDTerm messageID = new MessageIDTerm(0);
    /**
     * Message source, default: "0".
     */
    private MessageSourceTerm messageSource = MessageSourceTerm.DEFAULT;
    /**
     * Message class, default: "10" [nominal].
     */
    private MessageClassTerm messageClass = MessageClassTerm.NOMINAL;
    /**
     * Origin identification, default: " " [NASA Goddard Space Flight Center].
     */
    private OriginIdentificationTerm originIdentification = OriginIdentificationTerm.GSFC;
    /**
     * Destination routing indicator, default: "MANY".
     */
    private RoutingIndicatorTerm routingIndicator = RoutingIndicatorTerm.MANY;
    /**
     * Vector type, default: "1" [Free flight].
     */
    private VectorTypeTerm vectorType = VectorTypeTerm.FREE_FLIGHT;
    /**
     * Source of data, default: "1" [nominal/planning].
     */
    private DataSourceTerm dataSource = DataSourceTerm.NOMINAL;
    /**
     * Coordinate system, default: "1" [Geocentric True-of-Date Rotating (GTOD)].
     */
    private CoordinateSystemTerm coordinateSystem = CoordinateSystemTerm.GEOCENTRIC_TRUE_OF_DATE_ROTATING;
    /**
     * Support ID Code, default: "0000".
     */
    private SupportIdCodeTerm supportIdCode = new SupportIdCodeTerm("0000");
    /**
     * Vehicle ID Code, default: "01".
     */
    private VehicleIdCodeTerm vehicleIdCode = new VehicleIdCodeTerm("01");
    /**
     * Sequence number, default: "000".
     */
    private SequenceNumberTerm sequenceNumber = new SequenceNumberTerm(0);
    /**
     * Satellite mass (kg), default: "00156170" [unused].
     */
    private MassTerm mass = MassTerm.UNUSED;
    /**
     * Average satellite cross-sectional area (m^2), default: "00000" [unused].
     */
    private CrossSectionalAreaTerm crossSectionalArea = CrossSectionalAreaTerm.UNUSED;
    /**
     * Drag coefficient (dimensionless), default: "0000" [unused].
     */
    private DragCoefficientTerm dragCoefficient = DragCoefficientTerm.UNUSED;
    /**
     * Solar reflectivity coefficient (dimensionless), default: "00000000" [unused].
     */
    private SolarReflectivityCoefficientTerm solarReflectivityCoefficient = SolarReflectivityCoefficientTerm.UNUSED;
    /**
     * Originator of message (GCQU or GAQD), default: "GAQD".
     */
    private OriginatorRoutingIndicatorTerm originatorRoutingIndicator = OriginatorRoutingIndicatorTerm.GAQD;

    /**
     * Constructs an {@link IIRVBuilder} instance with a UTC timescale and default values for all parameters.
     *
     * @param utc UTC time scale
     */
    public IIRVBuilder(final UTCScale utc) {
        this.utc = utc;
    }

    /**
     * Constructs an IIRV object using the configured parameters.
     *
     * @param dayOfYear   Day of year, 001 to 366
     * @param vectorEpoch Vector epoch in UTC
     * @param xPosition   X component of the position vector [m]
     * @param yPosition   Y component of the position vector [m]
     * @param zPosition   Z component of the position vector [m]
     * @param xVelocity   X component of the velocity vector [m/s]
     * @param yVelocity   Y component of the velocity vector [m/s]
     * @param zVelocity   Z component of the velocity vector [m/s]
     * @return the newly constructed IIRV object
     */
    public IIRVVector buildVector(final DayOfYearTerm dayOfYear,
                                  final VectorEpochTerm vectorEpoch,
                                  final PositionVectorComponentTerm xPosition,
                                  final PositionVectorComponentTerm yPosition,
                                  final PositionVectorComponentTerm zPosition,
                                  final VelocityVectorComponentTerm xVelocity,
                                  final VelocityVectorComponentTerm yVelocity,
                                  final VelocityVectorComponentTerm zVelocity) {
        return new IIRVVector(
            messageType, messageID, messageSource, messageClass, originIdentification, routingIndicator, // Line 1
            vectorType, dataSource, coordinateSystem, supportIdCode, vehicleIdCode, sequenceNumber, dayOfYear, vectorEpoch, // Line 2
            xPosition, yPosition, zPosition, // Line 3
            xVelocity, yVelocity, zVelocity, // Line 4
            mass, crossSectionalArea, dragCoefficient, solarReflectivityCoefficient, // Line 5
            originatorRoutingIndicator, // Line 6
            utc
        );
    }

    /**
     * Constructs an IIRV vector using the configured parameters, with position, velocity, and time variables derived
     * from instances of {@link TimeStampedPVCoordinates} and {@link AbsoluteDate}.
     *
     * @param timeStampedPVCoordinates position and velocity components at a particular epoch corresponding to the
     *                                 IIRV vector
     * @return the newly constructed IIRV object at the given coordinates
     */
    public IIRVVector buildVector(final TimeStampedPVCoordinates timeStampedPVCoordinates) {

        // Retrieve the epoch associated with the given coordinates
        final AbsoluteDate epoch = timeStampedPVCoordinates.getDate();

        // Construct the IIRV time variable terms
        final DayOfYearTerm dayOfYear = new DayOfYearTerm(epoch, utc);
        final VectorEpochTerm vectorEpoch = new VectorEpochTerm(epoch, utc);

        // Construct the position component terms
        final PositionVectorComponentTerm xPosition = new PositionVectorComponentTerm(timeStampedPVCoordinates.getPosition().getX());
        final PositionVectorComponentTerm yPosition = new PositionVectorComponentTerm(timeStampedPVCoordinates.getPosition().getY());
        final PositionVectorComponentTerm zPosition = new PositionVectorComponentTerm(timeStampedPVCoordinates.getPosition().getZ());

        // Construct the velocity component terms
        final VelocityVectorComponentTerm xVelocity = new VelocityVectorComponentTerm(timeStampedPVCoordinates.getVelocity().getX());
        final VelocityVectorComponentTerm yVelocity = new VelocityVectorComponentTerm(timeStampedPVCoordinates.getVelocity().getY());
        final VelocityVectorComponentTerm zVelocity = new VelocityVectorComponentTerm(timeStampedPVCoordinates.getVelocity().getZ());

        // Construct an IIRV vector with the given terms
        return new IIRVVector(
            messageType, messageID, messageSource, messageClass, originIdentification, routingIndicator, // Line 1
            vectorType, dataSource, coordinateSystem, supportIdCode, vehicleIdCode, sequenceNumber, dayOfYear, vectorEpoch, // Line 2
            xPosition, yPosition, zPosition, // Line 3
            xVelocity, yVelocity, zVelocity, // Line 4
            mass, crossSectionalArea, dragCoefficient, solarReflectivityCoefficient, // Line 5
            originatorRoutingIndicator, // Line 6
            utc
        );
    }

    /**
     * Constructs an {@link IIRVMessage} where each {@link IIRVVector} in initialized from the inputted list of
     * {@link TimeStampedPVCoordinates}.
     *
     * @param timeStampedPVCoordinates list of time-stamped position and velocity vectors to populate the message
     * @param <C>                      type of the Cartesian coordinates
     * @return the newly constructed {@link IIRVMessage} containing the given coordinates
     */
    public <C extends TimeStampedPVCoordinates> IIRVMessage buildIIRVMessage(final List<C> timeStampedPVCoordinates) {
        final ArrayList<IIRVVector> vectors = new ArrayList<>();
        int incrementalSequenceNumber = 0;
        for (TimeStampedPVCoordinates coordinates : timeStampedPVCoordinates) {
            // Add coordinate to the list of vectors with the current sequence number
            setSequenceNumber(incrementalSequenceNumber);
            vectors.add(buildVector(coordinates));
            incrementalSequenceNumber++;
        }
        return new IIRVMessage(vectors);
    }


    /**
     * Constructs an {@link IIRVEphemerisFile} from the inputted list of {@link TimeStampedPVCoordinates}, inferring
     * the start year from the first coordinate's {@link org.orekit.time.AbsoluteDate}.
     * <p>
     * See {@link #buildIIRVMessage(List)} for {@link IIRVMessage} construction details.
     *
     * @param timeStampedPVCoordinates list of time-stamped position and velocity vectors to populate the message
     * @param <C>                      type of the Cartesian coordinates
     * @return the newly constructed {@link IIRVEphemerisFile} containing the given coordinates
     */
    public <C extends TimeStampedPVCoordinates> IIRVEphemerisFile buildEphemerisFile(final List<C> timeStampedPVCoordinates) {
        final int year = timeStampedPVCoordinates.get(0).getDate().getComponents(utc).getDate().getYear();
        return new IIRVEphemerisFile(year, buildIIRVMessage(timeStampedPVCoordinates));
    }

    /**
     * Gets the current {@link MassTerm} value.
     *
     * @return the current {@link MassTerm} value.
     */
    public MassTerm getMass() {
        return mass;
    }

    /**
     * Overrides the default Mass attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: kg
     *
     * @param mass mass value (kg) for the IIRV message
     */
    public void setMass(final MassTerm mass) {
        this.mass = mass;
    }

    /**
     * Overrides the default Mass attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: kg
     *
     * @param mass mass value (kg) for the IIRV message
     */
    public void setMass(final String mass) {
        this.mass = new MassTerm(mass);
    }

    /**
     * Overrides the default Mass attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: kg
     *
     * @param mass mass value (kg) for the IIRV message
     */
    public void setMass(final double mass) {
        this.mass = new MassTerm(mass);
    }

    /**
     * Gets the current {@link MessageTypeTerm} value.
     *
     * @return the current {@link MessageTypeTerm} value.
     */
    public MessageTypeTerm getMessageType() {
        return messageType;
    }

    /**
     * Overrides the default {@link MessageTypeTerm} attribute for the {@link IIRVVector} object being built.
     *
     * @param messageType {@link MessageTypeTerm} for the IIRV message
     */
    public void setMessageType(final String messageType) {
        this.messageType = new MessageTypeTerm(messageType);
    }

    /**
     * Overrides the default {@link MessageTypeTerm} attribute for the {@link IIRVVector} object being built.
     *
     * @param messageType {@link MessageTypeTerm} for the IIRV message
     */
    public void setMessageType(final MessageTypeTerm messageType) {
        this.messageType = messageType;
    }

    /**
     * Gets the current {@link MessageSourceTerm} value.
     *
     * @return the current {@link MessageSourceTerm} value.
     */
    public MessageSourceTerm getMessageSource() {
        return messageSource;
    }

    /**
     * Overrides the default {@link MessageSourceTerm} attribute for the {@link IIRVVector} object being built.
     *
     * @param messageSource {@link MessageSourceTerm} for the IIRV message
     */
    public void setMessageSource(final String messageSource) {
        this.messageSource = new MessageSourceTerm(messageSource);
    }

    /**
     * Overrides the default {@link MessageSourceTerm} attribute for the {@link IIRVVector} object being built.
     *
     * @param messageSource {@link MessageSourceTerm} for the IIRV message
     */
    public void setMessageSource(final MessageSourceTerm messageSource) {
        this.messageSource = messageSource;
    }

    /**
     * Gets the current {@link MessageIDTerm} value.
     *
     * @return the current {@link MessageIDTerm} value.
     */
    public MessageIDTerm getMessageID() {
        return messageID;
    }

    /**
     * Overrides the default MessageID attribute for the {@link IIRVVector} object being built.
     *
     * @param messageID message ID value for the IIRV message
     */
    public void setMessageID(final MessageIDTerm messageID) {
        this.messageID = messageID;
    }

    /**
     * Overrides the default MessageID attribute for the {@link IIRVVector} object being built.
     *
     * @param messageID message ID value for the IIRV message
     */
    public void setMessageID(final String messageID) {
        this.messageID = new MessageIDTerm(messageID);
    }

    /**
     * Overrides the default MessageID attribute for the {@link IIRVVector} object being built.
     *
     * @param messageID message ID value for the IIRV message
     */
    public void setMessageID(final long messageID) {
        this.messageID = new MessageIDTerm(messageID);
    }

    /**
     * Gets the current {@link MessageClassTerm} value.
     *
     * @return the current {@link MessageClassTerm} value.
     */
    public MessageClassTerm getMessageClass() {
        return messageClass;
    }

    /**
     * Overrides the default MessageClass attribute for the {@link IIRVVector} object being built.
     *
     * @param messageClass message class value for the IIRV message
     */
    public void setMessageClass(final MessageClassTerm messageClass) {
        this.messageClass = messageClass;
    }

    /**
     * Overrides the default MessageClass attribute for the {@link IIRVVector} object being built.
     *
     * @param messageClass message class value for the IIRV message
     */
    public void setMessageClass(final String messageClass) {
        this.messageClass = new MessageClassTerm(messageClass);
    }

    /**
     * Overrides the default MessageClass attribute for the {@link IIRVVector} object being built.
     *
     * @param messageClass message class value for the IIRV message
     */
    public void setMessageClass(final long messageClass) {
        this.messageClass = new MessageClassTerm(messageClass);
    }

    /**
     * Gets the current {@link OriginIdentificationTerm} value.
     *
     * @return the current {@link OriginIdentificationTerm} value.
     */
    public OriginIdentificationTerm getOriginIdentification() {
        return originIdentification;
    }

    /**
     * Overrides the default OriginIdentification attribute for the {@link IIRVVector} object being built.
     *
     * @param originIdentification origin identification value for the IIRV message
     */
    public void setOriginIdentification(final OriginIdentificationTerm originIdentification) {
        this.originIdentification = originIdentification;
    }

    /**
     * Overrides the default OriginIdentification attribute for the {@link IIRVVector} object being built.
     *
     * @param originIdentification origin identification value for the IIRV message
     */
    public void setOriginIdentification(final String originIdentification) {
        this.originIdentification = new OriginIdentificationTerm(originIdentification);
    }

    /**
     * Gets the current {@link RoutingIndicatorTerm} value.
     *
     * @return the current {@link RoutingIndicatorTerm} value.
     */
    public RoutingIndicatorTerm getRoutingIndicator() {
        return routingIndicator;
    }

    /**
     * Overrides the default RoutingIndicator attribute for the {@link IIRVVector} object being built.
     *
     * @param routingIndicator routing indicator term value for the IIRV message
     */
    public void setRoutingIndicator(final RoutingIndicatorTerm routingIndicator) {
        this.routingIndicator = routingIndicator;
    }

    /**
     * Overrides the default RoutingIndicator attribute for the {@link IIRVVector} object being built.
     *
     * @param routingIndicator routing indicator term value for the IIRV message
     */
    public void setRoutingIndicator(final String routingIndicator) {
        this.routingIndicator = new RoutingIndicatorTerm(routingIndicator);
    }

    /**
     * Gets the current {@link VectorTypeTerm} value.
     *
     * @return the current {@link VectorTypeTerm} value.
     */
    public VectorTypeTerm getVectorType() {
        return vectorType;
    }

    /**
     * Overrides the default VectorType attribute for the {@link IIRVVector} object being built.
     *
     * @param vectorType vector type term value for the IIRV message
     */
    public void setVectorType(final VectorTypeTerm vectorType) {
        this.vectorType = vectorType;
    }

    /**
     * Overrides the default VectorType attribute for the {@link IIRVVector} object being built.
     *
     * @param vectorType vector type term value for the IIRV message
     */
    public void setVectorType(final String vectorType) {
        this.vectorType = new VectorTypeTerm(vectorType);
    }

    /**
     * Overrides the default VectorType attribute for the {@link IIRVVector} object being built.
     *
     * @param vectorType vector type term value for the IIRV message
     */
    public void setVectorType(final long vectorType) {
        this.vectorType = new VectorTypeTerm(vectorType);
    }

    /**
     * Gets the current {@link DataSourceTerm} value.
     *
     * @return the current {@link DataSourceTerm} value.
     */
    public DataSourceTerm getDataSource() {
        return dataSource;
    }

    /**
     * Overrides the default DataSource attribute for the {@link IIRVVector} object being built.
     *
     * @param dataSource data source term value for the IIRV message
     */
    public void setDataSource(final DataSourceTerm dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * Overrides the default DataSource attribute for the {@link IIRVVector} object being built.
     *
     * @param dataSource data source term value for the IIRV message
     */
    public void setDataSource(final long dataSource) {
        this.dataSource = new DataSourceTerm(dataSource);
    }

    /**
     * Overrides the default DataSource attribute for the {@link IIRVVector} object being built.
     *
     * @param dataSource data source term value for the IIRV message
     */
    public void setDataSource(final String dataSource) {
        this.dataSource = new DataSourceTerm(dataSource);
    }

    /**
     * Gets the current {@link CoordinateSystemTerm} value.
     *
     * @return the current {@link CoordinateSystemTerm} value.
     */
    public CoordinateSystemTerm getCoordinateSystem() {
        return coordinateSystem;
    }

    /**
     * Overrides the default CoordinateSystem attribute for the {@link IIRVVector} object being built.
     *
     * @param coordinateSystem coordinate system term value for the IIRV message
     */
    public void setCoordinateSystem(final CoordinateSystemTerm coordinateSystem) {
        this.coordinateSystem = coordinateSystem;
    }

    /**
     * Overrides the default CoordinateSystem attribute for the {@link IIRVVector} object being built.
     *
     * @param coordinateSystem coordinate system term value for the IIRV message
     */
    public void setCoordinateSystem(final String coordinateSystem) {
        this.coordinateSystem = new CoordinateSystemTerm(coordinateSystem);
    }

    /**
     * Overrides the default CoordinateSystem attribute for the {@link IIRVVector} object being built.
     *
     * @param coordinateSystem coordinate system term value for the IIRV message
     */
    public void setCoordinateSystem(final long coordinateSystem) {
        this.coordinateSystem = new CoordinateSystemTerm(coordinateSystem);
    }

    /**
     * Gets the current {@link SupportIdCodeTerm} value.
     *
     * @return the current {@link SupportIdCodeTerm} value.
     */
    public SupportIdCodeTerm getSupportIdCode() {
        return supportIdCode;
    }

    /**
     * Overrides the default SupportIdCode attribute for the {@link IIRVVector} object being built.
     *
     * @param supportIdCode support id code value for the IIRV message
     */
    public void setSupportIdCode(final SupportIdCodeTerm supportIdCode) {
        this.supportIdCode = supportIdCode;
    }

    /**
     * Overrides the default SupportIdCode attribute for the {@link IIRVVector} object being built.
     *
     * @param supportIdCode support id code value for the IIRV message
     */
    public void setSupportIdCode(final String supportIdCode) {
        this.supportIdCode = new SupportIdCodeTerm(supportIdCode);
    }

    /**
     * Overrides the default SupportIdCode attribute for the {@link IIRVVector} object being built.
     *
     * @param supportIdCode support id code value for the IIRV message
     */
    public void setSupportIdCode(final long supportIdCode) {
        this.supportIdCode = new SupportIdCodeTerm(supportIdCode);
    }

    /**
     * Gets the current {@link VehicleIdCodeTerm} value.
     *
     * @return the current {@link VehicleIdCodeTerm} value.
     */
    public VehicleIdCodeTerm getVehicleIdCode() {
        return vehicleIdCode;
    }

    /**
     * Overrides the default VehicleIdCode attribute for the {@link IIRVVector} object being built.
     *
     * @param vehicleIdCode vehicle id code value for the IIRV message
     */
    public void setVehicleIdCode(final VehicleIdCodeTerm vehicleIdCode) {
        this.vehicleIdCode = vehicleIdCode;
    }

    /**
     * Overrides the default VehicleIdCode attribute for the {@link IIRVVector} object being built.
     *
     * @param vehicleIdCode vehicle id code value for the IIRV message
     */
    public void setVehicleIdCode(final String vehicleIdCode) {
        this.vehicleIdCode = new VehicleIdCodeTerm(vehicleIdCode);
    }

    /**
     * Overrides the default VehicleIdCode attribute for the {@link IIRVVector} object being built.
     *
     * @param vehicleIdCode vehicle id code value for the IIRV message
     */
    public void setVehicleIdCode(final long vehicleIdCode) {
        this.vehicleIdCode = new VehicleIdCodeTerm(vehicleIdCode);
    }

    /**
     * Gets the current {@link SequenceNumberTerm} value.
     *
     * @return the current {@link SequenceNumberTerm} value.
     */
    public SequenceNumberTerm getSequenceNumber() {
        return sequenceNumber;
    }

    /**
     * Overrides the default SequenceNumber attribute for the {@link IIRVVector} object being built.
     *
     * @param sequenceNumber sequence number value for the IIRV message
     */
    public void setSequenceNumber(final SequenceNumberTerm sequenceNumber) {
        this.sequenceNumber = sequenceNumber;
    }

    /**
     * Overrides the default SequenceNumber attribute for the {@link IIRVVector} object being built.
     *
     * @param sequenceNumber sequence number value for the IIRV message
     */
    public void setSequenceNumber(final String sequenceNumber) {
        this.sequenceNumber = new SequenceNumberTerm(sequenceNumber);
    }

    /**
     * Overrides the default SequenceNumber attribute for the {@link IIRVVector} object being built.
     *
     * @param sequenceNumber sequence number value for the IIRV message
     */
    public void setSequenceNumber(final long sequenceNumber) {
        if (sequenceNumber > SequenceNumberTerm.MAX_SEQUENCE_NUMBER) {
            throw new OrekitIllegalArgumentException(OrekitMessages.IIRV_EXCEEDS_MAX_VECTORS, sequenceNumber);
        }
        this.sequenceNumber = new SequenceNumberTerm(sequenceNumber);
    }

    /**
     * Gets the current {@link CrossSectionalAreaTerm} value.
     *
     * @return the current {@link CrossSectionalAreaTerm} value.
     */
    public CrossSectionalAreaTerm getCrossSectionalArea() {
        return crossSectionalArea;
    }

    /**
     * Overrides the default {@link CrossSectionalAreaTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: m^2
     *
     * @param crossSectionalArea cross-sectional area value (m^2) for the IIRV message
     */
    public void setCrossSectionalArea(final CrossSectionalAreaTerm crossSectionalArea) {
        this.crossSectionalArea = crossSectionalArea;
    }

    /**
     * Overrides the default {@link CrossSectionalAreaTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: m^2
     * <p>
     * See {@link CrossSectionalAreaTerm#CrossSectionalAreaTerm(String)}
     *
     * @param crossSectionalArea cross-sectional area value (m^2) for the IIRV message
     */
    public void setCrossSectionalArea(final String crossSectionalArea) {
        this.crossSectionalArea = new CrossSectionalAreaTerm(crossSectionalArea);
    }

    /**
     * Overrides the default {@link CrossSectionalAreaTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: m^2
     * <p>
     * See {@link CrossSectionalAreaTerm#CrossSectionalAreaTerm(double)}
     *
     * @param crossSectionalArea cross-sectional area value (m^2) for the IIRV message
     */
    public void setCrossSectionalArea(final double crossSectionalArea) {
        this.crossSectionalArea = new CrossSectionalAreaTerm(crossSectionalArea);
    }

    /**
     * Gets the current {@link DragCoefficientTerm} value.
     *
     * @return the current {@link DragCoefficientTerm} value.
     */
    public DragCoefficientTerm getDragCoefficient() {
        return dragCoefficient;
    }

    /**
     * Overrides the default {@link DragCoefficientTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: dimensionless
     *
     * @param dragCoefficient drag coefficient value (dimensionless) for the IIRV message
     */
    public void setDragCoefficient(final DragCoefficientTerm dragCoefficient) {
        this.dragCoefficient = dragCoefficient;
    }

    /**
     * Overrides the default {@link DragCoefficientTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: dimensionless
     * <p>
     * See {@link DragCoefficientTerm#DragCoefficientTerm(String)}
     *
     * @param dragCoefficient drag coefficient value (dimensionless) for the IIRV message
     */
    public void setDragCoefficient(final String dragCoefficient) {
        this.dragCoefficient = new DragCoefficientTerm(dragCoefficient);
    }

    /**
     * Overrides the default {@link DragCoefficientTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: dimensionless
     * <p>
     * See {@link DragCoefficientTerm#DragCoefficientTerm(double)}
     *
     * @param dragCoefficient drag coefficient value (dimensionless) for the IIRV message
     */
    public void setDragCoefficient(final double dragCoefficient) {
        this.dragCoefficient = new DragCoefficientTerm(dragCoefficient);
    }

    /**
     * Gets the current {@link SolarReflectivityCoefficientTerm} value.
     *
     * @return the current {@link SolarReflectivityCoefficientTerm} value.
     */
    public SolarReflectivityCoefficientTerm getSolarReflectivityCoefficient() {
        return solarReflectivityCoefficient;
    }

    /**
     * Overrides the default {@link SolarReflectivityCoefficientTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: dimensionless
     *
     * @param solarReflectivityCoefficient solar reflectivity coefficient value (dimensionless) for the IIRV message
     */
    public void setSolarReflectivityCoefficient(final SolarReflectivityCoefficientTerm solarReflectivityCoefficient) {
        this.solarReflectivityCoefficient = solarReflectivityCoefficient;
    }

    /**
     * Overrides the default {@link SolarReflectivityCoefficientTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: dimensionless
     * <p>
     * See {@link SolarReflectivityCoefficientTerm#SolarReflectivityCoefficientTerm(String)}
     *
     * @param solarReflectivityCoefficient solar reflectivity coefficient value (dimensionless) for the IIRV message
     */
    public void setSolarReflectivityCoefficient(final String solarReflectivityCoefficient) {
        this.solarReflectivityCoefficient = new SolarReflectivityCoefficientTerm(solarReflectivityCoefficient);
    }

    /**
     * Overrides the default {@link SolarReflectivityCoefficientTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * Units: dimensionless
     * <p>
     * See {@link SolarReflectivityCoefficientTerm#SolarReflectivityCoefficientTerm(double)}
     *
     * @param solarReflectivityCoefficient solar reflectivity coefficient value (dimensionless) for the IIRV message
     */
    public void setSolarReflectivityCoefficient(final double solarReflectivityCoefficient) {
        this.solarReflectivityCoefficient = new SolarReflectivityCoefficientTerm(solarReflectivityCoefficient);
    }

    /**
     * Gets the current {@link OriginatorRoutingIndicatorTerm} value.
     *
     * @return the current {@link OriginatorRoutingIndicatorTerm} value.
     */
    public OriginatorRoutingIndicatorTerm getOriginatorRoutingIndicator() {
        return originatorRoutingIndicator;
    }

    /**
     * Overrides the default {@link OriginatorRoutingIndicatorTerm} attribute for the {@link IIRVVector} object being built.
     *
     * @param originatorRoutingIndicator originator routing indicator value for the IIRV message
     */
    public void setOriginatorRoutingIndicator(final OriginatorRoutingIndicatorTerm originatorRoutingIndicator) {
        this.originatorRoutingIndicator = originatorRoutingIndicator;
    }

    /**
     * Overrides the default {@link OriginatorRoutingIndicatorTerm} attribute for the {@link IIRVVector} object being built.
     * <p>
     * See {@link OriginatorRoutingIndicatorTerm#OriginatorRoutingIndicatorTerm(String)}
     *
     * @param originatorRoutingIndicator originator routing indicator value for the IIRV message
     */
    public void setOriginatorRoutingIndicator(final String originatorRoutingIndicator) {
        this.originatorRoutingIndicator = new OriginatorRoutingIndicatorTerm(originatorRoutingIndicator);
    }

    /**
     * Returns the satellite ID (set to the value of the {@link VehicleIdCodeTerm}).
     *
     * @return the satellite ID
     */
    public String getSatelliteID() {
        return vehicleIdCode.toEncodedString();
    }


}