diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/templateengine')
4 files changed, 135 insertions, 6 deletions
diff --git a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/TemplateEngineMessages.java b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/TemplateEngineMessages.java index bba96d27340..4f790d97909 100644 --- a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/TemplateEngineMessages.java +++ b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/TemplateEngineMessages.java @@ -19,6 +19,11 @@ public class TemplateEngineMessages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle .getBundle(BUNDLE_NAME); + /** + * @since 5.6 + */ + public static String ProcessRunner_missingArg; + private TemplateEngineMessages() { } diff --git a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/messages.properties b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/messages.properties index 08d89dd50bf..43bd4b7692d 100644 --- a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/messages.properties +++ b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/messages.properties @@ -30,3 +30,4 @@ ProcessRunner.error=-->Error: ProcessRunner.success=-->Success: ProcessRunner.info=-->Info: ProcessHelper.fileNotFound=File not found: ''{0}'' +ProcessRunner_missingArg = ILanguageSettingsProvider failure: argument {0} not found diff --git a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/ProcessRunner.java b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/ProcessRunner.java index b091e0ae16b..b2742a9bf43 100644 --- a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/ProcessRunner.java +++ b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/ProcessRunner.java @@ -15,25 +15,34 @@ import org.eclipse.cdt.core.templateengine.TemplateEngineMessages; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import com.ibm.icu.text.MessageFormat; /** * Abstract ProcessRunner class provides the methods to implement for processes. */ public abstract class ProcessRunner { - + private ProcessParameter[] params = new ProcessParameter[0]; - + void setProcessParameters(ProcessParameter[] params) { this.params = params == null ? new ProcessParameter[0] : params; } - + /** * Returns the Process Parameters. */ public ProcessParameter[] getProcessParameters() { return params; } - + + /** + * @since 5.6 + */ + protected ProcessFailureException missingArgException(String processId, String varname) { + String msg = MessageFormat.format(TemplateEngineMessages.ProcessRunner_missingArg, varname); + return new ProcessFailureException(getProcessMessage(processId, IStatus.ERROR, msg)); + } + /** * Checks the whether the arguments are matching the required parameters. */ @@ -54,7 +63,7 @@ public abstract class ProcessRunner { } return true; } - + /** * Return the String containing the mismatching message * if the arguments are not matching the required parameters. @@ -95,7 +104,7 @@ public abstract class ProcessRunner { return processId + TemplateEngineMessages.getString("ProcessRunner.info") + msg; //$NON-NLS-1$ } } - + /** * @param template * @param args diff --git a/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/processes/SetEnvironmentVariable.java b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/processes/SetEnvironmentVariable.java new file mode 100644 index 00000000000..3492ff706ab --- /dev/null +++ b/core/org.eclipse.cdt.core/templateengine/org/eclipse/cdt/core/templateengine/process/processes/SetEnvironmentVariable.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2013 QNX Software Systems 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: + * QNX Software Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.templateengine.process.processes; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.envvar.IContributedEnvironment; +import org.eclipse.cdt.core.envvar.IEnvironmentVariable; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; +import org.eclipse.cdt.core.templateengine.TemplateCore; +import org.eclipse.cdt.core.templateengine.process.ProcessArgument; +import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; +import org.eclipse.cdt.core.templateengine.process.ProcessRunner; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * A template process for setting an environment variable in all of the new project's + * build configurations. E.g., + * <pre> + * <process type="org.eclipse.cdt.core.SetEnvironmentVariable"> + * <simple name="projectName" value="$(projectName)"/> + * <complex-array name="variables"> + * <element> + * <simple name="name" value="QMAKE"/> + * <simple name="value" value="$(qmake)"/> + * </element> + * </complex-array> + * </process> + * </pre> + * This will create an environment variable called "QMAKE" and will set the value to + * be the value entered in a field (called qmake) in the New Project wizard. + * + * @since 5.6 + */ +public class SetEnvironmentVariable extends ProcessRunner { + + private static final String PROJECTNAME_VARNAME = "projectName"; //$NON-NLS-1$ + private static final String VARIABLES_VARNAME = "variables"; //$NON-NLS-1$ + private static final String VARIABLES_NAME_VARNAME = "name"; //$NON-NLS-1$ + private static final String VARIABLES_VALUE_VARNAME = "value"; //$NON-NLS-1$ + + @Override + public void process(TemplateCore template, ProcessArgument[] args, String processId, IProgressMonitor monitor) throws ProcessFailureException { + + IProject project = null; + Map<String, String> envVars = new LinkedHashMap<String, String>(); + + for (ProcessArgument arg : args) { + String argName = arg.getName(); + if (PROJECTNAME_VARNAME.equals(argName)) + project = ResourcesPlugin.getWorkspace().getRoot().getProject(arg.getSimpleValue()); + else if(VARIABLES_VARNAME.equals(argName)) { + + for(ProcessArgument[] envVarArgs : arg.getComplexArrayValue()) { + String name = null; + String value = null; + + for(ProcessArgument varArg : envVarArgs) { + String varArgName = varArg.getName(); + if (VARIABLES_NAME_VARNAME.equals(varArgName)) + name = varArg.getSimpleValue(); + else if(VARIABLES_VALUE_VARNAME.equals(varArgName)) + value = varArg.getSimpleValue(); + } + + if (name == null) + throw missingArgException(processId, VARIABLES_NAME_VARNAME); + if (value == null) + throw missingArgException(processId, VARIABLES_VALUE_VARNAME); + + envVars.put(name, value); + } + } + } + + if (project == null) + throw missingArgException(processId, PROJECTNAME_VARNAME); + + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + ICProjectDescription des = mngr.getProjectDescription(project, true); + ICConfigurationDescription[] configDescs = des.getConfigurations(); + IContributedEnvironment ice = CCorePlugin.getDefault().getBuildEnvironmentManager().getContributedEnvironment(); + + for(Map.Entry<String, String> envVar : envVars.entrySet()) { + String name = envVar.getKey(); + String value = envVar.getValue(); + + for (ICConfigurationDescription configDesc : configDescs) + ice.addVariable(name, value, IEnvironmentVariable.ENVVAR_REPLACE, null, configDesc); + } + + try { + mngr.setProjectDescription(project, des); + } catch(CoreException e) { + CCorePlugin.log(e); + } + } +} |