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.utils.generation; 18 19 import java.io.IOException; 20 import java.util.List; 21 22 import org.orekit.files.ccsds.definitions.TimeConverter; 23 import org.orekit.files.ccsds.utils.FileFormat; 24 import org.orekit.time.AbsoluteDate; 25 import org.orekit.utils.Formatter; 26 import org.orekit.utils.units.Unit; 27 28 /** Generation interface for CCSDS messages. 29 * @author Luc Maisonobe 30 * @since 11.0 31 */ 32 public interface Generator extends AutoCloseable { 33 34 /** Get the name of the output (for error messages). 35 * @return name of the output 36 */ 37 String getOutputName(); 38 39 /** Get the generated file format. 40 * @return generated file format 41 */ 42 FileFormat getFormat(); 43 44 /** 45 * Used to format dates and doubles to string. 46 * @return formatter 47 */ 48 Formatter getFormatter(); 49 50 /** Start CCSDS message. 51 * @param messageTypeKey key for message type 52 * @param root root element for XML files 53 * @param version format version 54 * @throws IOException if an I/O error occurs. 55 */ 56 void startMessage(String root, String messageTypeKey, double version) throws IOException; 57 58 /** End CCSDS message. 59 * @param root root element for XML files 60 * @throws IOException if an I/O error occurs. 61 */ 62 void endMessage(String root) throws IOException; 63 64 /** Write comment lines. 65 * @param comments comments to write 66 * @throws IOException if an I/O error occurs. 67 */ 68 void writeComments(List<String> comments) throws IOException; 69 70 /** Write a single key/value entry. 71 * @param key the keyword to write 72 * @param value the value to write 73 * @param unit output unit (may be null) 74 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 75 * @throws IOException if an I/O error occurs. 76 */ 77 void writeEntry(String key, String value, Unit unit, boolean mandatory) throws IOException; 78 79 /** Write a single key/value entry. 80 * @param key the keyword to write 81 * @param value the value to write 82 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 83 * @throws IOException if an I/O error occurs. 84 */ 85 void writeEntry(String key, List<String> value, boolean mandatory) throws IOException; 86 87 /** Write a single key/value entry. 88 * @param key the keyword to write 89 * @param value the value to write 90 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 91 * @throws IOException if an I/O error occurs. 92 */ 93 void writeEntry(String key, Enum<?> value, boolean mandatory) throws IOException; 94 95 /** Write a single key/value entry. 96 * @param key the keyword to write 97 * @param converter converter to use for dates 98 * @param date the date to write 99 * @param forceCalendar if true, the date is forced to calendar format 100 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 101 * @throws IOException if an I/O error occurs. 102 */ 103 void writeEntry(String key, TimeConverter converter, AbsoluteDate date, boolean forceCalendar, boolean mandatory) throws IOException; 104 105 /** Write a single key/value entry. 106 * @param key the keyword to write 107 * @param value the value to write 108 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 109 * @throws IOException if an I/O error occurs. 110 */ 111 void writeEntry(String key, char value, boolean mandatory) throws IOException; 112 113 /** 114 * Write a single key/value entry. 115 * 116 * <p>Note that the {@code mandatory} flag has no effect and a value is always written 117 * because the whole domain of {@code value} is treated as valid. Use {@link 118 * #writeEntry(String, Integer, boolean)} for integer values that may not be present. 119 * 120 * @param key the keyword to write 121 * @param value the value to write 122 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored. 123 * @throws IOException if an I/O error occurs. 124 * @see #writeEntry(String, Integer, boolean) 125 */ 126 void writeEntry(String key, int value, boolean mandatory) throws IOException; 127 128 /** Write a single key/value entry. 129 * @param key the keyword to write 130 * @param value the value to write 131 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 132 * @throws IOException if an I/O error occurs. 133 */ 134 default void writeEntry(String key, Integer value, boolean mandatory) throws IOException { 135 writeEntry(key, value == null ? null : value.toString(), null, mandatory); 136 } 137 138 /** Write a single key/value entry. 139 * @param key the keyword to write 140 * @param value the value to write (in SI units) 141 * @param unit output unit 142 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 143 * @throws IOException if an I/O error occurs. 144 */ 145 void writeEntry(String key, double value, Unit unit, boolean mandatory) throws IOException; 146 147 /** Write a single key/value entry. 148 * @param key the keyword to write 149 * @param value the value to write (in SI units) 150 * @param unit output unit 151 * @param mandatory if true, null values triggers exception, otherwise they are silently ignored 152 * @throws IOException if an I/O error occurs. 153 */ 154 void writeEntry(String key, Double value, Unit unit, boolean mandatory) throws IOException; 155 156 /** Finish current line. 157 * @throws IOException if an I/O error occurs. 158 */ 159 void newLine() throws IOException; 160 161 /** Write raw data. 162 * @param data raw data to write 163 * @throws IOException if an I/O error occurs. 164 */ 165 void writeRawData(char data) throws IOException; 166 167 /** Write raw data. 168 * @param data raw data to write 169 * @throws IOException if an I/O error occurs. 170 */ 171 void writeRawData(CharSequence data) throws IOException; 172 173 /** Enter into a new section. 174 * @param name section name 175 * @throws IOException if an I/O error occurs. 176 */ 177 void enterSection(String name) throws IOException; 178 179 /** Exit last section. 180 * @return section name 181 * @throws IOException if an I/O error occurs. 182 */ 183 String exitSection() throws IOException; 184 185 /** Close the generator. 186 * @throws IOException if an I/O error occurs. 187 */ 188 void close() throws IOException; 189 190 /** Convert a date to string value with high precision. 191 * @param converter converter for dates 192 * @param date date to write 193 * @return date as a string (may be either a relative date or a calendar date) 194 */ 195 String dateToString(TimeConverter converter, AbsoluteDate date); 196 197 /** Convert a date to calendar string value with high precision. 198 * @param converter converter for dates 199 * @param date date to write 200 * @return date as a calendar string 201 * @since 12.0 202 */ 203 String dateToCalendarString(TimeConverter converter, AbsoluteDate date); 204 205 /** Convert a date to string value with high precision. 206 * @param year year 207 * @param month month 208 * @param day day 209 * @param hour hour 210 * @param minute minute 211 * @param seconds seconds 212 * @return date as a string 213 */ 214 String dateToString(int year, int month, int day, int hour, int minute, double seconds); 215 216 /** Convert a double to string value with high precision. 217 * <p> 218 * We don't want to loose internal accuracy when writing doubles 219 * but we also don't want to have ugly representations like STEP = 1.25000000000000000 220 * so we try a few simple formats first and fall back to scientific notation 221 * if it doesn't work. 222 * </p> 223 * @param value value to format 224 * @return formatted value, with all original value accuracy preserved, or null 225 * if value is null or {@code Double.NaN} 226 */ 227 String doubleToString(double value); 228 229 /** Convert a list of units to a bracketed string. 230 * @param units lists to output (may be null or empty) 231 * @return bracketed string (null if units list is null or empty) 232 */ 233 String unitsListToString(List<Unit> units); 234 235 /** Convert a SI unit name to a CCSDS name. 236 * @param siName si unit name 237 * @return CCSDS name for the unit 238 */ 239 String siToCcsdsName(String siName); 240 241 }