Added support for variable ${project} in import roots.
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_parse_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_parse_Test.java
index 2122362..7dc12eb 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_parse_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_parse_Test.java
@@ -26,6 +26,12 @@
assertThat(path.isWorkspacePath(), equalTo(true));
}
+ @Test public void should_parse_project_path() {
+ DirectoryPath path = DirectoryPath.parse("/${project}/src}");
+ assertThat(path.value(), equalTo("/${project}/src}"));
+ assertThat(path.isWorkspacePath(), equalTo(true));
+ }
+
@Test public void should_parse_file_system_path() {
DirectoryPath path = DirectoryPath.parse("/test/src");
assertThat(path.value(), equalTo("/test/src"));
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_toString_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_toString_Test.java
index 0b90114..c387983 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_toString_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath_toString_Test.java
@@ -25,6 +25,11 @@
assertThat(path.toString(), equalTo("${workspace_loc:/test/src}"));
}
+ @Test public void should_specify_is_project_path() {
+ DirectoryPath path = new DirectoryPath("/${project}/src", true);
+ assertThat(path.toString(), equalTo("/${project}/src"));
+ }
+
@Test public void should_return_plain_value_if_it_is_not_workspace_path() {
DirectoryPath path = new DirectoryPath("/test/src", false);
assertThat(path.toString(), equalTo("/test/src"));
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Fields_calculateTagNumberOf_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Fields_calculateTagNumberOf_Test.java
index 032d125..c117191 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Fields_calculateTagNumberOf_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Fields_calculateTagNumberOf_Test.java
@@ -15,11 +15,10 @@
import org.junit.*;
import com.google.eclipse.protobuf.junit.core.XtextRule;
-import com.google.eclipse.protobuf.protobuf.Property;
-import com.google.eclipse.protobuf.protobuf.Protobuf;
+import com.google.eclipse.protobuf.protobuf.*;
/**
- * Tests for <code>{@link Fields#calculateTagNumberOf(Property)}</code>.
+ * Tests for <code>{@link Fields#calculateTagNumberOf(Field)}</code>.
*
* @author alruiz@google.com (Alex Ruiz)
*/
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProjectVariable_useProjectName_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProjectVariable_useProjectName_Test.java
new file mode 100644
index 0000000..417f81a
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProjectVariable_useProjectName_Test.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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
+ */
+package com.google.eclipse.protobuf.ui.util;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.*;
+
+import org.eclipse.core.resources.IProject;
+import org.junit.*;
+
+/**
+ * Tests for <code>{@link ProjectVariable#useProjectName(String, IProject)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProjectVariable_useProjectName_Test {
+
+ private IProject project;
+
+ @Before public void setUp() {
+ project = mock(IProject.class);
+ }
+
+ @Test public void should_use_project_name_if_path_contains_variable() {
+ when(project.getName()).thenReturn("test");
+ String newPath = ProjectVariable.useProjectName("/${project}/src/test", project);
+ assertThat(newPath, equalTo("/test/src/test"));
+ }
+
+ @Test public void should_not_use_project_name_if_path_does_not_contain_variable() {
+ when(project.getName()).thenReturn("test");
+ String newPath = ProjectVariable.useProjectName("/main/src/test", project);
+ assertThat(newPath, equalTo("/main/src/test"));
+ }
+
+ @Test public void should_not_use_project_name_if_path_already_contains_it() {
+ when(project.getName()).thenReturn("test");
+ String newPath = ProjectVariable.useProjectName("/test/src/test", project);
+ assertThat(newPath, equalTo("/test/src/test"));
+ }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProjectVariable_useProjectVariable_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProjectVariable_useProjectVariable_Test.java
new file mode 100644
index 0000000..4cab0c5
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProjectVariable_useProjectVariable_Test.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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
+ */
+package com.google.eclipse.protobuf.ui.util;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.*;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.*;
+import org.junit.*;
+
+/**
+ * Tests for <code>{@link ProjectVariable#useProjectVariable(IPath, IProject)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProjectVariable_useProjectVariable_Test {
+
+ private IProject project;
+
+ @Before public void setUp() {
+ project = mock(IProject.class);
+ }
+
+ @Test public void should_use_variable_if_path_contains_project_name() {
+ IPath path = new Path("/test/src/test");
+ when(project.getName()).thenReturn("test");
+ IPath newPath = ProjectVariable.useProjectVariable(path, project);
+ assertThat(newPath.toString(), equalTo("/${project}/src/test"));
+ }
+
+ @Test public void should_not_use_variable_if_path_does_not_contain_project_name() {
+ IPath path = new Path("/main/src/test");
+ when(project.getName()).thenReturn("test");
+ IPath newPath = ProjectVariable.useProjectVariable(path, project);
+ assertThat(newPath.toString(), equalTo("/main/src/test"));
+ }
+
+ @Test public void should_not_use_variable_if_path_already_contains_it() {
+ IPath path = new Path("/${project}/src/test");
+ when(project.getName()).thenReturn("test");
+ IPath newPath = ProjectVariable.useProjectVariable(path, project);
+ assertThat(newPath.toString(), equalTo("/${project}/src/test"));
+ }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Strings_firstCharToLowerCase_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Strings_firstCharToLowerCase_Test.java
index 6453372..47fd9b1 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Strings_firstCharToLowerCase_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Strings_firstCharToLowerCase_Test.java
@@ -12,7 +12,6 @@
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertThat;
-import org.junit.BeforeClass;
import org.junit.Test;
/**
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtobufBuildParticipant.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtobufBuildParticipant.java
index 1e55016..6aa9563 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtobufBuildParticipant.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtobufBuildParticipant.java
@@ -64,7 +64,7 @@
private List<String> importRoots(IProject project) {
List<String> paths = new ArrayList<String>();
PathsPreferences preferences = pathsPreferencesProvider.getPreferences(project);
- List<DirectoryPath> directoryPaths = preferences.directoryPaths();
+ List<DirectoryPath> directoryPaths = preferences.importRoots();
for (DirectoryPath path : directoryPaths) {
String location = locationOfDirectory(path, project);
if (location != null) paths.add(location);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
index cd4cd0d..5679b03 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
@@ -10,18 +10,20 @@
import static com.google.eclipse.protobuf.ui.preferences.paths.DirectorySelectionDialogs.*;
import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.*;
+import static com.google.eclipse.protobuf.ui.util.ProjectVariable.useProjectVariable;
import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
import static org.eclipse.xtext.util.Strings.isEmpty;
+import com.google.eclipse.protobuf.ui.preferences.InputDialog;
+
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
-import com.google.eclipse.protobuf.ui.preferences.InputDialog;
-
/**
* Dialog where users can select a path (in the workspace or file system) to be included in resolution of imports.
*
@@ -29,6 +31,8 @@
*/
public class AddDirectoryDialog extends InputDialog {
+ private final IProject project;
+
private DirectoryPath selectedPath;
private Text txtPath;
@@ -43,6 +47,7 @@
*/
public AddDirectoryDialog(Shell parent, IProject project) {
super(parent, addDirectoryPath);
+ this.project = project;
}
/** {@inheritDoc} */
@@ -94,16 +99,17 @@
private void addEventListeners() {
btnWorkspace.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
- String path = showWorkspaceDirectoryDialog(getShell(), enteredPathText());
+ IPath path = showWorkspaceDirectorySelectionDialog(getShell(), enteredPathText());
if (path != null) {
- txtPath.setText(path.trim());
+ path = useProjectVariable(path, project);
+ txtPath.setText(path.toString().trim());
btnIsWorkspacePath.setSelection(true);
}
}
});
btnFileSystem.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
- String path = showFileSystemFolderDialog(getShell(), enteredPathText());
+ String path = showFileSystemDirectorySelectionDialog(getShell(), enteredPathText());
if (path != null) {
txtPath.setText(path.trim());
btnIsWorkspacePath.setSelection(false);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java
index 985589c..611426d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java
@@ -8,8 +8,9 @@
*/
package com.google.eclipse.protobuf.ui.preferences.paths;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import static com.google.eclipse.protobuf.ui.util.ProjectVariable.containsProjectVariable;
+
+import java.util.regex.*;
/**
* @author alruiz@google.com (Alex Ruiz)
@@ -24,6 +25,7 @@
static DirectoryPath parse(String path) {
Matcher matcher = WORKSPACE_PATH_PATTERN.matcher(path);
if (matcher.matches()) return new DirectoryPath(matcher.group(1), true);
+ if (containsProjectVariable(path)) return new DirectoryPath(path, true);
return new DirectoryPath(path, false);
}
@@ -34,7 +36,7 @@
/** {@inheritDoc} */
@Override public String toString() {
- if (!isWorkspacePath) return value;
+ if (!isWorkspacePath || containsProjectVariable(value)) return value;
return "${workspace_loc:" + value + "}";
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java
index e978653..cf088d0 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java
@@ -32,20 +32,21 @@
*/
class DirectorySelectionDialogs {
- static String showWorkspaceDirectoryDialog(Shell shell, String initialPath) {
- return showWorkspaceDirectoryDialog(shell, initialPath, null);
+ static IPath showWorkspaceDirectorySelectionDialog(Shell shell, String initialPath) {
+ return showWorkspaceDirectorySelectionDialog(shell, initialPath, null);
}
- static String showWorkspaceDirectoryDialog(Shell shell, String initialPath, IProject project) {
+ static IPath showWorkspaceDirectorySelectionDialog(Shell shell, String initialPath, IProject project) {
String currentPathText = initialPath.replaceAll("\"", "");
URI uri = URI.create(currentPathText);
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell, new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
- dialog.setInput(project == null ? workspaceRoot() : project);
+ IWorkspaceRoot workspaceRoot = workspaceRoot();
+ dialog.setInput(project == null ? workspaceRoot : project);
dialog.setComparator(new ResourceComparator(NAME));
IResource container = null;
if (uri.isAbsolute()) {
- IContainer containers[] = workspaceRoot().findContainersForLocationURI(uri);
+ IContainer containers[] = workspaceRoot.findContainersForLocationURI(uri);
if (containers != null && containers.length > 0) container = containers[0];
}
dialog.setInitialSelection(container);
@@ -60,11 +61,10 @@
dialog.setMessage(selectWorkspaceDirectory);
if (dialog.open() != OK) return null;
IResource resource = (IResource) dialog.getFirstResult();
- if (resource == null) return null;
- return resource.getFullPath().toString();
+ return (resource == null) ? null : resource.getFullPath();
}
- static String showFileSystemFolderDialog(Shell shell, String filterPath) {
+ static String showFileSystemDirectorySelectionDialog(Shell shell, String filterPath) {
DirectoryDialog dialog = new DirectoryDialog(shell, SWT.OPEN | SWT.APPLICATION_MODAL);
if (filterPath != null && filterPath.trim().length() != 0) dialog.setFilterPath(filterPath);
dialog.setMessage(selectFileSystemDirectory);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
index bd15f7d..c7faae3 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
@@ -78,7 +78,7 @@
IPreferenceStore store = getPreferenceStore();
btnOneFolderOnly.setSelection(store.getBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
btnMultipleFolders.setSelection(store.getBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
- setDirectoryPaths(store.getString(DIRECTORY_PATHS));
+ setDirectoryPaths(store.getString(IMPORT_ROOTS));
enableProjectOptions(true);
}
@@ -113,7 +113,7 @@
@Override protected void performDefaults(IPreferenceStore store) {
btnOneFolderOnly.setSelection(store.getDefaultBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
btnMultipleFolders.setSelection(store.getDefaultBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
- setDirectoryPaths(store.getDefaultString(DIRECTORY_PATHS));
+ setDirectoryPaths(store.getDefaultString(IMPORT_ROOTS));
enableProjectOptions(true);
super.performDefaults();
}
@@ -138,7 +138,7 @@
@Override protected void savePreferences(IPreferenceStore store) {
store.setValue(FILES_IN_ONE_DIRECTORY_ONLY, btnOneFolderOnly.getSelection());
store.setValue(FILES_IN_MULTIPLE_DIRECTORIES, btnMultipleFolders.getSelection());
- store.setValue(DIRECTORY_PATHS, directoryNames());
+ store.setValue(IMPORT_ROOTS, directoryNames());
}
private String directoryNames() {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceStoreInitializer.java
index 0766d28..0eb2245 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceStoreInitializer.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceStoreInitializer.java
@@ -26,7 +26,7 @@
IPreferenceStore store = access.getWritablePreferenceStore();
store.setDefault(FILES_IN_ONE_DIRECTORY_ONLY, true);
store.setDefault(FILES_IN_MULTIPLE_DIRECTORIES, false);
- store.setDefault(DIRECTORY_PATHS, "");
+ store.setDefault(IMPORT_ROOTS, "");
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
index 262203b..f276046 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
@@ -9,7 +9,7 @@
package com.google.eclipse.protobuf.ui.preferences.paths;
import static com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType.SINGLE_DIRECTORY;
-import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.DIRECTORY_PATHS;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.IMPORT_ROOTS;
import static com.google.eclipse.protobuf.ui.util.Strings.CSV_PATTERN;
import static java.util.Collections.*;
@@ -27,27 +27,27 @@
public class PathsPreferences {
private final PathResolutionType pathResolutionType;
- private final List<DirectoryPath> directoryPaths;
+ private final List<DirectoryPath> importRoots;
PathsPreferences(IPreferenceStore store) {
pathResolutionType = PathResolutionType.readFrom(store);
- directoryPaths = directoryPaths(pathResolutionType, store);
+ importRoots = importRoots(pathResolutionType, store);
}
- private static List<DirectoryPath> directoryPaths(PathResolutionType types, IPreferenceStore store) {
+ private static List<DirectoryPath> importRoots(PathResolutionType types, IPreferenceStore store) {
if (types.equals(SINGLE_DIRECTORY)) return emptyList();
- List<DirectoryPath> paths = new ArrayList<DirectoryPath>();
- for (String directoryPath : store.getString(DIRECTORY_PATHS).split(CSV_PATTERN)) {
- paths.add(DirectoryPath.parse(directoryPath));
+ List<DirectoryPath> roots = new ArrayList<DirectoryPath>();
+ for (String root : store.getString(IMPORT_ROOTS).split(CSV_PATTERN)) {
+ roots.add(DirectoryPath.parse(root));
}
- return unmodifiableList(paths);
+ return unmodifiableList(roots);
}
public PathResolutionType pathResolutionType() {
return pathResolutionType;
}
- public List<DirectoryPath> directoryPaths() {
- return directoryPaths;
+ public List<DirectoryPath> importRoots() {
+ return importRoots;
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java
index 936db6f..4bd8025 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java
@@ -15,7 +15,7 @@
static final String FILES_IN_ONE_DIRECTORY_ONLY = "paths.filesInOneDirectoryOnly";
static final String FILES_IN_MULTIPLE_DIRECTORIES = "paths.filesInMultipleDirectories";
- static final String DIRECTORY_PATHS = "paths.directoryPaths";
+ static final String IMPORT_ROOTS = "paths.directoryPaths";
private PreferenceNames() {}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
index b4f7db7..b39adbc 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
@@ -8,6 +8,8 @@
*/
package com.google.eclipse.protobuf.ui.scoping;
+import static com.google.eclipse.protobuf.ui.util.ProjectVariable.useProjectName;
+
import java.util.List;
import org.eclipse.core.filesystem.*;
@@ -18,7 +20,7 @@
import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
-import com.google.eclipse.protobuf.ui.util.Resources;
+import com.google.eclipse.protobuf.ui.util.*;
/**
* @author alruiz@google.com (Alex Ruiz)
@@ -35,32 +37,32 @@
/** {@inheritDoc} */
public String resolveUri(String importUri, URI declaringResourceUri, IProject project, PathsPreferences preferences) {
- List<DirectoryPath> directoryPaths = preferences.directoryPaths();
- for (DirectoryPath directoryPath : directoryPaths) {
- String resolved = resolveUri(importUri, directoryPath);
+ List<DirectoryPath> importRoots = preferences.importRoots();
+ for (DirectoryPath root : importRoots) {
+ String resolved = resolveUri(importUri, root, project);
if (resolved != null) return resolved;
}
- for (DirectoryPath directoryPath : directoryPaths) {
- if (!directoryPath.isWorkspacePath()) continue;
- String resolved = resolveUriFileSystem(importUri, mapping.folderLocation(directoryPath.value()));
+ for (DirectoryPath root : importRoots) {
+ if (!root.isWorkspacePath()) continue;
+ String resolved = resolveUriInFileSystem(importUri, mapping.folderLocation(root.value()));
if (resolved != null) return resolved;
}
return null;
}
- private String resolveUri(String importUri, DirectoryPath importRoot) {
+ private String resolveUri(String importUri, DirectoryPath importRoot, IProject project) {
String root = importRoot.value();
- if (importRoot.isWorkspacePath()) return resolveUriInWorkspace(importUri, root);
- return resolveUriFileSystem(importUri, root);
+ if (importRoot.isWorkspacePath()) return resolveUriInWorkspace(importUri, root, project);
+ return resolveUriInFileSystem(importUri, root);
}
- private String resolveUriInWorkspace(String importUri, String importRoot) {
- String path = PREFIX + importRoot + SEPARATOR + importUri;
+ private String resolveUriInWorkspace(String importUri, String importRoot, IProject project) {
+ String path = PREFIX + useProjectName(importRoot, project) + SEPARATOR + importUri;
boolean exists = resources.fileExists(URI.createURI(path));
return (exists) ? path : null;
}
- private String resolveUriFileSystem(String importUri, String importRoot) {
+ private String resolveUriInFileSystem(String importUri, String importRoot) {
IFileSystem fileSystem = EFS.getLocalFileSystem();
IPath path = new Path(importRoot + SEPARATOR + importUri);
IFileInfo fileInfo = fileSystem.getStore(path).fetchInfo();
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProjectVariable.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProjectVariable.java
new file mode 100644
index 0000000..787c78b
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProjectVariable.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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
+ */
+package com.google.eclipse.protobuf.ui.util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.*;
+
+/**
+ * ${project} variable.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProjectVariable {
+
+ private static final String VARIABLE_VALUE = "${project}";
+
+ public static IPath useProjectVariable(IPath path, IProject project) {
+ return switchNames(path, project.getName(), VARIABLE_VALUE);
+ }
+
+ public static String useProjectName(String path, IProject project) {
+ IPath newPath = switchNames(new Path(path), VARIABLE_VALUE, project.getName());
+ return newPath.toString();
+ }
+
+ private static IPath switchNames(IPath path, String originalName, String newName) {
+ if (!originalName.equals(path.segment(0))) return path;
+ IPath newPath = new Path(newName);
+ newPath = newPath.append(path.removeFirstSegments(1));
+ if (path.isAbsolute()) newPath = newPath.makeAbsolute();
+ return newPath;
+ }
+
+ public static boolean containsProjectVariable(String path) {
+ return path != null && path.contains(VARIABLE_VALUE);
+ }
+}