Allow for configurable entry tag name

This commit is contained in:
SiboVG 2024-07-21 23:58:54 +02:00
parent 47af6fbb9f
commit 144efb5610

View File

@ -357,7 +357,7 @@ public class OpenRocketSaver extends RocketSaver {
if (config != null) {
for (String key : config.keySet()) {
Object value = config.get(key, null);
writeEntry(key, value);
writeEntry("entry", key, value, false);
}
}
indent--;
@ -427,38 +427,60 @@ public class OpenRocketSaver extends RocketSaver {
indent--;
writeln("</photostudio>");
}
private void writeEntry(String key, Object value) throws IOException {
/**
* Write an entry element, which has a key and type attribute, and a value, to the output.
* For example: <entry key="key" type="string">value</entry>
* @param tagName The tag name (e.g. 'entry')
* @param key The key attribute value
* @param value The value to store
* @param saveNumbersWithExplicitType If true, numbers will be stored with an explicit type attribute ('integer' or 'double'),
* if false, save simply as 'number'
* @throws IOException
*/
private void writeEntry(String tagName, String key, Object value, boolean saveNumbersWithExplicitType) throws IOException {
if (value == null) {
return;
}
String keyAttr;
if (key != null) {
keyAttr = "key=\"" + key + "\" ";
} else {
keyAttr = "";
}
final String openTag = "<" + tagName + " ";
final String closeTag = "</" + tagName + ">";
if (value instanceof Boolean) {
writeln("<entry " + keyAttr + "type=\"boolean\">" + value + "</entry>");
writeln(openTag + keyAttr + "type=\"boolean\">" + value + closeTag);
} else if (value instanceof Number) {
writeln("<entry " + keyAttr + "type=\"number\">" + value + "</entry>");
if (saveNumbersWithExplicitType) {
if (value instanceof Integer) {
writeln(openTag + keyAttr + "type=\"integer\">" + value + closeTag);
} else if (value instanceof Double) {
writeln(openTag + keyAttr + "type=\"double\">" + value + closeTag);
} else {
writeln(openTag + keyAttr + "type=\"number\">" + value + closeTag);
}
} else {
writeln(openTag + keyAttr + "type=\"number\">" + value + closeTag);
}
} else if (value instanceof String) {
writeln("<entry " + keyAttr + "type=\"string\">" + TextUtil.escapeXML((String) value) + "</entry>");
} else if (value instanceof List) {
List<?> list = (List<?>) value;
writeln("<entry " + keyAttr + "type=\"list\">");
writeln(openTag + keyAttr + "type=\"string\">" + TextUtil.escapeXML(value) + closeTag);
} else if (value instanceof List<?> list) {
// Nested element
writeln(openTag + keyAttr + "type=\"list\">");
indent++;
for (Object o : list) {
writeEntry(null, o);
writeEntry(tagName, null, o, saveNumbersWithExplicitType);
}
indent--;
writeln("</entry>");
writeln(closeTag);
} else {
// Unknown type
log.error("Unknown configuration value type " + value.getClass() + " value=" + value);
log.error("Unknown configuration value type {} value={}", value.getClass(), value);
}
}