Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 360243

Summary: [ModelExplorer] Undo/Redo on delete for Diagrams and Tables
Product: [Modeling] Papyrus Reporter: Vincent Lorenzo <vincent.lorenzo>
Component: CoreAssignee: Camille Letavernier <cletavernier>
Status: RESOLVED FIXED QA Contact:
Severity: critical    
Priority: P3 CC: vincent.lorenzo
Version: 0.8.1   
Target Milestone: ---   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Bug Depends on: 348689, 400642    
Bug Blocks: 398712    

Description Vincent Lorenzo CLA 2011-10-07 10:38:17 EDT
Steps to reproduce : 
	1/ Create a new Papyrus project with a ClassDiagram and a CompositeStructureDiagram
	2/ Open these 2 diagrams if they are not opened
	3/ Delete on of them from the ModelExplorer
	4/ Do Undo
		-> You get the following exception :
		
!ENTRY org.eclipse.emf.workspace 4 23 2011-10-07 16:34:46.120
!MESSAGE Undo of operation was rolled back (possibly due to concurrent write)
!STACK 0
java.lang.IllegalStateException: Try to change state from CREATED to REPARENTED. This is forbidden.
      at org.eclipse.papyrus.sasheditor.internal.EditorPart.reparent(EditorPart.java:533)
      at org.eclipse.papyrus.sasheditor.internal.TabItemPart.resetChild(TabItemPart.java:106)
      at org.eclipse.papyrus.sasheditor.internal.TabFolderPart.resetTabItem(TabFolderPart.java:931)
      at org.eclipse.papyrus.sasheditor.internal.TabFolderPart.synchronize2(TabFolderPart.java:776)
      at org.eclipse.papyrus.sasheditor.internal.RootPart.synchronize2(RootPart.java:142)
      at org.eclipse.papyrus.sasheditor.editor.SashWindowsContainer.refreshTabsInternal(SashWindowsContainer.java:443)
      at org.eclipse.papyrus.sasheditor.editor.SashWindowsContainer.refreshTabs(SashWindowsContainer.java:397)
      at org.eclipse.papyrus.sasheditor.editor.AbstractMultiPageSashEditor.refreshTabs(AbstractMultiPageSashEditor.java:174)
      at org.eclipse.papyrus.core.editor.CoreMultiDiagramEditor.access$5(CoreMultiDiagramEditor.java:1)
      at org.eclipse.papyrus.core.editor.CoreMultiDiagramEditor$3.contentChanged(CoreMultiDiagramEditor.java:207)
      at org.eclipse.papyrus.sasheditor.contentprovider.di.internal.ContentChangedEventProvider.fireContentChanged(ContentChangedEventProvider.java:163)
      at org.eclipse.papyrus.sasheditor.contentprovider.di.internal.ContentChangedEventProvider$EMFAdapter.notifyChanged(ContentChangedEventProvider.java:194)
      at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:380)
      at org.eclipse.emf.common.notify.impl.NotificationImpl.dispatch(NotificationImpl.java:1033)
      at org.eclipse.emf.common.notify.impl.NotificationImpl.dispatch(NotificationImpl.java:1038)
      at org.eclipse.emf.common.notify.impl.NotifyingListImpl.addUnique(NotifyingListImpl.java:367)
      at org.eclipse.emf.common.util.AbstractEList.add(AbstractEList.java:345)
      at org.eclipse.emf.common.util.ECollections.setEList(ECollections.java:228)
      at org.eclipse.emf.ecore.change.impl.FeatureChangeImpl.process(FeatureChangeImpl.java:599)
      at org.eclipse.emf.ecore.change.impl.FeatureChangeImpl.apply(FeatureChangeImpl.java:524)
      at org.eclipse.emf.ecore.change.impl.FeatureChangeImpl.applyAndReverse(FeatureChangeImpl.java:509)
      at org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl.applyAndReverse(ChangeDescriptionImpl.java:375)
      at org.eclipse.emf.transaction.util.CompositeChangeDescription.applyAndReverse(CompositeChangeDescription.java:117)
      at org.eclipse.emf.transaction.RecordingCommand.undo(RecordingCommand.java:213)
      at org.eclipse.emf.common.command.CompoundCommand.undo(CompoundCommand.java:333)
      at org.eclipse.emf.workspace.EMFCommandOperation.doUndo(EMFCommandOperation.java:153)
      at org.eclipse.emf.workspace.AbstractEMFOperation.undo(AbstractEMFOperation.java:370)
      at org.eclipse.core.commands.operations.DefaultOperationHistory.doUndo(DefaultOperationHistory.java:417)
      at org.eclipse.core.commands.operations.DefaultOperationHistory.undo(DefaultOperationHistory.java:1282)
      at org.eclipse.papyrus.commands.CheckedOperationHistory.undo(CheckedOperationHistory.java:187)
      at org.eclipse.emf.workspace.impl.WorkspaceCommandStackImpl.undo(WorkspaceCommandStackImpl.java:255)
      at org.eclipse.papyrus.modelexplorer.handler.UndoHandler.execute(UndoHandler.java:36)
      at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293)
      at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476)
      at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
      at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.executeCommand(WorkbenchKeyboard.java:468)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.press(WorkbenchKeyboard.java:786)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.processKeyEvent(WorkbenchKeyboard.java:885)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.filterKeySequenceBindings(WorkbenchKeyboard.java:567)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.access$3(WorkbenchKeyboard.java:508)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard$KeyDownFilter.handleEvent(WorkbenchKeyboard.java:123)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
      at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1262)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1052)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
      at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1104)
      at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1100)
      at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1509)
      at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4640)
      at org.eclipse.swt.widgets.Tree.WM_CHAR(Tree.java:5941)
      at org.eclipse.swt.widgets.Control.windowProc(Control.java:4528)
      at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:5937)
      at org.eclipse.swt.widgets.Display.windowProc(Display.java:4972)
      at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
      at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2530)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3752)
      at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
      at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
      at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
      at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
      at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
      at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
      at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
      at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
      at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
      at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

