1   /* Copyright 2002-2025 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  
19  import java.io.IOException;
20  import java.util.ArrayList;
21  import java.util.List;
22  
23  import org.orekit.files.ccsds.definitions.BodyFacade;
24  import org.orekit.files.ccsds.section.AbstractWriter;
25  import org.orekit.files.ccsds.section.XmlStructureKey;
26  import org.orekit.files.ccsds.utils.generation.Generator;
27  
28  /**
29   * Writer for Metadata for CCSDS Conjunction Data Messages.
30   *
31   * @author Melina Vanel
32   * @since 11.2
33   */
34  public class CdmMetadataWriter extends AbstractWriter {
35  
36      /** Metadata. */
37      private final CdmMetadata metadata;
38  
39      /** Simple constructor.
40       * @param metadata metadata to write
41       */
42      public CdmMetadataWriter(final CdmMetadata metadata) {
43          super(XmlStructureKey.metadata.name(), null);
44          this.metadata      = metadata;
45      }
46  
47      /** {@inheritDoc} */
48      @Override
49      protected void writeContent(final Generator generator) throws IOException {
50  
51          generator.writeComments(metadata.getComments());
52  
53          // object
54          generator.writeEntry(CdmMetadataKey.OBJECT.name(),
55                               metadata.getObject(), null, true);
56          generator.writeEntry(CdmMetadataKey.OBJECT_DESIGNATOR.name(),
57                               metadata.getObjectDesignator(), null, true);
58          generator.writeEntry(CdmMetadataKey.CATALOG_NAME.name(),
59                               metadata.getCatalogName(), null, true);
60          generator.writeEntry(CdmMetadataKey.OBJECT_NAME.name(),
61                               metadata.getObjectName(), null, true);
62          generator.writeEntry(CdmMetadataKey.INTERNATIONAL_DESIGNATOR.name(),
63                               metadata.getInternationalDes(), null, true);
64          generator.writeEntry(CdmMetadataKey.OBJECT_TYPE.name(),
65                               metadata.getObjectType(), false);
66  
67          // originator
68          generator.writeEntry(CdmMetadataKey.OPERATOR_CONTACT_POSITION.name(),
69                               metadata.getOperatorContactPosition(), null, false);
70          generator.writeEntry(CdmMetadataKey.OPERATOR_ORGANIZATION.name(),
71                               metadata.getOperatorOrganization(), null, false);
72          generator.writeEntry(CdmMetadataKey.OPERATOR_PHONE.name(),
73                               metadata.getOperatorPhone(), null, false);
74          generator.writeEntry(CdmMetadataKey.OPERATOR_EMAIL.name(),
75                               metadata.getOperatorEmail(), null, false);
76  
77          // other information
78          generator.writeEntry(CdmMetadataKey.EPHEMERIS_NAME.name(),
79                               metadata.getEphemName(), null, true);
80          generator.writeEntry(CdmMetadataKey.COVARIANCE_METHOD.name(),
81                               metadata.getCovarianceMethod(), true);
82          generator.writeEntry(CdmMetadataKey.MANEUVERABLE.name(),
83                               metadata.getManeuverable().getValue(), null, true);
84          if (metadata.getOrbitCenter() != null) {
85              generator.writeEntry(CdmMetadataKey.ORBIT_CENTER.name(),
86                                   metadata.getOrbitCenter().getName(), null, false);
87          }
88          generator.writeEntry(CdmMetadataKey.REF_FRAME.name(),
89                               metadata.getRefFrame().getName(), null, true);
90          // gravity
91          if (metadata.getGravityModel() != null) {
92              final String model =
93                              new StringBuilder().
94                              append(metadata.getGravityModel()).
95                              append(": ").
96                              append(metadata.getGravityDegree()).
97                              append("D ").
98                              append(metadata.getGravityOrder()).
99                              append('O').
100                             toString();
101             generator.writeEntry(CdmMetadataKey.GRAVITY_MODEL.name(), model, null, false);
102         }
103 
104         // atmosphere
105         generator.writeEntry(CdmMetadataKey.ATMOSPHERIC_MODEL.name(), metadata.getAtmosphericModel(), null, false);
106 
107         // N body perturbation
108         if (metadata.getNBodyPerturbations() != null && !metadata.getNBodyPerturbations().isEmpty()) {
109             final List<String> names = new ArrayList<>();
110             for (BodyFacade bf : metadata.getNBodyPerturbations()) {
111                 names.add(bf.getName());
112             }
113             generator.writeEntry(CdmMetadataKey.N_BODY_PERTURBATIONS.name(), names, false);
114         }
115 
116         if (metadata.getSolarRadiationPressure() != null) {
117             generator.writeEntry(CdmMetadataKey.SOLAR_RAD_PRESSURE.name(), metadata.getSolarRadiationPressure().name(),
118                             null, false);
119         }
120         if (metadata.getEarthTides() != null) {
121             generator.writeEntry(CdmMetadataKey.EARTH_TIDES.name(), metadata.getEarthTides().name(),
122                             null, false);
123         }
124         if (metadata.getIntrackThrust() != null) {
125             generator.writeEntry(CdmMetadataKey.INTRACK_THRUST.name(), metadata.getIntrackThrust().name(),
126                             null, false);
127         }
128 
129     }
130 
131 }
132