/** * Aptana Studio * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.radrails.rails.internal.ui.commands; import java.util.List; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.debug.core.ILaunchManager; import org.radrails.rails.core.RailsServer; import org.radrails.rails.ui.RailsUIPlugin; import com.aptana.core.IFilter; import com.aptana.core.logging.IdeLog; import com.aptana.webserver.core.IServer; import com.aptana.webserver.core.IServerManager; import com.aptana.webserver.core.WebServerCorePlugin; /** * @author cwilliams */ public class RunServerHandler extends AbstractRailsHandler { protected String getMode() { return ILaunchManager.RUN_MODE; } public Object execute(ExecutionEvent event) throws ExecutionException { IProject railsProject = getProject(event); if (railsProject == null) { return null; } RailsServer server = findOrCreateServer(railsProject); if (server == null) { return null; } String mode = getMode(); if (server.getState() == IServer.State.STARTED) { // if already started in our target mode, restart if (mode.equals(server.getMode())) { // restart server.restart(mode, new NullProgressMonitor()); return null; } // Already started, but in a different mode, so stop first server.stop(true, new NullProgressMonitor()); } // start in target mode. server.start(mode, new NullProgressMonitor()); return null; } private RailsServer findOrCreateServer(final IProject railsProject) { // find all the servers for this project List<IServer> servers = getServerManager().getServers(new IFilter<IServer>() { public boolean include(IServer item) { if (item instanceof RailsServer) { RailsServer possible = (RailsServer) item; if (railsProject.equals(possible.getProject())) { return true; } } return false; } }); // If there are any, return the first one if (!servers.isEmpty()) { return (RailsServer) servers.get(0); } // No matching server. We need to create one return addServer(railsProject); } protected RailsServer addServer(final IProject project) { try { IServerManager serverManager = getServerManager(); RailsServer server = (RailsServer) serverManager.createServer(RailsServer.TYPE_ID); server.setProject(project); server.setName(project.getName()); serverManager.add(server); return server; } catch (CoreException e) { IdeLog.logError(RailsUIPlugin.getDefault(), "Error adding server for Rails project", e); //$NON-NLS-1$ } return null; } protected IServerManager getServerManager() { return WebServerCorePlugin.getDefault().getServerManager(); } }