!ENTRY org.eclipse.emf.common 2 0 2011-10-07 16:34:46.151
!MESSAGE An exception was ignored during command execution
!STACK 0
org.eclipse.emf.common.util.WrappedException: An exception was ignored during command execution
      at org.eclipse.emf.common.command.BasicCommandStack.handleError(BasicCommandStack.java:287)
      at org.eclipse.emf.transaction.impl.AbstractTransactionalCommandStack.handleError(AbstractTransactionalCommandStack.java:125)
      at org.eclipse.emf.workspace.impl.WorkspaceCommandStackImpl.undo(WorkspaceCommandStackImpl.java:263)
      at org.eclipse.papyrus.modelexplorer.handler.UndoHandler.execute(UndoHandler.java:36)
      at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293)
      at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476)
      at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
      at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.executeCommand(WorkbenchKeyboard.java:468)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.press(WorkbenchKeyboard.java:786)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.processKeyEvent(WorkbenchKeyboard.java:885)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.filterKeySequenceBindings(WorkbenchKeyboard.java:567)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard.access$3(WorkbenchKeyboard.java:508)
      at org.eclipse.ui.internal.keys.WorkbenchKeyboard$KeyDownFilter.handleEvent(WorkbenchKeyboard.java:123)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
      at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1262)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1052)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
      at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1104)
      at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1100)
      at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1509)
      at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4640)
      at org.eclipse.swt.widgets.Tree.WM_CHAR(Tree.java:5941)
      at org.eclipse.swt.widgets.Control.windowProc(Control.java:4528)
      at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:5937)
      at org.eclipse.swt.widgets.Display.windowProc(Display.java:4972)
      at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
      at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2530)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3752)
      at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
      at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
      at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
      at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
      at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
      at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
      at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
      at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
      at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
      at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Caused by: org.eclipse.core.commands.ExecutionException: Undo of operation was rolled back (possibly due to concurrent write)
      at org.eclipse.emf.workspace.AbstractEMFOperation.undo(AbstractEMFOperation.java:409)
      at org.eclipse.core.commands.operations.DefaultOperationHistory.doUndo(DefaultOperationHistory.java:417)
      at org.eclipse.core.commands.operations.DefaultOperationHistory.undo(DefaultOperationHistory.java:1282)
      at org.eclipse.papyrus.commands.CheckedOperationHistory.undo(CheckedOperationHistory.java:187)
      at org.eclipse.emf.workspace.impl.WorkspaceCommandStackImpl.undo(WorkspaceCommandStackImpl.java:255)
      ... 48 more
