/******************************************************************************* * Copyright (c) 2013, 2014 Google, Inc 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: * Sergey Prigogin (Google) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.internal.core; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.variables.IDynamicVariable; import org.eclipse.core.variables.IStringVariable; import org.eclipse.core.variables.IStringVariableManager; import org.eclipse.core.variables.IValueVariable; import org.eclipse.core.variables.IValueVariableListener; import org.eclipse.core.variables.VariablesPlugin; /** * String variable substitutor that resolves project_name, project_loc and project_path variables * in the context of the given project. Resolution of all other variables is delegated to * the default string variable manager. */ public class DebugStringVariableSubstitutor implements IStringVariableManager { private static class ProjectVariable implements IDynamicVariable { final String name; final IProject project; final String description; ProjectVariable(String name, String description, IProject project) { this.name = name; this.description = description; this.project = project; } @Override public String getName() { return name; } @Override public String getDescription() { return description; } @Override public String getValue(String argument) throws CoreException { IProject project = this.project; if (argument != null) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IPath path = Path.fromOSString(argument); project = path.isEmpty() ? null : root.getProject(path.segment(0)); } if (project == null) return null; if (name.endsWith("_name")) //$NON-NLS-1$ return project.getName(); if (name.endsWith("_loc")) //$NON-NLS-1$ return project.getLocation().toOSString(); if (name.endsWith("_path")) //$NON-NLS-1$ return project.getProjectRelativePath().toString(); return null; } @Override public boolean supportsArgument() { return true; } } private final IStringVariableManager variableManager; private final IProject project; /** * Creates a variable substitutor that resolves project_name, project_loc and project_path * variables in the context of the given project. * * @param project the project used to resolve project_name, project_loc and project_path * variables. If {@code null}, the project is determined based on the current selection. */ public DebugStringVariableSubstitutor(IProject project) { this.variableManager = VariablesPlugin.getDefault().getStringVariableManager(); this.project = project; } /** * Creates a variable substitutor that resolves project_name, project_loc and project_path * variables in the context of the given project. * * @param projectName the name of the project used to resolve project_name, project_loc and * project_path variables. If {@code null} or empty, the project is determined based on the current * selection. */ public DebugStringVariableSubstitutor(String projectName) { this(projectName == null || projectName.isEmpty() ? null : ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)); } public IStringVariable[] getVariables() { IStringVariable[] variables = variableManager.getVariables(); for (int i = 0; i < variables.length; i++) { IStringVariable var = variables[i]; if (var instanceof IDynamicVariable) variables[i] = substituteVariable((IDynamicVariable) var); } return variables; } public IValueVariable[] getValueVariables() { return variableManager.getValueVariables(); } public IValueVariable getValueVariable(String name) { return variableManager.getValueVariable(name); } public IDynamicVariable[] getDynamicVariables() { IDynamicVariable[] variables = variableManager.getDynamicVariables(); for (int i = 0; i < variables.length; i++) { variables[i] = substituteVariable(variables[i]); } return variables; } public IDynamicVariable getDynamicVariable(String name) { IDynamicVariable var = variableManager.getDynamicVariable(name); if (var == null) return null; return substituteVariable(var); } private IDynamicVariable substituteVariable(IDynamicVariable var) { String name = var.getName(); if ("project_loc".equals(name) || "project_name".equals(name) || "project_path".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return new ProjectVariable(name, var.getDescription(), project); } return var; } public String getContributingPluginId(IStringVariable variable) { return variableManager.getContributingPluginId(variable); } public String performStringSubstitution(String expression) throws CoreException { return performStringSubstitution(expression, true); } public String performStringSubstitution(String expression, boolean reportUndefinedVariables) throws CoreException { return new StringSubstitutionEngine().performStringSubstitution(expression, reportUndefinedVariables, true, this); } public void validateStringVariables(String expression) throws CoreException { new StringSubstitutionEngine().validateStringVariables(expression, this); } public IValueVariable newValueVariable(String name, String description) { return variableManager.newValueVariable(name, description); } public IValueVariable newValueVariable(String name, String description, boolean readOnly, String value) { return variableManager.newValueVariable(name, description, readOnly, value); } public void addVariables(IValueVariable[] variables) throws CoreException { variableManager.addVariables(variables); } public void removeVariables(IValueVariable[] variables) { variableManager.removeVariables(variables); } public void addValueVariableListener(IValueVariableListener listener) { variableManager.addValueVariableListener(listener); } public void removeValueVariableListener(IValueVariableListener listener) { variableManager.removeValueVariableListener(listener); } public String generateVariableExpression(String varName, String arg) { return variableManager.generateVariableExpression(varName, arg); } }