diff --git a/.idea/libraries/winp.xml b/.idea/libraries/winp.xml
index f86a5426c94b..ca5008ccc110 100644
--- a/.idea/libraries/winp.xml
+++ b/.idea/libraries/winp.xml
@@ -1,9 +1,11 @@
-
+
-
+
+
+
\ No newline at end of file
diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant
index 52eefc21f4dc..c4b9f40dfd88 100644
--- a/build/scripts/libLicenses.gant
+++ b/build/scripts/libLicenses.gant
@@ -222,7 +222,7 @@ libraryLicense(name: "TestNG", version: "5.7 snapshot", license: "Apache 2.0", u
libraryLicense(name: "Trilead SSH", libraryName: "trilead-ssh2", version: "build 213", license: "BSD style (see LICENSE.txt in trilead.jar)", url: "http://www.trilead.com/SSH_Library/")
libraryLicense(name: "Trove4j", version: "1.1 (with patches by JetBrains)", license: "LGPL", url: "http://trove4j.sourceforge.net/", licenseUrl: "http://trove4j.sourceforge.net/html/license.html")
libraryLicense(name: "Velocity", version: "1.7", license: "Apache 2.0", url: "http://velocity.apache.org/", licenseUrl: "http://velocity.apache.org/index.html")
-libraryLicense(name: "winp", version: "1.16", license: "MIT", url: "http://winp.dev.java.net/", licenseUrl: "https://winp.dev.java.net/license.html")
+libraryLicense(name: "winp", version: "1.16 (patched)", license: "MIT", url: "http://winp.dev.java.net/", licenseUrl: "https://winp.dev.java.net/license.html")
libraryLicense(name: "Xalan", libraryName:"Xalan-2.7.1", version: "2.7.1", license: "Apache 2.0", url: "http://xml.apache.org/xalan-j/", licenseUrl: "http://xml.apache.org/xalan-j/")
libraryLicense(name: "Xerces", version: "2.9.1", license: "Apache 2.0", url: "http://xerces.apache.org/xerces2-j/", licenseUrl: "http://xerces.apache.org/xerces2-j/")
libraryLicense(name: "XML Commons (xml-apis.jar, resolver.jar)", version: "", license: "Apache 2.0, W3C Software License , public domain", url: "http://xml.apache.org/commons/", licenseUrl: "http://xml.apache.org/commons/licenses.html")
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