Caused by: java.lang.IllegalStateException: Try to change state from CREATED to REPARENTED. This is forbidden.
      at org.eclipse.papyrus.sasheditor.internal.EditorPart.reparent(EditorPart.java:533)
      at org.eclipse.papyrus.sasheditor.internal.TabItemPart.resetChild(TabItemPart.java:106)
      at org.eclipse.papyrus.sasheditor.internal.TabFolderPart.resetTabItem(TabFolderPart.java:931)
      at org.eclipse.papyrus.sasheditor.internal.TabFolderPart.synchronize2(TabFolderPart.java:776)
      at org.eclipse.papyrus.sasheditor.internal.RootPart.synchronize2(RootPart.java:142)
      at org.eclipse.papyrus.sasheditor.editor.SashWindowsContainer.refreshTabsInternal(SashWindowsContainer.java:443)
      at org.eclipse.papyrus.sasheditor.editor.SashWindowsContainer.refreshTabs(SashWindowsContainer.java:397)
      at org.eclipse.papyrus.sasheditor.editor.AbstractMultiPageSashEditor.refreshTabs(AbstractMultiPageSashEditor.java:174)
      at org.eclipse.papyrus.core.editor.CoreMultiDiagramEditor.access$5(CoreMultiDiagramEditor.java:1)
      at org.eclipse.papyrus.core.editor.CoreMultiDiagramEditor$3.contentChanged(CoreMultiDiagramEditor.java:207)
      at org.eclipse.papyrus.sasheditor.contentprovider.di.internal.ContentChangedEventProvider.fireContentChanged(ContentChangedEventProvider.java:163)
      at org.eclipse.papyrus.sasheditor.contentprovider.di.internal.ContentChangedEventProvider$EMFAdapter.notifyChanged(ContentChangedEventProvider.java:194)
      at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:380)
      at org.eclipse.emf.common.notify.impl.NotificationImpl.dispatch(NotificationImpl.java:1033)
      at org.eclipse.emf.common.notify.impl.NotificationImpl.dispatch(NotificationImpl.java:1038)
      at org.eclipse.emf.common.notify.impl.NotifyingListImpl.addUnique(NotifyingListImpl.java:367)
      at org.eclipse.emf.common.util.AbstractEList.add(AbstractEList.java:345)
      at org.eclipse.emf.common.util.ECollections.setEList(ECollections.java:228)
      at org.eclipse.emf.ecore.change.impl.FeatureChangeImpl.process(FeatureChangeImpl.java:599)
      at org.eclipse.emf.ecore.change.impl.FeatureChangeImpl.apply(FeatureChangeImpl.java:524)
      at org.eclipse.emf.ecore.change.impl.FeatureChangeImpl.applyAndReverse(FeatureChangeImpl.java:509)
      at org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl.applyAndReverse(ChangeDescriptionImpl.java:375)
      at org.eclipse.emf.transaction.util.CompositeChangeDescription.applyAndReverse(CompositeChangeDescription.java:117)
      at org.eclipse.emf.transaction.RecordingCommand.undo(RecordingCommand.java:213)
      at org.eclipse.emf.common.command.CompoundCommand.undo(CompoundCommand.java:333)
      at org.eclipse.emf.workspace.EMFCommandOperation.doUndo(EMFCommandOperation.java:153)
      at org.eclipse.emf.workspace.AbstractEMFOperation.undo(AbstractEMFOperation.java:370)
      ... 52 more
Comment 1 Vincent Lorenzo CLA 2011-10-07 11:21:14 EDT
I tried to debug, so I observe that : 
deleting an opened diagram : 
	- TransactionalPageMngr is a listener which execute commands in the commandStack (pageOpened, pageClosed, pageActivated, ...), so when you execute the command to delete an diagram (handler DeleteDiagramHandler), you find in the commandStack : 6 commands executed by TransactionalPageMngr and 1 command corresponding to DeleteDiagramHandler
	- when you do an Undo, you add 2 commands to the commandStack and you get the exception

deleting a closed diagram : 
	- When you call the DeleteDiagramHandler, "only 2" commands are added in the commandStack (one from the TransactionalPageMngr, and corresponding to DeleteDiagramHandler)
	- When you do an Undo, only the last command (DeleteDiagramHandler) is removed from the stack.
Comment 2 Camille Letavernier CLA 2013-02-18 08:11:15 EST
I'm currently working on this issue. The bug has been clearly identified.

This is directly related to work on Bug 398712
Comment 3 Camille Letavernier CLA 2013-02-18 11:25:00 EST
Fixed in r10170