diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java index 986821bc0697..53ad8ab2385e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java @@ -64,10 +64,7 @@ import com.sun.jdi.request.EventRequest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class DebuggerSession implements AbstractDebuggerSession { private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.impl.DebuggerSession"); @@ -195,6 +192,21 @@ public class DebuggerSession implements AbstractDebuggerSession { return myDebugProcess; } + private final Map myDelayedHotswapFiles = new HashMap(); + + public void addHotswapFiles(Map files) { + myDelayedHotswapFiles.putAll(files); + } + + @NotNull + public Map getHotswapFiles() { + return Collections.unmodifiableMap(myDelayedHotswapFiles); + } + + public void clearHotswapFiles() { + myDelayedHotswapFiles.clear(); + } + private static class DebuggerSessionState { final int myState; final String myDescription; diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java index b7cd3f9ef9a1..05e9422fa94d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -35,6 +35,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -154,10 +155,11 @@ public class HotSwapManager extends AbstractProjectComponent { return project.getComponent(HotSwapManager.class); } - private void reloadClasses(DebuggerSession session, Map classesToReload, HotSwapProgress progress) { + private void reloadClasses(DebuggerSession session, HotSwapProgress progress) { final long newSwapTime = System.currentTimeMillis(); - new ReloadClassesWorker(session, progress).reloadClasses(classesToReload); + new ReloadClassesWorker(session, progress).reloadClasses(); setTimeStamp(session, newSwapTime); + session.clearHotswapFiles(); } public static Map> findModifiedClasses(List sessions, Map> generatedPaths) { @@ -223,7 +225,7 @@ public class HotSwapManager extends AbstractProjectComponent { return swapProgress.isCancelled() ? new HashMap>() : modifiedClasses; } - public static void reloadModifiedClasses(final Map> modifiedClasses, final HotSwapProgress reloadClassesProgress) { + public static void reloadModifiedClasses(final Collection sessions, final HotSwapProgress reloadClassesProgress) { final MultiProcessCommand reloadClassesCommand = new MultiProcessCommand(); reloadClassesProgress.setCancelWorker(new Runnable() { @@ -232,13 +234,11 @@ public class HotSwapManager extends AbstractProjectComponent { } }); - for (final DebuggerSession debuggerSession : modifiedClasses.keySet()) { + for (final DebuggerSession debuggerSession : sessions) { reloadClassesCommand.addCommand(debuggerSession.getProcess(), new DebuggerCommandImpl() { protected void action() throws Exception { reloadClassesProgress.setDebuggerSession(debuggerSession); - getInstance(reloadClassesProgress.getProject()).reloadClasses( - debuggerSession, modifiedClasses.get(debuggerSession), reloadClassesProgress - ); + getInstance(reloadClassesProgress.getProject()).reloadClasses(debuggerSession, reloadClassesProgress); } }); } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java index f2459aadff39..88ea2fabb6c0 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java @@ -32,7 +32,10 @@ import com.sun.jdi.ReferenceType; import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author lex @@ -87,10 +90,12 @@ class ReloadClassesWorker { } } - public void reloadClasses(final Map modifiedClasses) { + public void reloadClasses() { DebuggerManagerThreadImpl.assertIsManagerThread(); - if(modifiedClasses == null || modifiedClasses.size() == 0) { + final Map modifiedClasses = myDebuggerSession.getHotswapFiles(); + + if(modifiedClasses.isEmpty()) { myProgress.addMessage(myDebuggerSession, MessageCategory.INFORMATION, DebuggerBundle.message("status.hotswap.loaded.classes.up.to.date")); return; } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java index 822978d98c98..f5ec69cc7432 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java @@ -153,17 +153,35 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent{ ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { public void run() { - final Map> modifiedClasses = shouldPerformScan? + // todo: rewrite scan from VFS into java.io.File + final Map> newlyModifiedClasses = shouldPerformScan? scanForModifiedClassesWithProgress(sessions, findClassesProgress, !isOutOfProcessMode) : HotSwapManager.findModifiedClasses(sessions, generatedPaths); - final Application application = ApplicationManager.getApplication(); - if (modifiedClasses.isEmpty()) { + for (Map.Entry> entry : newlyModifiedClasses.entrySet()) { + final DebuggerSession session = entry.getKey(); + if (shouldPerformScan) { + session.clearHotswapFiles(); + } + session.addHotswapFiles(entry.getValue()); + } + + boolean hasFilesToReload = false; + for (DebuggerSession session : sessions) { + if (!session.getHotswapFiles().isEmpty()) { + hasFilesToReload = true; + break; + } + } + if (!hasFilesToReload) { final String message = DebuggerBundle.message("status.hotswap.uptodate"); HotSwapProgressImpl.NOTIFICATION_GROUP.createNotification(message, NotificationType.INFORMATION).notify(myProject); return; } + final Set sessionsToReload = new HashSet(sessions); + + final Application application = ApplicationManager.getApplication(); application.invokeLater(new Runnable() { public void run() { if (shouldAskBeforeHotswap && !DebuggerSettings.RUN_HOTSWAP_ALWAYS.equals(runHotswap)) { @@ -172,7 +190,7 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent{ if (!dialog.isOK()) { return; } - modifiedClasses.keySet().retainAll(dialog.getSessionsToReload()); + sessionsToReload.retainAll(dialog.getSessionsToReload()); } else { if (shouldDisplayHangWarning) { @@ -196,11 +214,11 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent{ } } - if (!modifiedClasses.isEmpty()) { + if (!sessionsToReload.isEmpty()) { final HotSwapProgressImpl progress = new HotSwapProgressImpl(myProject); application.executeOnPooledThread(new Runnable() { public void run() { - reloadModifiedClasses(modifiedClasses, progress); + reloadModifiedClasses(sessionsToReload, progress); } }); } @@ -225,10 +243,10 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent{ return result.get(); } - private static void reloadModifiedClasses(final Map> modifiedClasses, final HotSwapProgressImpl progress) { + private static void reloadModifiedClasses(final Collection sessions, final HotSwapProgressImpl progress) { ProgressManager.getInstance().runProcess(new Runnable() { public void run() { - HotSwapManager.reloadModifiedClasses(modifiedClasses, progress); + HotSwapManager.reloadModifiedClasses(sessions, progress); progress.finished(); } }, progress.getProgressIndicator());