/******************************************************************************* * Copyright (c) 2010, 2012 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 * Itema AS - Typo fix, corrected lazy initialisation of field *******************************************************************************/ package org.eclipse.mylyn.builds.ui; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.mylyn.builds.core.IBuildElement; import org.eclipse.mylyn.builds.core.IBuildModel; import org.eclipse.mylyn.builds.core.IBuildServer; import org.eclipse.mylyn.builds.core.spi.BuildConnector; import org.eclipse.mylyn.builds.internal.core.BuildServer; import org.eclipse.mylyn.builds.ui.spi.BuildConnectorUi; import org.eclipse.mylyn.commons.notifications.ui.NotificationsUi; import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation; import org.eclipse.mylyn.commons.workbench.EditorHandle; import org.eclipse.mylyn.internal.builds.ui.BuildConnectorDescriptor; import org.eclipse.mylyn.internal.builds.ui.BuildsUiInternal; import org.eclipse.mylyn.internal.builds.ui.BuildsUiPlugin; import org.eclipse.mylyn.internal.builds.ui.commands.OpenHandler; import org.eclipse.mylyn.internal.builds.ui.notifications.BuildsServiceNotification; import org.eclipse.mylyn.internal.builds.ui.view.BuildsView; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.statushandlers.StatusManager; /** * @author Steffen Pingel * @author Torkild U. Resheim */ public class BuildsUi { private static HashMap<String, BuildConnectorDescriptor> descriptorByKind; public synchronized static BuildConnector getConnector(String connectorKind) { BuildConnectorDescriptor descriptor = getConnectorDescriptorByKind().get(connectorKind); return (descriptor != null) ? descriptor.getCoreDelegate() : null; } public synchronized static BuildConnectorUi getConnectorUi(String connectorKind) { BuildConnectorDescriptor descriptor = getConnectorDescriptorByKind().get(connectorKind); return (descriptor != null) ? descriptor.getUiDelegate() : null; } public synchronized static IBuildModel getModel() { return BuildsUiInternal.getModel(); } private synchronized static HashMap<String, BuildConnectorDescriptor> getConnectorDescriptorByKind() { if (descriptorByKind != null) { return descriptorByKind; } descriptorByKind = new HashMap<String, BuildConnectorDescriptor>(); MultiStatus result = new MultiStatus(BuildsUiPlugin.ID_PLUGIN, 0, "Build connectors failed to load.", null); //$NON-NLS-1$ IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtensionPoint connectorsExtensionPoint = registry.getExtensionPoint(BuildsUiPlugin.ID_PLUGIN + ".connectors"); IExtension[] extensions = connectorsExtensionPoint.getExtensions(); for (IExtension extension : extensions) { IConfigurationElement[] elements = extension.getConfigurationElements(); for (IConfigurationElement element : elements) { BuildConnectorDescriptor descriptor = new BuildConnectorDescriptor(element); IStatus status = descriptor.validate(); if (status.isOK()) { descriptorByKind.put(descriptor.getConnectorKind(), descriptor); } else { result.add(status); } } } if (!result.isOK()) { StatusManager.getManager().handle(result); } return descriptorByKind; } public static IBuildServer createServer(String connectorKind) { return BuildsUiInternal.createServer(connectorKind, new RepositoryLocation()); } public static BuildConnector getConnector(IBuildServer server) { return getConnector(((BuildServer) server).getConnectorKind()); } public static BuildConnectorUi getConnectorUi(IBuildServer server) { return getConnectorUi(((BuildServer) server).getConnectorKind()); } public static void serverDiscovered(String title, String description) { BuildsServiceNotification notification = new BuildsServiceNotification(title, description); NotificationsUi.getService().notify(Collections.singletonList(notification)); } public static void open(IBuildElement element) { Assert.isNotNull(element); IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { IWorkbenchPage page = window.getActivePage(); if (page != null) { List<EditorHandle> handle = OpenHandler.open(page, Collections.singletonList(element)); if (handle.get(0).getStatus() != null && handle.get(0).getStatus().isOK()) { return; } } } // fall back to opening builds view BuildsView.openInActivePerspective(); } /** * Returns a list of existing server locations. It is safe to call this method from any thread. */ public static List<RepositoryLocation> getServerLocations() { final List<RepositoryLocation> locations = new ArrayList<RepositoryLocation>(); final IBuildModel model = BuildsUi.getModel(); BuildsUiInternal.getOperationService().getRealm().syncExec(new Runnable() { public void run() { List<IBuildServer> servers = model.getServers(); for (IBuildServer server : servers) { locations.add(server.getLocation()); } } }); return locations; } }