IDEA-52633 (GUI completely hung for about a minute (IntelliJ IDEA Maia IU-94.426))
authorirengrig <Irina.Chernushina@jetbrains.com>
Thu, 4 Mar 2010 12:29:56 +0000 (15:29 +0300)
committerirengrig <Irina.Chernushina@jetbrains.com>
Thu, 4 Mar 2010 12:29:56 +0000 (15:29 +0300)
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnAuthenticationNotifier.java
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java

index 2673237ae7f23bd8aa1a470719cb85bcb5c51b0b..e305948cd078b4ba8aa47cae75892395ca49c11e 100644 (file)
@@ -39,9 +39,7 @@ import org.tmatesoft.svn.core.internal.util.SVNURLUtil;
 import org.tmatesoft.svn.core.wc.SVNRevision;
 import org.tmatesoft.svn.core.wc.SVNWCClient;
 
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 
 public class SvnAuthenticationNotifier extends GenericNotifierImpl<SvnAuthenticationNotifier.AuthenticationRequest, SVNURL> {
   private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn.SvnAuthenticationNotifier");
@@ -49,11 +47,26 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl<SvnAuthentica
   private static final String ourGroupId = "SubversionId";
   private final SvnVcs myVcs;
   private final RootsToWorkingCopies myRootsToWorkingCopies;
+  private final Map<SVNURL, Boolean> myCopiesPassiveResults;
+  private Timer myTimer;
 
   public SvnAuthenticationNotifier(final SvnVcs svnVcs) {
     super(svnVcs.getProject(), ourGroupId, "Not Logged To Subversion", NotificationType.ERROR);
     myVcs = svnVcs;
     myRootsToWorkingCopies = myVcs.getRootsToWorkingCopies();
+    myCopiesPassiveResults = Collections.synchronizedMap(new HashMap<SVNURL, Boolean>());
+    // every 10 minutes
+    myTimer = new Timer();
+    myTimer.schedule(new TimerTask() {
+      @Override
+      public void run() {
+        myCopiesPassiveResults.clear();
+      }
+    }, 10000, 10 * 60 * 1000);
+  }
+
+  public void stop() {
+    myTimer.cancel();
   }
 
   @Override
@@ -74,6 +87,7 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl<SvnAuthentica
 
   private void onStateChangedToSuccess(final AuthenticationRequest obj) {
     myVcs.invokeRefreshSvnRoots(false);
+    myCopiesPassiveResults.put(getKey(obj), true);
     /*ApplicationManager.getApplication().invokeLater(new Runnable() {
       public void run() {
         myVcs.invokeRefreshSvnRoots(false);
@@ -104,6 +118,8 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl<SvnAuthentica
 
   @Override
   public void ensureNotify(AuthenticationRequest obj) {
+    final SVNURL key = getKey(obj);
+    myCopiesPassiveResults.remove(key);
     /*ChangesViewBalloonProblemNotifier.showMe(myVcs.getProject(), "You are not authenticated to '" + obj.getRealm() + "'." +
       "To login, see pending notifications.", MessageType.ERROR);*/
     super.ensureNotify(obj);
@@ -142,8 +158,14 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl<SvnAuthentica
     final boolean haveCancellation = getStateFor(wcCopy.getUrl());
     if (haveCancellation) return ThreeState.NO;
 
+    final Boolean keptResult = myCopiesPassiveResults.get(wcCopy.getUrl());
+    if (Boolean.TRUE.equals(keptResult)) return ThreeState.YES;
+    if (Boolean.FALSE.equals(keptResult)) return ThreeState.NO;
+    
     // check have credentials
-    return passiveValidation(myVcs.getProject(), wcCopy.getUrl()) ? ThreeState.YES : ThreeState.NO;
+    final boolean calculatedResult = passiveValidation(myVcs.getProject(), wcCopy.getUrl());
+    myCopiesPassiveResults.put(wcCopy.getUrl(), calculatedResult);
+    return calculatedResult ? ThreeState.YES : ThreeState.NO;
   }
 
   @NotNull
index 0c33215249d5bed88f2177462586ec05e2e4c25d..74b0309bf70b719c6634738e82e417a85fe20f28 100644 (file)
@@ -217,6 +217,12 @@ public class SvnVcs extends AbstractVcs {
     invokeRefreshSvnRoots(true);
   }
 
+  @Override
+  protected void shutdown() throws VcsException {
+    super.shutdown();
+    myAuthNotifier.stop();
+  }
+
   public void invokeRefreshSvnRoots(final boolean asynchronous) {
     REFRESH_LOG.debug("refresh: ", new Throwable());
     if (myCopiesRefreshManager != null) {