blob: 29543885d3c421a959d12f565b4bf36a152f0be2 [file] [log] [blame]
/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.debug.core.source;
import com.google.dart.tools.core.internal.util.ResourceUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
import java.io.File;
/**
* A source container that expects its input path to be a workspace relative path.
*/
public class WorkspaceSourceContainer extends AbstractSourceContainer {
public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier()
+ ".containerType.workspace"; //$NON-NLS-1$
private static final Object[] EMPTY_COLLECTION = new Object[0];
public static IFile locatePathAsFile(String path) {
IResource resource = locatePathAsResource(path);
if (resource instanceof IFile) {
return (IFile) resource;
} else {
return null;
}
}
public static IResource locatePathAsResource(String path) {
if (path == null) {
return null;
}
File file = new File(path);
// Look for a resource reference (/project/directory/file.dart).
IResource resource = ResourceUtil.getResource(file);
if (resource != null) {
return resource;
}
// Look for something which could potentially resolve to a resource in the workspace.
resource = findPotentialWorkspaceMatch(path);
if (resource != null) {
return resource;
}
// Look for a file system reference.
if (file.exists() && !file.isDirectory()) {
IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(file.toURI());
if (files.length > 0) {
return files[0];
}
// look for file among all resources, no filtering
resource = ResourceUtil.getFile(file);
if (resource != null) {
return resource;
}
}
return null;
}
private static IResource findPotentialWorkspaceMatch(String path) {
// file:///foo/bar/baz/projects/dart/samples/solar/web/solar.dart
// ==>
// solar/web/solar.dart
for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
String str = "/" + project.getName() + "/";
if (path.contains(str)) {
int index = path.lastIndexOf(str);
String localPath = path.substring(index);
return ResourcesPlugin.getWorkspace().getRoot().findMember(localPath);
}
}
return null;
}
public WorkspaceSourceContainer() {
}
@Override
public Object[] findSourceElements(String path) throws CoreException {
IResource resource = locatePathAsResource(path);
if (resource != null) {
return new Object[] {resource};
} else {
return EMPTY_COLLECTION;
}
}
@Override
public String getName() {
return "Workspace";
}
@Override
public ISourceContainerType getType() {
return getSourceContainerType(TYPE_ID);
}
}