diff options
Diffstat (limited to 'org.eclipse.mylyn.oslc.ui/src/org/eclipse/mylyn/internal/oslc/ui/OslcRepositorySettingsPage.java')
-rw-r--r-- | org.eclipse.mylyn.oslc.ui/src/org/eclipse/mylyn/internal/oslc/ui/OslcRepositorySettingsPage.java | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.oslc.ui/src/org/eclipse/mylyn/internal/oslc/ui/OslcRepositorySettingsPage.java b/org.eclipse.mylyn.oslc.ui/src/org/eclipse/mylyn/internal/oslc/ui/OslcRepositorySettingsPage.java new file mode 100644 index 000000000..afffb804d --- /dev/null +++ b/org.eclipse.mylyn.oslc.ui/src/org/eclipse/mylyn/internal/oslc/ui/OslcRepositorySettingsPage.java @@ -0,0 +1,207 @@ +/******************************************************************************* + * Copyright (c) 2009 Tasktop Technologies and others. + * 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 + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.oslc.ui; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.window.Window; +import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.internal.oslc.core.IOslcConnector; +import org.eclipse.mylyn.internal.oslc.core.IOslcCoreConstants; +import org.eclipse.mylyn.internal.oslc.core.OslcServiceDescriptor; +import org.eclipse.mylyn.internal.oslc.core.OslcServiceProvider; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +/** + * @author Robert Elves + */ +public abstract class OslcRepositorySettingsPage extends AbstractRepositorySettingsPage { + + private static final String OSLC_BASEURL = "oslc.baseurl"; //$NON-NLS-1$ + + private OslcServiceDescriptor descriptor; + + protected Text baseText; + + public OslcRepositorySettingsPage(String name, String desc, TaskRepository taskRepository) { + super(name, desc, taskRepository); + setNeedsAnonymousLogin(false); + setNeedsEncoding(false); + setNeedsTimeZone(false); + setNeedsHttpAuth(false); + } + + public OslcServiceDescriptor getProvider() { + return descriptor; + } + + public void setServiceDescriptor(OslcServiceDescriptor descriptor) { + this.descriptor = descriptor; + } + + protected String getBaseUrl() { + return baseText.getText(); + } + + @Override + protected void createSettingControls(Composite parent) { + + Label baseUrlLabel = new Label(parent, SWT.NONE); + baseUrlLabel.setText("Base URL:"); //$NON-NLS-1$ + baseText = new Text(parent, SWT.BORDER); + if (repository != null) { + String base = repository.getProperty(OSLC_BASEURL); + if (base != null) { + baseText.setText(base); + } + } + baseText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + serverUrlCombo.setText(baseText.getText()); + if (getWizard() != null) { + getWizard().getContainer().updateButtons(); + } + } + }); + + GridDataFactory.fillDefaults().hint(300, SWT.DEFAULT).span(2, 1).grab(true, false).applyTo(baseText); + + super.createSettingControls(parent); + if (serverUrlCombo.getText().length() == 0) { + serverUrlCombo.setText(Messages.OslcRepositorySettingsPage_Enter_Base_Url_Above); + } + serverUrlCombo.setEnabled(false); + } + + @Override + public abstract String getConnectorKind(); + + @Override + protected Validator getValidator(TaskRepository repository) { + return new OslcValidator(createTaskRepository(), baseText.getText()); + } + + @Override + protected boolean isValidUrl(String url) { + if (url.startsWith(URL_PREFIX_HTTPS) || url.startsWith(URL_PREFIX_HTTP)) { + try { + new URL(url); + return true; + } catch (MalformedURLException e) { + } + } + return false; + } + + @Override + public void applyTo(TaskRepository repository) { + repository.setProperty(OSLC_BASEURL, baseText.getText()); + super.applyTo(repository); + }; + + @Override + protected void applyValidatorResult(Validator validator) { + OslcValidator cqValidator = (OslcValidator) validator; + + if (!cqValidator.getProviders().isEmpty()) { + if (repository == null) { + repository = createTaskRepository(); + } + OslcServiceDiscoveryWizard oslcWizard = new OslcServiceDiscoveryWizard(((IOslcConnector) connector), + cqValidator.getRepository(), cqValidator.getProviders()); + OslcServiceDiscoveryWizardDialog dialog = new OslcServiceDiscoveryWizardDialog(getShell(), oslcWizard); + dialog.setBlockOnOpen(true); + dialog.create(); + int result = dialog.open(); + + if (result == Window.OK && oslcWizard.getSelectedServiceDescriptor() != null) { + setUrl(oslcWizard.getSelectedServiceDescriptor().getAboutUrl()); + setServiceDescriptor(oslcWizard.getSelectedServiceDescriptor()); + } else { + cqValidator.setStatus(Status.CANCEL_STATUS); + } + } + + super.applyValidatorResult(validator); + } + + private class OslcValidator extends Validator { + + final TaskRepository repository; + + private List<OslcServiceProvider> providers = new ArrayList<OslcServiceProvider>(); + + private final String baseUrl; + + public TaskRepository getRepository() { + return this.repository; + } + + public OslcValidator(TaskRepository repository, String baseUrl) { + this.repository = repository; + this.baseUrl = baseUrl; + } + + private String getBaseUrl() { + return baseUrl; + } + + @Override + public void run(IProgressMonitor monitor) throws CoreException { + try { + new URL(getBaseUrl()); + + // TODO: if only one ServiceProviderCatalog/ServiceProvider found, use it + List<OslcServiceProvider> serviceProviders = ((IOslcConnector) connector).getAvailableServices( + repository, getBaseUrl(), monitor); + setProviders(serviceProviders); + } catch (MalformedURLException ex) { + throw new CoreException(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN, IStatus.OK, + INVALID_REPOSITORY_URL, null)); + } catch (CoreException e) { + StatusHandler.log(new Status(IStatus.ERROR, IOslcCoreConstants.ID_PLUGIN, + "Error occurred during service discovery", e)); //$NON-NLS-1$ + } + + } + + private void setProviders(List<OslcServiceProvider> providers) { + this.providers = providers; + } + + public List<OslcServiceProvider> getProviders() { + return providers; + } + + } + + @Override + protected void createAdditionalControls(Composite parent) { + // ignore + } + +} |