public SvnAuthenticationNotifier(final SvnVcs17 svnVcs) {
   super(
       svnVcs.getProject(),
       svnVcs.getDisplayName(),
       "Not Logged In to Subversion",
       NotificationType.ERROR);
   myVcs = svnVcs;
   myRootsToWorkingCopies = myVcs.getRootsToWorkingCopies();
   myCopiesPassiveResults = Collections.synchronizedMap(new HashMap<SVNURL, Boolean>());
   myVerificationInProgress = false;
 }
 public static boolean interactiveValidation(
     final Project project, final SVNURL url, final String realm, final String kind) {
   final SvnConfiguration17 configuration = SvnConfiguration17.getInstance(project);
   final SvnAuthenticationManager passiveManager =
       configuration.getInteractiveManager(SvnVcs17.getInstance(project));
   return validationImpl(project, url, configuration, passiveManager, true, realm, kind, true);
 }
  private void onStateChangedToSuccess(final AuthenticationRequest obj) {
    myCopiesPassiveResults.put(getKey(obj), true);
    myVcs.invokeRefreshSvnRoots(false);

    final List<SVNURL> outdatedRequests = new LinkedList<SVNURL>();
    final Collection<SVNURL> keys = getAllCurrentKeys();
    for (SVNURL key : keys) {
      final SVNURL commonURLAncestor = SVNURLUtil.getCommonURLAncestor(key, obj.getUrl());
      if ((commonURLAncestor != null)
          && (!StringUtil.isEmptyOrSpaces(commonURLAncestor.getHost()))
          && (!StringUtil.isEmptyOrSpaces(commonURLAncestor.getPath()))) {
        // final AuthenticationRequest currObj = getObj(key);
        // if ((currObj != null) && passiveValidation(myVcs.getProject(), key, true,
        // currObj.getRealm(), currObj.getKind())) {
        outdatedRequests.add(key);
        // }
      }
    }
    log("on state changed ");
    ApplicationManager.getApplication()
        .invokeLater(
            new Runnable() {
              public void run() {
                for (SVNURL key : outdatedRequests) {
                  removeLazyNotificationByKey(key);
                }
              }
            },
            ModalityState.NON_MODAL);
  }
  /** Bases on presence of notifications! */
  public ThreeState isAuthenticatedFor(final VirtualFile vf) {
    final WorkingCopy wcCopy = myRootsToWorkingCopies.getWcRoot(vf);
    if (wcCopy == null) return ThreeState.UNSURE;

    // check there's no cancellation yet
    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
    final boolean calculatedResult = passiveValidation(myVcs.getProject(), wcCopy.getUrl());
    myCopiesPassiveResults.put(wcCopy.getUrl(), calculatedResult);
    return calculatedResult ? ThreeState.YES : ThreeState.NO;
  }
  private static boolean validationImpl(
      final Project project,
      final SVNURL url,
      final SvnConfiguration17 configuration,
      final SvnAuthenticationManager manager,
      final boolean checkWrite,
      final String realm,
      final String kind,
      boolean interactive) {
    SvnInteractiveAuthenticationProvider.clearCallState();
    try {
      new SVNWCClient(manager, configuration.getOptions(project))
          .doInfo(url, SVNRevision.UNDEFINED, SVNRevision.HEAD);
    } catch (SVNAuthenticationException e) {
      log(e);
      return false;
    } catch (SVNCancelException e) {
      log(e); // auth canceled
      return false;
    } catch (SVNException e) {
      if (e.getErrorMessage().getErrorCode().isAuthentication()) {
        log(e);
        return false;
      }
      LOG.info("some other exc", e);
      if (interactive) {
        VcsBalloonProblemNotifier.showOverChangesView(
            project, "Authentication failed: " + e.getMessage(), MessageType.ERROR);
      }
      return false; /// !!!! any exception means user should be notified that authorization failed
    }

    if (!checkWrite) {
      return true;
    }
    /*if (passive) {
      return SvnInteractiveAuthenticationProvider.wasCalled();
    }*/

    if (SvnInteractiveAuthenticationProvider.wasCalled()
        && SvnInteractiveAuthenticationProvider.wasCancelled()) return false;
    if (SvnInteractiveAuthenticationProvider.wasCalled()) return true;

    final SvnVcs17 svnVcs = SvnVcs17.getInstance(project);

    final SvnInteractiveAuthenticationProvider provider =
        new SvnInteractiveAuthenticationProvider(svnVcs, manager);
    final SVNAuthentication svnAuthentication =
        provider.requestClientAuthentication(kind, url, realm, null, null, true);
    if (svnAuthentication != null) {
      configuration.acknowledge(kind, realm, svnAuthentication);
      try {
        configuration
            .getAuthenticationManager(svnVcs)
            .acknowledgeAuthentication(true, kind, realm, null, svnAuthentication);
      } catch (SVNException e) {
        LOG.info(e);
      }
      return true;
    }
    return false;
  }