This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 207707 - Refactoring Redo doesn't work
Summary: Refactoring Redo doesn't work
Status: RESOLVED FIXED
Alias: None
Product: editor
Classification: Unclassified
Component: Refactoring (show other bugs)
Version: 7.2
Hardware: All All
: P2 normal (vote)
Assignee: Jan Becicka
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-01-25 09:45 UTC by soldatov
Modified: 2012-03-21 13:00 UTC (History)
1 user (show)

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description soldatov 2012-01-25 09:45:06 UTC
Regression in NetBeans Platform Dev (Build 201201241116)

Scenario:
- Create C/C++ Application with main
- add "int aa = 1;" into main
- Call context menu on 'aa' and select Refactor|Rename
- Type aa22 and press Refactor button
- Push Refactor|Undo [Rename "aa" to "aa2"]
==> ok
- Push Refactor|Redo [Rename "aa" to "aa2"]
==> no changes in text
Comment 1 Vladimir Voskresensky 2012-01-26 14:53:03 UTC
This is caused by http://hg.netbeans.org/cnd-main/rev/211330
registerListeners is now redirected into EDT and UndoManager.transactionEnded continues execution, so "UndoManager.undo" finishes and UndoAction.performAction
calles undoManager.saveAll();
saveAll calls unregisterListeners (=>listenersRegistered=false) and then registerListeners (holding allCES lock)
registerListeners passes check
if (listenersRegistered) return;
and goes to the next line
at the same time EDT redirected registerListeners enters registerListeners whithout acquisition of any locks and also passes check
if (listenersRegistered) return;
so UndoManager is added as listener twice and next unregisterListeners will remove only one instance from listeners => 
I see clear of redoList as [1] which cause redo doesn't work because UndoManager.undo exists by check
if (isRedoAvailable())
[1] 
java.lang.Exception
        at org.netbeans.modules.refactoring.spi.impl.UndoManager.clear(UndoManager.java:277)
        at org.netbeans.modules.refactoring.spi.impl.UndoManager.invalidate(UndoManager.java:457)
        at org.netbeans.modules.refactoring.spi.impl.UndoManager.removeUpdate(UndoManager.java:532)
        at org.netbeans.lib.editor.util.swing.PriorityDocumentListenerList.removeUpdate(PriorityDocumentListenerList.java:116)
        at javax.swing.text.AbstractDocument.fireRemoveUpdate(AbstractDocument.java:243)
        at org.netbeans.editor.BaseDocument.fireRemoveUpdate(BaseDocument.java:1569)
        at org.netbeans.editor.BaseDocument.handleRemove(BaseDocument.java:966)
        at org.netbeans.editor.BaseDocument.remove(BaseDocument.java:892)
        at org.openide.text.CloneableEditorSupport$4.run(CloneableEditorSupport.java:828)
        at org.netbeans.editor.GuardedDocument.runAtomic(GuardedDocument.java:317)
        at org.openide.text.NbDocument.runAtomic(NbDocument.java:422)
        at org.openide.text.CloneableEditorSupport.clearDocument(CloneableEditorSupport.java:822)
        at org.openide.text.CloneableEditorSupport.access$1700(CloneableEditorSupport.java:129)
        at org.openide.text.CloneableEditorSupport$6$1Query.call(CloneableEditorSupport.java:1774)
        at org.openide.text.CloneableEditorSupport$6.run(CloneableEditorSupport.java:1787)
        at org.netbeans.editor.GuardedDocument.runAtomic(GuardedDocument.java:317)
        at org.openide.text.NbDocument.runAtomic(NbDocument.java:422)
        at org.openide.text.CloneableEditorSupport.reloadDocument(CloneableEditorSupport.java:1737)
        at org.openide.text.CloneableEditorSupport.checkReload(CloneableEditorSupport.java:2286)
        at org.openide.text.CloneableEditorSupport.access$2600(CloneableEditorSupport.java:129)
        at org.openide.text.CloneableEditorSupport$Listener$1.run(CloneableEditorSupport.java:2893)
        at org.netbeans.editor.GuardedDocument.runAtomic(GuardedDocument.java:317)
        at org.openide.text.NbDocument.runAtomic(NbDocument.java:422)
        at org.openide.text.CloneableEditorSupport$Listener$1.run(CloneableEditorSupport.java:2885)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
        at java.awt.EventQueue.access$000(EventQueue.java:84)
        at java.awt.EventQueue$1.run(EventQueue.java:602)
        at java.awt.EventQueue$1.run(EventQueue.java:600)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:162)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Comment 2 Vladimir Voskresensky 2012-01-26 15:00:02 UTC
I have to backout 211330:31d505fcdf08 to recover after regression.
http://hg.netbeans.org/cnd-main/rev/054c260bad8a

Please, improve unregisterListeners/registerListeners logic by correctly holding locks or some other way

Thanks.
Comment 3 Vladimir Voskresensky 2012-01-26 15:04:30 UTC
(In reply to comment #1)
> I see clear of redoList as [1] which cause redo doesn't work because
> UndoManager.undo exists by check
> if (isRedoAvailable())
misprint, I meant:

UndoManager.redo exists by check
if (isRedoAvailable())
Comment 4 Jan Becicka 2012-01-26 15:53:39 UTC
I work on complete rewrite of undo/redo. Tis bug will be obsolete as soon as I push my changes. Anyway thanks for backout.
Comment 5 Jan Becicka 2012-03-21 13:00:53 UTC
Refactoring Undo was integrated with Editor Undo. This bug is no more valid. Please verify