| /******************************************************************************* |
| * Copyright (c) 2005, 2011 IBM Corporation 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: |
| * IBM Corporation - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.server.ui.internal.viewers; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.jface.viewers.ViewerSorter; |
| import org.eclipse.wst.common.project.facet.core.IFacetedProject; |
| import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; |
| import org.eclipse.wst.server.core.*; |
| import org.eclipse.wst.server.core.internal.ResourceManager; |
| import org.eclipse.wst.server.core.internal.facets.FacetUtil; |
| import org.eclipse.wst.server.ui.internal.ServerUIPlugin; |
| import org.eclipse.wst.server.ui.internal.Trace; |
| /** |
| * Class used to sort categories, runtime types, and server types in the |
| * New wizards. |
| */ |
| public class InitialSelectionProvider extends ViewerSorter { |
| |
| public Object getInitialSelection(Object[] obj) { |
| if (obj == null || obj.length == 0) |
| return null; |
| |
| if (obj[0] instanceof IRuntimeType) { |
| int size = obj.length; |
| IRuntimeType[] rt = new IRuntimeType[size]; |
| for (int i = 0; i < size; i++) |
| rt[i] = (IRuntimeType) obj[i]; |
| return getInitialSelection(rt); |
| } |
| |
| if (obj[0] instanceof IServerType) { |
| int size = obj.length; |
| IServerType[] st = new IServerType[size]; |
| for (int i = 0; i < size; i++) |
| st[i] = (IServerType) obj[i]; |
| return getInitialSelection(st); |
| } |
| |
| if (obj[0] instanceof IServer) { |
| int size = obj.length; |
| IServer[] st = new IServer[size]; |
| for (int i = 0; i < size; i++) |
| st[i] = (IServer) obj[i]; |
| return getInitialSelection(st); |
| } |
| |
| return null; |
| } |
| |
| /** |
| * |
| * @param serverTypes |
| * @return the initial selection |
| */ |
| public IServerType getInitialSelection(IServerType[] serverTypes) { |
| if (serverTypes == null) |
| return null; |
| |
| int size = serverTypes.length; |
| for (int i = 0; i < size; i++) { |
| if (hasRuntime(serverTypes[i])) |
| return serverTypes[i]; |
| } |
| return getDefaultServerType(serverTypes); |
| } |
| |
| /** |
| * |
| * @param servers |
| * @return the initial selection |
| */ |
| public IServer getInitialSelection(IServer[] servers) { |
| return getInitialSelection(servers,null); |
| } |
| |
| /** |
| * Allows adopters to provide an initial selection out of a list of items. |
| * <p> |
| * The <code>IProject</code> can be null, in cases where a project selection was not available (ie: New Server Wizard) |
| * </p><p> |
| * Returning <code>null</code> means no object is applicable to be selected. |
| * </p> |
| * |
| * @param servers |
| * @param project |
| * @return |
| */ |
| public IServer getInitialSelection(IServer[] servers, IProject project){ |
| if (servers == null) |
| return null; |
| |
| IServer rval = servers[0]; |
| |
| if (project != null){ |
| try{ |
| // check for the targeted runtime of the project |
| IFacetedProject facetedProject = ProjectFacetsManager.create(project); |
| if (facetedProject != null){ |
| org.eclipse.wst.common.project.facet.core.runtime.IRuntime facetedRuntime = facetedProject.getPrimaryRuntime(); |
| if (facetedRuntime != null){ |
| IRuntime runtime = FacetUtil.getRuntime(facetedRuntime); |
| IServer server = findServerFromRuntime(runtime.getId()); |
| if (server != null){ |
| rval = server; |
| } |
| } |
| } |
| } |
| catch (CoreException ce){ |
| if (Trace.WARNING) { |
| Trace.trace(Trace.STRING_WARNING, "Could not create a faceted project", ce); |
| } |
| } |
| } |
| return rval; |
| } |
| |
| /** |
| * |
| * @param runtimeTypes |
| * @return the initial selection |
| */ |
| public IRuntimeType getInitialSelection(IRuntimeType[] runtimeTypes) { |
| if (runtimeTypes == null) |
| return null; |
| |
| int size = runtimeTypes.length; |
| for (int i = 0; i < size; i++) { |
| if (hasRuntime(runtimeTypes[i])) |
| return runtimeTypes[i]; |
| } |
| return getDefaultRuntimeType(runtimeTypes); |
| } |
| |
| protected boolean hasRuntime(IServerType serverType) { |
| return hasRuntime(serverType.getRuntimeType()); |
| } |
| |
| protected boolean hasRuntime(IRuntimeType runtimeType) { |
| if (runtimeType == null) |
| return false; |
| IRuntime[] runtimes = ServerUIPlugin.getRuntimes(runtimeType); |
| return runtimes != null && runtimes.length > 0; |
| } |
| |
| /** |
| * Returns a default server type, typically the 'first' one sorted |
| * alphabetically by name. |
| * |
| * @param serverTypes |
| * @return the default server type |
| */ |
| protected IServerType getDefaultServerType(IServerType[] serverTypes) { |
| if (serverTypes == null) |
| return null; |
| |
| int size = serverTypes.length; |
| if (size == 1) |
| return serverTypes[0]; |
| |
| IServerType first = serverTypes[0]; |
| for (int i = 1; i < size; i++) { |
| if (DefaultViewerSorter.compareServerTypes(first, serverTypes[i]) > 0) |
| first = serverTypes[i]; |
| } |
| return first; |
| } |
| |
| /** |
| * Returns a default runtime type, typically the 'first' one sorted |
| * alphabetically by name. |
| * |
| * @param runtimeTypes |
| * @return the default runtime type |
| */ |
| protected IRuntimeType getDefaultRuntimeType(IRuntimeType[] runtimeTypes) { |
| if (runtimeTypes == null) |
| return null; |
| |
| int size = runtimeTypes.length; |
| if (size == 1) |
| return runtimeTypes[0]; |
| |
| IRuntimeType first = runtimeTypes[0]; |
| for (int i = 1; i < size; i++) { |
| if (DefaultViewerSorter.compareRuntimeTypes(first, runtimeTypes[i]) > 0) |
| first = runtimeTypes[i]; |
| } |
| return first; |
| } |
| |
| /** |
| * Allows adopters to provide an initial selection out of a list of items. |
| * <p> |
| * The <code>IProject</code> can be null, in cases where a project selection was not available (ie: New Server Wizard) |
| * </p><p> |
| * Returning <code>null</code> means no object is applicable to be selected. |
| * </p> |
| * |
| * @param obj Contains an array of all the possible object to be selected. |
| * @param project |
| * @return The object to be selected from the <code>obj[]</code> |
| */ |
| public Object getInitialSelection(Object [] obj, IProject project){ |
| if (obj == null || obj.length == 0) |
| return null; |
| |
| if (obj[0] instanceof IRuntimeType) { |
| int size = obj.length; |
| IRuntimeType[] rt = new IRuntimeType[size]; |
| for (int i = 0; i < size; i++) |
| rt[i] = (IRuntimeType) obj[i]; |
| return getInitialSelection(rt); |
| } |
| |
| if (obj[0] instanceof IServerType) { |
| int size = obj.length; |
| IServerType[] st = new IServerType[size]; |
| for (int i = 0; i < size; i++) |
| st[i] = (IServerType) obj[i]; |
| return getInitialSelection(st); |
| } |
| |
| if (obj[0] instanceof IServer) { |
| int size = obj.length; |
| IServer[] st = new IServer[size]; |
| for (int i = 0; i < size; i++) |
| st[i] = (IServer) obj[i]; |
| return getInitialSelection(st,project); |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Returns the server with the given runtime id, or <code>null</code> |
| * if none. This convenience method searches the list of registered servers |
| * for the matching runtime id. The id may not be null. |
| * |
| * @param runtimeId |
| * @return |
| */ |
| private static IServer findServerFromRuntime(String runtimeId){ |
| if (runtimeId == null) |
| throw new IllegalArgumentException(); |
| |
| IServer [] servers = ResourceManager.getInstance().getServers(); |
| for (IServer server:servers){ |
| if (runtimeId == server.getRuntime().getId()){ |
| return server; |
| } |
| } |
| return null; |
| } |
| |
| } |