Hanning connection in STG after copy-paste of a page

Bug #1321714 reported by Danil Sokolov
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Workcraft
Fix Committed
High
Stan

Bug Description

To reproduce:

1) Create an STG model with a sequence of 3 transition (connected in a series)
2) Group the first two of them into a page
3) Select the whole model and copy-paste it
4) Enter the copy page and remove the second transition (the one which is connected to the outside of the page)

The following exception is thrown (see the note at the bottom!):

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Cannot remove a hanging connection because its parent is not a Container.
 at org.workcraft.dom.DefaultHangingConnectionRemover.handleEvent(DefaultHangingConnectionRemover.java:61)
 at org.workcraft.observation.HierarchySupervisor.notify(HierarchySupervisor.java:77)
 at org.workcraft.observation.ObservableHierarchyImpl.sendNotification(ObservableHierarchyImpl.java:39)
 at org.workcraft.dom.AbstractGroup.removeInternal(AbstractGroup.java:85)
 at org.workcraft.dom.AbstractGroup.remove(AbstractGroup.java:123)
 at org.workcraft.dom.math.MathGroup.remove(MathGroup.java:63)
 at org.workcraft.dom.DefaultMathNodeRemover.decRef(DefaultMathNodeRemover.java:48)
 at org.workcraft.dom.DefaultMathNodeRemover.nodeRemoved(DefaultMathNodeRemover.java:76)
 at org.workcraft.dom.DefaultMathNodeRemover.handleEvent(DefaultMathNodeRemover.java:57)
 at org.workcraft.observation.HierarchySupervisor.notify(HierarchySupervisor.java:77)
 at org.workcraft.observation.ObservableHierarchyImpl.sendNotification(ObservableHierarchyImpl.java:39)
 at org.workcraft.dom.AbstractGroup.remove(AbstractGroup.java:135)
 at org.workcraft.dom.visual.VisualPage.remove(VisualPage.java:211)
 at org.workcraft.dom.visual.AbstractVisualModel.deleteSelection(AbstractVisualModel.java:550)
 at org.workcraft.workspace.WorkspaceEntry.delete(WorkspaceEntry.java:358)
 at org.workcraft.gui.MainWindow.delete(MainWindow.java:1184)
 at org.workcraft.gui.MainWindowActions$17.run(MainWindowActions.java:176)
 at org.workcraft.gui.MainWindow$1.actionPerformed(MainWindow.java:108)
 at org.workcraft.gui.actions.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:58)
 at org.workcraft.gui.actions.ActionMenuItem.access$0(ActionMenuItem.java:55)
 at org.workcraft.gui.actions.ActionMenuItem$ActionForwarder.actionPerformed(ActionMenuItem.java:34)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
 at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
 at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
 at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
 at javax.swing.AbstractButton.doClick(AbstractButton.java:374)
 at javax.swing.AbstractButton.doClick(AbstractButton.java:354)
 at javax.swing.plaf.basic.BasicMenuItemUI$Actions.actionPerformed(BasicMenuItemUI.java:798)
 at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1661)
 at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
 at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:687)
 at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:695)
 at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:695)
 at javax.swing.JMenuBar.processKeyBinding(JMenuBar.java:666)
 at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:285)
 at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:272)
 at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2928)
 at javax.swing.JComponent.processKeyBindings(JComponent.java:2920)
 at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
 at java.awt.Component.processEvent(Component.java:6065)
 at java.awt.Container.processEvent(Container.java:2045)
 at java.awt.Component.dispatchEventImpl(Component.java:4649)
 at java.awt.Container.dispatchEventImpl(Container.java:2103)
 at java.awt.Component.dispatchEvent(Component.java:4475)
 at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1879)
 at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:770)
 at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1046)
 at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:913)
 at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:735)
 at java.awt.Component.dispatchEventImpl(Component.java:4519)
 at java.awt.Container.dispatchEventImpl(Container.java:2103)
 at java.awt.Window.dispatchEventImpl(Window.java:2588)
 at java.awt.Component.dispatchEvent(Component.java:4475)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:675)
 at java.awt.EventQueue.access$300(EventQueue.java:96)
 at java.awt.EventQueue$2.run(EventQueue.java:634)
 at java.awt.EventQueue$2.run(EventQueue.java:632)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:108)
 at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:119)
 at java.awt.EventQueue$3.run(EventQueue.java:648)
 at java.awt.EventQueue$3.run(EventQueue.java:646)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:108)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:645)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

Note: if you undo the delete action and try to remove the transition again it work fine.

Related branches

Changed in workcraft:
status: Triaged → Confirmed
Revision history for this message
Stan (sgaflv) wrote :

- the problem is that the mathematical connection is deleted two times:

first - it is deleted from DefaultMathNodeRemover because there are no more references to it
(after deletion its parent becomes null, it is no longer possible to determine its container)

second - it is deleted because the math Node is referring to it in the NodeContextTracker (Math node is deleted, hence the related connection must be deleted as well)

current solution: instead of creating an exception about a parent not being a container, ignore deleting node with parent == null

Revision history for this message
Danil Sokolov (danilovesky) wrote :

A temporary hack is used - the model is serialised and deserialised again to properly initialise the listeners. A nicer solution is still required.

Changed in workcraft:
status: Confirmed → Fix Committed
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.