| /* |
| * 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.preferences.locations; |
| |
| import static com.google.eclipse.protobuf.ui.preferences.locations.ProjectVariable.replaceProjectVariableWithProjectName; |
| import static com.google.eclipse.protobuf.ui.util.IPaths.directoryLocationInWorkspace; |
| |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.eclipse.core.filesystem.EFS; |
| import org.eclipse.core.filesystem.IFileInfo; |
| import org.eclipse.core.filesystem.IFileSystem; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| |
| /** |
| * Represents the path of a directory. |
| * |
| * @author alruiz@google.com (Alex Ruiz) |
| */ |
| public class DirectoryPath { |
| private static final Pattern WORKSPACE_PATH_PATTERN = Pattern.compile("\\$\\{workspace_loc:(.*)\\}"); |
| |
| private final String value; |
| private final boolean isWorkspacePath; |
| |
| /** |
| * Creates a new <code>{@link DirectoryPath}</code>. |
| * @param path the path to parse. If the path belongs to a file in the workspace it should match the pattern |
| * "\$\{workspace_loc:(.*)\}". |
| * @param project the current project. |
| * @return the created {@code DirectoryPath}. |
| */ |
| public static DirectoryPath parse(String path, IProject project) { |
| Matcher matcher = WORKSPACE_PATH_PATTERN.matcher(path); |
| String actualPath = path; |
| boolean isWorkspacePath = false; |
| if (matcher.matches()) { |
| actualPath = matcher.group(1); |
| isWorkspacePath = true; |
| if (project != null) { |
| IPath newPath = replaceProjectVariableWithProjectName(Path.fromOSString(actualPath), project); |
| // Issue 204: we'll create an URI from this path. It must not have OS-specific path separators. |
| actualPath = newPath.toPortableString(); |
| } |
| } |
| return new DirectoryPath(actualPath, isWorkspacePath); |
| } |
| |
| private DirectoryPath(String path, boolean isWorkspacePath) { |
| this.value = path; |
| this.isWorkspacePath = isWorkspacePath; |
| } |
| |
| /** |
| * Returns the textual value of this path. |
| * @return the textual value of this path. |
| */ |
| public String value() { |
| return value; |
| } |
| |
| /** |
| * Indicates whether this path belongs to a workspace resource. |
| * @return {@code true} if this path belongs to a workspace resource, {@code false} otherwise. |
| */ |
| public boolean isWorkspacePath() { |
| return isWorkspacePath; |
| } |
| |
| /** |
| * Returns the absolute path in the local file system, or {@code null} if no path can be determined. |
| * @return the absolute path in the local file system, or {@code null} if no path can be determined. |
| */ |
| public String absolutePathInFileSystem() { |
| IPath path = Path.fromOSString(value); |
| if (isWorkspacePath()) { |
| return directoryLocationInWorkspace(path); |
| } |
| return locationInFileSystem(path); |
| } |
| |
| private String locationInFileSystem(IPath path) { |
| IFileSystem fileSystem = EFS.getLocalFileSystem(); |
| IFileInfo fileInfo = fileSystem.getStore(path).fetchInfo(); |
| if (!fileInfo.isDirectory()) { |
| return null; |
| } |
| return value; |
| } |
| } |