/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * 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: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.ide.core.launch; import static melnorme.utilbox.core.CoreUtil.array; import static melnorme.utilbox.misc.StringUtil.nullAsEmpty; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; 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 melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.utils.ProjectValidator; import melnorme.lang.ide.core.utils.ResourceUtils; import melnorme.lang.ide.launching.LaunchConstants; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.status.StatusException; public class ProjectLaunchSettings implements ILaunchConfigSerializer { public ProjectValidator projectValidator = new ProjectValidator(LangCore.NATURE_ID); public String projectName = ""; public ProjectLaunchSettings() { } public ProjectLaunchSettings(String projectName) { this.projectName = projectName; } public ProjectLaunchSettings(ILaunchConfiguration config) throws CoreException { projectName = config.getAttribute(LaunchConstants.ATTR_PROJECT_NAME, ""); } public IProject getProject() { if(projectName == null || projectName.isEmpty()) { return null; } return ResourceUtils.getProject(projectName); } @Override public ProjectLaunchSettings initFrom(IResource contextualResource) { if(contextualResource == null) { return this; } IProject project = contextualResource.getProject(); IProject validProject; try { validProject = projectValidator.getProject(project.getName()); } catch(StatusException e) { return this; } try { initFromProject(validProject); } catch(CommonException e) { LangCore.logError("Error initializing launch settings from context resource: ", e); } return this; } public ProjectLaunchSettings initFromProject(IProject project) throws CommonException { projectName = project.getName(); return this; } protected ILaunchManager getLaunchManager() { return DebugPlugin.getDefault().getLaunchManager(); } public ILaunchConfiguration createNewConfiguration(ILaunchConfigurationType launchCfgType) throws CoreException, CommonException { String suggestedName = getSuggestedConfigName(); String launchName = getLaunchManager().generateLaunchConfigurationName(suggestedName); ILaunchConfigurationWorkingCopy wc = launchCfgType.newInstance(null, launchName); saveToConfig(wc); return wc.doSave(); } public final String getSuggestedConfigName() { // Suggested name should be trimmed, because it will be used as a file name String suggestedName = nullAsEmpty(getSuggestedConfigName_do()).trim(); if(suggestedName.isEmpty()) { return "New Launch"; } return suggestedName; } protected String getSuggestedConfigName_do() { return nullAsEmpty(projectName); } @Override public void saveToConfig(ILaunchConfigurationWorkingCopy config, boolean rename) throws CommonException { config.setAttribute(LaunchConstants.ATTR_PROJECT_NAME, projectName); config.setMappedResources(array(getProject())); if(rename) { String suggestedName = getSuggestedConfigName(); String newName = getLaunchManager().generateLaunchConfigurationName(suggestedName); config.rename(newName); } saveToConfig_rest(config); } @SuppressWarnings("unused") protected void saveToConfig_rest(ILaunchConfigurationWorkingCopy config) throws CommonException { } }