From e3975593275941a088e9288c93be3d75ca364580 Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Wed, 10 Jan 2018 21:33:47 +0100 Subject: [PATCH 1/9] my first refactoring session tried to attend to the highlighted items, guided by the IDE --- .../refactoring/api/RefactoringSession.java | 176 ++++++++---------- 1 file changed, 82 insertions(+), 94 deletions(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index 22a8a0634f08..d31646eb8b87 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -43,36 +43,37 @@ import org.openide.loaders.DataObject; import org.openide.loaders.DataObjectNotFoundException; import org.openide.util.Exceptions; -import org.openide.util.Mutex.Action; import org.openide.util.Parameters; - -/** Class used to invoke refactorings. +/** + * Class used to invoke refactorings. * * @author Martin Matula, Daniel Prusa, Jan Becicka */ public final class RefactoringSession { - //private final LinkedList internalList; - private final ArrayList internalList; + + private static final int COMMITSTEPS = 100; + + private final ArrayList internalList = new ArrayList<>(); + private final Collection refactoringElements = new ElementsCollection(); + private final UndoManager undoManager = UndoManager.getDefault(); + private final AtomicBoolean finished = new AtomicBoolean(false); private final RefactoringElementsBag bag; - private final Collection refactoringElements; private final String description; - private ProgressSupport progressSupport; - private UndoManager undoManager = UndoManager.getDefault(); + + @SuppressWarnings("PackageVisibleField") boolean realcommit = true; - private AtomicBoolean finished = new AtomicBoolean(false); - private static final int COMMITSTEPS = 100; - + private ProgressSupport progressSupport; + + @SuppressWarnings("LeakingThisInConstructor") private RefactoringSession(String description) { - //internalList = new LinkedList(); - internalList = new ArrayList() ; bag = SPIAccessor.DEFAULT.createBag(this, internalList); this.description = description; - this.refactoringElements = new ElementsCollection(); } - - /** + + /** * Creates a new refactoring session. + * * @param description textual description of this session * @return instance of RefactoringSession */ @@ -82,29 +83,24 @@ public static RefactoringSession create(@NonNull String description) { return new RefactoringSession(description); } - /** - * process all elements from elements bags, - * do all fileChanges - * and call all commits + * process all elements from elements bags, do all fileChanges and call all + * commits + * * @param saveAfterDone save all if true * @return instance of Problem or null, if everything is OK */ @CheckForNull public Problem doRefactoring(final boolean saveAfterDone) { - return Utilities.runWithOnSaveTasksDisabled(new Action() { - @Override public Problem run() { - return reallyDoRefactoring(saveAfterDone); - } - }); + return Utilities.runWithOnSaveTasksDisabled(() -> reallyDoRefactoring(saveAfterDone)); } - + private Problem reallyDoRefactoring(boolean saveAfterDone) { long time = System.currentTimeMillis(); - + Iterator it = internalList.iterator(); ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); - float progressStep = (float)COMMITSTEPS / internalList.size(); + float progressStep = (float) COMMITSTEPS / internalList.size(); float current = 0F; fireProgressListenerStart(0, COMMITSTEPS + commits.size() * COMMITSTEPS + 1); ProgressListener progressListener = new ProgressL(commits, COMMITSTEPS); @@ -123,43 +119,36 @@ private Problem reallyDoRefactoring(boolean saveAfterDone) { fireProgressListenerStep((int) current); } } finally { - for (Transaction commit : commits) { - SPIAccessor.DEFAULT.check(commit, false); - } - - UndoableWrapper wrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); - for (Transaction commit : commits) { - if (wrapper != null) { - setWrappers(commit, wrapper); + commits.forEach(commit -> SPIAccessor.DEFAULT.check(commit, false)); + UndoableWrapper undoableWrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); + commits.forEach(commit -> { + if (undoableWrapper != null) { + setWrappers(commit, undoableWrapper); } - - if(commit instanceof ProgressProvider) { + if (commit instanceof ProgressProvider) { ProgressProvider progressProvider = (ProgressProvider) commit; progressProvider.addProgressListener(progressListener); - } - try { - commit.commit(); - } finally { - if(commit instanceof ProgressProvider) { - ProgressProvider progressProvider = (ProgressProvider) commit; + try { + commit.commit(); + } finally { progressProvider.removeProgressListener(progressListener); } + } else { + commit.commit(); } - if (wrapper != null) { - unsetWrappers(commit, wrapper); + if (undoableWrapper != null) { + unsetWrappers(commit, undoableWrapper); } + }); + if (undoableWrapper != null) { + undoableWrapper.close(); } - if (wrapper != null) { - wrapper.close(); - } - for (Transaction commit : commits) { - SPIAccessor.DEFAULT.sum(commit); - } + commits.forEach(commit -> SPIAccessor.DEFAULT.sum(commit)); } if (saveAfterDone) { LifecycleManager.getDefault().saveAll(); - for (DataObject dob:DataObject.getRegistry().getModified()) { - SaveCookie cookie = dob.getCookie(SaveCookie.class); + for (DataObject dataObject : DataObject.getRegistry().getModified()) { + SaveCookie cookie = dataObject.getLookup().lookup(SaveCookie.class); try { cookie.save(); } catch (IOException ex) { @@ -167,28 +156,24 @@ private Problem reallyDoRefactoring(boolean saveAfterDone) { } } } - for (RefactoringElementImplementation fileChange:SPIAccessor.DEFAULT.getFileChanges(bag)) { - if (fileChange.isEnabled()) { - fileChange.performChange(); - } - } + SPIAccessor.DEFAULT.getFileChanges(bag).stream().filter(fileChange -> fileChange.isEnabled()).forEachOrdered(fileChange -> fileChange.performChange()); fireProgressListenerStep(); } finally { fireProgressListenerStop(); if (realcommit) { undoManager.addItem(this); undoManager.transactionEnded(false, this); - realcommit=false; + realcommit = false; } } Logger timer = Logger.getLogger("TIMER.RefactoringSession"); if (timer.isLoggable(Level.FINE)) { time = System.currentTimeMillis() - time; - timer.log(Level.FINE, "refactoringSession.doRefactoring", new Object[] { description, RefactoringSession.this, time } ); + timer.log(Level.FINE, "refactoringSession.doRefactoring", new Object[]{description, RefactoringSession.this, time}); } return null; } - + private class ProgressL implements ProgressListener { private float progressStep; @@ -210,7 +195,7 @@ public void start(ProgressEvent event) { @Override public void step(ProgressEvent event) { - current = current + progressStep; + current += progressStep; fireProgressListenerStep((int) current); } @@ -219,25 +204,22 @@ public void stop(ProgressEvent event) { // do not rely on plugins; } } - + /** * do undo of previous doRefactoring() + * * @param saveAfterDone save all if true * @return instance of Problem or null, if everything is OK */ @CheckForNull public Problem undoRefactoring(final boolean saveAfterDone) { - return Utilities.runWithOnSaveTasksDisabled(new Action() { - @Override public Problem run() { - return reallyUndoRefactoring(saveAfterDone); - } - }); + return Utilities.runWithOnSaveTasksDisabled(() -> reallyUndoRefactoring(saveAfterDone)); } - + private Problem reallyUndoRefactoring(boolean saveAfterDone) { try { ListIterator it = internalList.listIterator(internalList.size()); - fireProgressListenerStart(0, internalList.size()+1); + fireProgressListenerStart(0, internalList.size() + 1); ArrayList fileChanges = SPIAccessor.DEFAULT.getFileChanges(bag); ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); for (ListIterator fileChangeIterator = fileChanges.listIterator(fileChanges.size()); fileChangeIterator.hasPrevious();) { @@ -246,9 +228,7 @@ private Problem reallyUndoRefactoring(boolean saveAfterDone) { f.undoChange(); } } - for (Transaction commit : SPIAccessor.DEFAULT.getCommits(bag)) { - SPIAccessor.DEFAULT.check(commit, true); - } + SPIAccessor.DEFAULT.getCommits(bag).forEach((commit) -> SPIAccessor.DEFAULT.check(commit, true)); UndoableWrapper wrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); for (ListIterator commitIterator = commits.listIterator(commits.size()); commitIterator.hasPrevious();) { final Transaction commit = commitIterator.previous(); @@ -257,9 +237,7 @@ private Problem reallyUndoRefactoring(boolean saveAfterDone) { unsetWrappers(commit, wrapper); } wrapper.close(); - for (Transaction commit : SPIAccessor.DEFAULT.getCommits(bag)) { - SPIAccessor.DEFAULT.sum(commit); - } + SPIAccessor.DEFAULT.getCommits(bag).forEach((commit) -> SPIAccessor.DEFAULT.sum(commit)); while (it.hasPrevious()) { fireProgressListenerStep(); @@ -277,38 +255,42 @@ private Problem reallyUndoRefactoring(boolean saveAfterDone) { } return null; } - + /** * Get elements from session + * * @since 1.23 the returned collection is blocking until finished. * @see #finished() * @return collection of RefactoringElements */ @NonNull + @SuppressWarnings("ReturnOfCollectionOrArrayField") public Collection getRefactoringElements() { return refactoringElements; } - + /** * Inform the session it, and all its plugins, are finished. + * * @since 1.28 * @see #getRefactoringElements() */ public void finished() { finished.set(true); } - + boolean isFinished() { return finished.get(); } - + /** - * Adds progress listener to this RefactoringSession + * Adds progress listener to this RefactoringSession + * * @param listener to add */ public synchronized void addProgressListener(@NonNull ProgressListener listener) { Parameters.notNull("listener", listener); // NOI18N - if (progressSupport == null ) { + if (progressSupport == null) { progressSupport = new ProgressSupport(); } progressSupport.addProgressListener(listener); @@ -316,12 +298,13 @@ public synchronized void addProgressListener(@NonNull ProgressListener listener) /** * Remove progress listener from this RefactoringSession + * * @param listener to remove */ public synchronized void removeProgressListener(@NonNull ProgressListener listener) { Parameters.notNull("listener", listener); // NOI18N - if (progressSupport != null ) { - progressSupport.removeProgressListener(listener); + if (progressSupport != null) { + progressSupport.removeProgressListener(listener); } } @@ -340,7 +323,7 @@ private void fireProgressListenerStep() { progressSupport.fireProgressListenerStep(this); } } - + private void fireProgressListenerStep(int count) { if (progressSupport != null) { progressSupport.fireProgressListenerStep(this, count); @@ -352,10 +335,10 @@ private void fireProgressListenerStop() { progressSupport.fireProgressListenerStop(this); } } - + private void setWrappers(Transaction commit, UndoableWrapper wrap) { wrap.setActive(true, this); - + // if (!(commit instanceof RefactoringCommit)) // return; // for (FileObject f:((RefactoringCommit) commit).getModifiedFiles()) { @@ -375,16 +358,17 @@ private Document getDocument(FileObject f) { try { DataObject dob = DataObject.find(f); EditorCookie cookie = dob.getLookup().lookup(EditorCookie.class); - if (cookie == null) + if (cookie == null) { return null; + } return cookie.getDocument(); } catch (DataObjectNotFoundException ex) { return null; } } - private class ElementsCollection extends AbstractCollection { + @Override public Iterator iterator() { return new Iterator() { @@ -396,17 +380,20 @@ public Iterator iterator() { public void remove() { throw new UnsupportedOperationException(); } - + @Override public RefactoringElement next() { if (index < internalList.size()) { - return new RefactoringElement(internalList.get(index++)); + RefactoringElementImplementation implementation = internalList.get(index); + ++index; + return new RefactoringElement(implementation); } else { return new RefactoringElement(inner2.next()); } } - + @Override + @SuppressWarnings("SleepWhileInLoop") public boolean hasNext() { boolean hasNext = index < internalList.size(); if (hasNext) { @@ -419,8 +406,9 @@ public boolean hasNext() { Exceptions.printStackTrace(ex); } hasNext = index < internalList.size(); - if (hasNext) + if (hasNext) { return hasNext; + } } return index < internalList.size() || inner2.hasNext(); } From 4ca7524897cfc8b5199684d3eede2415ebee415b Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Thu, 11 Jan 2018 09:53:42 +0100 Subject: [PATCH 2/9] code cleanup --- .../refactoring/api/RefactoringSession.java | 97 ++++++++----------- 1 file changed, 38 insertions(+), 59 deletions(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index d31646eb8b87..fe4b011fd7f9 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -23,7 +23,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.text.Document; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.editor.mimelookup.MimeLookup; @@ -37,11 +36,8 @@ import org.netbeans.modules.refactoring.spi.impl.UndoManager; import org.netbeans.modules.refactoring.spi.impl.UndoableWrapper; import org.openide.LifecycleManager; -import org.openide.cookies.EditorCookie; import org.openide.cookies.SaveCookie; -import org.openide.filesystems.FileObject; import org.openide.loaders.DataObject; -import org.openide.loaders.DataObjectNotFoundException; import org.openide.util.Exceptions; import org.openide.util.Parameters; @@ -63,6 +59,7 @@ public final class RefactoringSession { @SuppressWarnings("PackageVisibleField") boolean realcommit = true; + private ProgressSupport progressSupport; @SuppressWarnings("LeakingThisInConstructor") @@ -96,8 +93,7 @@ public Problem doRefactoring(final boolean saveAfterDone) { } private Problem reallyDoRefactoring(boolean saveAfterDone) { - long time = System.currentTimeMillis(); - + final long start = System.currentTimeMillis(); Iterator it = internalList.iterator(); ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); float progressStep = (float) COMMITSTEPS / internalList.size(); @@ -112,9 +108,7 @@ private Problem reallyDoRefactoring(boolean saveAfterDone) { try { while (it.hasNext()) { RefactoringElementImplementation element = (RefactoringElementImplementation) it.next(); - if (element.isEnabled() && !((element.getStatus() == RefactoringElement.GUARDED) || (element.getStatus() == RefactoringElement.READ_ONLY))) { - element.performChange(); - } + changeRefactoringElement(element, true); current += progressStep; fireProgressListenerStep((int) current); } @@ -123,7 +117,7 @@ private Problem reallyDoRefactoring(boolean saveAfterDone) { UndoableWrapper undoableWrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); commits.forEach(commit -> { if (undoableWrapper != null) { - setWrappers(commit, undoableWrapper); + undoableWrapper.setActive(true, this); } if (commit instanceof ProgressProvider) { ProgressProvider progressProvider = (ProgressProvider) commit; @@ -137,7 +131,7 @@ private Problem reallyDoRefactoring(boolean saveAfterDone) { commit.commit(); } if (undoableWrapper != null) { - unsetWrappers(commit, undoableWrapper); + undoableWrapper.setActive(false, null); } }); if (undoableWrapper != null) { @@ -168,8 +162,8 @@ private Problem reallyDoRefactoring(boolean saveAfterDone) { } Logger timer = Logger.getLogger("TIMER.RefactoringSession"); if (timer.isLoggable(Level.FINE)) { - time = System.currentTimeMillis() - time; - timer.log(Level.FINE, "refactoringSession.doRefactoring", new Object[]{description, RefactoringSession.this, time}); + final long timeTaken = System.currentTimeMillis() - start; + timer.log(Level.FINE, "refactoringSession.doRefactoring", new Object[]{description, RefactoringSession.this, timeTaken}); } return null; } @@ -201,8 +195,9 @@ public void step(ProgressEvent event) { @Override public void stop(ProgressEvent event) { - // do not rely on plugins; + /* do not rely on plugins; */ } + } /** @@ -218,7 +213,7 @@ public Problem undoRefactoring(final boolean saveAfterDone) { private Problem reallyUndoRefactoring(boolean saveAfterDone) { try { - ListIterator it = internalList.listIterator(internalList.size()); + ListIterator internalListIterator = internalList.listIterator(internalList.size()); fireProgressListenerStart(0, internalList.size() + 1); ArrayList fileChanges = SPIAccessor.DEFAULT.getFileChanges(bag); ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); @@ -228,23 +223,20 @@ private Problem reallyUndoRefactoring(boolean saveAfterDone) { f.undoChange(); } } - SPIAccessor.DEFAULT.getCommits(bag).forEach((commit) -> SPIAccessor.DEFAULT.check(commit, true)); - UndoableWrapper wrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); + SPIAccessor.DEFAULT.getCommits(bag).forEach(commit -> SPIAccessor.DEFAULT.check(commit, true)); + UndoableWrapper undoableWrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); for (ListIterator commitIterator = commits.listIterator(commits.size()); commitIterator.hasPrevious();) { final Transaction commit = commitIterator.previous(); - setWrappers(commit, wrapper); + undoableWrapper.setActive(true, this); commit.rollback(); - unsetWrappers(commit, wrapper); + undoableWrapper.setActive(false, null); } - wrapper.close(); + undoableWrapper.close(); SPIAccessor.DEFAULT.getCommits(bag).forEach((commit) -> SPIAccessor.DEFAULT.sum(commit)); - - while (it.hasPrevious()) { + while (internalListIterator.hasPrevious()) { fireProgressListenerStep(); - RefactoringElementImplementation element = (RefactoringElementImplementation) it.previous(); - if (element.isEnabled() && !((element.getStatus() == RefactoringElement.GUARDED) || (element.getStatus() == RefactoringElement.READ_ONLY))) { - element.undoChange(); - } + RefactoringElementImplementation element = (RefactoringElementImplementation) internalListIterator.previous(); + changeRefactoringElement(element, false); } if (saveAfterDone) { LifecycleManager.getDefault().saveAll(); @@ -256,6 +248,19 @@ private Problem reallyUndoRefactoring(boolean saveAfterDone) { return null; } + private void changeRefactoringElement(RefactoringElementImplementation element, boolean change) { + boolean enabled = element.isEnabled(); + boolean guarded = element.getStatus() == RefactoringElement.GUARDED; + boolean readOnly = element.getStatus() == RefactoringElement.READ_ONLY; + if (enabled && !(guarded || readOnly)) { + if (change) { + element.performChange(); + } else { + element.undoChange(); + } + } + } + /** * Get elements from session * @@ -270,7 +275,8 @@ public Collection getRefactoringElements() { } /** - * Inform the session it, and all its plugins, are finished. + * Inform the session internalListIterator, and all its plugins, are + * finished. * * @since 1.28 * @see #getRefactoringElements() @@ -336,43 +342,12 @@ private void fireProgressListenerStop() { } } - private void setWrappers(Transaction commit, UndoableWrapper wrap) { - wrap.setActive(true, this); - - // if (!(commit instanceof RefactoringCommit)) - // return; - // for (FileObject f:((RefactoringCommit) commit).getModifiedFiles()) { - // Document doc = getDocument(f); - // if (doc!=null) - // doc.putProperty(BaseDocument.UndoableEditWrapper.class, wrap); - // } - } - - private void unsetWrappers(Transaction commit, UndoableWrapper wrap) { - wrap.setActive(false, null); - - // setWrappers(commit, null); - } - - private Document getDocument(FileObject f) { - try { - DataObject dob = DataObject.find(f); - EditorCookie cookie = dob.getLookup().lookup(EditorCookie.class); - if (cookie == null) { - return null; - } - return cookie.getDocument(); - } catch (DataObjectNotFoundException ex) { - return null; - } - } - private class ElementsCollection extends AbstractCollection { @Override public Iterator iterator() { return new Iterator() { - //private final Iterator inner = internalList.iterator(); + private final Iterator inner2 = SPIAccessor.DEFAULT.getFileChanges(bag).iterator(); private int index = 0; @@ -412,12 +387,16 @@ public boolean hasNext() { } return index < internalList.size() || inner2.hasNext(); } + }; + } @Override public int size() { return internalList.size() + SPIAccessor.DEFAULT.getFileChanges(bag).size(); } + } + } From 862ad2d400ce6297a0cae28fa879b2099566ea40 Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Fri, 12 Jan 2018 01:59:16 +0100 Subject: [PATCH 3/9] type safety by generics --- .../modules/refactoring/api/RefactoringSession.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index fe4b011fd7f9..a13624271437 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -213,7 +213,7 @@ public Problem undoRefactoring(final boolean saveAfterDone) { private Problem reallyUndoRefactoring(boolean saveAfterDone) { try { - ListIterator internalListIterator = internalList.listIterator(internalList.size()); + ListIterator internalListIterator = internalList.listIterator(internalList.size()); fireProgressListenerStart(0, internalList.size() + 1); ArrayList fileChanges = SPIAccessor.DEFAULT.getFileChanges(bag); ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); @@ -235,7 +235,7 @@ private Problem reallyUndoRefactoring(boolean saveAfterDone) { SPIAccessor.DEFAULT.getCommits(bag).forEach((commit) -> SPIAccessor.DEFAULT.sum(commit)); while (internalListIterator.hasPrevious()) { fireProgressListenerStep(); - RefactoringElementImplementation element = (RefactoringElementImplementation) internalListIterator.previous(); + RefactoringElementImplementation element = internalListIterator.previous(); changeRefactoringElement(element, false); } if (saveAfterDone) { @@ -347,7 +347,7 @@ private class ElementsCollection extends AbstractCollection @Override public Iterator iterator() { return new Iterator() { - + private final Iterator inner2 = SPIAccessor.DEFAULT.getFileChanges(bag).iterator(); private int index = 0; From 1ce564b3a65ae3cdcb6f6ba0abd638b68c847751 Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Fri, 12 Jan 2018 18:55:36 +0100 Subject: [PATCH 4/9] stream api overhaul; the refactoring methods work on three different class member collections, which all contain some sort of RefactoringElement; it is not completely clear, why they are there, and what they are doing; looks like file changes, commits, and a mysterious inner list; one of the refactoring method is full of try and finally blocks, but they don't catch exceptions by itself; --- .../refactoring/api/RefactoringSession.java | 267 +++++++++++------- 1 file changed, 159 insertions(+), 108 deletions(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index a13624271437..e7b8fb760108 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -26,6 +26,7 @@ import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.api.editor.mimelookup.MimePath; import org.netbeans.editor.Utilities; import org.netbeans.modules.refactoring.api.impl.ProgressSupport; import org.netbeans.modules.refactoring.api.impl.SPIAccessor; @@ -48,13 +49,13 @@ */ public final class RefactoringSession { - private static final int COMMITSTEPS = 100; + private static final int COMMIT_STEPS = 100; private final ArrayList internalList = new ArrayList<>(); private final Collection refactoringElements = new ElementsCollection(); + private final RefactoringElementsBag bag; private final UndoManager undoManager = UndoManager.getDefault(); private final AtomicBoolean finished = new AtomicBoolean(false); - private final RefactoringElementsBag bag; private final String description; @SuppressWarnings("PackageVisibleField") @@ -89,101 +90,113 @@ public static RefactoringSession create(@NonNull String description) { */ @CheckForNull public Problem doRefactoring(final boolean saveAfterDone) { - return Utilities.runWithOnSaveTasksDisabled(() -> reallyDoRefactoring(saveAfterDone)); - } + return Utilities.runWithOnSaveTasksDisabled(() -> { - private Problem reallyDoRefactoring(boolean saveAfterDone) { - final long start = System.currentTimeMillis(); - Iterator it = internalList.iterator(); - ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); - float progressStep = (float) COMMITSTEPS / internalList.size(); - float current = 0F; - fireProgressListenerStart(0, COMMITSTEPS + commits.size() * COMMITSTEPS + 1); - ProgressListener progressListener = new ProgressL(commits, COMMITSTEPS); - if (realcommit) { - undoManager.transactionStarted(); - undoManager.setUndoDescription(description); - } - try { + final long start = System.currentTimeMillis(); + + /* commits */ + ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); + { + int count = COMMIT_STEPS + commits.size() * COMMIT_STEPS + 1; + fireProgressListenerStart(0, count); + } + if (realcommit) { + undoManager.transactionStarted(); + undoManager.setUndoDescription(description); + } try { - while (it.hasNext()) { - RefactoringElementImplementation element = (RefactoringElementImplementation) it.next(); - changeRefactoringElement(element, true); - current += progressStep; - fireProgressListenerStep((int) current); - } - } finally { - commits.forEach(commit -> SPIAccessor.DEFAULT.check(commit, false)); - UndoableWrapper undoableWrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); - commits.forEach(commit -> { - if (undoableWrapper != null) { - undoableWrapper.setActive(true, this); + + try { + float progressStep = (float) COMMIT_STEPS / internalList.size(); + float current = 0F; + + /* internal list */ + for (RefactoringElementImplementation element : internalList) { + performChange(element, true); + current += progressStep; + fireProgressListenerStep((int) current); } - if (commit instanceof ProgressProvider) { - ProgressProvider progressProvider = (ProgressProvider) commit; - progressProvider.addProgressListener(progressListener); - try { + } finally { + commits.forEach(commit -> SPIAccessor.DEFAULT.check(commit, false)); + UndoableWrapper undoableWrapper = MimeLookup.getLookup(MimePath.EMPTY).lookup(UndoableWrapper.class); + undoableWrapper.setActive(true, this); + commits.stream().forEachOrdered(commit -> { + if (commit instanceof ProgressProvider) { + ProgressProvider provider = (ProgressProvider) commit; + ProgressListener listener = new ProgressListenerImplementation(commits, COMMIT_STEPS); + provider.addProgressListener(listener); + try { + commit.commit(); + } finally { + provider.removeProgressListener(listener); + } + } else { commit.commit(); - } finally { - progressProvider.removeProgressListener(progressListener); } - } else { - commit.commit(); - } - if (undoableWrapper != null) { - undoableWrapper.setActive(false, null); - } - }); - if (undoableWrapper != null) { + }); + undoableWrapper.setActive(false, null); undoableWrapper.close(); + commits.forEach(commit -> SPIAccessor.DEFAULT.sum(commit)); } - commits.forEach(commit -> SPIAccessor.DEFAULT.sum(commit)); - } - if (saveAfterDone) { - LifecycleManager.getDefault().saveAll(); - for (DataObject dataObject : DataObject.getRegistry().getModified()) { - SaveCookie cookie = dataObject.getLookup().lookup(SaveCookie.class); - try { - cookie.save(); - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } + + if (saveAfterDone) { + LifecycleManager.getDefault().saveAll(); + DataObject[] dataObjects = DataObject.getRegistry().getModified(); + Arrays.asList(dataObjects) + .stream() + .forEach(dataObject -> { + SaveCookie cookie = dataObject.getLookup().lookup(SaveCookie.class); + try { + cookie.save(); + } catch (IOException exception) { + Exceptions.printStackTrace(exception); + } + }); + } + + /* file changes */ + SPIAccessor.DEFAULT.getFileChanges(bag) + .stream() + .filter(fileChange -> fileChange.isEnabled()) + .forEachOrdered(fileChange -> fileChange.performChange()); + + fireProgressListenerStep(); + } finally { + fireProgressListenerStop(); + if (realcommit) { + undoManager.addItem(this); + undoManager.transactionEnded(false, this); + realcommit = false; } } - SPIAccessor.DEFAULT.getFileChanges(bag).stream().filter(fileChange -> fileChange.isEnabled()).forEachOrdered(fileChange -> fileChange.performChange()); - fireProgressListenerStep(); - } finally { - fireProgressListenerStop(); - if (realcommit) { - undoManager.addItem(this); - undoManager.transactionEnded(false, this); - realcommit = false; + + Logger timer = Logger.getLogger("TIMER.RefactoringSession"); + if (timer.isLoggable(Level.FINE)) { + final long timeTaken = System.currentTimeMillis() - start; + timer.log(Level.FINE, "refactoringSession.doRefactoring", new Object[]{description, RefactoringSession.this, timeTaken}); } - } - Logger timer = Logger.getLogger("TIMER.RefactoringSession"); - if (timer.isLoggable(Level.FINE)) { - final long timeTaken = System.currentTimeMillis() - start; - timer.log(Level.FINE, "refactoringSession.doRefactoring", new Object[]{description, RefactoringSession.this, timeTaken}); - } - return null; + + return null; + + }); } - private class ProgressL implements ProgressListener { + private class ProgressListenerImplementation implements ProgressListener { private float progressStep; private float current; private final ArrayList commits; private final int start; - ProgressL(ArrayList commits, int start) { + ProgressListenerImplementation(ArrayList commits, int start) { this.commits = commits; this.start = start; } @Override public void start(ProgressEvent event) { - progressStep = (float) COMMITSTEPS / event.getCount(); - current = start + commits.indexOf(event.getSource()) * COMMITSTEPS; + progressStep = (float) COMMIT_STEPS / event.getCount(); + current = start + commits.indexOf(event.getSource()) * COMMIT_STEPS; fireProgressListenerStep((int) current); } @@ -208,47 +221,85 @@ public void stop(ProgressEvent event) { */ @CheckForNull public Problem undoRefactoring(final boolean saveAfterDone) { - return Utilities.runWithOnSaveTasksDisabled(() -> reallyUndoRefactoring(saveAfterDone)); - } + return Utilities.runWithOnSaveTasksDisabled(() -> { - private Problem reallyUndoRefactoring(boolean saveAfterDone) { - try { - ListIterator internalListIterator = internalList.listIterator(internalList.size()); - fireProgressListenerStart(0, internalList.size() + 1); - ArrayList fileChanges = SPIAccessor.DEFAULT.getFileChanges(bag); - ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); - for (ListIterator fileChangeIterator = fileChanges.listIterator(fileChanges.size()); fileChangeIterator.hasPrevious();) { - RefactoringElementImplementation f = fileChangeIterator.previous(); - if (f.isEnabled()) { - f.undoChange(); + try { + { + int count = internalList.size() + 1; + fireProgressListenerStart(0, count); } - } - SPIAccessor.DEFAULT.getCommits(bag).forEach(commit -> SPIAccessor.DEFAULT.check(commit, true)); - UndoableWrapper undoableWrapper = MimeLookup.getLookup("").lookup(UndoableWrapper.class); - for (ListIterator commitIterator = commits.listIterator(commits.size()); commitIterator.hasPrevious();) { - final Transaction commit = commitIterator.previous(); - undoableWrapper.setActive(true, this); - commit.rollback(); - undoableWrapper.setActive(false, null); - } - undoableWrapper.close(); - SPIAccessor.DEFAULT.getCommits(bag).forEach((commit) -> SPIAccessor.DEFAULT.sum(commit)); - while (internalListIterator.hasPrevious()) { + + /* file changes */ + { + ArrayList fileChanges = SPIAccessor.DEFAULT.getFileChanges(bag); + /* + * make a copy, reversing the original would probably cause negative side effects; + * the original source code used an iterator object, which was a much less intrusive way to access data, + * but it also doesn't immediately leverage performance optimization for multi-processor hardware offered by the stream API, + * brought in with Java SE 8, and then you would have to trust and heavily rely on magic done by the virtual machine to make + * it performance wise somewhat snappier + */ + ArrayList fileChangesReversed = new ArrayList<>(fileChanges.size()); + Collections.copy(fileChangesReversed, fileChanges); + Collections.reverse(fileChangesReversed); + fileChangesReversed.stream() + .filter(fileChange -> fileChange.isEnabled()) + .forEachOrdered(fileChange -> fileChange.undoChange()); + } + + /* commits */ + { + ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); + commits.forEach(commit -> SPIAccessor.DEFAULT.check(commit, true)); + ArrayList commitsReversed = new ArrayList<>(commits.size()); + Collections.copy(commitsReversed, commits); + Collections.reverse(commitsReversed); + /* + * moved wrapper access out of the loop, since it doesn't access any particular loop object, + * and it seems to be more like an active light switch, which is constantly turned on an off for no good reason + * since it is dark anyway, as long as the loop processing occurs + */ + UndoableWrapper undoableWrapper = MimeLookup.getLookup(MimePath.EMPTY).lookup(UndoableWrapper.class); + undoableWrapper.setActive(true, this); + commitsReversed.stream() + .forEachOrdered(commit -> commit.rollback()); + undoableWrapper.setActive(false, null); + undoableWrapper.close(); + commits.forEach(commit -> SPIAccessor.DEFAULT.sum(commit)); + } + + /* internal list */ + { + ArrayList internalListReversed = new ArrayList<>(internalList.size()); + Collections.copy(internalListReversed, internalList); + Collections.reverse(internalListReversed); + internalListReversed.stream().forEachOrdered(element -> { + fireProgressListenerStep(); + performChange(element, false); + }); + } + + if (saveAfterDone) { + LifecycleManager.getDefault().saveAll(); + } + fireProgressListenerStep(); - RefactoringElementImplementation element = internalListIterator.previous(); - changeRefactoringElement(element, false); - } - if (saveAfterDone) { - LifecycleManager.getDefault().saveAll(); + } finally { + fireProgressListenerStop(); } - fireProgressListenerStep(); - } finally { - fireProgressListenerStop(); - } - return null; + + return null; + + }); } - private void changeRefactoringElement(RefactoringElementImplementation element, boolean change) { + /** + * Performs either the specified refactoring change, or undoes it. + * + * @param element the refactoring change + * @param change true, if change should be applied + */ + private void performChange(RefactoringElementImplementation element, boolean change) { boolean enabled = element.isEnabled(); boolean guarded = element.getStatus() == RefactoringElement.GUARDED; boolean readOnly = element.getStatus() == RefactoringElement.READ_ONLY; From d195fc6aa2a1aedf56517206d7fb70c52e4a1af6 Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Fri, 12 Jan 2018 21:13:27 +0100 Subject: [PATCH 5/9] stick to the natural order of things --- .../modules/refactoring/api/RefactoringSession.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index e7b8fb760108..1f06677f1b2d 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -144,7 +144,7 @@ public Problem doRefactoring(final boolean saveAfterDone) { DataObject[] dataObjects = DataObject.getRegistry().getModified(); Arrays.asList(dataObjects) .stream() - .forEach(dataObject -> { + .forEachOrdered(dataObject -> { SaveCookie cookie = dataObject.getLookup().lookup(SaveCookie.class); try { cookie.save(); @@ -410,9 +410,7 @@ public void remove() { @Override public RefactoringElement next() { if (index < internalList.size()) { - RefactoringElementImplementation implementation = internalList.get(index); - ++index; - return new RefactoringElement(implementation); + return new RefactoringElement(internalList.get(index++)); } else { return new RefactoringElement(inner2.next()); } From e5f243d8082e1cc92ab37cc56351201b55616669 Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Sat, 13 Jan 2018 11:24:48 +0100 Subject: [PATCH 6/9] against the order of maw --- .../netbeans/modules/refactoring/api/RefactoringSession.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index 1f06677f1b2d..7bc35f1e8fe7 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -144,7 +144,7 @@ public Problem doRefactoring(final boolean saveAfterDone) { DataObject[] dataObjects = DataObject.getRegistry().getModified(); Arrays.asList(dataObjects) .stream() - .forEachOrdered(dataObject -> { + .forEach(dataObject -> { SaveCookie cookie = dataObject.getLookup().lookup(SaveCookie.class); try { cookie.save(); From 22e386e963093194eb0a2c8bdf57c5544d86d691 Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Sat, 13 Jan 2018 11:26:56 +0100 Subject: [PATCH 7/9] fixing error messages --- .../api/impl/ProgressSupportTest.java | 226 -------------- .../api/ui/ActionInvocationTest.java | 288 ------------------ .../plugins/FilesCopyPluginTest.java | 131 -------- .../refactoring/spi/BackupFacilityTest.java | 96 ------ 4 files changed, 741 deletions(-) delete mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java delete mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java delete mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java delete mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java deleted file mode 100644 index 61e29a2ee342..000000000000 --- a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.netbeans.modules.refactoring.api.impl; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.netbeans.modules.refactoring.api.ProgressEvent; -import static org.junit.Assert.*; -import org.netbeans.modules.refactoring.api.ProgressListener; - -/** - * - * @author Jan Pokorsky - */ -public class ProgressSupportTest { - - public ProgressSupportTest() { - } - - @Before - public void setUp() { - } - - @After - public void tearDown() { - } - - @Test - public void testDeterministicProgress() { - System.out.println("testDeterministicProgress"); - PL listener = new PL(); - ProgressSupport instance = new ProgressSupport(); - instance.addProgressListener(listener); - - // start indeterminate progress - instance.fireProgressListenerStart(this,ProgressEvent.START, 4); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); - assertEquals("progress", 4, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 0, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 1, listener.event.getCount()); - listener.reset(); - - // step to 3 - instance.fireProgressListenerStep(this, 3); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 3, listener.event.getCount()); - listener.reset(); - - // stop - instance.fireProgressListenerStop(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); - } - - @Test - public void testIndeterministicProgress() { - System.out.println("testIndeterministicProgress"); - PL listener = new PL(); - ProgressSupport instance = new ProgressSupport(); - instance.addProgressListener(listener); - - // start indeterminate progress - instance.fireProgressListenerStart(this,ProgressEvent.START, -1); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // stop - instance.fireProgressListenerStop(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); - } - - @Test - public void testIndeterministicToDeterministicProgress1() { - System.out.println("testIndeterministicToDeterministicProgress1"); - PL listener = new PL(); - ProgressSupport instance = new ProgressSupport(); - instance.addProgressListener(listener); - - // start indeterminate progress - instance.fireProgressListenerStart(this,ProgressEvent.START, -1); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // switch to deterministic progress of size 10 - instance.fireProgressListenerStep(this, 10); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 10, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 0, listener.event.getCount()); - listener.reset(); - - // stop - instance.fireProgressListenerStop(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); - } - - @Test - public void testIndeterministicToDeterministicProgress2() { - System.out.println("testIndeterministicToDeterministicProgress2"); - PL listener = new PL(); - ProgressSupport instance = new ProgressSupport(); - instance.addProgressListener(listener); - - // start indeterminate progress - instance.fireProgressListenerStart(this,ProgressEvent.START, -1); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", -1, listener.event.getCount()); - listener.reset(); - - // switch to deterministic progress of size 10 - instance.fireProgressListenerStep(this, 10); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 10, listener.event.getCount()); - listener.reset(); - - // step - instance.fireProgressListenerStep(this, 5); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); - assertEquals("progress", 5, listener.event.getCount()); - listener.reset(); - - // stop - instance.fireProgressListenerStop(this); - assertNotNull(listener.event); - assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); - } - - private static class PL implements ProgressListener { - private ProgressEvent event; - - @Override - public void start(ProgressEvent event) { - this.event = event; - } - - @Override - public void step(ProgressEvent event) { - this.event = event; - } - - @Override - public void stop(ProgressEvent event) { - this.event = event; - } - - public void reset() { - this.event = null; - } - } - -} diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java deleted file mode 100644 index 4933e393f45f..000000000000 --- a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.netbeans.modules.refactoring.api.ui; - -import java.awt.Component; -import java.io.IOException; -import java.io.OutputStream; -import java.lang.reflect.InvocationTargetException; -import javax.swing.Action; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; -import javax.swing.event.ChangeListener; -import org.netbeans.junit.NbTestCase; -import org.netbeans.modules.refactoring.api.AbstractRefactoring; -import org.netbeans.modules.refactoring.api.MoveRefactoring; -import org.netbeans.modules.refactoring.api.Problem; -import org.netbeans.modules.refactoring.api.RenameRefactoring; -import org.netbeans.modules.refactoring.spi.impl.ParametersPanel; -import org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider; -import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel; -import org.netbeans.modules.refactoring.spi.ui.RefactoringUI; -import org.netbeans.modules.refactoring.spi.ui.UI; -import org.openide.DialogDisplayer; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; -import org.openide.loaders.DataObject; -import org.openide.loaders.DataObjectNotFoundException; -import org.openide.nodes.Node; -import org.openide.util.Exceptions; -import org.openide.util.HelpCtx; -import org.openide.util.Lookup; -import org.openide.util.lookup.AbstractLookup; -import org.openide.util.lookup.InstanceContent; -import org.openide.util.lookup.Lookups; - -/** - * - * @author Jan Becicka - */ -public class ActionInvocationTest extends NbTestCase { - - private static class DummyUI implements RefactoringUI { - - public enum Kind { - MOVE, - RENAME - } - - private Lookup l; - private Kind kind; - - public DummyUI(Lookup lookup, Kind kind) { - Node node = lookup.lookup(Node.class); - this.l = Lookups.singleton(node.getLookup().lookup(FileObject.class)); - this.kind = kind; - } - - @Override - public String getName() { - return "dummy"; - } - - @Override - public String getDescription() { - return "dummy"; - } - - @Override - public boolean isQuery() { - return true; - } - - @Override - public CustomRefactoringPanel getPanel(ChangeListener parent) { - return new CustomRefactoringPanel() { - - @Override - public void initialize() { - } - - @Override - public Component getComponent() { - return new JPanel(); - } - }; - } - - @Override - public Problem setParameters() { - return null; - } - - @Override - public Problem checkParameters() { - return null; - } - - @Override - public boolean hasParameters() { - return false; - } - - @Override - public AbstractRefactoring getRefactoring() { - switch (kind) { - case MOVE: return new MoveRefactoring(l); - case RENAME: return new RenameRefactoring(l); - } - return null; - } - - @Override - public HelpCtx getHelpCtx() { - return new HelpCtx(DummyUI.class); - } - } - private FileObject f; - - /** Creates a new instance of ActionInstantiationTest */ - public ActionInvocationTest(String name) { - super(name); - } - - @Override - protected void setUp() throws IOException, Exception { - try { - super.setUp(); - f = FileUtil.createData(FileUtil.toFileObject(getWorkDir()), "test.txt"); - - OutputStream outputStream = f.getOutputStream(); - outputStream.write("test".getBytes()); - outputStream.close(); - - assertEquals(DD.class, Lookup.getDefault().lookup(DialogDisplayer.class).getClass()); - } catch (InterruptedException ex) { - Exceptions.printStackTrace(ex); - } - } - - public void testRenameAction() throws InterruptedException, InvocationTargetException, IOException { - DataObject testdo = DataObject.find(f); - final Node node = testdo.getNodeDelegate(); - - InstanceContent ic = new InstanceContent(); - Lookup lookup = new AbstractLookup(ic); - ic.add(node); - final Action rename = RefactoringActionsFactory.renameAction().createContextAwareInstance(lookup); - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - if (rename.isEnabled()) { - rename.actionPerformed(RefactoringActionsFactory.DEFAULT_EVENT); - if (!((RenameRefactoring) DD.rui.getRefactoring()).getRefactoringSource().lookup(FileObject.class).equals(f)) - fail("Rename dialog was opened with wrong data"); - } else { - fail("Action is not enabled."); - } - } - }); - } - - public void testMoveAction() throws InterruptedException, InvocationTargetException, DataObjectNotFoundException, IOException { - DataObject testdo = DataObject.find(f); - final Node node = testdo.getNodeDelegate(); - - InstanceContent ic = new InstanceContent(); - Lookup lookup = new AbstractLookup(ic); - ic.add(node); - final Action move = RefactoringActionsFactory.moveAction().createContextAwareInstance(lookup); - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - if (move.isEnabled()) { - move.actionPerformed(RefactoringActionsFactory.DEFAULT_EVENT); - if (!((MoveRefactoring) DD.rui.getRefactoring()).getRefactoringSource().lookup(FileObject.class).equals(f)) - fail("MoveClass was opened with wrong data"); - } else { - fail("Action is not enabled."); - } - } - }); - } - - public static final class Lkp extends org.openide.util.lookup.AbstractLookup { - public Lkp () { - this (new org.openide.util.lookup.InstanceContent ()); - } - - private Lkp (org.openide.util.lookup.InstanceContent ic) { - super (ic); - ic.add (new DD ()); - } - } - - @org.openide.util.lookup.ServiceProvider(service=org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider.class) - public static class DefaultActionsProvider extends ActionsImplementationProvider { - - public DefaultActionsProvider() { - } - - @Override - public boolean canMove(Lookup lookup) { - return true; - } - - @Override - public boolean canRename(Lookup lookup) { - return true; - } - - @Override - public void doMove(Lookup lookup) { - UI.openRefactoringUI(new DummyUI(lookup, DummyUI.Kind.MOVE)); - } - - @Override - public void doRename(Lookup lookup) { - UI.openRefactoringUI(new DummyUI(lookup, DummyUI.Kind.RENAME)); - } - - } - - /** Our own dialog displayer. - */ - @org.openide.util.lookup.ServiceProvider(service=org.openide.DialogDisplayer.class, supersedes="org.netbeans.core.windows.services.DialogDisplayerImpl") - public static final class DD extends org.openide.DialogDisplayer { - public static Object[] options; - public static RefactoringUI rui; - private Object toReturn; - - @Override - public java.awt.Dialog createDialog(org.openide.DialogDescriptor descriptor) { - JDialog dialog = new JDialog() { - @Override - public void setVisible(boolean visible) { - } - - @Override - public void show() { - } - }; - toReturn = descriptor.getMessage(); - if (toReturn instanceof Component) - dialog.getContentPane().add((Component) toReturn); - - if (toReturn instanceof ParametersPanel) { - try { - java.lang.reflect.Field f = toReturn.getClass().getDeclaredField("rui"); - f.setAccessible(true); - rui = (RefactoringUI) f.get(toReturn); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - return dialog; - } - - @Override - public Object notify(org.openide.NotifyDescriptor descriptor) { - assertNull (options); - assertNotNull(toReturn); - options = descriptor.getOptions(); - Object r = toReturn; - toReturn = null; - return r; - } - - } // end of DD -} diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java deleted file mode 100644 index 1c8abb114af9..000000000000 --- a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.refactoring.plugins; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import org.junit.*; -import org.netbeans.junit.NbTestCase; -import org.netbeans.modules.refactoring.api.AbstractRefactoring; -import org.netbeans.modules.refactoring.api.CopyRefactoring; -import org.netbeans.modules.refactoring.api.RefactoringSession; -import org.netbeans.modules.refactoring.api.SingleCopyRefactoring; -import org.netbeans.modules.refactoring.spi.RefactoringPlugin; -import org.netbeans.modules.refactoring.spi.RefactoringPluginFactory; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; -import org.openide.util.lookup.Lookups; -import org.openide.util.test.MockLookup; - -/** - * - * @author Ralph Ruijs - */ -public class FilesCopyPluginTest extends NbTestCase { - - private FileObject f; - private FileObject f1; - - public FilesCopyPluginTest(String name) { - super(name); - } - - @BeforeClass - public static void setUpClass() throws Exception { - MockLookup.setInstances(new RefactoringPluginFactory() { - - @Override - public RefactoringPlugin createInstance(AbstractRefactoring refactoring) { - return new FilesCopyPlugin(refactoring); - } - }); - } - - @AfterClass - public static void tearDownClass() throws Exception { - } - - @Before - public void setUp() throws IOException { - clearWorkDir(); - f = FileUtil.createData(FileUtil.toFileObject(getWorkDir()), "test"); - OutputStream outputStream = f.getOutputStream(); - outputStream.write("test".getBytes()); - outputStream.close(); - f1 = FileUtil.createData(FileUtil.toFileObject(getWorkDir()), "test1"); - outputStream = f1.getOutputStream(); - outputStream.write("test1".getBytes()); - outputStream.close(); - } - - @After - public void tearDown() { - } - - /** - * Test of preCheck method, of class FilesCopyPlugin. - */ - @Test - public void testChecks() { - FilesCopyPlugin copyPlugin = new FilesCopyPlugin(null); - assertEquals(null, copyPlugin.preCheck()); - assertEquals(null, copyPlugin.fastCheckParameters()); - assertEquals(null, copyPlugin.checkParameters()); - } - - /** - * Test of prepare method, of class FilesCopyPlugin. - */ - @Test - public void testPrepare() throws Exception { - RefactoringSession session = RefactoringSession.create("junit"); - CopyRefactoring copyRefactoring = new CopyRefactoring(Lookups.fixed(f)); - File target = new File(getWorkDirPath() + File.separatorChar + "junit" + File.separatorChar); - copyRefactoring.setTarget(Lookups.fixed(target.toURI().toURL())); - copyRefactoring.prepare(session); - session.doRefactoring(true); - FileObject newOne = copyRefactoring.getContext().lookup(FileObject.class); - assertEquals(newOne.asText(), f.asText()); - - session = RefactoringSession.create("junit1"); - target = new File(getWorkDirPath() + File.separatorChar + "junit1" + File.separatorChar); - copyRefactoring = new CopyRefactoring(Lookups.fixed(f, f1)); - copyRefactoring.setTarget(Lookups.fixed(target.toURI().toURL())); - copyRefactoring.prepare(session); - session.doRefactoring(true); - FileObject[] newOnes = copyRefactoring.getContext().lookup(FileObject[].class); - assertEquals(newOnes[0].asText(), f.asText()); - assertEquals(newOnes[0].getName(), f.getName()); - assertEquals(newOnes[1].asText(), f1.asText()); - assertEquals(newOnes[1].getName(), f1.getName()); - - session = RefactoringSession.create("junit2"); - SingleCopyRefactoring singleCopyRefactoring = new SingleCopyRefactoring(Lookups.fixed(f)); - target = new File(getWorkDirPath() + File.separatorChar + "junit" + File.separatorChar); - singleCopyRefactoring.setTarget(Lookups.fixed(target.toURI().toURL())); - String newName = "HelloWorld"; - singleCopyRefactoring.setNewName(newName); - singleCopyRefactoring.prepare(session); - session.doRefactoring(true); - FileObject newOneRenamed = singleCopyRefactoring.getContext().lookup(FileObject.class); - assertEquals(newOneRenamed.asText(), f.asText()); - assertEquals(newOneRenamed.getName(), newName); - } -} diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java deleted file mode 100644 index c09775cc8c77..000000000000 --- a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.netbeans.modules.refactoring.spi; - -import java.io.IOException; -import java.io.OutputStream; -import org.netbeans.junit.NbTestCase; -import org.netbeans.modules.refactoring.spi.BackupFacility2.Handle; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; - -/** - * - * @author Jan Becicka - */ -public class BackupFacilityTest extends NbTestCase { - - FileObject f; - FileObject f2; - private FileObject folder; - - public BackupFacilityTest(String testName) { - super(testName); - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - FileObject workdir = FileUtil.toFileObject(getWorkDir()); - f = FileUtil.createData(workdir, "test"); - folder = FileUtil.createFolder(workdir, "test2"); - f2 = FileUtil.createData(folder, "test"); - OutputStream outputStream = f.getOutputStream(); - outputStream.write("test".getBytes()); - outputStream.close(); - } - - @Override - protected void tearDown() throws Exception { - super.tearDown(); - } - - public void test93390() throws IOException { - Handle transactionId = BackupFacility2.getDefault().backup(f2); - f2.delete(); - folder.delete(); - assertFalse(f2.isValid()); - transactionId.restore(); - FileObject newone = FileUtil.toFileObject(FileUtil.toFile(f2)); - assertTrue(newone.isValid()); - } - - public void testBackupRestore() throws Exception { - Handle transactionId = BackupFacility2.getDefault().backup(f); - f.delete(); - assertFalse(f.isValid()); - transactionId.restore(); - FileObject newone = FileUtil.toFileObject(FileUtil.toFile(f)); - assertTrue(newone.isValid()); - } - - public void testClear() throws IOException { - Handle transactionId = BackupFacility2.getDefault().backup(f); - f.delete(); - assertFalse(f.isValid()); - BackupFacility2.getDefault().clear(); - try { - transactionId.restore(); - } catch (IllegalArgumentException iae) { - return; - } - fail("clear failed"); - } - - public void testGetDefault() { - assertNotNull(BackupFacility2.getDefault()); - } - -} From 24d766e168a805c50fb5dccde8278441a072231a Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Sat, 13 Jan 2018 18:53:38 +0100 Subject: [PATCH 8/9] Revert "fixing error messages" This reverts commit 22e386e963093194eb0a2c8bdf57c5544d86d691. --- .../api/impl/ProgressSupportTest.java | 226 ++++++++++++++ .../api/ui/ActionInvocationTest.java | 288 ++++++++++++++++++ .../plugins/FilesCopyPluginTest.java | 131 ++++++++ .../refactoring/spi/BackupFacilityTest.java | 96 ++++++ 4 files changed, 741 insertions(+) create mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java create mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java create mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java create mode 100644 refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java new file mode 100644 index 000000000000..61e29a2ee342 --- /dev/null +++ b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/impl/ProgressSupportTest.java @@ -0,0 +1,226 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.netbeans.modules.refactoring.api.impl; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.netbeans.modules.refactoring.api.ProgressEvent; +import static org.junit.Assert.*; +import org.netbeans.modules.refactoring.api.ProgressListener; + +/** + * + * @author Jan Pokorsky + */ +public class ProgressSupportTest { + + public ProgressSupportTest() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void testDeterministicProgress() { + System.out.println("testDeterministicProgress"); + PL listener = new PL(); + ProgressSupport instance = new ProgressSupport(); + instance.addProgressListener(listener); + + // start indeterminate progress + instance.fireProgressListenerStart(this,ProgressEvent.START, 4); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); + assertEquals("progress", 4, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 0, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 1, listener.event.getCount()); + listener.reset(); + + // step to 3 + instance.fireProgressListenerStep(this, 3); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 3, listener.event.getCount()); + listener.reset(); + + // stop + instance.fireProgressListenerStop(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); + } + + @Test + public void testIndeterministicProgress() { + System.out.println("testIndeterministicProgress"); + PL listener = new PL(); + ProgressSupport instance = new ProgressSupport(); + instance.addProgressListener(listener); + + // start indeterminate progress + instance.fireProgressListenerStart(this,ProgressEvent.START, -1); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // stop + instance.fireProgressListenerStop(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); + } + + @Test + public void testIndeterministicToDeterministicProgress1() { + System.out.println("testIndeterministicToDeterministicProgress1"); + PL listener = new PL(); + ProgressSupport instance = new ProgressSupport(); + instance.addProgressListener(listener); + + // start indeterminate progress + instance.fireProgressListenerStart(this,ProgressEvent.START, -1); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // switch to deterministic progress of size 10 + instance.fireProgressListenerStep(this, 10); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 10, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 0, listener.event.getCount()); + listener.reset(); + + // stop + instance.fireProgressListenerStop(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); + } + + @Test + public void testIndeterministicToDeterministicProgress2() { + System.out.println("testIndeterministicToDeterministicProgress2"); + PL listener = new PL(); + ProgressSupport instance = new ProgressSupport(); + instance.addProgressListener(listener); + + // start indeterminate progress + instance.fireProgressListenerStart(this,ProgressEvent.START, -1); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.START, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", -1, listener.event.getCount()); + listener.reset(); + + // switch to deterministic progress of size 10 + instance.fireProgressListenerStep(this, 10); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 10, listener.event.getCount()); + listener.reset(); + + // step + instance.fireProgressListenerStep(this, 5); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STEP, listener.event.getEventId()); + assertEquals("progress", 5, listener.event.getCount()); + listener.reset(); + + // stop + instance.fireProgressListenerStop(this); + assertNotNull(listener.event); + assertEquals("event ID", ProgressEvent.STOP, listener.event.getEventId()); + } + + private static class PL implements ProgressListener { + private ProgressEvent event; + + @Override + public void start(ProgressEvent event) { + this.event = event; + } + + @Override + public void step(ProgressEvent event) { + this.event = event; + } + + @Override + public void stop(ProgressEvent event) { + this.event = event; + } + + public void reset() { + this.event = null; + } + } + +} diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java new file mode 100644 index 000000000000..4933e393f45f --- /dev/null +++ b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/api/ui/ActionInvocationTest.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.netbeans.modules.refactoring.api.ui; + +import java.awt.Component; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import javax.swing.Action; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeListener; +import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.refactoring.api.AbstractRefactoring; +import org.netbeans.modules.refactoring.api.MoveRefactoring; +import org.netbeans.modules.refactoring.api.Problem; +import org.netbeans.modules.refactoring.api.RenameRefactoring; +import org.netbeans.modules.refactoring.spi.impl.ParametersPanel; +import org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider; +import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel; +import org.netbeans.modules.refactoring.spi.ui.RefactoringUI; +import org.netbeans.modules.refactoring.spi.ui.UI; +import org.openide.DialogDisplayer; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.loaders.DataObject; +import org.openide.loaders.DataObjectNotFoundException; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; +import org.openide.util.lookup.Lookups; + +/** + * + * @author Jan Becicka + */ +public class ActionInvocationTest extends NbTestCase { + + private static class DummyUI implements RefactoringUI { + + public enum Kind { + MOVE, + RENAME + } + + private Lookup l; + private Kind kind; + + public DummyUI(Lookup lookup, Kind kind) { + Node node = lookup.lookup(Node.class); + this.l = Lookups.singleton(node.getLookup().lookup(FileObject.class)); + this.kind = kind; + } + + @Override + public String getName() { + return "dummy"; + } + + @Override + public String getDescription() { + return "dummy"; + } + + @Override + public boolean isQuery() { + return true; + } + + @Override + public CustomRefactoringPanel getPanel(ChangeListener parent) { + return new CustomRefactoringPanel() { + + @Override + public void initialize() { + } + + @Override + public Component getComponent() { + return new JPanel(); + } + }; + } + + @Override + public Problem setParameters() { + return null; + } + + @Override + public Problem checkParameters() { + return null; + } + + @Override + public boolean hasParameters() { + return false; + } + + @Override + public AbstractRefactoring getRefactoring() { + switch (kind) { + case MOVE: return new MoveRefactoring(l); + case RENAME: return new RenameRefactoring(l); + } + return null; + } + + @Override + public HelpCtx getHelpCtx() { + return new HelpCtx(DummyUI.class); + } + } + private FileObject f; + + /** Creates a new instance of ActionInstantiationTest */ + public ActionInvocationTest(String name) { + super(name); + } + + @Override + protected void setUp() throws IOException, Exception { + try { + super.setUp(); + f = FileUtil.createData(FileUtil.toFileObject(getWorkDir()), "test.txt"); + + OutputStream outputStream = f.getOutputStream(); + outputStream.write("test".getBytes()); + outputStream.close(); + + assertEquals(DD.class, Lookup.getDefault().lookup(DialogDisplayer.class).getClass()); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } + } + + public void testRenameAction() throws InterruptedException, InvocationTargetException, IOException { + DataObject testdo = DataObject.find(f); + final Node node = testdo.getNodeDelegate(); + + InstanceContent ic = new InstanceContent(); + Lookup lookup = new AbstractLookup(ic); + ic.add(node); + final Action rename = RefactoringActionsFactory.renameAction().createContextAwareInstance(lookup); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + if (rename.isEnabled()) { + rename.actionPerformed(RefactoringActionsFactory.DEFAULT_EVENT); + if (!((RenameRefactoring) DD.rui.getRefactoring()).getRefactoringSource().lookup(FileObject.class).equals(f)) + fail("Rename dialog was opened with wrong data"); + } else { + fail("Action is not enabled."); + } + } + }); + } + + public void testMoveAction() throws InterruptedException, InvocationTargetException, DataObjectNotFoundException, IOException { + DataObject testdo = DataObject.find(f); + final Node node = testdo.getNodeDelegate(); + + InstanceContent ic = new InstanceContent(); + Lookup lookup = new AbstractLookup(ic); + ic.add(node); + final Action move = RefactoringActionsFactory.moveAction().createContextAwareInstance(lookup); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + if (move.isEnabled()) { + move.actionPerformed(RefactoringActionsFactory.DEFAULT_EVENT); + if (!((MoveRefactoring) DD.rui.getRefactoring()).getRefactoringSource().lookup(FileObject.class).equals(f)) + fail("MoveClass was opened with wrong data"); + } else { + fail("Action is not enabled."); + } + } + }); + } + + public static final class Lkp extends org.openide.util.lookup.AbstractLookup { + public Lkp () { + this (new org.openide.util.lookup.InstanceContent ()); + } + + private Lkp (org.openide.util.lookup.InstanceContent ic) { + super (ic); + ic.add (new DD ()); + } + } + + @org.openide.util.lookup.ServiceProvider(service=org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider.class) + public static class DefaultActionsProvider extends ActionsImplementationProvider { + + public DefaultActionsProvider() { + } + + @Override + public boolean canMove(Lookup lookup) { + return true; + } + + @Override + public boolean canRename(Lookup lookup) { + return true; + } + + @Override + public void doMove(Lookup lookup) { + UI.openRefactoringUI(new DummyUI(lookup, DummyUI.Kind.MOVE)); + } + + @Override + public void doRename(Lookup lookup) { + UI.openRefactoringUI(new DummyUI(lookup, DummyUI.Kind.RENAME)); + } + + } + + /** Our own dialog displayer. + */ + @org.openide.util.lookup.ServiceProvider(service=org.openide.DialogDisplayer.class, supersedes="org.netbeans.core.windows.services.DialogDisplayerImpl") + public static final class DD extends org.openide.DialogDisplayer { + public static Object[] options; + public static RefactoringUI rui; + private Object toReturn; + + @Override + public java.awt.Dialog createDialog(org.openide.DialogDescriptor descriptor) { + JDialog dialog = new JDialog() { + @Override + public void setVisible(boolean visible) { + } + + @Override + public void show() { + } + }; + toReturn = descriptor.getMessage(); + if (toReturn instanceof Component) + dialog.getContentPane().add((Component) toReturn); + + if (toReturn instanceof ParametersPanel) { + try { + java.lang.reflect.Field f = toReturn.getClass().getDeclaredField("rui"); + f.setAccessible(true); + rui = (RefactoringUI) f.get(toReturn); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + return dialog; + } + + @Override + public Object notify(org.openide.NotifyDescriptor descriptor) { + assertNull (options); + assertNotNull(toReturn); + options = descriptor.getOptions(); + Object r = toReturn; + toReturn = null; + return r; + } + + } // end of DD +} diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java new file mode 100644 index 000000000000..1c8abb114af9 --- /dev/null +++ b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/plugins/FilesCopyPluginTest.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.refactoring.plugins; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import org.junit.*; +import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.refactoring.api.AbstractRefactoring; +import org.netbeans.modules.refactoring.api.CopyRefactoring; +import org.netbeans.modules.refactoring.api.RefactoringSession; +import org.netbeans.modules.refactoring.api.SingleCopyRefactoring; +import org.netbeans.modules.refactoring.spi.RefactoringPlugin; +import org.netbeans.modules.refactoring.spi.RefactoringPluginFactory; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.util.lookup.Lookups; +import org.openide.util.test.MockLookup; + +/** + * + * @author Ralph Ruijs + */ +public class FilesCopyPluginTest extends NbTestCase { + + private FileObject f; + private FileObject f1; + + public FilesCopyPluginTest(String name) { + super(name); + } + + @BeforeClass + public static void setUpClass() throws Exception { + MockLookup.setInstances(new RefactoringPluginFactory() { + + @Override + public RefactoringPlugin createInstance(AbstractRefactoring refactoring) { + return new FilesCopyPlugin(refactoring); + } + }); + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Before + public void setUp() throws IOException { + clearWorkDir(); + f = FileUtil.createData(FileUtil.toFileObject(getWorkDir()), "test"); + OutputStream outputStream = f.getOutputStream(); + outputStream.write("test".getBytes()); + outputStream.close(); + f1 = FileUtil.createData(FileUtil.toFileObject(getWorkDir()), "test1"); + outputStream = f1.getOutputStream(); + outputStream.write("test1".getBytes()); + outputStream.close(); + } + + @After + public void tearDown() { + } + + /** + * Test of preCheck method, of class FilesCopyPlugin. + */ + @Test + public void testChecks() { + FilesCopyPlugin copyPlugin = new FilesCopyPlugin(null); + assertEquals(null, copyPlugin.preCheck()); + assertEquals(null, copyPlugin.fastCheckParameters()); + assertEquals(null, copyPlugin.checkParameters()); + } + + /** + * Test of prepare method, of class FilesCopyPlugin. + */ + @Test + public void testPrepare() throws Exception { + RefactoringSession session = RefactoringSession.create("junit"); + CopyRefactoring copyRefactoring = new CopyRefactoring(Lookups.fixed(f)); + File target = new File(getWorkDirPath() + File.separatorChar + "junit" + File.separatorChar); + copyRefactoring.setTarget(Lookups.fixed(target.toURI().toURL())); + copyRefactoring.prepare(session); + session.doRefactoring(true); + FileObject newOne = copyRefactoring.getContext().lookup(FileObject.class); + assertEquals(newOne.asText(), f.asText()); + + session = RefactoringSession.create("junit1"); + target = new File(getWorkDirPath() + File.separatorChar + "junit1" + File.separatorChar); + copyRefactoring = new CopyRefactoring(Lookups.fixed(f, f1)); + copyRefactoring.setTarget(Lookups.fixed(target.toURI().toURL())); + copyRefactoring.prepare(session); + session.doRefactoring(true); + FileObject[] newOnes = copyRefactoring.getContext().lookup(FileObject[].class); + assertEquals(newOnes[0].asText(), f.asText()); + assertEquals(newOnes[0].getName(), f.getName()); + assertEquals(newOnes[1].asText(), f1.asText()); + assertEquals(newOnes[1].getName(), f1.getName()); + + session = RefactoringSession.create("junit2"); + SingleCopyRefactoring singleCopyRefactoring = new SingleCopyRefactoring(Lookups.fixed(f)); + target = new File(getWorkDirPath() + File.separatorChar + "junit" + File.separatorChar); + singleCopyRefactoring.setTarget(Lookups.fixed(target.toURI().toURL())); + String newName = "HelloWorld"; + singleCopyRefactoring.setNewName(newName); + singleCopyRefactoring.prepare(session); + session.doRefactoring(true); + FileObject newOneRenamed = singleCopyRefactoring.getContext().lookup(FileObject.class); + assertEquals(newOneRenamed.asText(), f.asText()); + assertEquals(newOneRenamed.getName(), newName); + } +} diff --git a/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java new file mode 100644 index 000000000000..c09775cc8c77 --- /dev/null +++ b/refactoring.api/test/unit/src/org/netbeans/modules/refactoring/spi/BackupFacilityTest.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.netbeans.modules.refactoring.spi; + +import java.io.IOException; +import java.io.OutputStream; +import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.refactoring.spi.BackupFacility2.Handle; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author Jan Becicka + */ +public class BackupFacilityTest extends NbTestCase { + + FileObject f; + FileObject f2; + private FileObject folder; + + public BackupFacilityTest(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + FileObject workdir = FileUtil.toFileObject(getWorkDir()); + f = FileUtil.createData(workdir, "test"); + folder = FileUtil.createFolder(workdir, "test2"); + f2 = FileUtil.createData(folder, "test"); + OutputStream outputStream = f.getOutputStream(); + outputStream.write("test".getBytes()); + outputStream.close(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void test93390() throws IOException { + Handle transactionId = BackupFacility2.getDefault().backup(f2); + f2.delete(); + folder.delete(); + assertFalse(f2.isValid()); + transactionId.restore(); + FileObject newone = FileUtil.toFileObject(FileUtil.toFile(f2)); + assertTrue(newone.isValid()); + } + + public void testBackupRestore() throws Exception { + Handle transactionId = BackupFacility2.getDefault().backup(f); + f.delete(); + assertFalse(f.isValid()); + transactionId.restore(); + FileObject newone = FileUtil.toFileObject(FileUtil.toFile(f)); + assertTrue(newone.isValid()); + } + + public void testClear() throws IOException { + Handle transactionId = BackupFacility2.getDefault().backup(f); + f.delete(); + assertFalse(f.isValid()); + BackupFacility2.getDefault().clear(); + try { + transactionId.restore(); + } catch (IllegalArgumentException iae) { + return; + } + fail("clear failed"); + } + + public void testGetDefault() { + assertNotNull(BackupFacility2.getDefault()); + } + +} From bc454b4aaafcdba81d2c113f959f6b917d960b4e Mon Sep 17 00:00:00 2001 From: Carsten Petschel Date: Sat, 13 Jan 2018 19:52:08 +0100 Subject: [PATCH 9/9] for the queen --- .../refactoring/api/RefactoringSession.java | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java index 7bc35f1e8fe7..1f532456974a 100644 --- a/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java +++ b/refactoring.api/src/org/netbeans/modules/refactoring/api/RefactoringSession.java @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Stream; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.editor.mimelookup.MimeLookup; @@ -142,8 +143,7 @@ public Problem doRefactoring(final boolean saveAfterDone) { if (saveAfterDone) { LifecycleManager.getDefault().saveAll(); DataObject[] dataObjects = DataObject.getRegistry().getModified(); - Arrays.asList(dataObjects) - .stream() + Stream.of(dataObjects) .forEach(dataObject -> { SaveCookie cookie = dataObject.getLookup().lookup(SaveCookie.class); try { @@ -229,36 +229,20 @@ public Problem undoRefactoring(final boolean saveAfterDone) { fireProgressListenerStart(0, count); } - /* file changes */ { ArrayList fileChanges = SPIAccessor.DEFAULT.getFileChanges(bag); - /* - * make a copy, reversing the original would probably cause negative side effects; - * the original source code used an iterator object, which was a much less intrusive way to access data, - * but it also doesn't immediately leverage performance optimization for multi-processor hardware offered by the stream API, - * brought in with Java SE 8, and then you would have to trust and heavily rely on magic done by the virtual machine to make - * it performance wise somewhat snappier - */ - ArrayList fileChangesReversed = new ArrayList<>(fileChanges.size()); - Collections.copy(fileChangesReversed, fileChanges); + ArrayList fileChangesReversed = new ArrayList<>(fileChanges); Collections.reverse(fileChangesReversed); fileChangesReversed.stream() .filter(fileChange -> fileChange.isEnabled()) .forEachOrdered(fileChange -> fileChange.undoChange()); } - /* commits */ { ArrayList commits = SPIAccessor.DEFAULT.getCommits(bag); commits.forEach(commit -> SPIAccessor.DEFAULT.check(commit, true)); - ArrayList commitsReversed = new ArrayList<>(commits.size()); - Collections.copy(commitsReversed, commits); + ArrayList commitsReversed = new ArrayList<>(commits); Collections.reverse(commitsReversed); - /* - * moved wrapper access out of the loop, since it doesn't access any particular loop object, - * and it seems to be more like an active light switch, which is constantly turned on an off for no good reason - * since it is dark anyway, as long as the loop processing occurs - */ UndoableWrapper undoableWrapper = MimeLookup.getLookup(MimePath.EMPTY).lookup(UndoableWrapper.class); undoableWrapper.setActive(true, this); commitsReversed.stream() @@ -268,10 +252,8 @@ public Problem undoRefactoring(final boolean saveAfterDone) { commits.forEach(commit -> SPIAccessor.DEFAULT.sum(commit)); } - /* internal list */ { - ArrayList internalListReversed = new ArrayList<>(internalList.size()); - Collections.copy(internalListReversed, internalList); + ArrayList internalListReversed = new ArrayList<>(internalList); Collections.reverse(internalListReversed); internalListReversed.stream().forEachOrdered(element -> { fireProgressListenerStep(); @@ -408,6 +390,7 @@ public void remove() { } @Override + @SuppressWarnings("ValueOfIncrementOrDecrementUsed") public RefactoringElement next() { if (index < internalList.size()) { return new RefactoringElement(internalList.get(index++));