Yes the tags seems to be missing.
This is strange because there are explicit methods to handle them (see OemWriter line 516).
Could you check in a debugger in your case if these methods are called or not? The expected call sequence is writer.write() →writeSegment() → writeSegmentContent() → startData() and endData()
I agree with Luc, that’s very strange because the write(...) method of the EphemerisWriter seems to perform the same steps as the writeMessage(...) method of the OemWriter.
Please find below a workaround that works:
// Format
final FileFormat format = FileFormat.XML;
// Header
final Header header = new Header(3);
// Metadata
final OemMetadata template = new OemMetadata(8);
template.setTimeSystem(TimeSystem.UTC);
template.setObjectID("M2B");
template.setObjectName("M2B");
template.setCenter(new BodyFacade("EARTH", CelestialBodyFactory.getCelestialBodies().getEarth()));
template.setReferenceFrame(FrameFacade.map(FramesFactory.getGCRF()));
template.setStartTime(states.get(0).getDate());
template.setStopTime(states.get(states.size() - 1).getDate());
// Data
final OemData data = new OemData();
// Loops over collected states
for (SpacecraftState state : states) {
// Adds the state vector
data.addData(state.getPVCoordinates(), true);
}
// Segment
final List<OemSegment> segments = new ArrayList<>();
segments.add(new OemSegment(template, data, states.get(0).getMu()));
// Oem
final Oem oem = new Oem(header, segments, IERSConventions.IERS_2010, DataContext.getDefault(), states.get(0).getMu());
// Write
final OemWriter oemWriter = new WriterBuilder().buildOemWriter();
try (BufferedWriter writer =
Files.newBufferedWriter(Paths.get("output.oem"), StandardCharsets.UTF_8);
final Generator generator = format == FileFormat.KVN ?
new KvnGenerator(writer, OemWriter.KVN_PADDING_WIDTH, "output.oem", 0) :
new XmlGenerator(writer, XmlGenerator.DEFAULT_INDENT, "output.oem", false)) {
oemWriter.writeMessage(generator, oem);
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
// Read the file
OemParser parser = new ParserBuilder().buildOemParser();
Oem oemParsed = parser.parse(new DataSource("output.oem"));
I haven’t used a debugger to trace java code before, so it’s very possible I’ve done something wrong …
From writer (which is an EphemerisWriter) the call path is just writer.write() → writer.writeSegment() → writer.writeOrbitEphemerisLine()
There isn’t any call to writeSegmentContent()? writeSegment() is in EphemerisWriter and writeOrbitEphemerisLine() is in OemWriter.