/******************************************************************************* * Copyright 2011 Google Inc. All Rights Reserved. * * 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.google.gdt.eclipse.suite.launch; import com.google.gdt.eclipse.core.CorePluginLog; import com.google.gdt.eclipse.core.WebAppUtilities; import com.google.gdt.eclipse.core.extensions.ExtensionQuery; import com.google.gdt.eclipse.core.launch.ILaunchShortcutStrategy; import com.google.gdt.eclipse.core.launch.LaunchConfigurationProcessorUtilities; import com.google.gdt.eclipse.core.launch.LaunchConfigurationUtilities; import com.google.gdt.eclipse.core.launch.WebAppLaunchConfiguration; import com.google.gdt.eclipse.core.launch.WebAppLaunchConfigurationWorkingCopy; import com.google.gdt.eclipse.suite.launch.processors.PortArgumentProcessor; import com.google.gdt.eclipse.suite.launch.processors.WarArgumentProcessor; import com.google.gwt.eclipse.core.GWTPlugin; import com.google.gwt.eclipse.core.launch.GWTLaunchConfigurationWorkingCopy; import com.google.gwt.eclipse.core.launch.ILaunchShortcutStrategyProvider; import com.google.gwt.eclipse.core.launch.LegacyGWTLaunchShortcutStrategy; import com.google.gwt.eclipse.core.launch.ModuleClasspathProvider; import com.google.gwt.eclipse.core.launch.WebAppLaunchShortcutStrategy; import com.google.gwt.eclipse.core.launch.processors.SuperDevModeArgumentProcessor; import com.google.gwt.eclipse.core.nature.GWTNature; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import java.util.List; /** * Launch utilities. */ public class WebAppLaunchUtil { /** * Create a launch new configuration working copy. * * @param isGwtSuperDevModeEnabled will turn on GWT super dev mode. * @return ILaunchConfigurationWorkingCopy * @throws CoreException * @throws OperationCanceledException */ public static ILaunchConfigurationWorkingCopy createLaunchConfigWorkingCopy( String launchConfigName, final IProject project, String url, boolean isExternal, boolean isGwtSuperDevModeEnabled) throws CoreException, OperationCanceledException { assert (url != null); ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); ILaunchConfigurationType type = manager.getLaunchConfigurationType(WebAppLaunchConfiguration.TYPE_ID); final ILaunchConfigurationWorkingCopy wc = type.newInstance(null, launchConfigName); setDefaults(wc, project); LaunchConfigurationUtilities.setProjectName(wc, project.getName()); if (isExternal) { WebAppLaunchConfigurationWorkingCopy.setRunServer(wc, false); } GWTLaunchConfigurationWorkingCopy.setStartupUrl(wc, url); IPath warDir = null; if (WebAppUtilities.hasManagedWarOut(project)) { warDir = WebAppUtilities.getManagedWarOut(project).getLocation(); } if (warDir != null) { // The processor will update to the proper argument style for the current // project nature(s) WarArgumentProcessor warArgProcessor = new WarArgumentProcessor(); warArgProcessor.setWarDirFromLaunchConfigCreation(warDir.toOSString()); LaunchConfigurationProcessorUtilities.updateViaProcessor(warArgProcessor, wc); } // Link the launch configuration to the project. This will cause the // launch config to be deleted automatically if the project is deleted. wc.setMappedResources(new IResource[] {project}); // GWT SDM GWTLaunchConfigurationWorkingCopy.setSuperDevModeEnabled(wc, isGwtSuperDevModeEnabled); SuperDevModeArgumentProcessor sdmArgsProcessor = new SuperDevModeArgumentProcessor(); LaunchConfigurationProcessorUtilities.updateViaProcessor(sdmArgsProcessor, wc); return wc; } /** * Given a resource, figure out what the target URL should be for a launch configuration * corresponding to this resource. If the resource has several possible URLs that correspond to * it, this method will cause a dialog to pop up, asking the user to choose one. If the resource's * project uses GAE but not GWT, return empty string; GAE-only projects have no startup url. If * the resource's project uses GWT 2.0+, return empty string since no URL is started in dev mode. */ public static String determineStartupURL(IResource resource, boolean isExternalLaunch) throws CoreException { ILaunchShortcutStrategy strategy = null; IProject project = resource.getProject(); ExtensionQuery<ILaunchShortcutStrategyProvider> extQuery = new ExtensionQuery<ILaunchShortcutStrategyProvider>(GWTPlugin.PLUGIN_ID, "launchShortcutStrategy", "class"); List<ExtensionQuery.Data<ILaunchShortcutStrategyProvider>> strategyProviderInfos = extQuery.getData(); for (ExtensionQuery.Data<ILaunchShortcutStrategyProvider> data : strategyProviderInfos) { strategy = data.getExtensionPointData().getStrategy(project); break; } if (strategy == null) { if (WebAppUtilities.isWebApp(project)) { strategy = new WebAppLaunchShortcutStrategy(); } else { assert (GWTNature.isGWTProject(project)); strategy = new LegacyGWTLaunchShortcutStrategy(); } } return strategy.generateUrl(resource, isExternalLaunch); } public static ILaunchConfiguration findConfigurationByName(String name) { try { String configTypeStr = WebAppLaunchConfiguration.TYPE_ID; ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); ILaunchConfigurationType typeid = launchManager.getLaunchConfigurationType(configTypeStr); ILaunchConfiguration[] configs = launchManager.getLaunchConfigurations(typeid); for (ILaunchConfiguration config : configs) { if (config.getName().equals(name)) { return config; } } } catch (CoreException e) { CorePluginLog.logError(e); } return null; } /** * Returns the project associated with this launch configuration, or <code> * null</code> if there is no project assigned or if the project does not exist. */ public static IProject getProject(ILaunchConfiguration configuration) throws CoreException { String projectName = LaunchConfigurationUtilities.getProjectName(configuration); if (projectName.length() == 0) { return null; } IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); return project.exists() ? project : null; } public static void setDefaults(ILaunchConfigurationWorkingCopy configuration, IProject project) { // Set the default main type so it shows up when the launcher is created. configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, ModuleClasspathProvider.computeProviderId(project)); // Set the default server port LaunchConfigurationProcessorUtilities.updateViaProcessor(new PortArgumentProcessor(), configuration); } }