hotswap: allow class reload task cancelling as long as no classes are actually reloaded

This commit is contained in:
Eugene Zhuravlev
2013-10-31 20:35:10 +01:00
parent 17a014e70e
commit 6df23a1974
3 changed files with 29 additions and 17 deletions
@@ -155,13 +155,14 @@ public class HotSwapManager extends AbstractProjectComponent {
}
private void reloadClasses(DebuggerSession session, Map<String, HotSwapFile> classesToReload, HotSwapProgress progress) {
if (progress.isCancelled()) {
session.setModifiedClassesScanRequired(true);
return;
}
final long newSwapTime = System.currentTimeMillis();
new ReloadClassesWorker(session, progress).reloadClasses(classesToReload);
setTimeStamp(session, newSwapTime);
if (progress.isCancelled()) {
session.setModifiedClassesScanRequired(true);
}
else {
setTimeStamp(session, newSwapTime);
}
}
public static Map<DebuggerSession, Map<String, HotSwapFile>> findModifiedClasses(List<DebuggerSession> sessions, Map<String, List<String>> generatedPaths) {
@@ -114,32 +114,44 @@ class ReloadClassesWorker {
try {
RedefineProcessor redefineProcessor = new RedefineProcessor(virtualMachineProxy);
int processedClassesCount = 0;
for (final String qualifiedName : modifiedClasses.keySet()) {
processedClassesCount++;
int processedEntriesCount = 0;
for (final Map.Entry<String, HotSwapFile> entry : modifiedClasses.entrySet()) {
if (redefineProcessor.getProcessedClassesCount() == 0 && myProgress.isCancelled()) {
// once at least one class has been actually reloaded, do not interrupt the whole process
break;
}
processedEntriesCount++;
final String qualifiedName = entry.getKey();
if (qualifiedName != null) {
myProgress.setText(qualifiedName);
myProgress.setFraction(processedClassesCount / (double)modifiedClasses.size());
myProgress.setFraction(processedEntriesCount / (double)modifiedClasses.size());
}
final HotSwapFile fileDescr = modifiedClasses.get(qualifiedName);
try {
redefineProcessor.processClass(qualifiedName, fileDescr.file);
redefineProcessor.processClass(qualifiedName, entry.getValue().file);
}
catch (IOException e) {
reportProblem(qualifiedName, e);
}
}
if (redefineProcessor.getProcessedClassesCount() == 0 && myProgress.isCancelled()) {
// once at least one class has been actually reloaded, do not interrupt the whole process
return;
}
redefineProcessor.processPending();
myProgress.setFraction(1);
final int partiallyRedefinedClassesCount = redefineProcessor.getPartiallyRedefinedClassesCount();
if (partiallyRedefinedClassesCount == 0) {
myProgress.addMessage(myDebuggerSession, MessageCategory.INFORMATION,
DebuggerBundle.message("status.classes.reloaded", redefineProcessor.getProcessedClassesCount()));
myProgress.addMessage(
myDebuggerSession, MessageCategory.INFORMATION, DebuggerBundle.message("status.classes.reloaded", redefineProcessor.getProcessedClassesCount())
);
}
else {
final String message = DebuggerBundle.message("status.classes.not.all.versions.reloaded", partiallyRedefinedClassesCount,
redefineProcessor.getProcessedClassesCount());
final String message = DebuggerBundle.message(
"status.classes.not.all.versions.reloaded", partiallyRedefinedClassesCount, redefineProcessor.getProcessedClassesCount()
);
myProgress.addMessage(myDebuggerSession, MessageCategory.WARNING, message);
}
@@ -269,8 +269,7 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent {
return result.get();
}
private static void reloadModifiedClasses(final Map<DebuggerSession, Map<String, HotSwapFile>> modifiedClasses,
final HotSwapProgressImpl progress) {
private static void reloadModifiedClasses(final Map<DebuggerSession, Map<String, HotSwapFile>> modifiedClasses, final HotSwapProgressImpl progress) {
ProgressManager.getInstance().runProcess(new Runnable() {
public void run() {
HotSwapManager.reloadModifiedClasses(modifiedClasses, progress);