diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/ex/CompilerPathsEx.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/ex/CompilerPathsEx.java index bb2d830651ce..963635775c68 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/ex/CompilerPathsEx.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/ex/CompilerPathsEx.java @@ -30,6 +30,7 @@ import com.intellij.util.containers.OrderedSet; import gnu.trove.TObjectHashingStrategy; import java.io.File; +import java.util.Collection; import java.util.Set; public class CompilerPathsEx extends CompilerPaths { @@ -75,7 +76,7 @@ public class CompilerPathsEx extends CompilerPaths { } } - public static void visitFiles(final VirtualFile[] directories, final FileVisitor visitor) { + public static void visitFiles(final Collection directories, final FileVisitor visitor) { for (final VirtualFile outputDir : directories) { ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { 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 1838d9d21458..9483a6668db2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -20,14 +20,15 @@ import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.engine.DebuggerManagerThreadImpl; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.compiler.ex.CompilerPathsEx; import com.intellij.openapi.components.AbstractProjectComponent; +import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; @@ -68,25 +69,58 @@ public class HotSwapManager extends AbstractProjectComponent { myTimeStamps.put(session, Long.valueOf(tStamp)); } - public Map scanForModifiedClasses(final DebuggerSession session, final HotSwapProgress progress) { + public Map scanForModifiedClasses(final DebuggerSession session, final HotSwapProgress progress, final boolean scanWithVFS) { DebuggerManagerThreadImpl.assertIsManagerThread(); - final List outputRoots = new ArrayList(); - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - final List allClasses = OrderEnumerator.orderEntries(myProject).withoutSdk().withoutLibraries().getPathsList().getRootDirs(); - for (VirtualFile dir : VfsUtil.toVirtualFileArray(allClasses)) { - outputRoots.add(new File(dir.getPath())); - } - } - }); - final long timeStamp = getTimeStamp(session); final Map modifiedClasses = new HashMap(); - for (File root : outputRoots) { - final String rootPath = FileUtil.toCanonicalPath(root.getPath()); - collectModifiedClasses(root, rootPath, rootPath + "/", modifiedClasses, progress, timeStamp); + + if (scanWithVFS) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final List allDirs = OrderEnumerator.orderEntries(myProject).withoutSdk().withoutLibraries().getPathsList().getRootDirs(); + CompilerPathsEx.visitFiles(allDirs, new CompilerPathsEx.FileVisitor() { + protected void acceptDirectory(final VirtualFile file, final String fileRoot, final String filePath) { + if (!progress.isCancelled()) { + progress.setText(DebuggerBundle.message("progress.hotswap.scanning.path", filePath)); + super.acceptDirectory(file, fileRoot, filePath); + } + } + + protected void acceptFile(VirtualFile file, String fileRoot, String filePath) { + if (progress.isCancelled()) { + return; + } + if (file.getTimeStamp() > timeStamp && StdFileTypes.CLASS.equals(file.getFileType())) { + //noinspection HardCodedStringLiteral + if (SystemInfo.isFileSystemCaseSensitive ? filePath.endsWith(CLASS_EXTENSION) : StringUtil.endsWithIgnoreCase(filePath, CLASS_EXTENSION)) { + progress.setText(DebuggerBundle.message("progress.hotswap.scanning.path", filePath)); + //noinspection HardCodedStringLiteral + final String qualifiedName = filePath.substring(fileRoot.length() + 1, filePath.length() - CLASS_EXTENSION.length()).replace('/', '.'); + modifiedClasses.put(qualifiedName, new HotSwapFile(new File(filePath))); + } + } + } + }); + } + }); } + else { + final List outputRoots = new ArrayList(); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final List allDirs = OrderEnumerator.orderEntries(myProject).withoutSdk().withoutLibraries().getPathsList().getRootDirs(); + for (VirtualFile dir : allDirs) { + outputRoots.add(new File(dir.getPath())); + } + } + }); + for (File root : outputRoots) { + final String rootPath = FileUtil.toCanonicalPath(root.getPath()); + collectModifiedClasses(root, rootPath, rootPath + "/", modifiedClasses, progress, timeStamp); + } + } + return modifiedClasses; } @@ -158,7 +192,7 @@ public class HotSwapManager extends AbstractProjectComponent { } - public static Map> scanForModifiedClasses(final List sessions, final HotSwapProgress swapProgress) { + public static Map> scanForModifiedClasses(final List sessions, final HotSwapProgress swapProgress, final boolean scanWithVFS) { final Map> modifiedClasses = new HashMap>(); final MultiProcessCommand scanClassesCommand = new MultiProcessCommand(); @@ -174,7 +208,7 @@ public class HotSwapManager extends AbstractProjectComponent { scanClassesCommand.addCommand(debuggerSession.getProcess(), new DebuggerCommandImpl() { protected void action() throws Exception { swapProgress.setDebuggerSession(debuggerSession); - final Map sessionClasses = getInstance(swapProgress.getProject()).scanForModifiedClasses(debuggerSession, swapProgress); + final Map sessionClasses = getInstance(swapProgress.getProject()).scanForModifiedClasses(debuggerSession, swapProgress, scanWithVFS); if (!sessionClasses.isEmpty()) { modifiedClasses.put(debuggerSession, sessionClasses); } 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 5404b04f8f99..ff744dbad2d4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java @@ -16,6 +16,7 @@ package com.intellij.debugger.ui; import com.intellij.CommonBundle; +import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.impl.DebuggerSession; @@ -157,11 +158,16 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent{ return; } - final HotSwapProgressImpl findClassesProgress = generatedPaths == null? new HotSwapProgressImpl(myProject) : null; + final boolean isServerMode = CompilerWorkspaceConfiguration.getInstance(myProject).useCompileServer(); + final boolean shouldPerformScan = !isServerMode || generatedPaths == null; + + final HotSwapProgressImpl findClassesProgress = shouldPerformScan ? new HotSwapProgressImpl(myProject) : null; ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { public void run() { - final Map> modifiedClasses = generatedPaths == null? scanForModifiedClassesWithProgress(sessions, findClassesProgress) : HotSwapManager.findModifiedClasses(sessions, generatedPaths); + final Map> modifiedClasses = shouldPerformScan? + scanForModifiedClassesWithProgress(sessions, findClassesProgress, !isServerMode) : + HotSwapManager.findModifiedClasses(sessions, generatedPaths); final Application application = ApplicationManager.getApplication(); if (modifiedClasses.isEmpty()) { @@ -216,12 +222,12 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent{ }); } - private static Map> scanForModifiedClassesWithProgress(final List sessions, final HotSwapProgressImpl progress) { + private static Map> scanForModifiedClassesWithProgress(final List sessions, final HotSwapProgressImpl progress, final boolean scanWithVFS) { final Ref>> result = Ref.create(null); ProgressManager.getInstance().runProcess(new Runnable() { public void run() { try { - result.set(HotSwapManager.scanForModifiedClasses(sessions, progress)); + result.set(HotSwapManager.scanForModifiedClasses(sessions, progress, scanWithVFS)); } finally { progress.finished();