diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/OpenRocketSaver.java b/core/src/main/java/info/openrocket/core/file/openrocket/OpenRocketSaver.java index cc841799d..982df34bc 100644 --- a/core/src/main/java/info/openrocket/core/file/openrocket/OpenRocketSaver.java +++ b/core/src/main/java/info/openrocket/core/file/openrocket/OpenRocketSaver.java @@ -403,7 +403,24 @@ public class OpenRocketSaver extends RocketSaver { indent++; for (Warning w : data.getWarningSet()) { - writeElementWithAttribute("warning", "priority", w.getPriority().getExportLabel(), TextUtil.escapeXML(w.toString())); + writeln(""); + indent++; + + writeElement("id", w.getID().toString()); + writeElement("description", w.getMessageDescription()); + writeElement("priority", w.getPriority()); + + if (null != w.getSources()) { + for (RocketComponent c : w.getSources()) { + writeElement("source", c.getID()); + } + } + + // We write the whole string content for backwards compatibility with old versions + writeln(TextUtil.escapeXML(w.toString())); + + indent--; + writeln(""); } // Check whether to store data @@ -579,16 +596,21 @@ public class OpenRocketSaver extends RocketSaver { // Write events for (FlightEvent event : branch.getEvents()) { String eventStr = ""; + eventStr += "/>"; writeln(eventStr); } @@ -649,14 +671,6 @@ public class OpenRocketSaver extends RocketSaver { content = ""; writeln("<" + element + ">" + TextUtil.escapeXML(content) + ""); } - - private void writeElementWithAttribute(String element, String attributeName, String attribute, Object content) throws IOException { - content = content == null ? "" : content; - - writeln("<" + element + " " + attributeName + " = \"" + attribute + "\">" + TextUtil.escapeXML(content) + ""); - } - - private void writeln(String str) throws IOException { if (str.length() == 0) { diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataBranchHandler.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataBranchHandler.java index 7ba4088b8..2b2277ce1 100644 --- a/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataBranchHandler.java +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataBranchHandler.java @@ -3,6 +3,7 @@ package info.openrocket.core.file.openrocket.importt; import java.util.HashMap; import java.util.UUID; +import info.openrocket.core.logging.Message; import info.openrocket.core.logging.SimulationAbort; import info.openrocket.core.logging.SimulationAbort.Cause; import info.openrocket.core.logging.WarningSet; @@ -132,15 +133,14 @@ class FlightDataBranchHandler extends AbstractElementHandler { if (element.equals("event")) { double time; FlightEvent.Type type; - SimulationAbort abort = null; - SimulationAbort.Cause cause = null; + Message data = null; RocketComponent source = null; String sourceID; try { time = DocumentConfig.stringToDouble(attributes.get("time")); } catch (NumberFormatException e) { - warnings.add("Illegal event specification, ignoring."); + warnings.add("Illegal event time specification, ignoring: " + e.getMessage()); return; } @@ -157,13 +157,23 @@ class FlightDataBranchHandler extends AbstractElementHandler { source = rocket.findComponent(UUID.fromString(sourceID)); } + // For warning events, get the warning + if (type == FlightEvent.Type.SIM_WARN) { + data = simHandler.getWarningSet().findById(UUID.fromString(attributes.get("id"))); + } + // For aborts, get the cause - cause = (Cause) DocumentConfig.findEnum(attributes.get("cause"), SimulationAbort.Cause.class); + Cause cause = (Cause) DocumentConfig.findEnum(attributes.get("cause"), SimulationAbort.Cause.class); if (cause != null) { - abort = new SimulationAbort(cause); + data = new SimulationAbort(cause); } - branch.addEvent(new FlightEvent(type, time, source, abort)); + try { + branch.addEvent(new FlightEvent(type, time, source, data)); + } catch (Exception e) { + warnings.add("Illegal parameters for FlightEvent: " + e.getMessage()); + } + return; } diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataHandler.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataHandler.java index 6ce1573f1..1c6ad1b89 100644 --- a/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataHandler.java +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/FlightDataHandler.java @@ -39,7 +39,7 @@ class FlightDataHandler extends AbstractElementHandler { WarningSet warnings) { if (element.equals("warning")) { - return PlainTextHandler.INSTANCE; + return new WarningHandler(context.getOpenRocketDocument().getRocket(), warningSet); } if (element.equals("databranch")) { if (attributes.get("name") == null || attributes.get("types") == null) { @@ -83,10 +83,10 @@ class FlightDataHandler extends AbstractElementHandler { if (branch.getLength() > 0) { branches.add(branch); } - } else if (element.equals("warning")) { - String priorityStr = attributes.get("priority"); - MessagePriority priority = MessagePriority.fromExportLabel(priorityStr); - warningSet.add(Warning.fromString(content, priority)); + // } else if (element.equals("warning")) { + // String priorityStr = attributes.get("priority"); + // MessagePriority priority = MessagePriority.fromExportLabel(priorityStr); + // warningSet.add(Warning.fromString(content, priority)); } } @@ -157,6 +157,9 @@ class FlightDataHandler extends AbstractElementHandler { data.getWarningSet().addAll(warningSet); data.immute(); } - - + + + public WarningSet getWarningSet() { + return warningSet; + } } diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/SingleSimulationHandler.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/SingleSimulationHandler.java index f283144f1..80e062b03 100644 --- a/core/src/main/java/info/openrocket/core/file/openrocket/importt/SingleSimulationHandler.java +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/SingleSimulationHandler.java @@ -156,6 +156,13 @@ class SingleSimulationHandler extends AbstractElementHandler { doc.addSimulation(simulation); } + /** + * @return the warning set associated with this simulation + */ + public WarningSet getWarningSet() { + return dataHandler.getWarningSet(); + } + private SimulationExtension compatibilityExtension(String className) { JavaCode extension = Application.getInjector().getInstance(JavaCode.class); extension.setClassName(className); diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/WarningHandler.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/WarningHandler.java new file mode 100644 index 000000000..edfde5bc5 --- /dev/null +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/WarningHandler.java @@ -0,0 +1,73 @@ +package info.openrocket.core.file.openrocket.importt; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.UUID; + +import info.openrocket.core.file.simplesax.AbstractElementHandler; +import info.openrocket.core.file.simplesax.ElementHandler; +import info.openrocket.core.file.simplesax.PlainTextHandler; +import info.openrocket.core.logging.MessagePriority; +import info.openrocket.core.logging.Warning; +import info.openrocket.core.logging.WarningSet; +import info.openrocket.core.rocketcomponent.Rocket; +import info.openrocket.core.rocketcomponent.RocketComponent; + +class WarningHandler extends AbstractElementHandler { + private Rocket rocket; + private WarningSet warningSet; + private Warning warning; + private UUID id = UUID.randomUUID(); + private MessagePriority priority = MessagePriority.NORMAL; + private ArrayList sources = new ArrayList<>(); + private String warningText; + + public WarningHandler(Rocket rocket, WarningSet warningSet) { + this.rocket = rocket; + this.warningSet = warningSet; + } + + @Override + public ElementHandler openElement(String element, HashMap attributes, + WarningSet warnings) { + return PlainTextHandler.INSTANCE; + } + + @Override + public void closeElement(String element, HashMap attributes, + String content, WarningSet warnings) { + if (element.equals("id")) { + id = UUID.fromString(content); + } else if (element.equals("description")) { + warning = Warning.fromString(content); + } else if (element.equals("priority")) { + priority = MessagePriority.fromExportLabel(content); + } else if (element.equals("source")) { + RocketComponent component = rocket.findComponent(UUID.fromString(content)); + sources.add(component); + } else { + warnings.add("Unknown element '" + element + "', ignoring."); + } + } + + @Override + public void endHandler(String element, HashMap attributes, + String content, WarningSet warnings) { + + // If we didn't already create a warning, this came from an old version + if (null == warning) { + warning = Warning.fromString(content.trim()); + } + if (null != id) { + warning.setID(id); + } + if (null != priority) { + warning.setPriority(priority); + } + if (null != sources) { + warning.setSources(sources.toArray(new RocketComponent[0])); + } + + warningSet.add(warning); + } +} diff --git a/core/src/main/java/info/openrocket/core/file/simplesax/ElementHandler.java b/core/src/main/java/info/openrocket/core/file/simplesax/ElementHandler.java index 3f4e13326..38bb894ec 100644 --- a/core/src/main/java/info/openrocket/core/file/simplesax/ElementHandler.java +++ b/core/src/main/java/info/openrocket/core/file/simplesax/ElementHandler.java @@ -80,4 +80,4 @@ public interface ElementHandler { public abstract void endHandler(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException; -} \ No newline at end of file +} diff --git a/core/src/main/java/info/openrocket/core/logging/Message.java b/core/src/main/java/info/openrocket/core/logging/Message.java index 8de8254c9..e7b9b46a1 100644 --- a/core/src/main/java/info/openrocket/core/logging/Message.java +++ b/core/src/main/java/info/openrocket/core/logging/Message.java @@ -73,6 +73,13 @@ public abstract class Message implements Cloneable { public UUID getID() { return id; } + + /** + * Set the ID + **/ + public void setID(UUID id) { + this.id = id; + } /** * Return the rocket component(s) that are the source of this warning. diff --git a/core/src/main/java/info/openrocket/core/logging/MessageSet.java b/core/src/main/java/info/openrocket/core/logging/MessageSet.java index be11b51d7..f71c8c039 100644 --- a/core/src/main/java/info/openrocket/core/logging/MessageSet.java +++ b/core/src/main/java/info/openrocket/core/logging/MessageSet.java @@ -1,5 +1,10 @@ package info.openrocket.core.logging; +import java.util.AbstractSet; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; + import info.openrocket.core.rocketcomponent.RocketComponent; import info.openrocket.core.util.ArrayList; import info.openrocket.core.util.BugException; @@ -7,10 +12,6 @@ import info.openrocket.core.util.ModID; import info.openrocket.core.util.Monitorable; import info.openrocket.core.util.Mutable; -import java.util.AbstractSet; -import java.util.Iterator; -import java.util.List; - /** * A set that contains multiple Messages. When adding a * {@link Message} to this set, the contents is checked for a message of the @@ -69,7 +70,7 @@ public abstract class MessageSet extends AbstractSet imple * @param sources the sources of the message (rocket components that caused the message) * */ - public boolean add(E m, RocketComponent... sources) { + public boolean add(E m, RocketComponent... sources) { mutable.check(); try { m = (E) m.clone(); @@ -78,7 +79,7 @@ public abstract class MessageSet extends AbstractSet imple } m.setSources(sources); return add(m); - } + } /** * Add a Message of the specified type with the specified discriminator to the @@ -149,6 +150,14 @@ public abstract class MessageSet extends AbstractSet imple return list; } + public Message findById(UUID id) { + for (Message m : messages) { + if (m.id.equals(id)) + return m; + } + throw new BugException("Message with id " + id + " not found"); + } + public void immute() { mutable.immute(); } diff --git a/core/src/main/java/info/openrocket/core/logging/Warning.java b/core/src/main/java/info/openrocket/core/logging/Warning.java index 30bd9364b..7361f7180 100644 --- a/core/src/main/java/info/openrocket/core/logging/Warning.java +++ b/core/src/main/java/info/openrocket/core/logging/Warning.java @@ -18,7 +18,8 @@ public abstract class Warning extends Message { * @return a Message with the specific text and priority. */ public static Warning fromString(String text, MessagePriority priority) { - return new Warning.Other(text, priority); + Warning.Other warn = new Warning.Other(text, priority); + return warn; } /** @@ -27,8 +28,6 @@ public abstract class Warning extends Message { public static Warning fromString(String text) { return fromString(text, MessagePriority.NORMAL); } - - ///////////// Specific warning classes /////////////