CdmMetadata.java

  1. /* Copyright 2002-2024 CS GROUP
  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.ccsds.ndm.cdm;

  18. import java.util.List;

  19. import org.orekit.annotation.DefaultDataContext;
  20. import org.orekit.bodies.CelestialBody;
  21. import org.orekit.bodies.CelestialBodyFactory;
  22. import org.orekit.data.DataContext;
  23. import org.orekit.errors.OrekitException;
  24. import org.orekit.errors.OrekitMessages;
  25. import org.orekit.files.ccsds.definitions.YesNoUnknown;
  26. import org.orekit.files.ccsds.definitions.BodyFacade;
  27. import org.orekit.files.ccsds.definitions.FrameFacade;
  28. import org.orekit.files.ccsds.definitions.CelestialBodyFrame;
  29. import org.orekit.files.ccsds.definitions.ModifiedFrame;
  30. import org.orekit.files.ccsds.definitions.TimeSystem;
  31. import org.orekit.files.ccsds.ndm.odm.ocm.ObjectType;
  32. import org.orekit.files.ccsds.section.Metadata;
  33. import org.orekit.frames.Frame;

  34. /**
  35.  * This class gathers the meta-data present in the Conjunction Data Message (CDM).
  36.  * @author Melina Vanel
  37.  * @since 11.2
  38.  */
  39. public class CdmMetadata extends Metadata {

  40.     /** CDM relative metadata. */
  41.     private CdmRelativeMetadata relativeMetadata;

  42.     /** Refering to object 1 or 2. */
  43.     private String object;

  44.     /** Unique satellite identification designator for the object. */
  45.     private String objectDesignator;

  46.     /** Specification of satellite catalog source. */
  47.     private String catalogName;

  48.     /** Object name. */
  49.     private String objectName;

  50.     /** International designator for the object as assigned by the UN Committee
  51.      * on Space Research (COSPAR) and the US National Space Science Data Center (NSSDC). */
  52.     private String internationalDesignator;

  53.     /** Type of object. */
  54.     private ObjectType objectType;

  55.     /** Operator contact position for the space object. */
  56.     private String operatorContact;

  57.     /** Operator organization for the space object. */
  58.     private String operatorOrganization;

  59.     /** Operator phone for the space object. */
  60.     private String operatorPhone;

  61.     /** Operator email for the space object. */
  62.     private String operatorEmail;

  63.     /** Unique identifier of Orbit Data Message(s) that are linked (relevant) to this Conjunction Data Message. */
  64.     private String odmMsgLink;

  65.     /** Unique identifier of Attitude Data Message(s) that are linked (relevant) to this Conjunction Data Message. */
  66.     private String admMsgLink;

  67.     /** Unique name of the external ephemeris file used for the object or NONE. */
  68.     private String ephemName;

  69.     /** Flag indicating whether new tracking observations are anticipated prior to the issue of the next CDM associated with the event
  70.      * specified by CONJUNCTION_ID. */
  71.     private YesNoUnknown obsBeforeNextMessage;

  72.     /** Operator email for the space object. */
  73.     private CovarianceMethod covarianceMethod;

  74.     /** Maneuver capacity. */
  75.     private Maneuvrable maneuverable;

  76.     /** Central body around which Object1 and 2 are orbiting. */
  77.     private BodyFacade orbitCenter;

  78.     /** Reference frame in which state vector data are given. */
  79.     private FrameFacade refFrame;

  80.     /** Gravity model name. */
  81.     private String gravityModel;

  82.     /** Degree of the gravity model. */
  83.     private int gravityDegree;

  84.     /** Order of the gravity model. */
  85.     private int gravityOrder;

  86.     /** Name of atmospheric model. */
  87.     private String atmosphericModel;

  88.     /** N-body perturbation bodies. */
  89.     private List<BodyFacade> nBodyPerturbations;

  90.     /** Is solar radiation pressure taken into account or not ? STANDARD CCSDS saying YES/NO choice and optional */
  91.     private YesNoUnknown isSolarRadPressure;

  92.     /** Is solid Earth and ocean tides taken into account or not. STANDARD CCSDS saying YES/NO choice and optional */
  93.     private YesNoUnknown isEarthTides;

  94.     /** Is in-track thrust modelling used or not. STANDARD CCSDS saying YES/NO choice and optional */
  95.     private YesNoUnknown isIntrackThrustModeled;

  96.     /** The source from which the covariance data used in the report for both Object 1 and Object 2 originates. */
  97.     private String covarianceSource;

  98.     /** Flag indicating the type of alternate covariance information provided. */
  99.     private AltCovarianceType altCovType;

  100.     /** Reference frame in which the alternate covariance data are given. */
  101.     private FrameFacade altCovRefFrame;

  102.     /** Simple constructor.
  103.      */
  104.     @DefaultDataContext
  105.     public CdmMetadata() {
  106.         super(null);
  107.         orbitCenter = new BodyFacade(CelestialBodyFactory.EARTH.toUpperCase(), CelestialBodyFactory.getEarth());
  108.     }

  109.     /** Simple constructor.
  110.      *
  111.      * @param dataContext data context
  112.      */
  113.     public CdmMetadata(final DataContext dataContext) {
  114.         super(null);
  115.         final CelestialBody earth = dataContext.getCelestialBodies().getEarth();
  116.         orbitCenter = new BodyFacade(earth.getName().toUpperCase(), earth);
  117.     }

  118.     /** {@inheritDoc} */
  119.     @Override
  120.     public void validate(final double version) {
  121.         // We only check values that are mandatory in a cdm file
  122.         checkNotNull(object,                  CdmMetadataKey.OBJECT.name());
  123.         checkNotNull(objectDesignator,        CdmMetadataKey.OBJECT_DESIGNATOR.name());
  124.         checkNotNull(catalogName,             CdmMetadataKey.CATALOG_NAME.name());
  125.         checkNotNull(objectName,              CdmMetadataKey.OBJECT_NAME.name());
  126.         checkNotNull(internationalDesignator, CdmMetadataKey.INTERNATIONAL_DESIGNATOR.name());
  127.         checkNotNull(ephemName,               CdmMetadataKey.EPHEMERIS_NAME.name());
  128.         checkNotNull(covarianceMethod,        CdmMetadataKey.COVARIANCE_METHOD.name());
  129.         checkNotNull(maneuverable,            CdmMetadataKey.MANEUVERABLE.name());
  130.         checkNotNull(refFrame,                CdmMetadataKey.REF_FRAME.name());
  131.     }

  132.     /**
  133.      * Get the relative metadata following header, they are the common metadata for the CDM.
  134.      * @return relativeMetadata relative metadata
  135.      */
  136.     public CdmRelativeMetadata getRelativeMetadata() {
  137.         return relativeMetadata;
  138.     }

  139.     /**
  140.      * Set the relative metadata following header, they are the common metadata for the CDM.
  141.      * @param relativeMetadata relative metadata
  142.      */
  143.     public void setRelativeMetadata(final CdmRelativeMetadata relativeMetadata) {
  144.         this.relativeMetadata = relativeMetadata;
  145.     }

  146.     /**
  147.      * Get the object name for which metadata are given.
  148.      * @return the object name
  149.      */
  150.     public String getObject() {
  151.         return object;
  152.     }

  153.     /**
  154.      * Set the object name for which metadata are given.
  155.      * @param object = object 1 or 2 to be set
  156.      */
  157.     public void setObject(final String object) {
  158.         this.setTimeSystem(TimeSystem.UTC);
  159.         refuseFurtherComments();
  160.         this.object = object;
  161.     }

  162.     /**
  163.      * Get the object satellite catalog designator for which metadata are given.
  164.      * @return the satellite catalog designator for the object
  165.      */
  166.     public String getObjectDesignator() {
  167.         return objectDesignator;
  168.     }

  169.     /**
  170.      * Set the satellite designator for the object for which metadata are given.
  171.      * @param objectDesignator for the spacecraft to be set
  172.      */
  173.     public void setObjectDesignator(final String objectDesignator) {
  174.         refuseFurtherComments();
  175.         this.objectDesignator = objectDesignator;
  176.     }

  177.     /**
  178.      * Get the satellite catalog used for the object.
  179.      * @return the catalog name
  180.      */
  181.     public String getCatalogName() {
  182.         return catalogName;
  183.     }

  184.     /**
  185.      * Set the satellite catalog name used for object.
  186.      * @param catalogName for the spacecraft to be set
  187.      */
  188.     public void setCatalogName(final String catalogName) {
  189.         refuseFurtherComments();
  190.         this.catalogName = catalogName;
  191.     }

  192.     /**
  193.      * Get the spacecraft name for the object.
  194.      * @return the spacecraft name
  195.      */
  196.     public String getObjectName() {
  197.         return objectName;
  198.     }

  199.     /**
  200.      * Set the spacecraft name used for object.
  201.      * @param objectName for the spacecraft to be set
  202.      */
  203.     public void setObjectName(final String objectName) {
  204.         refuseFurtherComments();
  205.         this.objectName = objectName;
  206.     }

  207.     /**
  208.      * Get the international designator for the object.
  209.      * @return the international designator
  210.      */
  211.     public String getInternationalDes() {
  212.         return internationalDesignator;
  213.     }

  214.     /**
  215.      * Set the international designator used for object.
  216.      * @param internationalDes for the object to be set
  217.      */
  218.     public void setInternationalDes(final String internationalDes) {
  219.         refuseFurtherComments();
  220.         this.internationalDesignator = internationalDes;
  221.     }

  222.     /**
  223.      * Get the type of object.
  224.      * @return the object type
  225.      */
  226.     public ObjectType getObjectType() {
  227.         return objectType;
  228.     }

  229.     /**
  230.      * Set the type of object.
  231.      * @param objectType type of object
  232.      */
  233.     public void setObjectType(final ObjectType objectType) {
  234.         refuseFurtherComments();
  235.         this.objectType = objectType;
  236.     }

  237.     /**
  238.      * Get the contact position of the owner / operator of the object.
  239.      * @return the contact position
  240.      */
  241.     public String getOperatorContactPosition() {
  242.         return operatorContact;
  243.     }

  244.     /**
  245.      * Set the contact position for the object owner / operator.
  246.      * @param opContact for the object to be set
  247.      */
  248.     public void setOperatorContactPosition(final String opContact) {
  249.         refuseFurtherComments();
  250.         this.operatorContact = opContact;
  251.     }

  252.     /**
  253.      * Get the contact organisation of the object.
  254.      * @return the contact organisation
  255.      */
  256.     public String getOperatorOrganization() {
  257.         return operatorOrganization;
  258.     }

  259.     /**
  260.      * Set the contact organisation of the object.
  261.      * @param operatorOrganization contact organisation for the object to be set
  262.      */
  263.     public void setOperatorOrganization(final String operatorOrganization) {
  264.         refuseFurtherComments();
  265.         this.operatorOrganization = operatorOrganization;
  266.     }

  267.     /**
  268.      * Get the contact phone of the operator of the object.
  269.      * @return the operator phone
  270.      */
  271.     public String getOperatorPhone() {
  272.         return operatorPhone;
  273.     }

  274.     /**
  275.      * Set the operator phone of the object.
  276.      * @param operatorPhone contact phone for the object to be set
  277.      */
  278.     public void setOperatorPhone(final String operatorPhone) {
  279.         refuseFurtherComments();
  280.         this.operatorPhone = operatorPhone;
  281.     }

  282.     /**
  283.      * Get the email of the operator of the object.
  284.      * @return the operator email
  285.      */
  286.     public String getOperatorEmail() {
  287.         return operatorEmail;
  288.     }

  289.     /**
  290.      * Set the object operator email.
  291.      * @param operatorEmail operator email for the object to be set
  292.      */
  293.     public void setOperatorEmail(final String operatorEmail) {
  294.         refuseFurtherComments();
  295.         this.operatorEmail = operatorEmail;
  296.     }

  297.     /**
  298.      * Get the unique name of the external ephemeris used for OD.
  299.      * @return the name of ephemeris used
  300.      */
  301.     public String getEphemName() {
  302.         return ephemName;
  303.     }

  304.     /**
  305.      * Set the name of external ephemeris used for OD.
  306.      * @param ephemName me of external ephemeris used
  307.      */
  308.     public void setEphemName(final String ephemName) {
  309.         refuseFurtherComments();
  310.         this.ephemName = ephemName;
  311.     }

  312.     /**
  313.      * Get the method name used to calculate covariance during OD.
  314.      * @return the name of covariance calculation method
  315.      */
  316.     public CovarianceMethod getCovarianceMethod() {
  317.         return covarianceMethod;
  318.     }

  319.     /**
  320.      * Set the method name used to calculate covariance during OD.
  321.      * @param covarianceMethod method name for covariance calculation
  322.      */
  323.     public void setCovarianceMethod(final CovarianceMethod covarianceMethod) {
  324.         refuseFurtherComments();
  325.         this.covarianceMethod = covarianceMethod;
  326.     }

  327.     /**
  328.      * Get the ability of object to maneuver or not.
  329.      * @return the ability to maneuver
  330.      */
  331.     public Maneuvrable getManeuverable() {
  332.         return maneuverable;
  333.     }

  334.     /**
  335.      * Set the object maneuver ability.
  336.      * @param maneuverable ability to maneuver
  337.      */
  338.     public void setManeuverable(final Maneuvrable maneuverable) {
  339.         refuseFurtherComments();
  340.         this.maneuverable = maneuverable;
  341.     }

  342.     /**
  343.      * Get the central body for object 1 and 2.
  344.      * @return the name of the central body
  345.      */
  346.     public BodyFacade getOrbitCenter() {
  347.         return orbitCenter;
  348.     }

  349.     /**
  350.      * Set the central body name for object 1 and 2.
  351.      * @param orbitCenter name of the central body
  352.      */
  353.     public void setOrbitCenter(final BodyFacade orbitCenter) {
  354.         refuseFurtherComments();
  355.         this.orbitCenter = orbitCenter;
  356.     }

  357.     /**
  358.      * Get the reference frame in which data are given: used for state vector and
  359.      * Keplerian elements data (and for the covariance reference frame if none is given).
  360.      *
  361.      * @return the reference frame
  362.      */
  363.     public Frame getFrame() {
  364.         if (orbitCenter == null || orbitCenter.getBody() == null) {
  365.             throw new OrekitException(OrekitMessages.NO_DATA_LOADED_FOR_CELESTIAL_BODY, "No Orbit center name");
  366.         }
  367.         if (refFrame == null) {
  368.             throw new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, "No reference frame");
  369.         }
  370.         else  {
  371.             if (refFrame.asFrame() == null) {
  372.                 throw new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, refFrame.getName());
  373.             }
  374.         }
  375.         // Just return frame if we don't need to shift the center based on CENTER_NAME
  376.         // MCI and ICRF are the only non-Earth centered frames specified in Annex A.
  377.         final boolean isMci  = refFrame.asCelestialBodyFrame() == CelestialBodyFrame.MCI;
  378.         final boolean isIcrf = refFrame.asCelestialBodyFrame() == CelestialBodyFrame.ICRF;
  379.         final boolean isSolarSystemBarycenter =
  380.                 CelestialBodyFactory.SOLAR_SYSTEM_BARYCENTER.equals(orbitCenter.getBody().getName());
  381.         if (!(isMci || isIcrf) && CelestialBodyFactory.EARTH.equals(orbitCenter.getBody().getName()) ||
  382.             isMci && CelestialBodyFactory.MARS.equals(orbitCenter.getBody().getName()) ||
  383.             isIcrf && isSolarSystemBarycenter) {
  384.             return refFrame.asFrame();
  385.         }
  386.         // else, translate frame to specified center.
  387.         return new ModifiedFrame(refFrame.asFrame(), refFrame.asCelestialBodyFrame(),
  388.                                  orbitCenter.getBody(), orbitCenter.getName());
  389.     }

  390.     /**
  391.      * Get the value of {@code REF_FRAME} as an Orekit {@link Frame}. The {@code
  392.      * ORBIT_CENTER} key word has not been applied yet, so the returned frame may not
  393.      * correspond to the reference frame of the data in the file.
  394.      * @return the reference frame
  395.      */
  396.     public FrameFacade getRefFrame() {
  397.         return refFrame;
  398.     }

  399.     /**
  400.      * Set the name of the reference frame in which the state vector data are given.
  401.      * @param refFrame reference frame
  402.      */
  403.     public void setRefFrame(final FrameFacade refFrame) {
  404.         refuseFurtherComments();
  405.         this.refFrame = refFrame;
  406.     }

  407.     /** Get gravity model name.
  408.      * @return gravity model name
  409.      */
  410.     public String getGravityModel() {
  411.         return gravityModel;
  412.     }

  413.     /** Get degree of the gravity model.
  414.      * @return degree of the gravity model
  415.      */
  416.     public int getGravityDegree() {
  417.         return gravityDegree;
  418.     }

  419.     /** Get order of the gravity model.
  420.      * @return order of the gravity model
  421.      */
  422.     public int getGravityOrder() {
  423.         return gravityOrder;
  424.     }

  425.     /** Set gravity model.
  426.      * @param name name of the model
  427.      * @param degree degree of the model
  428.      * @param order order of the model
  429.      */
  430.     public void setGravityModel(final String name, final int degree, final int order) {
  431.         refuseFurtherComments();
  432.         this.gravityModel  = name;
  433.         this.gravityDegree = degree;
  434.         this.gravityOrder  = order;
  435.     }

  436.     /** Get name of atmospheric model.
  437.      * @return name of atmospheric model
  438.      */
  439.     public String getAtmosphericModel() {
  440.         return atmosphericModel;
  441.     }

  442.     /** Set name of atmospheric model.
  443.      * @param atmosphericModel name of atmospheric model
  444.      */
  445.     public void setAtmosphericModel(final String atmosphericModel) {
  446.         refuseFurtherComments();
  447.         this.atmosphericModel = atmosphericModel;
  448.     }

  449.     /** Get n-body perturbation bodies.
  450.      * @return n-body perturbation bodies
  451.      */
  452.     public List<BodyFacade> getNBodyPerturbations() {
  453.         return nBodyPerturbations;
  454.     }

  455.     /** Set n-body perturbation bodies.
  456.      * @param nBody n-body perturbation bodies
  457.      */
  458.     public void setNBodyPerturbations(final List<BodyFacade> nBody) {
  459.         refuseFurtherComments();
  460.         this.nBodyPerturbations = nBody;
  461.     }

  462.     /**
  463.      * Get Enum YesNoUnknown that indicates if Solar Radiation Pressure is taken into account or not.
  464.      * @return isSolarRadPressure YesNoUnknown
  465.      */
  466.     public YesNoUnknown getSolarRadiationPressure() {
  467.         return isSolarRadPressure;
  468.     }

  469.     /**
  470.      * Set Enum that indicates if Solar Radiation Pressure is taken into account or not.
  471.      * @param isSolRadPressure YesNoUnknown
  472.      */
  473.     public void setSolarRadiationPressure(final YesNoUnknown isSolRadPressure) {
  474.         refuseFurtherComments();
  475.         this.isSolarRadPressure = isSolRadPressure;
  476.     }

  477.     /**
  478.      * Get Enum YesNoUnknown that indicates if Earth and ocean tides are taken into account or not.
  479.      * @return isEarthTides YesNoUnknown
  480.      */
  481.     public YesNoUnknown getEarthTides() {
  482.         return isEarthTides;
  483.     }

  484.     /**
  485.      * Set Enum YesNoUnknown that indicates if Earth and ocean tides are taken into account or not.
  486.      * @param EarthTides YesNoUnknown
  487.      */
  488.     public void setEarthTides(final YesNoUnknown EarthTides) {
  489.         refuseFurtherComments();
  490.         this.isEarthTides = EarthTides;
  491.     }

  492.     /**
  493.      * Get Enum YesNoUnknown that indicates if intrack thrust modeling was into account or not.
  494.      * @return isEarthTides YesNoUnknown
  495.      */
  496.     public YesNoUnknown getIntrackThrust() {
  497.         return isIntrackThrustModeled;
  498.     }

  499.     /**
  500.      * Set boolean that indicates if intrack thrust modeling was into account or not.
  501.      * @param IntrackThrustModeled YesNoUnknown
  502.      */
  503.     public void setIntrackThrust(final YesNoUnknown IntrackThrustModeled) {
  504.         refuseFurtherComments();
  505.         this.isIntrackThrustModeled = IntrackThrustModeled;
  506.     }

  507.     /** Get the source of the covariance data.
  508.      * @return the covarianceSource
  509.      */
  510.     public String getCovarianceSource() {
  511.         return covarianceSource;
  512.     }

  513.     /** Set the source of the covariance data.
  514.      * @param covarianceSource the covarianceSource to set
  515.      */
  516.     public void setCovarianceSource(final String covarianceSource) {
  517.         refuseFurtherComments();
  518.         this.covarianceSource = covarianceSource;
  519.     }

  520.     /** Get the flag indicating the type of alternate covariance information provided.
  521.      * @return the altCovType
  522.      */
  523.     public AltCovarianceType getAltCovType() {
  524.         return altCovType;
  525.     }

  526.     /** Set the flag indicating the type of alternate covariance information provided.
  527.      * @param altCovType the altCovType to set
  528.      */
  529.     public void setAltCovType(final AltCovarianceType altCovType) {
  530.         refuseFurtherComments();
  531.         this.altCovType = altCovType;
  532.     }

  533.      /**
  534.      * Get the value of {@code ALT_COV_REF_FRAME} as an Orekit {@link Frame}.
  535.      * @return the reference frame
  536.      */
  537.     public FrameFacade getAltCovRefFrame() {
  538.         return altCovRefFrame;
  539.     }

  540.     /**
  541.      * Set the name of the reference frame in which the alternate covariance data are given.
  542.      * @param altCovRefFrame alternate covariance reference frame
  543.      */
  544.     public void setAltCovRefFrame(final FrameFacade altCovRefFrame) {
  545.         refuseFurtherComments();

  546.         if (getAltCovType() == null) {
  547.             throw new OrekitException(OrekitMessages.CCSDS_MISSING_KEYWORD, CdmMetadataKey.ALT_COV_TYPE);
  548.         }

  549.         if (altCovRefFrame.asFrame() == null) {
  550.             throw new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, altCovRefFrame.getName());
  551.         }

  552.         // Only set the frame if within the allowed options: GCRF, EME2000, ITRF
  553.         if ( altCovRefFrame.asCelestialBodyFrame() == CelestialBodyFrame.GCRF ||
  554.                  altCovRefFrame.asCelestialBodyFrame() == CelestialBodyFrame.EME2000 ||
  555.                      altCovRefFrame.asCelestialBodyFrame().name().contains("ITRF") ) {
  556.             this.altCovRefFrame = altCovRefFrame;
  557.         } else {
  558.             throw new OrekitException(OrekitMessages.CCSDS_INVALID_FRAME, altCovRefFrame.getName());
  559.         }
  560.     }

  561.     /** Get the unique identifier of Orbit Data Message(s) that are linked (relevant) to this Conjunction Data Message.
  562.      * @return the odmMsgLink
  563.      */
  564.     public String getOdmMsgLink() {
  565.         return odmMsgLink;
  566.     }

  567.     /** Set the unique identifier of Orbit Data Message(s) that are linked (relevant) to this Conjunction Data Message.
  568.      * @param odmMsgLink the odmMsgLink to set
  569.      */
  570.     public void setOdmMsgLink(final String odmMsgLink) {
  571.         refuseFurtherComments();
  572.         this.odmMsgLink = odmMsgLink;
  573.     }

  574.     /** Get the unique identifier of Attitude Data Message(s) that are linked (relevant) to this Conjunction Data Message.
  575.      * @return the admMsgLink
  576.      */
  577.     public String getAdmMsgLink() {
  578.         return admMsgLink;
  579.     }

  580.     /** Set the unique identifier of Attitude Data Message(s) that are linked (relevant) to this Conjunction Data Message.
  581.      * @param admMsgLink the admMsgLink to set
  582.      */
  583.     public void setAdmMsgLink(final String admMsgLink) {
  584.         refuseFurtherComments();
  585.         this.admMsgLink = admMsgLink;
  586.     }

  587.     /** Get the flag indicating whether new tracking observations are anticipated prior to the issue of the next CDM associated with the event
  588.      * specified by CONJUNCTION_ID.
  589.      * @return the obsBeforeNextMessage
  590.      */
  591.     public YesNoUnknown getObsBeforeNextMessage() {
  592.         return obsBeforeNextMessage;
  593.     }

  594.     /** Set the flag indicating whether new tracking observations are anticipated prior to the issue of the next CDM associated with the event
  595.      * specified by CONJUNCTION_ID.
  596.      * @param obsBeforeNextMessage the obsBeforeNextMessage to set
  597.      */
  598.     public void setObsBeforeNextMessage(final YesNoUnknown obsBeforeNextMessage) {
  599.         refuseFurtherComments();
  600.         this.obsBeforeNextMessage = obsBeforeNextMessage;
  601.     }
  602. }