1   /* Copyright 2002-2026 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  
18  package org.orekit.files.ccsds.ndm.odm.ocm;
19  
20  import java.util.List;
21  
22  import org.orekit.data.DataContext;
23  import org.orekit.files.ccsds.definitions.CcsdsFrameMapper;
24  import org.orekit.files.ccsds.definitions.TimeSystem;
25  import org.orekit.files.ccsds.ndm.odm.OdmMetadata;
26  import org.orekit.files.ccsds.section.MetadataKey;
27  import org.orekit.frames.Frame;
28  import org.orekit.time.AbsoluteDate;
29  
30  /** Meta-data for {@link OcmMetadata Orbit Comprehensive Message}.
31   * @since 11.0
32   */
33  public class OcmMetadata extends OdmMetadata {
34  
35      /** Default value for SCLK_OFFSET_AT_EPOCH.
36       * @since 12.0
37       */
38      public static final double DEFAULT_SCLK_OFFSET_AT_EPOCH = 0.0;
39  
40      /** Default value for SCLK_SEC_PER_SI_SEC.
41       * @since 12.0
42       */
43      public static final double DEFAULT_SCLK_SEC_PER_SI_SEC = 1.0;
44  
45      /** International designator for the object as assigned by the UN Committee
46       * on Space Research (COSPAR) and the US National Space Science Data Center (NSSDC). */
47      private String internationalDesignator;
48  
49      /** Specification of satellite catalog source. */
50      private String catalogName;
51  
52      /** Unique satellite identification designator for the object. */
53      private String objectDesignator;
54  
55      /** Alternate names for this space object. */
56      private List<String> alternateNames;
57  
58      /** Programmatic Point Of Contact at originator. */
59      private String originatorPOC;
60  
61      /** Position of Programmatic Point Of Contact at originator. */
62      private String originatorPosition;
63  
64      /** Phone number of Programmatic Point Of Contact at originator. */
65      private String originatorPhone;
66  
67      /** Email address of Programmatic Point Of Contact at originator.
68       * @since 11.2
69       */
70      private String originatorEmail;
71  
72      /** Address of Programmatic Point Of Contact at originator. */
73      private String originatorAddress;
74  
75      /** Creating agency or operator. */
76      private String techOrg;
77  
78      /** Technical Point Of Contact at originator. */
79      private String techPOC;
80  
81      /** Position of Technical Point Of Contact at originator. */
82      private String techPosition;
83  
84      /** Phone number of Technical Point Of Contact at originator. */
85      private String techPhone;
86  
87      /** Email address of Technical Point Of Contact at originator.
88       * @since 11.2
89       */
90      private String techEmail;
91  
92      /** Address of Technical Point Of Contact at originator. */
93      private String techAddress;
94  
95      /** Unique ID identifying previous message from a given originator. */
96      private String previousMessageID;
97  
98      /** Unique ID identifying next message from a given originator. */
99      private String nextMessageID;
100 
101     /** Unique identifier of Attitude Data Message linked to this Orbit Data Message. */
102     private String admMessageLink;
103 
104     /** Unique identifier of Conjunction Data Message linked to this Orbit Data Message. */
105     private String cdmMessageLink;
106 
107     /** Unique identifier of Pointing Request Message linked to this Orbit Data Message. */
108     private String prmMessageLink;
109 
110     /** Unique identifier of Reentry Data Messages linked to this Orbit Data Message. */
111     private String rdmMessageLink;
112 
113     /** Unique identifier of Tracking Data Messages linked to this Orbit Data Message. */
114     private String tdmMessageLink;
115 
116     /** Operator of the space object. */
117     private String operator;
118 
119     /** Owner of the space object. */
120     private String owner;
121 
122     /** Name of the country where the space object owner is based. */
123     private String country;
124 
125     /** Name of the constellation this space object belongs to. */
126     private String constellation;
127 
128     /** Type of object. */
129     private ObjectType objectType;
130 
131     /** Epoch to which <em>all</em> relative times are referenced in data blocks;
132      * unless overridden by block-specific {@code EPOCH_TZERO} values. */
133     private AbsoluteDate epochT0;
134 
135     /** Operational status. */
136     private OpsStatus opsStatus;
137 
138     /** Orbit category. */
139     private OrbitCategory orbitCategory;
140 
141     /** List of elements of information data blocks included in this message. */
142     private List<OcmElements> ocmDataElements;
143 
144     /** Spacecraft clock count at {@link #getEpochT0()}. */
145     private double sclkOffsetAtEpoch;
146 
147     /** Number of spacecraft clock seconds occurring during one SI second. */
148     private double sclkSecPerSISec;
149 
150     /** Creation date of previous message from a given originator. */
151     private AbsoluteDate previousMessageEpoch;
152 
153     /** Creation date of next message from a given originator. */
154     private AbsoluteDate nextMessageEpoch;
155 
156     /** Time of the earliest data contained in the OCM. */
157     private AbsoluteDate startTime;
158 
159     /** Time of the latest data contained in the OCM. */
160     private AbsoluteDate stopTime;
161 
162     /** Span of time that the OCM covers. */
163     private double timeSpan;
164 
165     /** Difference (TAI – UTC) in seconds at epoch {@link #epochT0}. */
166     private double taimutcT0;
167 
168     /** Epoch of next leap second.
169      * @since 11.2
170      */
171     private AbsoluteDate nextLeapEpoch;
172 
173     /** Difference (TAI – UTC) in seconds incorporated at {@link #nextLeapEpoch}.
174      * @since 11.2
175      */
176     private double nextLeapTaimutc;
177 
178     /** Difference (UT1 – UTC) in seconds at epoch {@link #epochT0}. */
179     private double ut1mutcT0;
180 
181     /** Source and version of Earth Orientation Parameters. */
182     private String eopSource;
183 
184     /** Interpolation method for Earth Orientation Parameters. */
185     private String interpMethodEOP;
186 
187     /** Source and version of celestial body (e.g. Sun/Earth/Planetary). */
188     private String celestialSource;
189 
190     /** Data context.
191      * @since 12.0
192      */
193     private final DataContext dataContext;
194 
195     /**
196      * Create a new meta-data.
197      *
198      * @param dataContext data context
199      * @param frameMapper for creating an Orekit {@link Frame}.
200      * @since 13.1.5
201      */
202     public OcmMetadata(final DataContext dataContext,
203                        final CcsdsFrameMapper frameMapper) {
204 
205         // set up the few fields that have default values as per CCSDS standard
206         super(TimeSystem.UTC, frameMapper);
207         sclkOffsetAtEpoch = DEFAULT_SCLK_OFFSET_AT_EPOCH;
208         sclkSecPerSISec   = DEFAULT_SCLK_SEC_PER_SI_SEC;
209         timeSpan          = Double.NaN;
210         taimutcT0         = Double.NaN;
211         ut1mutcT0         = Double.NaN;
212         nextLeapTaimutc   = Double.NaN;
213         this.dataContext  = dataContext;
214 
215     }
216 
217     /** {@inheritDoc} */
218     @Override
219     public void validate(final double version) {
220         // we don't call super.checkMandatoryEntries() because
221         // all of the parameters considered mandatory at ODM level
222         // for OPM, OMM and OEM are in fact optional in OCM
223         // only TIME_SYSTEM and EPOCH_TZERO are mandatory
224         checkNotNull(getTimeSystem(), MetadataKey.TIME_SYSTEM.name());
225         checkNotNull(epochT0,         OcmMetadataKey.EPOCH_TZERO.name());
226         if (nextLeapEpoch != null) {
227             checkNotNaN(nextLeapTaimutc, OcmMetadataKey.NEXT_LEAP_TAIMUTC.name());
228         }
229     }
230 
231     /** Get the international designator for the object.
232      * @return international designator for the object
233      */
234     public String getInternationalDesignator() {
235         return internationalDesignator;
236     }
237 
238     /** Set the international designator for the object.
239      * @param internationalDesignator international designator for the object
240      */
241     public void setInternationalDesignator(final String internationalDesignator) {
242         refuseFurtherComments();
243         this.internationalDesignator = internationalDesignator;
244     }
245 
246     /** Get the specification of satellite catalog source.
247      * @return specification of satellite catalog source
248      */
249     public String getCatalogName() {
250         return catalogName;
251     }
252 
253     /** Set the specification of satellite catalog source.
254      * @param catalogName specification of satellite catalog source
255      */
256     public void setCatalogName(final String catalogName) {
257         refuseFurtherComments();
258         this.catalogName = catalogName;
259     }
260 
261     /** Get the unique satellite identification designator for the object.
262      * @return unique satellite identification designator for the object.
263      */
264     public String getObjectDesignator() {
265         return objectDesignator;
266     }
267 
268     /** Set the unique satellite identification designator for the object.
269      * @param objectDesignator unique satellite identification designator for the object
270      */
271     public void setObjectDesignator(final String objectDesignator) {
272         refuseFurtherComments();
273         this.objectDesignator = objectDesignator;
274     }
275 
276     /** Get the alternate names for this space object.
277      * @return alternate names
278      */
279     public List<String> getAlternateNames() {
280         return alternateNames;
281     }
282 
283     /** Set the alternate names for this space object.
284      * @param alternateNames alternate names
285      */
286     public void setAlternateNames(final List<String> alternateNames) {
287         refuseFurtherComments();
288         this.alternateNames = alternateNames;
289     }
290 
291     /** Get the programmatic Point Of Contact at originator.
292      * @return programmatic Point Of Contact at originator
293      */
294     public String getOriginatorPOC() {
295         return originatorPOC;
296     }
297 
298     /** Set the programmatic Point Of Contact at originator.
299      * @param originatorPOC programmatic Point Of Contact at originator
300      */
301     public void setOriginatorPOC(final String originatorPOC) {
302         refuseFurtherComments();
303         this.originatorPOC = originatorPOC;
304     }
305 
306     /** Get the position of Programmatic Point Of Contact at originator.
307      * @return position of Programmatic Point Of Contact at originator
308      */
309     public String getOriginatorPosition() {
310         return originatorPosition;
311     }
312 
313     /** Set the position of Programmatic Point Of Contact at originator.
314      * @param originatorPosition position of Programmatic Point Of Contact at originator
315      */
316     public void setOriginatorPosition(final String originatorPosition) {
317         refuseFurtherComments();
318         this.originatorPosition = originatorPosition;
319     }
320 
321     /** Get the phone number of Programmatic Point Of Contact at originator.
322      * @return phone number of Programmatic Point Of Contact at originator
323      */
324     public String getOriginatorPhone() {
325         return originatorPhone;
326     }
327 
328     /** Set the phone number of Programmatic Point Of Contact at originator.
329      * @param originatorPhone phone number of Programmatic Point Of Contact at originator
330      */
331     public void setOriginatorPhone(final String originatorPhone) {
332         refuseFurtherComments();
333         this.originatorPhone = originatorPhone;
334     }
335 
336     /** Get the email address of Programmatic Point Of Contact at originator.
337      * @return email address of Programmatic Point Of Contact at originator
338      * @since 11.2
339      */
340     public String getOriginatorEmail() {
341         return originatorEmail;
342     }
343 
344     /** Set the email address of Programmatic Point Of Contact at originator.
345      * @param originatorEmail email address of Programmatic Point Of Contact at originator
346      * @since 11.2
347      */
348     public void setOriginatorEmail(final String originatorEmail) {
349         refuseFurtherComments();
350         this.originatorEmail = originatorEmail;
351     }
352 
353     /** Get the address of Programmatic Point Of Contact at originator.
354      * @return address of Programmatic Point Of Contact at originator
355      */
356     public String getOriginatorAddress() {
357         return originatorAddress;
358     }
359 
360     /** Set the address of Programmatic Point Of Contact at originator.
361      * @param originatorAddress address of Programmatic Point Of Contact at originator
362      */
363     public void setOriginatorAddress(final String originatorAddress) {
364         refuseFurtherComments();
365         this.originatorAddress = originatorAddress;
366     }
367 
368     /** Get the creating agency or operator.
369      * @return creating agency or operator
370      */
371     public String getTechOrg() {
372         return techOrg;
373     }
374 
375     /** Set the creating agency or operator.
376      * @param techOrg creating agency or operator
377      */
378     public void setTechOrg(final String techOrg) {
379         refuseFurtherComments();
380         this.techOrg = techOrg;
381     }
382 
383     /** Get the Technical Point Of Contact at originator.
384      * @return Technical Point Of Contact at originator
385      */
386     public String getTechPOC() {
387         return techPOC;
388     }
389 
390     /** Set the Technical Point Of Contact at originator.
391      * @param techPOC Technical Point Of Contact at originator
392      */
393     public void setTechPOC(final String techPOC) {
394         refuseFurtherComments();
395         this.techPOC = techPOC;
396     }
397 
398     /** Get the position of Technical Point Of Contact at originator.
399      * @return position of Technical Point Of Contact at originator
400      */
401     public String getTechPosition() {
402         return techPosition;
403     }
404 
405     /** Set the position of Technical Point Of Contact at originator.
406      * @param techPosition position of Technical Point Of Contact at originator
407      */
408     public void setTechPosition(final String techPosition) {
409         refuseFurtherComments();
410         this.techPosition = techPosition;
411     }
412 
413     /** Get the phone number of Technical Point Of Contact at originator.
414      * @return phone number of Technical Point Of Contact at originator
415      */
416     public String getTechPhone() {
417         return techPhone;
418     }
419 
420     /** Set the phone number of Technical Point Of Contact at originator.
421      * @param techPhone phone number of Technical Point Of Contact at originator
422      */
423     public void setTechPhone(final String techPhone) {
424         refuseFurtherComments();
425         this.techPhone = techPhone;
426     }
427 
428     /** Get the email address of Technical Point Of Contact at originator.
429      * @return email address of Technical Point Of Contact at originator
430      * @since 11.2
431      */
432     public String getTechEmail() {
433         return techEmail;
434     }
435 
436     /** Set the email address of Technical Point Of Contact at originator.
437      * @param techEmail email address of Technical Point Of Contact at originator
438      * @since 11.2
439      */
440     public void setTechEmail(final String techEmail) {
441         refuseFurtherComments();
442         this.techEmail = techEmail;
443     }
444 
445     /** Get the address of Technical Point Of Contact at originator.
446      * @return address of Technical Point Of Contact at originator
447      */
448     public String getTechAddress() {
449         return techAddress;
450     }
451 
452     /** Set the address of Technical Point Of Contact at originator.
453      * @param techAddress address of Technical Point Of Contact at originator
454      */
455     public void setTechAddress(final String techAddress) {
456         refuseFurtherComments();
457         this.techAddress = techAddress;
458     }
459 
460     /** Get the unique ID identifying previous message from a given originator.
461      * @return unique ID identifying previous message from a given originator
462      */
463     public String getPreviousMessageID() {
464         return previousMessageID;
465     }
466 
467     /** Set the unique ID identifying previous message from a given originator.
468      * @param previousMessageID unique ID identifying previous message from a given originator
469      */
470     public void setPreviousMessageID(final String previousMessageID) {
471         refuseFurtherComments();
472         this.previousMessageID = previousMessageID;
473     }
474 
475     /** Get the unique ID identifying next message from a given originator.
476      * @return unique ID identifying next message from a given originator
477      */
478     public String getNextMessageID() {
479         return nextMessageID;
480     }
481 
482     /** Set the unique ID identifying next message from a given originator.
483      * @param nextMessageID unique ID identifying next message from a given originator
484      */
485     public void setNextMessageID(final String nextMessageID) {
486         refuseFurtherComments();
487         this.nextMessageID = nextMessageID;
488     }
489 
490     /** Get the Unique identifier of Attitude Data Message linked to this Orbit Data Message.
491      * @return Unique identifier of Attitude Data Message linked to this Orbit Data Message
492      */
493     public String getAdmMessageLink() {
494         return admMessageLink;
495     }
496 
497     /** Set the Unique identifier of Attitude Data Message linked to this Orbit Data Message.
498      * @param admMessageLink Unique identifier of Attitude Data Message linked to this Orbit Data Message
499      */
500     public void setAdmMessageLink(final String admMessageLink) {
501         refuseFurtherComments();
502         this.admMessageLink = admMessageLink;
503     }
504 
505     /** Get the Unique identifier of Conjunction Data Message linked to this Orbit Data Message.
506      * @return Unique identifier of Conjunction Data Message linked to this Orbit Data Message
507      */
508     public String getCdmMessageLink() {
509         return cdmMessageLink;
510     }
511 
512     /** Set the Unique identifier of Conjunction Data Message linked to this Orbit Data Message.
513      * @param cdmMessageLink Unique identifier of Conjunction Data Message linked to this Orbit Data Message
514      */
515     public void setCdmMessageLink(final String cdmMessageLink) {
516         refuseFurtherComments();
517         this.cdmMessageLink = cdmMessageLink;
518     }
519 
520     /** Get the Unique identifier of Pointing Request Message linked to this Orbit Data Message.
521      * @return Unique identifier of Pointing Request Message linked to this Orbit Data Message
522      */
523     public String getPrmMessageLink() {
524         return prmMessageLink;
525     }
526 
527     /** Set the Unique identifier of Pointing Request Message linked to this Orbit Data Message.
528      * @param prmMessageLink Unique identifier of Pointing Request Message linked to this Orbit Data Message
529      */
530     public void setPrmMessageLink(final String prmMessageLink) {
531         refuseFurtherComments();
532         this.prmMessageLink = prmMessageLink;
533     }
534 
535     /** Get the Unique identifier of Reentry Data Message linked to this Orbit Data Message.
536      * @return Unique identifier of Reentry Data Message linked to this Orbit Data Message
537      */
538     public String getRdmMessageLink() {
539         return rdmMessageLink;
540     }
541 
542     /** Set the Unique identifier of Reentry Data Message linked to this Orbit Data Message.
543      * @param rdmMessageLink Unique identifier of Reentry Data Message linked to this Orbit Data Message
544      */
545     public void setRdmMessageLink(final String rdmMessageLink) {
546         refuseFurtherComments();
547         this.rdmMessageLink = rdmMessageLink;
548     }
549 
550     /** Get the Unique identifier of Tracking Data Message linked to this Orbit Data Message.
551      * @return Unique identifier of Tracking Data Message linked to this Orbit Data Message
552      */
553     public String getTdmMessageLink() {
554         return tdmMessageLink;
555     }
556 
557     /** Set the Unique identifier of Tracking Data Message linked to this Orbit Data Message.
558      * @param tdmMessageLink Unique identifier of Tracking Data Message linked to this Orbit Data Message
559      */
560     public void setTdmMessageLink(final String tdmMessageLink) {
561         refuseFurtherComments();
562         this.tdmMessageLink = tdmMessageLink;
563     }
564 
565     /** Get the operator of the space object.
566      * @return operator of the space object
567      */
568     public String getOperator() {
569         return operator;
570     }
571 
572     /** Set the operator of the space object.
573      * @param operator operator of the space object
574      */
575     public void setOperator(final String operator) {
576         refuseFurtherComments();
577         this.operator = operator;
578     }
579 
580     /** Get the owner of the space object.
581      * @return owner of the space object
582      */
583     public String getOwner() {
584         return owner;
585     }
586 
587     /** Set the owner of the space object.
588      * @param owner owner of the space object
589      */
590     public void setOwner(final String owner) {
591         refuseFurtherComments();
592         this.owner = owner;
593     }
594 
595     /** Get the name of the country where the space object owner is based.
596      * @return name of the country where the space object owner is based
597      */
598     public String getCountry() {
599         return country;
600     }
601 
602     /** Set the name of the country where the space object owner is based.
603      * @param country name of the country where the space object owner is based
604      */
605     public void setCountry(final String country) {
606         refuseFurtherComments();
607         this.country = country;
608     }
609 
610     /** Get the name of the constellation this space object belongs to.
611      * @return name of the constellation this space object belongs to
612      */
613     public String getConstellation() {
614         return constellation;
615     }
616 
617     /** Set the name of the constellation this space object belongs to.
618      * @param constellation name of the constellation this space object belongs to
619      */
620     public void setConstellation(final String constellation) {
621         refuseFurtherComments();
622         this.constellation = constellation;
623     }
624 
625     /** Get the type of object.
626      * @return type of object
627      */
628     public ObjectType getObjectType() {
629         return objectType;
630     }
631 
632     /** Set the type of object.
633      * @param objectType type of object
634      */
635     public void setObjectType(final ObjectType objectType) {
636         refuseFurtherComments();
637         this.objectType = objectType;
638     }
639 
640     /** Get the epoch to which <em>all</em> relative times are referenced in data blocks.
641      * @return epoch to which <em>all</em> relative times are referenced in data blocks
642      */
643     public AbsoluteDate getEpochT0() {
644         return epochT0;
645     }
646 
647     /** Set the epoch to which <em>all</em> relative times are referenced in data blocks.
648      * @param epochT0 epoch to which <em>all</em> relative times are referenced in data blocks
649      */
650     public void setEpochT0(final AbsoluteDate epochT0) {
651         refuseFurtherComments();
652         this.epochT0 = epochT0;
653     }
654 
655     /** Get the operational status.
656      * @return operational status
657      */
658     public OpsStatus getOpsStatus() {
659         return opsStatus;
660     }
661 
662     /** Set the operational status.
663      * @param opsStatus operational status
664      */
665     public void setOpsStatus(final OpsStatus opsStatus) {
666         refuseFurtherComments();
667         this.opsStatus = opsStatus;
668     }
669 
670     /** Get the orbit category.
671      * @return orbit category
672      */
673     public OrbitCategory getOrbitCategory() {
674         return orbitCategory;
675     }
676 
677     /** Set the orbit category.
678      * @param orbitCategory orbit category
679      */
680     public void setOrbitCategory(final OrbitCategory orbitCategory) {
681         refuseFurtherComments();
682         this.orbitCategory = orbitCategory;
683     }
684 
685     /** Get the list of elements of information data blocks included in this message.
686      * @return list of elements of information data blocks included in this message
687      */
688     public List<OcmElements> getOcmDataElements() {
689         return ocmDataElements;
690     }
691 
692     /** Set the list of elements of information data blocks included in this message.
693      * @param ocmDataElements list of elements of information data blocks included in this message
694      */
695     public void setOcmDataElements(final List<OcmElements> ocmDataElements) {
696         refuseFurtherComments();
697         this.ocmDataElements = ocmDataElements;
698     }
699 
700     /** Get the spacecraft clock count at {@link #getEpochT0()}.
701      * @return spacecraft clock count at {@link #getEpochT0()}
702      */
703     public double getSclkOffsetAtEpoch() {
704         return sclkOffsetAtEpoch;
705     }
706 
707     /** Set the spacecraft clock count at {@link #getEpochT0()}.
708      * @param sclkOffsetAtEpoch spacecraft clock count at {@link #getEpochT0()}
709      */
710     public void setSclkOffsetAtEpoch(final double sclkOffsetAtEpoch) {
711         refuseFurtherComments();
712         this.sclkOffsetAtEpoch = sclkOffsetAtEpoch;
713     }
714 
715     /** Get the number of spacecraft clock seconds occurring during one SI second.
716      * @return number of spacecraft clock seconds occurring during one SI second
717      */
718     public double getSclkSecPerSISec() {
719         return sclkSecPerSISec;
720     }
721 
722     /** Set the number of spacecraft clock seconds occurring during one SI second.
723      * @param secClockPerSISec number of spacecraft clock seconds occurring during one SI second
724      */
725     public void setSclkSecPerSISec(final double secClockPerSISec) {
726         refuseFurtherComments();
727         this.sclkSecPerSISec = secClockPerSISec;
728     }
729 
730     /** Get the creation date of previous message from a given originator.
731      * @return creation date of previous message from a given originator
732      */
733     public AbsoluteDate getPreviousMessageEpoch() {
734         return previousMessageEpoch;
735     }
736 
737     /** Set the creation date of previous message from a given originator.
738      * @param previousMessageEpoch creation date of previous message from a given originator
739      */
740     public void setPreviousMessageEpoch(final AbsoluteDate previousMessageEpoch) {
741         refuseFurtherComments();
742         this.previousMessageEpoch = previousMessageEpoch;
743     }
744 
745     /** Get the creation date of next message from a given originator.
746      * @return creation date of next message from a given originator
747      */
748     public AbsoluteDate getNextMessageEpoch() {
749         return nextMessageEpoch;
750     }
751 
752     /** Set the creation date of next message from a given originator.
753      * @param nextMessageEpoch creation date of next message from a given originator
754      */
755     public void setNextMessageEpoch(final AbsoluteDate nextMessageEpoch) {
756         refuseFurtherComments();
757         this.nextMessageEpoch = nextMessageEpoch;
758     }
759 
760     /** Get the time of the earliest data contained in the OCM.
761      * @return time of the earliest data contained in the OCM
762      */
763     public AbsoluteDate getStartTime() {
764         return startTime;
765     }
766 
767     /** Set the time of the earliest data contained in the OCM.
768      * @param startTime time of the earliest data contained in the OCM
769      */
770     public void setStartTime(final AbsoluteDate startTime) {
771         refuseFurtherComments();
772         this.startTime = startTime;
773     }
774 
775     /** Get the time of the latest data contained in the OCM.
776      * @return time of the latest data contained in the OCM
777      */
778     public AbsoluteDate getStopTime() {
779         return stopTime;
780     }
781 
782     /** Set the time of the latest data contained in the OCM.
783      * @param stopTime time of the latest data contained in the OCM
784      */
785     public void setStopTime(final AbsoluteDate stopTime) {
786         refuseFurtherComments();
787         this.stopTime = stopTime;
788     }
789 
790     /** Get the span of time in seconds that the OCM covers.
791      * @return span of time in seconds that the OCM covers
792      */
793     public double getTimeSpan() {
794         return timeSpan;
795     }
796 
797     /** Set the span of time in seconds that the OCM covers.
798      * @param timeSpan span of time in seconds that the OCM covers
799      */
800     public void setTimeSpan(final double timeSpan) {
801         refuseFurtherComments();
802         this.timeSpan = timeSpan;
803     }
804 
805     /** Get the difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()}.
806      * @return difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()}
807      */
808     public double getTaimutcT0() {
809         return taimutcT0;
810     }
811 
812     /** Set the difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()}.
813      * @param taimutcT0 difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()}
814      */
815     public void setTaimutcT0(final double taimutcT0) {
816         refuseFurtherComments();
817         this.taimutcT0 = taimutcT0;
818     }
819 
820     /** Get the epoch of next leap second.
821      * @return epoch of next leap second
822      * @since 11.2
823      */
824     public AbsoluteDate getNextLeapEpoch() {
825         return nextLeapEpoch;
826     }
827 
828     /** Set the epoch of next leap second.
829      * @param nextLeapEpoch epoch of next leap second
830      * @since 11.2
831      */
832     public void setNextLeapEpoch(final AbsoluteDate nextLeapEpoch) {
833         refuseFurtherComments();
834         this.nextLeapEpoch = nextLeapEpoch;
835     }
836 
837     /** Get the difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()}.
838      * @return difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()}
839      * @since 11.2
840      */
841     public double getNextLeapTaimutc() {
842         return nextLeapTaimutc;
843     }
844 
845     /** Set the difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()}.
846      * @param nextLeapTaimutc difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()}
847      * @since 11.2
848      */
849     public void setNextLeapTaimutc(final double nextLeapTaimutc) {
850         refuseFurtherComments();
851         this.nextLeapTaimutc = nextLeapTaimutc;
852     }
853 
854     /** Get the difference (UT1 – UTC) in seconds at epoch {@link #getEpochT0()}.
855      * @return difference (UT1 – UTC) in seconds at epoch {@link #getEpochT0()}
856      */
857     public double getUt1mutcT0() {
858         return ut1mutcT0;
859     }
860 
861     /** Set the difference (UT1 – UTC) in seconds at epoch {@link #getEpochT0()}.
862      * @param ut1mutcT0 difference (UT1 – UTC) in seconds at epoch {@link #getEpochT0()}
863      */
864     public void setUt1mutcT0(final double ut1mutcT0) {
865         refuseFurtherComments();
866         this.ut1mutcT0 = ut1mutcT0;
867     }
868 
869     /** Get the source and version of Earth Orientation Parameters.
870      * @return source and version of Earth Orientation Parameters
871      */
872     public String getEopSource() {
873         return eopSource;
874     }
875 
876     /** Set the source and version of Earth Orientation Parameters.
877      * @param eopSource source and version of Earth Orientation Parameters
878      */
879     public void setEopSource(final String eopSource) {
880         refuseFurtherComments();
881         this.eopSource = eopSource;
882     }
883 
884     /** Get the interpolation method for Earth Orientation Parameters.
885      * @return interpolation method for Earth Orientation Parameters
886      */
887     public String getInterpMethodEOP() {
888         return interpMethodEOP;
889     }
890 
891     /** Set the interpolation method for Earth Orientation Parameters.
892      * @param interpMethodEOP interpolation method for Earth Orientation Parameters
893      */
894     public void setInterpMethodEOP(final String interpMethodEOP) {
895         refuseFurtherComments();
896         this.interpMethodEOP = interpMethodEOP;
897     }
898 
899     /** Get the source and version of celestial body (e.g. Sun/Earth/Planetary).
900      * @return source and version of celestial body (e.g. Sun/Earth/Planetary)
901      */
902     public String getCelestialSource() {
903         return celestialSource;
904     }
905 
906     /** Set the source and version of celestial body (e.g. Sun/Earth/Planetary).
907      * @param celestialSource source and version of celestial body (e.g. Sun/Earth/Planetary)
908      */
909     public void setCelestialSource(final String celestialSource) {
910         refuseFurtherComments();
911         this.celestialSource = celestialSource;
912     }
913 
914     /** Copy the instance, making sure mandatory fields have been initialized.
915      * <p>
916      * Message ID, previous/next references, start and stop times are not copied.
917      * </p>
918      * @param version format version
919      * @return a new copy
920      * @since 12.0
921      */
922     public OcmMetadata copy(final double version) {
923 
924         validate(version);
925 
926         // allocate new instance
927         final OcmMetadata copy = new OcmMetadata(dataContext, getFrameMapper());
928 
929         // copy comments
930         for (String comment : getComments()) {
931             copy.addComment(comment);
932         }
933 
934         // copy metadata
935         copy.setInternationalDesignator(getInternationalDesignator());
936         copy.setCatalogName(getCatalogName());
937         copy.setObjectDesignator(getObjectDesignator());
938         copy.setAlternateNames(getAlternateNames());
939         copy.setOriginatorPOC(getOriginatorPOC());
940         copy.setOriginatorPosition(getOriginatorPosition());
941         copy.setOriginatorPhone(getOriginatorPhone());
942         copy.setOriginatorEmail(getOriginatorEmail());
943         copy.setOriginatorAddress(getOriginatorAddress());
944         copy.setTechOrg(getTechOrg());
945         copy.setTechPOC(getTechPOC());
946         copy.setTechPosition(getTechPosition());
947         copy.setTechPhone(getTechPhone());
948         copy.setTechEmail(getTechEmail());
949         copy.setTechAddress(getTechAddress());
950         copy.setAdmMessageLink(getAdmMessageLink());
951         copy.setCdmMessageLink(getCdmMessageLink());
952         copy.setPrmMessageLink(getPrmMessageLink());
953         copy.setRdmMessageLink(getRdmMessageLink());
954         copy.setTdmMessageLink(getTdmMessageLink());
955         copy.setOperator(getOperator());
956         copy.setOwner(getOwner());
957         copy.setCountry(getCountry());
958         copy.setConstellation(getConstellation());
959         copy.setObjectType(getObjectType());
960         copy.setEpochT0(getEpochT0());
961         copy.setOpsStatus(getOpsStatus());
962         copy.setOrbitCategory(getOrbitCategory());
963         copy.setOcmDataElements(getOcmDataElements());
964         copy.setSclkOffsetAtEpoch(getSclkOffsetAtEpoch());
965         copy.setSclkSecPerSISec(getSclkSecPerSISec());
966         copy.setTaimutcT0(getTaimutcT0());
967         copy.setNextLeapEpoch(getNextLeapEpoch());
968         copy.setNextLeapTaimutc(getNextLeapTaimutc());
969         copy.setUt1mutcT0(getUt1mutcT0());
970         copy.setEopSource(getEopSource());
971         copy.setInterpMethodEOP(getInterpMethodEOP());
972         copy.setCelestialSource(getCelestialSource());
973 
974         return copy;
975 
976     }
977 
978 }