blob: ef9828c3964e85374e045658a1a4f9284d9273ec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
* Frank Becker - improvements
* Helen Bershadskaya - improvements for bug 242445
* Atlassian - fixes for bug 316113
*******************************************************************************/
package org.eclipse.mylyn.tasks.ui.wizards;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.httpclient.URI;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.commons.ui.dialogs.IValidatable;
import org.eclipse.mylyn.commons.ui.dialogs.ValidatableWizardDialog;
import org.eclipse.mylyn.commons.workbench.browser.BrowserUtil;
import org.eclipse.mylyn.commons.workbench.forms.SectionComposite;
import org.eclipse.mylyn.internal.commons.repositories.ui.RepositoryUiUtil;
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.internal.tasks.core.RepositoryTemplateManager;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.internal.tasks.ui.IBrandManager;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.RepositoryInfo;
import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* Extend to provide custom repository settings. This page is typically invoked by the user requesting properties via
* the Task Repositories view.
*
* @author Mik Kersten
* @author Rob Elves
* @author Steffen Pingel
* @author Frank Becker
* @author David Green
* @author Helen Bershadskaya
* @author Benjamin Muskalla
* @since 2.0
*/
public abstract class AbstractRepositorySettingsPage extends AbstractTaskRepositoryPage
implements ITaskRepositoryPage, IAdaptable {
protected static final String PREFS_PAGE_ID_NET_PROXY = "org.eclipse.ui.net.NetPreferences"; //$NON-NLS-1$
protected static final String LABEL_REPOSITORY_LABEL = Messages.AbstractRepositorySettingsPage_Label_;
protected static final String LABEL_SERVER = Messages.AbstractRepositorySettingsPage_Server_;
protected static final String LABEL_USER = Messages.AbstractRepositorySettingsPage_User_ID_;
protected static final String LABEL_PASSWORD = Messages.AbstractRepositorySettingsPage_Password_;
protected static final String URL_PREFIX_HTTPS = "https://"; //$NON-NLS-1$
protected static final String URL_PREFIX_HTTP = "http://"; //$NON-NLS-1$
protected static final String INVALID_REPOSITORY_URL = Messages.AbstractRepositorySettingsPage_Repository_url_is_invalid;
protected static final String INVALID_LOGIN = Messages.AbstractRepositorySettingsPage_Unable_to_authenticate_with_repository;
protected AbstractRepositoryConnector connector;
private final AbstractRepositoryConnectorUi connectorUi;
protected StringFieldEditor repositoryLabelEditor;
protected Combo serverUrlCombo;
private boolean serverUrlReadOnly = false;
private String serverVersion = TaskRepository.NO_VERSION_SPECIFIED;
protected StringFieldEditor repositoryUserNameEditor;
protected StringFieldEditor repositoryPasswordEditor;
protected StringFieldEditor httpAuthUserNameEditor;
protected StringFieldEditor httpAuthPasswordEditor;
private StringFieldEditor certAuthFileNameEditor;
private Button certBrowseButton;
private StringFieldEditor certAuthPasswordEditor;
protected StringFieldEditor proxyHostnameEditor;
protected StringFieldEditor proxyPortEditor;
protected StringFieldEditor proxyUserNameEditor;
protected StringFieldEditor proxyPasswordEditor;
// FIXME shadows declaration in super
protected TaskRepository repository;
private Combo otherEncodingCombo;
private Button defaultEncoding;
// private Combo timeZonesCombo;
protected Button anonymousButton;
private String oldUsername;
private String oldPassword;
private String oldHttpAuthUserId;
private String oldHttpAuthPassword;
private String oldCertAuthFileName;
private String oldCertAuthPassword;
private boolean needsAnonymousLogin;
private boolean needsTimeZone;
private boolean needsEncoding;
private boolean needsCertAuth;
private boolean needsHttpAuth;
private boolean needsValidation;
private boolean needsValidateOnFinish;
private boolean needsAdvanced;
private boolean needsRepositoryCredentials;
protected Composite compositeContainer;
private Composite advancedComp;
private Composite certAuthComp;
private Composite httpAuthComp;
private Composite proxyAuthComp;
private Set<String> repositoryUrls;
private String originalUrl;
private Button otherEncoding;
private Button certAuthButton;
private Button httpAuthButton;
private boolean needsProxy;
/**
* @since 3.11
*/
protected Button systemProxyButton;
/**
* @since 3.11
*/
protected Hyperlink changeProxySettingsLink;
private String oldProxyUsername = ""; //$NON-NLS-1$
private String oldProxyPassword = ""; //$NON-NLS-1$
// private Button proxyAuthButton;
private String oldProxyHostname = ""; //$NON-NLS-1$
private String oldProxyPort = ""; //$NON-NLS-1$
private Button proxyAuthButton;
private Hyperlink createAccountHyperlink;
private Hyperlink manageAccountHyperlink;
/**
* @since 3.1
*/
protected Button savePasswordButton;
private Button saveHttpPasswordButton;
private Button saveCertPasswordButton;
private Button saveProxyPasswordButton;
private Button disconnectedButton;
private Button validateOnFinishButton;
private boolean isValid;
/**
* @since 3.9
*/
protected SectionComposite innerComposite;
private TaskRepository validatedTaskRepository;
private final Map<AuthenticationType, AuthenticationCredentials> validatedAuthenticationCredentials = new HashMap<AuthenticationType, AuthenticationCredentials>();
private String brand;
/**
* @since 3.10
*/
public AbstractRepositorySettingsPage(String title, String description, TaskRepository taskRepository,
AbstractRepositoryConnector connector) {
this(title, description, taskRepository, connector, null);
}
/**
* @since 3.14
*/
public AbstractRepositorySettingsPage(String title, String description, TaskRepository taskRepository,
AbstractRepositoryConnector connector, AbstractRepositoryConnectorUi connectorUi) {
super(title, description, taskRepository);
repository = taskRepository;
if (connector == null) {
connector = TasksUi.getRepositoryManager().getRepositoryConnector(getConnectorKind());
}
this.connector = connector;
if (connectorUi == null) {
connectorUi = TasksUi.getRepositoryConnectorUi(getConnectorKind());
}
this.connectorUi = connectorUi;
if (repository != null && !repository.getConnectorKind().equals(getConnectorKind())) {
throw new IllegalArgumentException(
"connectorKind of repository does not match connectorKind of page, expected '" + getConnectorKind() //$NON-NLS-1$
+ "', got '" + repository.getConnectorKind() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
updateBrandFromRepository();
setNeedsRepositoryCredentials(true);
setNeedsAnonymousLogin(false);
setNeedsEncoding(true);
setNeedsTimeZone(true);
setNeedsProxy(true);
setNeedsValidation(true);
setNeedsAdvanced(true);
setNeedsValidateOnFinish(false);
}
/**
* @since 3.0
*/
public AbstractRepositorySettingsPage(String title, String description, TaskRepository taskRepository) {
this(title, description, taskRepository, null);
}
/**
* @since 3.0
*/
@Override
public abstract String getConnectorKind();
@Override
public void dispose() {
super.dispose();
}
// /**
// * @since 2.0
// */
// @Override
// protected Control createContents(Composite parent) {
// compositeContainer = new Composite(parent, SWT.NONE);
// GridLayout layout = new GridLayout(3, false);
// compositeContainer.setLayout(layout);
//
// createSettingControls(parent);
// }
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
toolkit = new FormToolkit(TasksUiPlugin.getDefault().getFormColors(parent.getDisplay()));
innerComposite = new SectionComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
createSettingControls(innerComposite.getContent());
createValidationControls(innerComposite.getContent());
if (needsValidateOnFinish()) {
validateOnFinishButton = new Button(innerComposite.getContent(), SWT.CHECK);
validateOnFinishButton.setText(Messages.AbstractRepositorySettingsPage_Validate_on_Finish);
validateOnFinishButton.setSelection(true);
}
Point p = innerComposite.getContent().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
innerComposite.setMinSize(p);
innerComposite.getShell().layout();
if (needsRepositoryCredentials()) {
swapUserNameWithAnonymousInTabList();
}
Dialog.applyDialogFont(innerComposite);
setControl(innerComposite);
}
private void swapUserNameWithAnonymousInTabList() {
if (compositeContainer != null && anonymousButton != null && repositoryUserNameEditor != null) {
List<Control> tabList = Arrays.asList(compositeContainer.getTabList());
if (tabList.contains(repositoryUserNameEditor.getTextControl(compositeContainer))
&& tabList.contains(anonymousButton)) {
int userNameIndex = tabList.indexOf(repositoryUserNameEditor.getTextControl(compositeContainer));
int anonymousIndex = tabList.indexOf(anonymousButton);
Collections.swap(tabList, userNameIndex, anonymousIndex);
compositeContainer.setTabList(tabList.toArray(new Control[tabList.size()]));
}
}
}
/**
* @since 3.5
*/
protected void createValidationControls(Composite parent) {
if (!needsValidation() || getContainer() instanceof ValidatableWizardDialog
|| getContainer() instanceof TaskRepositoryWizardDialog) {
return;
}
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 10;
layout.marginWidth = 0;
layout.horizontalSpacing = 10;
composite.setLayout(layout);
composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 3, 1));
// show validation control on page since it's not provided by container
Button validateButton = new Button(composite, SWT.PUSH);
validateButton.setImage(CommonImages.getImage(CommonImages.VALIDATE));
validateButton.setText(Messages.AbstractRepositorySettingsPage_Validate_Settings_Button_Label);
validateButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
validateSettings();
}
});
}
/**
* @since 2.0
*/
@Override
protected void createSettingControls(Composite parent) {
compositeContainer = parent;
initializeOldValues();
Label serverLabel = new Label(compositeContainer, SWT.NONE);
serverLabel.setText(LABEL_SERVER);
serverUrlCombo = new Combo(compositeContainer, SWT.DROP_DOWN);
if (serverUrlReadOnly) {
serverUrlCombo.setEnabled(false);
} else {
serverUrlCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
});
serverUrlCombo.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
updateHyperlinks();
}
});
serverUrlCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
});
}
GridDataFactory.fillDefaults()
.hint(300, SWT.DEFAULT)
.grab(true, false)
.span(2, SWT.DEFAULT)
.applyTo(serverUrlCombo);
repositoryLabelEditor = new StringFieldEditor("", LABEL_REPOSITORY_LABEL, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
compositeContainer) {
@Override
protected boolean doCheckState() {
return true;
// return isValidUrl(getStringValue());
}
@Override
protected void valueChanged() {
super.valueChanged();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 2;
}
};
disconnectedButton = new Button(compositeContainer, SWT.CHECK);
disconnectedButton.setText(Messages.AbstractRepositorySettingsPage_Disconnected);
disconnectedButton.setSelection(repository != null ? repository.isOffline() : false);
disconnectedButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
isPageComplete();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
});
if (needsRepositoryCredentials()) {
createRepositoryCredentialsSection();
}
if (needsAdvanced() || needsEncoding()) {
createAdvancedSection();
}
if (needsCertAuth()) {
createCertAuthSection();
}
if (needsHttpAuth()) {
createHttpAuthSection();
}
if (needsProxy()) {
createProxySection();
}
createContributionControls(innerComposite);
Composite managementComposite = new Composite(compositeContainer, SWT.NULL);
GridLayout managementLayout = new GridLayout(4, false);
managementLayout.marginHeight = 0;
managementLayout.marginWidth = 0;
managementLayout.horizontalSpacing = 10;
managementComposite.setLayout(managementLayout);
managementComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
createAccountHyperlink = toolkit.createHyperlink(managementComposite,
Messages.AbstractRepositorySettingsPage_Create_new_account, SWT.NONE);
createAccountHyperlink.setBackground(managementComposite.getBackground());
createAccountHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
// TaskRepository repository = getRepository();
TaskRepository repository = createTaskRepository();
// if (repository == null && getServerUrl() != null && getServerUrl().length() > 0) {
// repository = createTaskRepository();
// }
if (repository != null) {
String accountCreationUrl = connectorUi.getAccountCreationUrl(repository);
if (accountCreationUrl != null) {
BrowserUtil.openUrl(accountCreationUrl, IWorkbenchBrowserSupport.AS_EXTERNAL);
}
}
}
});
manageAccountHyperlink = toolkit.createHyperlink(managementComposite,
Messages.AbstractRepositorySettingsPage_Change_account_settings, SWT.NONE);
manageAccountHyperlink.setBackground(managementComposite.getBackground());
manageAccountHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
TaskRepository repository = getRepository();
if (repository == null && getRepositoryUrl() != null && getRepositoryUrl().length() > 0) {
repository = createTaskRepository();
}
if (repository != null) {
String accountManagementUrl = connectorUi.getAccountManagementUrl(repository);
if (accountManagementUrl != null) {
BrowserUtil.openUrl(accountManagementUrl, IWorkbenchBrowserSupport.AS_EXTERNAL);
}
}
}
});
if (repositoryPasswordEditor != null) {
// bug 131656: must set echo char after setting value on Mac
((RepositoryStringFieldEditor) repositoryPasswordEditor).getTextControl().setEchoChar('*');
}
if (needsRepositoryCredentials()) {
if (needsAnonymousLogin()) {
// do this after username and password widgets have been intialized
if (repository != null) {
setAnonymous(isAnonymousAccess());
}
}
}
updateHyperlinks();
if (repository != null) {
updateLabel();
updateUrl();
saveToValidatedProperties(createTaskRepository());
}
GridLayout layout = new GridLayout(3, false);
compositeContainer.setLayout(layout);
}
private void createRepositoryCredentialsSection() {
repositoryUserNameEditor = new StringFieldEditor("", LABEL_USER, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
compositeContainer) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
isPageComplete();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
// always 2 columns -- if no anonymous checkbox, just leave 3rd column empty
return 2;
}
};
if (needsAnonymousLogin()) {
// need to increase column number here, because above string editor will use them if declared beforehand
//((GridLayout) (compositeContainer.getLayout())).numColumns++;
anonymousButton = new Button(compositeContainer, SWT.CHECK);
anonymousButton.setText(Messages.AbstractRepositorySettingsPage_Anonymous_Access);
anonymousButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setAnonymous(anonymousButton.getSelection());
isPageComplete();
}
});
} else {
Label dummyLabel = new Label(compositeContainer, SWT.NONE); // dummy control to fill 3rd column when no anonymous login
GridDataFactory.fillDefaults().applyTo(dummyLabel); // not really necessary, but to be on the safe side
}
repositoryPasswordEditor = new RepositoryStringFieldEditor("", LABEL_PASSWORD, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
compositeContainer) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
isPageComplete();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 2;
}
};
savePasswordButton = new Button(compositeContainer, SWT.CHECK);
savePasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
savePasswordButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
isPageComplete();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
});
if (repository != null) {
try {
AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
if (credentials != null) {
repositoryUserNameEditor.setStringValue(credentials.getUserName());
repositoryPasswordEditor.setStringValue(credentials.getPassword());
} else {
repositoryUserNameEditor.setStringValue(""); //$NON-NLS-1$
repositoryPasswordEditor.setStringValue(""); //$NON-NLS-1$
}
} catch (Throwable t) {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set field value", t)); //$NON-NLS-1$
}
}
if (needsAnonymousLogin()) {
if (repository != null) {
setAnonymous(repository.getCredentials(AuthenticationType.REPOSITORY) == null);
} else {
setAnonymous(true);
}
}
if (repository != null) {
savePasswordButton.setSelection(repository.getSavePassword(AuthenticationType.REPOSITORY));
} else {
savePasswordButton.setSelection(false);
}
RepositoryUiUtil.testCredentialsStore(getRepositoryUrl(), this);
}
private void updateLabel() {
String repositoryLabel = repository.getProperty(IRepositoryConstants.PROPERTY_LABEL);
if (repositoryLabel != null && repositoryLabel.length() > 0) {
repositoryLabelEditor.setStringValue(repositoryLabel);
}
}
private void updateUrl() {
setUrl(repository.getRepositoryUrl());
}
private void createAdvancedSection() {
ExpandableComposite section = createSection(innerComposite,
Messages.AbstractRepositorySettingsPage_Additional_Settings);
advancedComp = toolkit.createComposite(section, SWT.NONE);
GridLayout gridLayout2 = new GridLayout();
gridLayout2.numColumns = 2;
gridLayout2.verticalSpacing = 5;
gridLayout2.marginWidth = 0;
advancedComp.setLayout(gridLayout2);
advancedComp.setBackground(compositeContainer.getBackground());
section.setClient(advancedComp);
createAdditionalControls(advancedComp);
if (needsEncoding()) {
Label encodingLabel = new Label(advancedComp, SWT.HORIZONTAL);
encodingLabel.setText(Messages.AbstractRepositorySettingsPage_Character_encoding);
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).applyTo(encodingLabel);
Composite encodingContainer = new Composite(advancedComp, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
encodingContainer.setLayout(gridLayout);
defaultEncoding = new Button(encodingContainer, SWT.RADIO);
defaultEncoding.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
defaultEncoding.setText(Messages.AbstractRepositorySettingsPage_Default__
+ TaskRepository.DEFAULT_CHARACTER_ENCODING + ")"); //$NON-NLS-1$
defaultEncoding.setSelection(true);
otherEncoding = new Button(encodingContainer, SWT.RADIO);
otherEncoding.setText(Messages.AbstractRepositorySettingsPage_Other);
otherEncodingCombo = new Combo(encodingContainer, SWT.READ_ONLY);
try {
for (String encoding : Charset.availableCharsets().keySet()) {
if (!encoding.equals(TaskRepository.DEFAULT_CHARACTER_ENCODING)) {
otherEncodingCombo.add(encoding);
}
}
} catch (LinkageError e) {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
Messages.AbstractRepositorySettingsPage_Problems_encountered_determining_available_charsets,
e));
// bug 237972: 3rd party encodings can cause availableCharsets() to fail
otherEncoding.setEnabled(false);
otherEncodingCombo.setEnabled(false);
}
setDefaultEncoding();
otherEncoding.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (otherEncoding.getSelection()) {
defaultEncoding.setSelection(false);
otherEncodingCombo.setEnabled(true);
} else {
defaultEncoding.setSelection(true);
otherEncodingCombo.setEnabled(false);
}
}
});
if (repository != null) {
try {
String repositoryEncoding = repository.getCharacterEncoding();
if (repositoryEncoding != null) {// &&
// !repositoryEncoding.equals(defaultEncoding))
// {
if (otherEncodingCombo.getItemCount() > 0
&& otherEncodingCombo.indexOf(repositoryEncoding) > -1) {
otherEncodingCombo.setEnabled(true);
otherEncoding.setSelection(true);
defaultEncoding.setSelection(false);
otherEncodingCombo.select(otherEncodingCombo.indexOf(repositoryEncoding));
} else {
setDefaultEncoding();
}
}
} catch (Throwable t) {
StatusHandler
.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set field value", t)); //$NON-NLS-1$
}
}
}
}
private void createCertAuthSection() {
ExpandableComposite section = createSection(innerComposite,
Messages.AbstractRepositorySettingsPage_certificate_settings);
certAuthComp = toolkit.createComposite(section, SWT.NONE);
certAuthComp.setBackground(compositeContainer.getBackground());
section.setClient(certAuthComp);
certAuthButton = new Button(certAuthComp, SWT.CHECK);
GridDataFactory.fillDefaults()
.indent(0, 5)
.align(SWT.LEFT, SWT.TOP)
.span(3, SWT.DEFAULT)
.applyTo(certAuthButton);
certAuthButton.setText(Messages.AbstractRepositorySettingsPage_Enable_certificate_authentification);
certAuthButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setCertAuth(certAuthButton.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
// ignore
}
});
certAuthFileNameEditor = new StringFieldEditor("", Messages.AbstractRepositorySettingsPage_CertificateFile_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, certAuthComp) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 2;
}
};
certBrowseButton = new Button(certAuthComp, SWT.PUSH);
certBrowseButton.setText(Messages.AbstractRepositorySettingsPage_ChooseCertificateFile_);
certBrowseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN);
fileDialog.setFilterPath(System.getProperty("user.home", ".")); //$NON-NLS-1$ //$NON-NLS-2$
String returnFile = fileDialog.open();
if (returnFile != null) {
certAuthFileNameEditor.setStringValue(returnFile);
}
}
});
certAuthPasswordEditor = new RepositoryStringFieldEditor("", //$NON-NLS-1$
Messages.AbstractRepositorySettingsPage_CertificatePassword_, StringFieldEditor.UNLIMITED,
certAuthComp) {
@Override
public int getNumberOfControls() {
return 2;
}
};
((RepositoryStringFieldEditor) certAuthPasswordEditor).getTextControl().setEchoChar('*');
saveCertPasswordButton = new Button(certAuthComp, SWT.CHECK);
saveCertPasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
certAuthFileNameEditor.setEnabled(certAuthButton.getSelection(), certAuthComp);
certBrowseButton.setEnabled(certAuthButton.getSelection());
certAuthPasswordEditor.setEnabled(certAuthButton.getSelection(), certAuthComp);
saveCertPasswordButton.setEnabled(certAuthButton.getSelection());
if (repository != null) {
saveCertPasswordButton.setSelection(repository.getSavePassword(AuthenticationType.CERTIFICATE));
} else {
saveCertPasswordButton.setSelection(false);
}
setCertAuth(oldCertAuthPassword != null || oldCertAuthFileName != null);
section.setExpanded(certAuthButton.getSelection());
GridLayout gridLayout2 = new GridLayout();
gridLayout2.numColumns = 3;
gridLayout2.marginWidth = 0;
certAuthComp.setLayout(gridLayout2);
}
private void createHttpAuthSection() {
ExpandableComposite section = createSection(innerComposite,
Messages.AbstractRepositorySettingsPage_Http_Authentication);
httpAuthComp = toolkit.createComposite(section, SWT.NONE);
httpAuthComp.setBackground(compositeContainer.getBackground());
section.setClient(httpAuthComp);
httpAuthButton = new Button(httpAuthComp, SWT.CHECK);
GridDataFactory.fillDefaults()
.indent(0, 5)
.align(SWT.LEFT, SWT.TOP)
.span(3, SWT.DEFAULT)
.applyTo(httpAuthButton);
httpAuthButton.setText(Messages.AbstractRepositorySettingsPage_Enable_http_authentication);
httpAuthButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setHttpAuth(httpAuthButton.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
// ignore
}
});
httpAuthUserNameEditor = new StringFieldEditor("", Messages.AbstractRepositorySettingsPage_User_ID_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, httpAuthComp) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 3;
}
};
httpAuthPasswordEditor = new RepositoryStringFieldEditor("", Messages.AbstractRepositorySettingsPage_Password_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, httpAuthComp) {
@Override
public int getNumberOfControls() {
return 2;
}
};
((RepositoryStringFieldEditor) httpAuthPasswordEditor).getTextControl().setEchoChar('*');
saveHttpPasswordButton = new Button(httpAuthComp, SWT.CHECK);
saveHttpPasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
httpAuthUserNameEditor.setEnabled(httpAuthButton.getSelection(), httpAuthComp);
httpAuthPasswordEditor.setEnabled(httpAuthButton.getSelection(), httpAuthComp);
saveHttpPasswordButton.setEnabled(httpAuthButton.getSelection());
if (repository != null) {
saveHttpPasswordButton.setSelection(repository.getSavePassword(AuthenticationType.HTTP));
} else {
saveHttpPasswordButton.setSelection(false);
}
setHttpAuth(oldHttpAuthPassword != null || oldHttpAuthUserId != null);
section.setExpanded(httpAuthButton.getSelection());
GridLayout gridLayout2 = new GridLayout();
gridLayout2.numColumns = 3;
gridLayout2.marginWidth = 0;
httpAuthComp.setLayout(gridLayout2);
}
private void initializeOldValues() {
if (repository != null) {
originalUrl = repository.getRepositoryUrl();
AuthenticationCredentials oldCredentials = repository.getCredentials(AuthenticationType.REPOSITORY);
if (oldCredentials != null) {
oldUsername = oldCredentials.getUserName();
oldPassword = oldCredentials.getPassword();
} else {
oldUsername = ""; //$NON-NLS-1$
oldPassword = ""; //$NON-NLS-1$
}
AuthenticationCredentials oldCertCredentials = repository.getCredentials(AuthenticationType.CERTIFICATE);
if (oldCertCredentials != null) {
oldCertAuthFileName = oldCertCredentials.getUserName();
oldCertAuthPassword = oldCertCredentials.getPassword();
} else {
oldCertAuthPassword = null;
oldCertAuthFileName = null;
}
AuthenticationCredentials oldHttpCredentials = repository.getCredentials(AuthenticationType.HTTP);
if (oldHttpCredentials != null) {
oldHttpAuthUserId = oldHttpCredentials.getUserName();
oldHttpAuthPassword = oldHttpCredentials.getPassword();
} else {
oldHttpAuthPassword = null;
oldHttpAuthUserId = null;
}
oldProxyHostname = repository.getProperty(TaskRepository.PROXY_HOSTNAME);
oldProxyPort = repository.getProperty(TaskRepository.PROXY_PORT);
if (oldProxyHostname == null) {
oldProxyHostname = ""; //$NON-NLS-1$
}
if (oldProxyPort == null) {
oldProxyPort = ""; //$NON-NLS-1$
}
AuthenticationCredentials oldProxyCredentials = repository.getCredentials(AuthenticationType.PROXY);
if (oldProxyCredentials != null) {
oldProxyUsername = oldProxyCredentials.getUserName();
oldProxyPassword = oldProxyCredentials.getPassword();
} else {
oldProxyUsername = null;
oldProxyPassword = null;
}
} else {
oldUsername = ""; //$NON-NLS-1$
oldPassword = ""; //$NON-NLS-1$
oldHttpAuthPassword = null;
oldHttpAuthUserId = null;
oldCertAuthFileName = null;
oldCertAuthPassword = null;
}
}
private void createProxySection() {
ExpandableComposite section = createSection(innerComposite,
Messages.AbstractRepositorySettingsPage_Proxy_Server_Configuration);
proxyAuthComp = toolkit.createComposite(section, SWT.NONE);
GridLayout gridLayout2 = new GridLayout();
gridLayout2.verticalSpacing = 0;
gridLayout2.numColumns = 3;
proxyAuthComp.setLayout(gridLayout2);
proxyAuthComp.setBackground(compositeContainer.getBackground());
section.setClient(proxyAuthComp);
Composite systemSettingsComposite = new Composite(proxyAuthComp, SWT.NULL);
GridLayout gridLayout3 = new GridLayout();
gridLayout3.verticalSpacing = 0;
gridLayout3.numColumns = 2;
gridLayout3.marginWidth = 0;
systemSettingsComposite.setLayout(gridLayout3);
systemProxyButton = new Button(systemSettingsComposite, SWT.CHECK);
GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).span(3, SWT.DEFAULT).applyTo(systemSettingsComposite);
systemProxyButton.setText(Messages.AbstractRepositorySettingsPage_Use_global_Network_Connections_preferences);
systemProxyButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setUseDefaultProxy(systemProxyButton.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
// ignore
}
});
changeProxySettingsLink = toolkit.createHyperlink(systemSettingsComposite,
Messages.AbstractRepositorySettingsPage_Change_Settings, SWT.NULL);
changeProxySettingsLink.setBackground(compositeContainer.getBackground());
changeProxySettingsLink.addHyperlinkListener(new IHyperlinkListener() {
public void linkActivated(HyperlinkEvent e) {
PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(), PREFS_PAGE_ID_NET_PROXY,
new String[] { PREFS_PAGE_ID_NET_PROXY }, null);
dlg.open();
}
public void linkEntered(HyperlinkEvent e) {
// ignore
}
public void linkExited(HyperlinkEvent e) {
// ignore
}
});
proxyHostnameEditor = new StringFieldEditor("", Messages.AbstractRepositorySettingsPage_Proxy_host_address_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, proxyAuthComp) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 3;
}
};
proxyHostnameEditor.setStringValue(oldProxyHostname);
proxyPortEditor = new RepositoryStringFieldEditor("", Messages.AbstractRepositorySettingsPage_Proxy_host_port_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, proxyAuthComp) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 3;
}
};
proxyPortEditor.setStringValue(oldProxyPort);
proxyHostnameEditor.setEnabled(systemProxyButton.getSelection(), proxyAuthComp);
proxyPortEditor.setEnabled(systemProxyButton.getSelection(), proxyAuthComp);
// ************* PROXY AUTHENTICATION **************
proxyAuthButton = new Button(proxyAuthComp, SWT.CHECK);
GridDataFactory.fillDefaults().span(3, SWT.DEFAULT).applyTo(proxyAuthButton);
proxyAuthButton.setText(Messages.AbstractRepositorySettingsPage_Enable_proxy_authentication);
proxyAuthButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setProxyAuth(proxyAuthButton.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
// ignore
}
});
proxyUserNameEditor = new StringFieldEditor("", Messages.AbstractRepositorySettingsPage_User_ID_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, proxyAuthComp) {
@Override
protected boolean doCheckState() {
return true;
}
@Override
protected void valueChanged() {
super.valueChanged();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
@Override
public int getNumberOfControls() {
return 3;
}
};
proxyPasswordEditor = new RepositoryStringFieldEditor("", Messages.AbstractRepositorySettingsPage_Password_, //$NON-NLS-1$
StringFieldEditor.UNLIMITED, proxyAuthComp) {
@Override
public int getNumberOfControls() {
return 2;
}
};
((RepositoryStringFieldEditor) proxyPasswordEditor).getTextControl().setEchoChar('*');
// proxyPasswordEditor.setEnabled(httpAuthButton.getSelection(),
// advancedComp);
// ((StringFieldEditor)
// httpAuthPasswordEditor).setEnabled(httpAuthButton.getSelection(),
// advancedComp);
// need to increase column number here, because above string editor will use them if declared beforehand
((GridLayout) (proxyAuthComp.getLayout())).numColumns++;
saveProxyPasswordButton = new Button(proxyAuthComp, SWT.CHECK);
saveProxyPasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
saveProxyPasswordButton.setEnabled(proxyAuthButton.getSelection());
if (repository != null) {
saveProxyPasswordButton.setSelection(repository.getSavePassword(AuthenticationType.PROXY));
} else {
saveProxyPasswordButton.setSelection(false);
}
setProxyAuth(oldProxyUsername != null || oldProxyPassword != null);
setUseDefaultProxy(repository != null ? repository.isDefaultProxyEnabled() : true);
section.setExpanded(!systemProxyButton.getSelection());
}
// private void addContributionSection() {
// Composite composite = toolkit.createComposite(compositeContainer);
// GridDataFactory.fillDefaults().grab(true, false).span(3, SWT.DEFAULT).applyTo(composite);
//
// GridLayout layout = new GridLayout(1, false);
// layout.marginWidth = 0;
// layout.marginTop = -5;
// composite.setLayout(layout);
//
// composite.setBackground(compositeContainer.getBackground());
//
// createContributionControls(composite);
// }
protected void setEncoding(String encoding) {
if (encoding.equals(TaskRepository.DEFAULT_CHARACTER_ENCODING)) {
setDefaultEncoding();
} else {
if (otherEncodingCombo.indexOf(encoding) != -1) {
defaultEncoding.setSelection(false);
otherEncodingCombo.setEnabled(true);
otherEncoding.setSelection(true);
otherEncodingCombo.select(otherEncodingCombo.indexOf(encoding));
} else {
setDefaultEncoding();
}
}
}
private void setDefaultEncoding() {
defaultEncoding.setSelection(true);
otherEncoding.setSelection(false);
otherEncodingCombo.setEnabled(false);
if (otherEncodingCombo.getItemCount() > 0) {
otherEncodingCombo.select(0);
}
}
/**
* @since 2.0
*/
public void setAnonymous(boolean selected) {
if (!needsAnonymousLogin) {
return;
}
anonymousButton.setSelection(selected);
updateCredentialsEditors();
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
private void updateCredentialsEditors() {
if (repositoryUserNameEditor != null && repositoryPasswordEditor != null) {
boolean shouldEnable = needsRepositoryCredentials() && !isAnonymousAccess();
if (shouldEnable) {
repositoryUserNameEditor.setStringValue(oldUsername);
repositoryPasswordEditor.setStringValue(oldPassword);
} else {
oldUsername = repositoryUserNameEditor.getStringValue();
oldPassword = (repositoryPasswordEditor).getStringValue();
repositoryUserNameEditor.setStringValue(""); //$NON-NLS-1$
repositoryPasswordEditor.setStringValue(""); //$NON-NLS-1$
}
repositoryUserNameEditor.setEnabled(shouldEnable, compositeContainer);
repositoryPasswordEditor.setEnabled(shouldEnable, compositeContainer);
savePasswordButton.setEnabled(shouldEnable);
}
}
/**
* @since 2.0
*/
public void setHttpAuth(boolean selected) {
if (!needsHttpAuth) {
return;
}
httpAuthButton.setSelection(selected);
if (!selected) {
oldHttpAuthUserId = httpAuthUserNameEditor.getStringValue();
oldHttpAuthPassword = httpAuthPasswordEditor.getStringValue();
httpAuthUserNameEditor.setStringValue(null);
httpAuthPasswordEditor.setStringValue(null);
} else {
httpAuthUserNameEditor.setStringValue(oldHttpAuthUserId);
httpAuthPasswordEditor.setStringValue(oldHttpAuthPassword);
}
httpAuthUserNameEditor.setEnabled(selected, httpAuthComp);
httpAuthPasswordEditor.setEnabled(selected, httpAuthComp);
saveHttpPasswordButton.setEnabled(selected);
}
/**
* @since 3.6
*/
public void setCertAuth(boolean selected) {
if (!needsCertAuth) {
return;
}
certAuthButton.setSelection(selected);
if (!selected) {
oldCertAuthFileName = certAuthFileNameEditor.getStringValue();
oldCertAuthPassword = certAuthPasswordEditor.getStringValue();
certAuthFileNameEditor.setStringValue(null);
certAuthPasswordEditor.setStringValue(null);
} else {
certAuthFileNameEditor.setStringValue(oldCertAuthFileName);
certAuthPasswordEditor.setStringValue(oldCertAuthPassword);
}
certAuthFileNameEditor.setEnabled(selected, certAuthComp);
certBrowseButton.setEnabled(selected);
certAuthPasswordEditor.setEnabled(selected, certAuthComp);
saveCertPasswordButton.setEnabled(selected);
}
/**
* @since 2.2
*/
public boolean getHttpAuth() {
return httpAuthButton.getSelection();
}
/**
* @since 3.6
*/
public boolean getCertAuth() {
return certAuthButton.getSelection();
}
/**
* @since 2.0
*/
public void setUseDefaultProxy(boolean selected) {
if (!needsProxy) {
return;
}
systemProxyButton.setSelection(selected);
if (selected) {
oldProxyHostname = proxyHostnameEditor.getStringValue();
oldProxyPort = proxyPortEditor.getStringValue();
// proxyHostnameEditor.setStringValue(null);
// proxyPortEditor.setStringValue(null);
} else {
proxyHostnameEditor.setStringValue(oldProxyHostname);
proxyPortEditor.setStringValue(oldProxyPort);
}
proxyHostnameEditor.setEnabled(!selected, proxyAuthComp);
proxyPortEditor.setEnabled(!selected, proxyAuthComp);
proxyAuthButton.setEnabled(!selected);
setProxyAuth(proxyAuthButton.getSelection());
}
/**
* @since 2.0
*/
public void setProxyAuth(boolean selected) {
proxyAuthButton.setSelection(selected);
proxyAuthButton.setEnabled(!systemProxyButton.getSelection());
if (!selected) {
oldProxyUsername = proxyUserNameEditor.getStringValue();
oldProxyPassword = proxyPasswordEditor.getStringValue();
proxyUserNameEditor.setStringValue(null);
proxyPasswordEditor.setStringValue(null);
} else {
proxyUserNameEditor.setStringValue(oldProxyUsername);
proxyPasswordEditor.setStringValue(oldProxyPassword);
}
proxyUserNameEditor.setEnabled(selected && !systemProxyButton.getSelection(), proxyAuthComp);
proxyPasswordEditor.setEnabled(selected && !systemProxyButton.getSelection(), proxyAuthComp);
saveProxyPasswordButton.setEnabled(selected && !systemProxyButton.getSelection());
}
/**
* @since 2.2
*/
public boolean getProxyAuth() {
return proxyAuthButton.getSelection();
}
/**
* @since 3.0
*/
protected void addRepositoryTemplatesToServerUrlCombo() {
final RepositoryTemplateManager templateManager = TasksUiPlugin.getRepositoryTemplateManager();
for (RepositoryTemplate template : templateManager.getTemplates(connector.getConnectorKind())) {
serverUrlCombo.add(template.label);
}
serverUrlCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String text = serverUrlCombo.getText();
RepositoryTemplate template = templateManager.getTemplate(connector.getConnectorKind(), text);
if (template != null) {
repositoryTemplateSelected(template);
return;
}
}
});
}
/**
* @since 3.0
*/
protected void repositoryTemplateSelected(RepositoryTemplate template) {
}
/**
* @since 2.0
*/
protected abstract void createAdditionalControls(@NonNull Composite parent);
/**
* @since 2.0
*/
protected boolean isValidUrl(String url) {
if (url.startsWith(URL_PREFIX_HTTPS) || url.startsWith(URL_PREFIX_HTTP)) {
try {
new URI(url, true, "UTF-8"); //$NON-NLS-1$
return true;
} catch (Exception e) {
return false;
}
}
return false;
}
private void updateHyperlinks() {
if (getRepositoryUrl() != null && getRepositoryUrl().length() > 0) {
TaskRepository repository = new TaskRepository(connector.getConnectorKind(), getRepositoryUrl());
String accountCreationUrl = connectorUi.getAccountCreationUrl(repository);
createAccountHyperlink.setEnabled(accountCreationUrl != null);
createAccountHyperlink.setVisible(accountCreationUrl != null);
String accountManagementUrl = connectorUi.getAccountManagementUrl(repository);
manageAccountHyperlink.setEnabled(accountManagementUrl != null);
manageAccountHyperlink.setVisible(accountManagementUrl != null);
} else {
createAccountHyperlink.setEnabled(false);
createAccountHyperlink.setVisible(false);
manageAccountHyperlink.setEnabled(false);
manageAccountHyperlink.setVisible(false);
}
}
/**
* @since 2.0
*/
public String getRepositoryLabel() {
return repositoryLabelEditor.getStringValue();
}
/**
* @since 3.0
*/
public String getRepositoryUrl() {
return TaskRepositoryManager.stripSlashes(serverUrlCombo.getText());
}
/**
* @since 2.0
*/
public String getUserName() {
if (needsRepositoryCredentials()) {
return repositoryUserNameEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public String getPassword() {
if (needsRepositoryCredentials()) {
return repositoryPasswordEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public String getHttpAuthUserId() {
if (needsHttpAuth()) {
return httpAuthUserNameEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public String getHttpAuthPassword() {
if (needsHttpAuth()) {
return httpAuthPasswordEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 3.6
*/
public String getCertAuthFileName() {
if (needsCertAuth()) {
return certAuthFileNameEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 3.6
*/
public String getCertAuthPassword() {
if (needsCertAuth()) {
return certAuthPasswordEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public String getProxyHostname() {
if (needsProxy()) {
return proxyHostnameEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public String getProxyPort() {
if (needsProxy()) {
return proxyPortEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public Boolean getUseDefaultProxy() {
if (needsProxy()) {
return systemProxyButton.getSelection();
} else {
return true;
}
}
/**
* @since 2.0
*/
public String getProxyUserName() {
if (needsProxy()) {
return proxyUserNameEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public String getProxyPassword() {
if (needsProxy()) {
return proxyPasswordEditor.getStringValue();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* @since 2.0
*/
public void init(IWorkbench workbench) {
// ignore
}
/**
* @since 2.0
*/
public boolean isAnonymousAccess() {
if (anonymousButton != null) {
return anonymousButton.getSelection();
} else {
return false;
}
}
/**
* Exposes StringFieldEditor.refreshValidState() TODO: is there a better way?
*/
private static class RepositoryStringFieldEditor extends StringFieldEditor {
public RepositoryStringFieldEditor(String name, String labelText, int style, Composite parent) {
super(name, labelText, style, parent);
}
@Override
public void refreshValidState() {
try {
super.refreshValidState();
} catch (Exception e) {
StatusHandler.log(
new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Problem refreshing password field", e)); //$NON-NLS-1$
}
}
@Override
public Text getTextControl() {
return super.getTextControl();
}
}
@Override
public boolean isPageComplete() {
String errorMessage = null;
String url = getRepositoryUrl();
// check for errors
errorMessage = isUniqueUrl(url);
if (errorMessage == null) {
for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) {
if (!repository.equals(getRepository())
&& getRepositoryLabel().equals(repository.getRepositoryLabel())) {
errorMessage = Messages.AbstractRepositorySettingsPage_A_repository_with_this_name_already_exists;
break;
}
}
}
if (errorMessage == null) {
// check for messages
if (!isValidUrl(url)) {
errorMessage = Messages.AbstractRepositorySettingsPage_Enter_a_valid_server_url;
}
if (errorMessage == null && needsRepositoryCredentials()
&& (!needsAnonymousLogin() || !anonymousButton.getSelection()) && isMissingCredentials()) {
errorMessage = Messages.AbstractRepositorySettingsPage_Enter_a_user_id_Message0;
}
setMessage(errorMessage, repository == null ? IMessageProvider.NONE : IMessageProvider.ERROR);
} else {
setMessage(errorMessage, IMessageProvider.ERROR);
}
return errorMessage == null && super.isPageComplete();
}
/**
* Returns true, if credentials are incomplete. Clients may override this method.
*
* @since 3.4
*/
protected boolean isMissingCredentials() {
return needsRepositoryCredentials() && repositoryUserNameEditor.getStringValue().trim().equals("") //$NON-NLS-1$
|| (getSavePassword() && repositoryPasswordEditor.getStringValue().trim().equals("")); //$NON-NLS-1$
}
/**
* @since 2.0
*/
protected String isUniqueUrl(String urlString) {
if (!urlString.equals(originalUrl)) {
if (repositoryUrls == null) {
List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
repositoryUrls = new HashSet<String>(repositories.size());
for (TaskRepository repository : repositories) {
repositoryUrls.add(repository.getRepositoryUrl());
}
}
if (repositoryUrls.contains(urlString)) {
return Messages.AbstractRepositorySettingsPage_Repository_already_exists;
}
}
return null;
}
/**
* @since 2.0
*/
@Deprecated
public void setRepository(TaskRepository repository) {
this.repository = repository;
}
/**
* @since 2.0
*/
public void setVersion(String previousVersion) {
if (previousVersion == null) {
serverVersion = TaskRepository.NO_VERSION_SPECIFIED;
} else {
serverVersion = previousVersion;
}
}
/**
* @since 2.0
*/
public String getVersion() {
return serverVersion;
}
/**
* @since 2.0
*/
public TaskRepository getRepository() {
return repository;
}
/**
* @since 2.0
*/
public String getCharacterEncoding() {
if (defaultEncoding == null) {
return null;
}
if (defaultEncoding.getSelection()) {
return TaskRepository.DEFAULT_CHARACTER_ENCODING;
} else {
if (otherEncodingCombo.getSelectionIndex() > -1) {
return otherEncodingCombo.getItem(otherEncodingCombo.getSelectionIndex());
} else {
return TaskRepository.DEFAULT_CHARACTER_ENCODING;
}
}
}
/**
* Creates a {@link TaskRepository} based on the current settings.
* <p>
* Note: The credentials of the created repository are not persisted in the platform keystore. When overriding,
* subclasses must either call super or call {@link TaskRepository#setShouldPersistCredentials(boolean)
* setShouldPersistCredentials(false)} before calling {@link #applyTo(TaskRepository)}.
*
* @since 2.0
*/
public TaskRepository createTaskRepository() {
TaskRepository repository = new TaskRepository(connector.getConnectorKind(), getRepositoryUrl());
// do not modify the secure storage for a temporary repository
repository.setShouldPersistCredentials(false);
applyTo(repository);
return repository;
}
/**
* @since 2.2
*/
@Override
public void applyTo(@NonNull TaskRepository repository) {
String category = repository.getCategory();
if (category == null || category.length() == 0) {
connector.applyDefaultCategory(repository);
}
repository.setVersion(getVersion());
if (brand != null) {
repository.setProperty(ITasksCoreConstants.PROPERTY_BRAND_ID, brand);
}
if (needsEncoding()) {
repository.setCharacterEncoding(getCharacterEncoding());
}
if (needsRepositoryCredentials()) {
if (isAnonymousAccess()) {
repository.setCredentials(AuthenticationType.REPOSITORY, null, getSavePassword());
} else {
AuthenticationCredentials credentials = new AuthenticationCredentials(getUserName(), getPassword());
repository.setCredentials(AuthenticationType.REPOSITORY, credentials, getSavePassword());
}
}
repository.setRepositoryLabel(getRepositoryLabel());
if (needsCertAuth()) {
if (getCertAuth()) {
AuthenticationCredentials webCredentials = new AuthenticationCredentials(getCertAuthFileName(),
getCertAuthPassword());
repository.setCredentials(AuthenticationType.CERTIFICATE, webCredentials, getSaveCertPassword());
} else {
repository.setCredentials(AuthenticationType.CERTIFICATE, null, getSaveCertPassword());
}
}
if (needsHttpAuth()) {
if (getHttpAuth()) {
AuthenticationCredentials webCredentials = new AuthenticationCredentials(getHttpAuthUserId(),
getHttpAuthPassword());
repository.setCredentials(AuthenticationType.HTTP, webCredentials, getSaveHttpPassword());
} else {
repository.setCredentials(AuthenticationType.HTTP, null, getSaveHttpPassword());
}
}
if (needsProxy()) {
repository.setDefaultProxyEnabled(getUseDefaultProxy());
repository.setProperty(TaskRepository.PROXY_HOSTNAME, getProxyHostname());
repository.setProperty(TaskRepository.PROXY_PORT, getProxyPort());
if (getProxyAuth()) {
AuthenticationCredentials webCredentials = new AuthenticationCredentials(getProxyUserName(),
getProxyPassword());
repository.setCredentials(AuthenticationType.PROXY, webCredentials, getSaveProxyPassword());
} else {
repository.setCredentials(AuthenticationType.PROXY, null, getSaveProxyPassword());
}
}
if (disconnectedButton != null) {
repository.setOffline(disconnectedButton.getSelection());
}
super.applyTo(repository);
}
/**
* @since 2.0
*/
public AbstractRepositoryConnector getConnector() {
return connector;
}
/**
* @since 2.0
*/
public boolean needsEncoding() {
return needsEncoding;
}
/**
* @since 2.0
*/
public boolean needsTimeZone() {
return needsTimeZone;
}
/**
* @since 2.0
*/
public boolean needsAnonymousLogin() {
return needsAnonymousLogin;
}
/**
* @since 3.11
*/
public boolean needsRepositoryCredentials() {
return needsRepositoryCredentials;
}
/**
* @since 2.0
*/
public boolean needsAdvanced() {
return needsAdvanced;
}
/**
* @since 2.0
*/
public void setNeedsEncoding(boolean needsEncoding) {
this.needsEncoding = needsEncoding;
}
/**
* @since 2.0
*/
public void setNeedsTimeZone(boolean needsTimeZone) {
this.needsTimeZone = needsTimeZone;
}
/**
* @since 2.0
*/
public void setNeedsAdvanced(boolean needsAdvanced) {
this.needsAdvanced = needsAdvanced;
}
/**
* @since 3.6
*/
public boolean needsCertAuth() {
return this.needsCertAuth;
}
/**
* @since 3.6
*/
public void setNeedsCertAuth(boolean needsCertificate) {
this.needsCertAuth = needsCertificate;
}
/**
* @since 2.0
*/
public boolean needsHttpAuth() {
return this.needsHttpAuth;
}
/**
* @since 2.0
*/
public void setNeedsHttpAuth(boolean needsHttpAuth) {
this.needsHttpAuth = needsHttpAuth;
}
/**
* @since 2.0
*/
public void setNeedsProxy(boolean needsProxy) {
this.needsProxy = needsProxy;
}
/**
* @since 2.0
*/
public boolean needsProxy() {
return this.needsProxy;
}
/**
* @since 2.0
*/
public void setNeedsAnonymousLogin(boolean needsAnonymousLogin) {
this.needsAnonymousLogin = needsAnonymousLogin;
}
/**
* @since 3.11
*/
public void setNeedsRepositoryCredentials(boolean needsRepositoryCredentials) {
this.needsRepositoryCredentials = needsRepositoryCredentials;
updateCredentialsEditors();
}
public void setNeedsValidation(boolean needsValidation) {
this.needsValidation = needsValidation;
}
/**
* Returns whether this page can be validated or not.
* <p>
* This information is typically used by the wizard to set the enablement of the validation UI affordance.
* </p>
*
* @return <code>true</code> if this page can be validated, and <code>false</code> otherwise
* @see #needsValidation()
* @see IWizardContainer#updateButtons()
* @since 3.4
*/
public boolean canValidate() {
return true;
}
/**
* @since 2.0
*/
public boolean needsValidation() {
return needsValidation;
}
/**
* Public for testing.
*
* @since 2.0
*/
public void setUrl(String url) {
serverUrlCombo.setText(url);
}
/**
* Sets the URL control is read only, or can be edited.
*
* @since 3.18
*/
public void setUrlReadOnly(boolean value) {
serverUrlReadOnly = value;
}
/**
* @return if the URL control is read-only.
* @since 3.18
*/
public boolean isUrlReadOnly() {
return serverUrlReadOnly;
}
/**
* Public for testing.
*
* @since 2.0
*/
public void setUserId(String id) {
repositoryUserNameEditor.setStringValue(id);
}
/**
* Public for testing.
*
* @since 2.0
*/
public void setPassword(String pass) {
repositoryPasswordEditor.setStringValue(pass);
}
/**
* @since 2.2
*/
public Boolean getSavePassword() {
return savePasswordButton.getSelection();
}
/**
* @since 2.2
*/
public Boolean getSaveProxyPassword() {
if (needsProxy()) {
return saveProxyPasswordButton.getSelection();
} else {
return false;
}
}
/**
* @since 3.6
*/
public Boolean getSaveCertPassword() {
if (needsCertAuth()) {
return saveCertPasswordButton.getSelection();
} else {
return false;
}
}
/**
* @since 2.2
*/
public Boolean getSaveHttpPassword() {
if (needsHttpAuth()) {
return saveHttpPasswordButton.getSelection();
} else {
return false;
}
}
/**
* Validate settings provided by the {@link #getValidator(TaskRepository) validator}, typically the server settings.
*
* @since 2.0
*/
protected void validateSettings() {
TaskRepository newTaskRepository = createTaskRepository();
final Validator validator = getValidator(newTaskRepository);
if (validator == null) {
return;
}
try {
getWizard().getContainer().run(true, true, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask(Messages.AbstractRepositorySettingsPage_Validating_server_settings,
IProgressMonitor.UNKNOWN);
try {
validator.run(monitor);
if (validator.getStatus() == null) {
validator.setStatus(Status.OK_STATUS);
}
} catch (CoreException e) {
validator.setStatus(e.getStatus());
} catch (OperationCanceledException e) {
validator.setStatus(Status.CANCEL_STATUS);
throw new InterruptedException();
} catch (Exception e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
});
} catch (InvocationTargetException e) {
StatusManager.getManager()
.handle(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
Messages.AbstractRepositorySettingsPage_Internal_error_validating_repository, e),
StatusManager.SHOW | StatusManager.LOG);
return;
} catch (InterruptedException e) {
// canceled
return;
}
getWizard().getContainer().updateButtons();
applyValidatorResult(validator);
if (isValid) {
saveToValidatedProperties(newTaskRepository);
}
}
/**
* @since 3.1
*/
@Override
protected IStatus validate() {
return null;
}
/**
* @since 2.0
*/
protected void applyValidatorResult(Validator validator) {
IStatus status = validator.getStatus();
String message = status.getMessage();
if (message == null || message.length() == 0) {
message = null;
}
switch (status.getSeverity()) {
case IStatus.OK:
if (status == Status.OK_STATUS) {
if (getUserName().length() > 0) {
message = Messages.AbstractRepositorySettingsPage_Authentication_credentials_are_valid;
} else {
message = Messages.AbstractRepositorySettingsPage_Repository_is_valid;
}
}
setMessage(message, IMessageProvider.INFORMATION);
break;
case IStatus.INFO:
setMessage(message, IMessageProvider.INFORMATION);
break;
case IStatus.WARNING:
setMessage(message, IMessageProvider.WARNING);
break;
default:
setMessage(message, IMessageProvider.ERROR);
break;
}
setErrorMessage(null);
isValid = status.getSeverity() == IStatus.OK || status.getSeverity() == IStatus.INFO;
}
/**
* For version 3.11 we change the abstract implementation to a default implementation. The default implementation
* creates an {@link Validator} and deligate the work to
* {@link AbstractRepositoryConnector#validateRepository(TaskRepository, IProgressMonitor)}
*
* @since 2.0
*/
protected Validator getValidator(@NonNull final TaskRepository repository) {
return new org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage.Validator() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
RepositoryInfo repositoryInfo = connector.validateRepository(repository, monitor);
setStatus(new Status(IStatus.OK, TasksUiPlugin.ID_PLUGIN,
NLS.bind(Messages.AbstractRepositorySettingsPage_Settings_are_valid_version,
repositoryInfo.getVersion())));
}
};
}
/**
* Public for testing.
*
* @since 2.0
*/
public abstract class Validator {
private IStatus status;
public abstract void run(@NonNull IProgressMonitor monitor) throws CoreException;
public IStatus getStatus() {
return status;
}
public void setStatus(IStatus status) {
this.status = status;
}
}
/**
* Provides an adapter for the {@link IValidatable} interface.
*
* @since 3.7
* @see IAdaptable#getAdapter(Class)
*/
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
if (adapter == IValidatable.class) {
return new IValidatable() {
public void validate() {
AbstractRepositorySettingsPage.this.validateSettings();
}
public boolean needsValidation() {
return AbstractRepositorySettingsPage.this.needsValidation();
}
public boolean canValidate() {
return AbstractRepositorySettingsPage.this.canValidate();
}
};
}
return null;
}
/**
* @since 3.7
*/
public boolean needsValidateOnFinish() {
return needsValidateOnFinish;
}
/**
* @since 3.7
*/
public void setNeedsValidateOnFinish(boolean needsValidateOnFinish) {
this.needsValidateOnFinish = needsValidateOnFinish;
}
@Override
public boolean preFinish(TaskRepository repository) {
if (shouldValidateOnFinish() && !propertiesUnchanged()) {
isValid = false;
validateSettings();
} else {
isValid = true;
}
if (isValid) {
isValid = super.preFinish(repository);
}
return isValid;
}
boolean shouldValidateOnFinish() {
return validateOnFinishButton != null && validateOnFinishButton.getSelection();
}
@Override
protected ExpandableComposite createSection(Composite parentControl, String title) {
if (parentControl instanceof SectionComposite) {
return ((SectionComposite) parentControl).createSection(title);
} else {
return super.createSection(parentControl, title);
}
}
/**
* Returns the toolkit used to construct sections and hyperlinks.
*
* @return the toolkit
* @throws IllegalStateException
* if the toolkit has not been initialized
* @since 3.9
*/
protected FormToolkit getToolkit() {
if (toolkit == null) {
throw new IllegalStateException("Toolkit is not initialized, createControl() must be invoked first"); //$NON-NLS-1$
}
return toolkit;
}
private boolean propertiesUnchanged() {
TaskRepository newRepository = createTaskRepository();
boolean propertiesUnchanged = false;
if (validatedTaskRepository != null) {
propertiesUnchanged = validatedTaskRepository.getProperties().equals(newRepository.getProperties());
if (propertiesUnchanged) {
for (AuthenticationType authenticationType : AuthenticationType.values()) {
AuthenticationCredentials credentialsOld = validatedAuthenticationCredentials
.get(authenticationType);
AuthenticationCredentials credentialsNew = newRepository.getCredentials(authenticationType);
if (credentialsOld != null) {
propertiesUnchanged = credentialsOld.equals(credentialsNew);
if (!propertiesUnchanged) {
break;
}
} else if (credentialsNew != null) {
propertiesUnchanged = false;
break;
}
}
}
}
return propertiesUnchanged;
}
private void saveToValidatedProperties(TaskRepository taskRepository) {
validatedTaskRepository = taskRepository;
validatedAuthenticationCredentials.clear();
for (AuthenticationType authenticationType : AuthenticationType.values()) {
AuthenticationCredentials ra = validatedTaskRepository.getCredentials(authenticationType);
validatedAuthenticationCredentials.put(authenticationType, ra);
}
}
/**
* Updates the branding of this repository settings page. This also updates the title and wizard banner for the
* given brand.
*
* @param brand
* new connector branding ID
* @since 3.17
*/
public void setBrand(@NonNull String brand) {
this.brand = brand;
updateTitle(brand);
updateBanner(brand);
}
private void updateBrandFromRepository() {
if (repository != null && repository.hasProperty(ITasksCoreConstants.PROPERTY_BRAND_ID)) {
setBrand(repository.getProperty(ITasksCoreConstants.PROPERTY_BRAND_ID));
}
}
/**
* Called when the page's branding is set. Implementors may change the wizard's title to one with branding specific
* information. Sets the title to the branding's connector title by default.
*
* @param brand
* The current connector branding ID
* @since 3.17
*/
protected void updateTitle(String brand) {
IBrandManager brandManager = TasksUiPlugin.getDefault().getBrandManager();
setTitle(brandManager.getConnectorLabel(getConnector(), brand));
}
/**
* Called when the page's branding is set. Implementors may change the wizard's banner to one with branding specific
* information. Does nothing by default.
*
* @param brand
* The current connector branding ID
* @since 3.17
*/
protected void updateBanner(String brand) {
// do nothing
}
}