Package org.eclipse.egit.ui.internal.fetch

Source Code of org.eclipse.egit.ui.internal.fetch.FetchWizard

/*******************************************************************************
* Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
* Copyright (C) 2010, 2011, Mathias Kinzler <mathias.kinzler@sap.com>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.egit.ui.internal.fetch;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.egit.core.securestorage.UserPasswordCredentials;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.internal.SecureStoreUtils;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.components.RefSpecPage;
import org.eclipse.egit.ui.internal.components.RepositorySelection;
import org.eclipse.egit.ui.internal.components.RepositorySelectionPage;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.osgi.util.NLS;

/**
* Wizard allowing user to specify all needed data to fetch from another
* repository - including selection of remote repository, ref specifications,
* annotated tags fetching strategy.
* <p>
* Fetch operation is performed upon successful completion of this wizard.
*/
public class FetchWizard extends Wizard {
  private final Repository localDb;

  private final RepositorySelectionPage repoPage;

  private final RefSpecPage refSpecPage;

  /**
   * Create wizard for provided local repository.
   *
   * @param localDb
   *            local repository to fetch to.
   * @throws URISyntaxException
   *             when configuration of this repository contains illegal URIs.
   */
  public FetchWizard(final Repository localDb) throws URISyntaxException {
    this.localDb = localDb;
    final List<RemoteConfig> remotes = RemoteConfig
        .getAllRemoteConfigs(localDb.getConfig());
    repoPage = new RepositorySelectionPage(true, remotes, null);
    refSpecPage = new RefSpecPage(localDb, false) {
      @Override
      public void setVisible(boolean visible) {
        if (visible) {
          setSelection(repoPage.getSelection());
          setCredentials(repoPage.getCredentials());
        }
        super.setVisible(visible);
      }
    };
    setDefaultPageImageDescriptor(UIIcons.WIZBAN_FETCH);
    setNeedsProgressMonitor(true);
  }

  @Override
  public void addPages() {
    addPage(repoPage);
    addPage(refSpecPage);
  }

  @Override
  public boolean canFinish() {
    if (getContainer().getCurrentPage() == repoPage) {
      RepositorySelection sel = repoPage.getSelection();
      if (sel.isConfigSelected()) {
        RemoteConfig config = sel.getConfig();
        return !config.getURIs().isEmpty()
            && !config.getFetchRefSpecs().isEmpty();
      }
    }
    return super.canFinish();
  }

  @Override
  public boolean performFinish() {
    boolean calledFromRepoPage = false;
    if (getContainer().getCurrentPage()==repoPage)
      calledFromRepoPage = true;
    if (repoPage.getSelection().isConfigSelected()
        && refSpecPage.isSaveRequested())
      saveConfig();
    if (repoPage.getStoreInSecureStore()) {
      if (!SecureStoreUtils.storeCredentials(repoPage.getCredentials(),
          repoPage.getSelection().getURI()))
        return false;
    }

    final FetchOperationUI op;
    int timeout = Activator.getDefault().getPreferenceStore().getInt(
        UIPreferences.REMOTE_CONNECTION_TIMEOUT);
    final RepositorySelection repoSelection = repoPage.getSelection();

    if (calledFromRepoPage)
      op = new FetchOperationUI(localDb, repoSelection.getConfig(),
          timeout, false);
    else if (repoSelection.isConfigSelected())
      op = new FetchOperationUI(localDb, repoSelection.getConfig()
          .getURIs().get(0), refSpecPage.getRefSpecs(), timeout,
          false);
    else
      op = new FetchOperationUI(localDb, repoSelection.getURI(false),
          refSpecPage.getRefSpecs(), timeout, false);

    UserPasswordCredentials credentials = repoPage.getCredentials();
    if (credentials != null)
      op.setCredentialsProvider(new UsernamePasswordCredentialsProvider(
          credentials.getUser(), credentials.getPassword()));

    // even if a RemoteConfig is selected, we need to make sure to
    // add the RefSpecs from the RefSpec page into the FetchOperation
    if (!calledFromRepoPage)
      op.setTagOpt(refSpecPage.getTagOpt());
    op.start();

    repoPage.saveUriInPrefs();

    return true;
  }

  @Override
  public String getWindowTitle() {
    final IWizardPage currentPage = getContainer().getCurrentPage();
    if (currentPage == repoPage || currentPage == null)
      return UIText.FetchWizard_windowTitleDefault;
    return NLS.bind(UIText.FetchWizard_windowTitleWithSource,
        getSourceString());
  }

  private void saveConfig() {
    final RemoteConfig rc = repoPage.getSelection().getConfig();
    rc.setFetchRefSpecs(refSpecPage.getRefSpecs());
    rc.setTagOpt(refSpecPage.getTagOpt());
    final StoredConfig config = localDb.getConfig();
    rc.update(config);
    try {
      config.save();
    } catch (final IOException e) {
      ErrorDialog.openError(getShell(), UIText.FetchWizard_cantSaveTitle,
          UIText.FetchWizard_cantSaveMessage, new Status(
              IStatus.WARNING, Activator.getPluginId(), e
                  .getMessage(), e));
      // Continue, it's not critical.
    }
  }

  private String getSourceString() {
    final RepositorySelection repoSelection = repoPage.getSelection();
    if (repoSelection.isConfigSelected())
      return repoSelection.getConfigName();
    return repoSelection.getURI(false).toString();
  }
}
TOP

Related Classes of org.eclipse.egit.ui.internal.fetch.FetchWizard

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.