diff --git a/src/main/java/de/neemann/digital/core/ExceptionWithOrigin.java b/src/main/java/de/neemann/digital/core/ExceptionWithOrigin.java index 48ca34316..b151bc63a 100644 --- a/src/main/java/de/neemann/digital/core/ExceptionWithOrigin.java +++ b/src/main/java/de/neemann/digital/core/ExceptionWithOrigin.java @@ -11,6 +11,26 @@ import java.util.Set; public class ExceptionWithOrigin extends Exception { private Set origin; + + /** + * Returns the file or the files that caused the given exception. + * If no origin is found null is returned. + * + * @param e the exception + * @return the origin or null; + */ + public static String getOrigin(Throwable e) { + while (e != null) { + if (e instanceof ExceptionWithOrigin) { + String orig = ((ExceptionWithOrigin) e).getOriginStr(); + if (orig != null) + return orig; + } + e = e.getCause(); + } + return null; + } + /** * Creates a new exception * @@ -49,7 +69,7 @@ public class ExceptionWithOrigin extends Exception { /** * @return the origin of the error as a string */ - public String getOriginStr() { + private String getOriginStr() { Set orig = getOrigin(); if (orig == null || orig.isEmpty()) return null; @@ -68,20 +88,10 @@ public class ExceptionWithOrigin extends Exception { * @param origin the file which had caused the exception */ public void setOrigin(File origin) { - if (getOrigin() == null) { + if (this.origin == null && origin != null) { this.origin = new HashSet<>(); this.origin.add(origin); } } - /** - * Sets the origin of an error - * - * @param origin a set of file which had caused the exception - */ - public void setOrigin(Set origin) { - if (getOrigin() == null) - this.origin = origin; - } - } diff --git a/src/main/java/de/neemann/digital/core/NodeException.java b/src/main/java/de/neemann/digital/core/NodeException.java index b491c3d47..2e6207bcc 100644 --- a/src/main/java/de/neemann/digital/core/NodeException.java +++ b/src/main/java/de/neemann/digital/core/NodeException.java @@ -83,7 +83,7 @@ public class NodeException extends ExceptionWithOrigin { ItemConcatenation items = new ItemConcatenation(super.getMessage()); if (values != null && values.size() > 0) { for (ObservableValue ov : values) - items.addItem(ov.getName()); + items.addItem(Lang.get("msg_signal_N", ov.getName())); } if (nodes != null && nodes.size() > 0) { diff --git a/src/main/java/de/neemann/digital/draw/model/ModelCreator.java b/src/main/java/de/neemann/digital/draw/model/ModelCreator.java index 26b1efd93..d2aaaa7d0 100644 --- a/src/main/java/de/neemann/digital/draw/model/ModelCreator.java +++ b/src/main/java/de/neemann/digital/draw/model/ModelCreator.java @@ -124,7 +124,7 @@ public class ModelCreator implements Iterable { } if (isNotAIO) - entries.add(new ModelEntry(element, pins, ve, elementType.getInputDescription(ve.getElementAttributes()), isNestedCircuit)); + entries.add(new ModelEntry(element, pins, ve, elementType.getInputDescription(ve.getElementAttributes()), isNestedCircuit, origin)); for (Pin p : pins) netList.add(p); diff --git a/src/main/java/de/neemann/digital/draw/model/ModelEntry.java b/src/main/java/de/neemann/digital/draw/model/ModelEntry.java index 0704a02ba..a40529902 100644 --- a/src/main/java/de/neemann/digital/draw/model/ModelEntry.java +++ b/src/main/java/de/neemann/digital/draw/model/ModelEntry.java @@ -11,6 +11,7 @@ import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.draw.elements.*; import de.neemann.digital.lang.Lang; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; @@ -26,6 +27,7 @@ public class ModelEntry { private final Pins pins; private final PinDescriptions inputNames; private final boolean isNestedElement; + private final File origin; // Only used to create better error messages private final VisualElement visualElement; private IOState ioState; @@ -37,13 +39,15 @@ public class ModelEntry { * @param visualElement the visual element which has created the element * @param inputNames the pin descriptions of the inputs. * @param isNestedElement true if this visual element is a nested included element + * @param origin Used to create better error messages */ - public ModelEntry(Element element, Pins pins, VisualElement visualElement, PinDescriptions inputNames, boolean isNestedElement) { + public ModelEntry(Element element, Pins pins, VisualElement visualElement, PinDescriptions inputNames, boolean isNestedElement, File origin) { this.element = element; this.pins = pins; this.visualElement = visualElement; this.inputNames = inputNames; this.isNestedElement = isNestedElement; + this.origin = origin; } /** @@ -53,43 +57,48 @@ public class ModelEntry { * @throws NodeException NodeException */ public void applyInputs() throws PinException, NodeException { - HashMap ins = pins.getInputs(); + try { + HashMap ins = pins.getInputs(); - InverterConfig ic = visualElement.getElementAttributes().get(Keys.INVERTERCONFIG); + InverterConfig ic = visualElement.getElementAttributes().get(Keys.INVERTERCONFIG); - ObservableValues values = ObservableValues.EMPTY_LIST; - ArrayList inputs = new ArrayList<>(); - for (PinDescription inputName : inputNames) { - Pin pin = ins.get(inputName.getName()); - if (pin == null) - throw new PinException(Lang.get("err_pin_N0_atElement_N1_notFound", inputName, visualElement), visualElement); + ObservableValues values = ObservableValues.EMPTY_LIST; + ArrayList inputs = new ArrayList<>(); + for (PinDescription inputName : inputNames) { + Pin pin = ins.get(inputName.getName()); + if (pin == null) + throw new PinException(Lang.get("err_pin_N0_atElement_N1_notFound", inputName, visualElement), visualElement); - ObservableValue value = pin.getValue(); - if (value == null) - throw new PinException(Lang.get("err_noValueSetFor_N0_atElement_N1", inputName, visualElement), visualElement); + ObservableValue value = pin.getValue(); + if (value == null) + throw new PinException(Lang.get("err_noValueSetFor_N0_atElement_N1", inputName, visualElement), visualElement); - inputs.add(ic.invert(inputName.getName(), value)); - } - - ArrayList bidirect = null; - for (Pin p : pins) { - if (p.getDirection() == Pin.Direction.both) { - if (bidirect == null) - bidirect = new ArrayList<>(); - final ObservableValue readerValue = p.getReaderValue(); - if (readerValue == null) - throw new PinException(Lang.get("err_noValueSetFor_N0_atElement_N1", p.getName(), visualElement), visualElement); - bidirect.add(readerValue); + inputs.add(ic.invert(inputName.getName(), value)); } - } - if (bidirect != null) - inputs.addAll(bidirect); - if (inputs.size() > 0) { - values = new ObservableValues(inputs); - element.setInputs(values); + ArrayList bidirect = null; + for (Pin p : pins) { + if (p.getDirection() == Pin.Direction.both) { + if (bidirect == null) + bidirect = new ArrayList<>(); + final ObservableValue readerValue = p.getReaderValue(); + if (readerValue == null) + throw new PinException(Lang.get("err_noValueSetFor_N0_atElement_N1", p.getName(), visualElement), visualElement); + bidirect.add(readerValue); + } + } + if (bidirect != null) + inputs.addAll(bidirect); + + if (inputs.size() > 0) { + values = new ObservableValues(inputs); + element.setInputs(values); + } + ioState = new IOState(values, element.getOutputs(), element); + } catch (PinException | NodeException e) { + e.setOrigin(origin); + throw e; } - ioState = new IOState(values, element.getOutputs(), element); } /** diff --git a/src/main/java/de/neemann/gui/ErrorMessage.java b/src/main/java/de/neemann/gui/ErrorMessage.java index 9b05d1765..62c0e2c9a 100644 --- a/src/main/java/de/neemann/gui/ErrorMessage.java +++ b/src/main/java/de/neemann/gui/ErrorMessage.java @@ -46,12 +46,10 @@ public class ErrorMessage implements Runnable { message.append('\n'); addExceptionMessage(e); - if (e instanceof ExceptionWithOrigin) { - String orig = ((ExceptionWithOrigin) e).getOriginStr(); - if (orig != null) { - if (message.length() > 0) message.append('\n'); - message.append(Lang.get("msg_errInFile_N", orig)); - } + String orig = ExceptionWithOrigin.getOrigin(e); + if (orig != null) { + if (message.length() > 0) message.append('\n'); + message.append(Lang.get("msg_errInFile_N", orig)); } return this; diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 652194712..6ffd026f9 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -916,6 +916,7 @@ Die Icons stammen aus dem Tango Desktop Project. Die Namen der Pins konnten nicht ermittelt werden. Aufgetreten in Datei {0}. Betroffen sind: {0}. + Leitung {0} Ok diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index d09fe47c3..3980498ba 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -903,6 +903,7 @@ The icons are taken from the Tango Desktop Project. Could not determine the names of the pins. Occurred in file {0}. Affected are: {0}. + Signal {0} Ok