public static AddServerResult addServer()

in src/org/jetbrains/tfsIntegration/config/TfsServerConnectionHelper.java [142:271]


  public static AddServerResult addServer(final JComponent parentComponent) {
    TfsRequestManager.Request<Trinity<URI, ServerDescriptor, Credentials>> connectRequest =
      new TfsRequestManager.Request<Trinity<URI, ServerDescriptor, Credentials>>(null) {
        @Override
        public Trinity<URI, ServerDescriptor, Credentials> execute(Credentials credentials,
                                                                   URI serverUri,
                                                                   @Nullable ProgressIndicator pi)
          throws Exception {
          ServerDescriptor serverDescriptor = connect(serverUri, credentials, false, pi);
          serverUri = serverDescriptor.uri;
          // check duplicate instance id for TFS 2005/2008, TFS 2010 will be checked later when project collection is selected
          if (serverDescriptor instanceof Tfs200xServerDescriptor &&
              TFSConfigurationManager.getInstance()
                .serverKnown(((Tfs200xServerDescriptor)serverDescriptor).instanceId)) {
            throw new TfsException(TFSBundle.message("duplicate.server"));
          }

          if (credentials.getType() != Credentials.Type.NtlmNative &&
              !credentials.getUserName().equalsIgnoreCase(serverDescriptor.getUserName())) {
            LOG.warn("authorized user mismatch: current=" + credentials.getQualifiedUsername() +
                     ", authorized: " + serverDescriptor.authorizedCredentials);
            throw new TfsException(TFSBundle.message("authorized.user.mismatch"));
          }

          if (serverDescriptor instanceof Tfs2010ServerDescriptor) {
            Collection<TeamProjectCollectionDescriptor> teamProjectCollections =
              ((Tfs2010ServerDescriptor)serverDescriptor).teamProjectCollections;
            if (teamProjectCollections.size() == 0) {
              throw new TfsException(TFSBundle.message("no.team.project.collections"));
            }

            boolean newCollection = false;
            for (TeamProjectCollectionDescriptor teamProjectCollection : teamProjectCollections) {
              if (!TFSConfigurationManager.getInstance().serverKnown(teamProjectCollection.instanceId)) {
                newCollection = true;
                break;
              }
            }
            if (!newCollection) {
              throw new TfsException(TFSBundle.message("all.team.project.collections.duplicate"));
            }
          }
          return Trinity.create(serverUri, serverDescriptor, credentials);
        }

        @NotNull
        @Override
        public String getProgressTitle(Credentials credentials, URI serverUri) {
          return TFSBundle.message("connect.to", TfsUtil.getPresentableUri(serverUri));
        }

        @Override
        public boolean retrieveAuthorizedCredentials() {
          return false;
        }
      };

    Trinity<URI, ServerDescriptor, Credentials> result;
    try {
      result = TfsRequestManager.getInstance(null).executeRequestInForeground(parentComponent, true, null, true, connectRequest);
    }
    catch (UserCancelledException e) {
      return null;
    }
    catch (TfsException e) {
      // should not float up through the dialog
      LOG.error(e);
      return null;
    }

    final ServerDescriptor serverDescriptor = result.second;

    if (serverDescriptor instanceof Tfs200xServerDescriptor) {
      Tfs200xServerDescriptor tfs200xServerDescriptor = (Tfs200xServerDescriptor)serverDescriptor;
      return new AddServerResult(result.first, tfs200xServerDescriptor.instanceId, serverDescriptor.authorizedCredentials,
                                 tfs200xServerDescriptor.workspaces, null, serverDescriptor.beans);
    }
    else {
      Collection<TeamProjectCollectionDescriptor> teamProjectCollections =
        ((Tfs2010ServerDescriptor)serverDescriptor).teamProjectCollections;
      TeamProjectCollectionDescriptor collection;
      if (teamProjectCollections.size() == 1) {
        collection = teamProjectCollections.iterator().next();
      }
      else {
        ChooseTeamProjectCollectionDialog d2 =
          new ChooseTeamProjectCollectionDialog(parentComponent, result.first.toString(), teamProjectCollections);
        if (!d2.showAndGet()) {
          return null;
        }
        collection = d2.getSelectedItem();
        LOG.assertTrue(collection != null);
      }

      URI collectionUri = getCollectionUri(result.first, collection);
      final TfsBeansHolder collectionBeans = new TfsBeansHolder(collectionUri);
      TfsRequestManager.Request<Workspace[]> loadWorkspacesRequest = new TfsRequestManager.Request<Workspace[]>(null) {
        @Override
        public Workspace[] execute(Credentials credentials, URI serverUri, @Nullable ProgressIndicator pi) throws Exception {
          return queryWorkspaces(serverDescriptor.authorizedCredentials, pi, collectionBeans);
        }

        @NotNull
        @Override
        public String getProgressTitle(Credentials credentials, URI serverUri) {
          return TFSBundle.message("connect.to", TfsUtil.getPresentableUri(serverUri));
        }

        @Override
        public boolean retrieveAuthorizedCredentials() {
          return false;
        }
      };

      Workspace[] workspaces = null;
      String workspacesLoadError = null;
      try {
        workspaces = TfsRequestManager.getInstance(collectionUri)
          .executeRequestInForeground(parentComponent, false, result.third, true, loadWorkspacesRequest);
      }
      catch (UserCancelledException e) {
        return null;
      }
      catch (TfsException e) {
        workspacesLoadError = e.getMessage();
      }
      return new AddServerResult(collectionUri, collection.instanceId, serverDescriptor.authorizedCredentials, workspaces,
                                 workspacesLoadError, collectionBeans);
    }
  }