blob: 9a9c4484796617393e31dae09aa1b02913e2ccfd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* James Blackburn (Broadcom Corp.) - ongoing development
*******************************************************************************/
package org.eclipse.core.internal.resources;
import java.net.URI;
import java.util.*;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.internal.utils.FileUtil;
import org.eclipse.core.internal.utils.Policy;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
public class WorkspaceRoot extends Container implements IWorkspaceRoot {
/**
* As an optimization, we store a table of project handles
* that have been requested from this root. This maps project
* name strings to project handles.
*/
private final Map<String, Project> projectTable = Collections.synchronizedMap(new HashMap<String, Project>(16));
/**
* Cache of the canonicalized platform location.
*/
private final IPath workspaceLocation;
protected WorkspaceRoot(IPath path, Workspace container) {
super(path, container);
Assert.isTrue(path.equals(Path.ROOT));
workspaceLocation = FileUtil.canonicalPath(Platform.getLocation());
Assert.isNotNull(workspaceLocation);
}
@Override
public void delete(boolean deleteContent, boolean force, IProgressMonitor monitor) throws CoreException {
int updateFlags = force ? IResource.FORCE : IResource.NONE;
updateFlags |= deleteContent ? IResource.ALWAYS_DELETE_PROJECT_CONTENT : IResource.NEVER_DELETE_PROJECT_CONTENT;
delete(updateFlags, monitor);
}
@Override
public void delete(boolean force, IProgressMonitor monitor) throws CoreException {
int updateFlags = force ? IResource.FORCE : IResource.NONE;
delete(updateFlags, monitor);
}
@Override
public boolean exists(int flags, boolean checkType) {
return true;
}
@Deprecated
@Override
public IContainer[] findContainersForLocation(IPath location) {
return findContainersForLocationURI(URIUtil.toURI(location.makeAbsolute()));
}
@Override
public IContainer[] findContainersForLocationURI(URI location) {
return findContainersForLocationURI(location, NONE);
}
@Override
public IContainer[] findContainersForLocationURI(URI location, int memberFlags) {
if (!location.isAbsolute())
throw new IllegalArgumentException();
return (IContainer[]) getLocalManager().allResourcesFor(location, false, memberFlags);
}
@Deprecated
@Override
public IFile[] findFilesForLocation(IPath location) {
return findFilesForLocationURI(URIUtil.toURI(location.makeAbsolute()));
}
@Override
public IFile[] findFilesForLocationURI(URI location) {
return findFilesForLocationURI(location, NONE);
}
@Override
public IFile[] findFilesForLocationURI(URI location, int memberFlags) {
if (!location.isAbsolute())
throw new IllegalArgumentException();
return (IFile[]) getLocalManager().allResourcesFor(location, true, memberFlags);
}
@Override
public IContainer getContainerForLocation(IPath location) {
return getLocalManager().containerForLocation(location);
}
@Override
public String getDefaultCharset(boolean checkImplicit) {
if (checkImplicit)
return ResourcesPlugin.getEncoding();
String enc = ResourcesPlugin.getPlugin().getPluginPreferences().getString(ResourcesPlugin.PREF_ENCODING);
return enc == null || enc.length() == 0 ? null : enc;
}
@Override
public IFile getFileForLocation(IPath location) {
return getLocalManager().fileForLocation(location);
}
@Override
public long getLocalTimeStamp() {
return IResource.NULL_STAMP;
}
@Override
public IPath getLocation() {
return workspaceLocation;
}
@Override
public String getName() {
return ""; //$NON-NLS-1$
}
@Override
public IContainer getParent() {
return null;
}
@Override
public IProject getProject() {
return null;
}
@Override
public IProject getProject(String name) {
//first check our project cache
Project result = projectTable.get(name);
if (result == null) {
IPath projectPath = new Path(null, name).makeAbsolute();
String message = "Path for project must have only one segment."; //$NON-NLS-1$
Assert.isLegal(projectPath.segmentCount() == ICoreConstants.PROJECT_SEGMENT_LENGTH, message);
//try to get the project using a canonical name
String canonicalName = projectPath.lastSegment();
result = projectTable.get(canonicalName);
if (result != null)
return result;
result = new Project(projectPath, workspace);
projectTable.put(canonicalName, result);
}
return result;
}
@Override
public IPath getProjectRelativePath() {
return Path.EMPTY;
}
@Override
public IProject[] getProjects() {
return getProjects(IResource.NONE);
}
@Override
public IProject[] getProjects(int memberFlags) {
IResource[] roots = getChildren(memberFlags);
IProject[] result = new IProject[roots.length];
try {
System.arraycopy(roots, 0, result, 0, roots.length);
} catch (ArrayStoreException ex) {
// Shouldn't happen since only projects should be children of the workspace root
for (IResource root2 : roots) {
if (root2.getType() != IResource.PROJECT)
Policy.log(IStatus.ERROR, NLS.bind("{0} is an invalid child of the workspace root.", //$NON-NLS-1$
root2), null);
}
throw ex;
}
return result;
}
@Override
public int getType() {
return IResource.ROOT;
}
@Override
public void internalSetLocal(boolean flag, int depth) throws CoreException {
// do nothing for the root, but call for its children
if (depth == IResource.DEPTH_ZERO)
return;
if (depth == IResource.DEPTH_ONE)
depth = IResource.DEPTH_ZERO;
// get the children via the workspace since we know that this
// resource exists (it is local).
IResource[] children = getChildren(IResource.NONE);
for (IResource element : children)
((Resource) element).internalSetLocal(flag, depth);
}
@Override
public boolean isDerived(int options) {
return false;//the root is never derived
}
@Override
public boolean isHidden() {
return false;//the root is never hidden
}
@Override
public boolean isHidden(int options) {
return false;//the root is never hidden
}
@Override
public boolean isTeamPrivateMember(int options) {
return false;//the root is never a team private member
}
@Override
public boolean isLinked(int options) {
return false;//the root is never linked
}
@Deprecated
@Override
public boolean isLocal(int depth) {
// the flags parameter is ignored for the workspace root so pass anything
return isLocal(-1, depth);
}
@Deprecated
@Override
public boolean isLocal(int flags, int depth) {
// don't check the flags....workspace root is always local
if (depth == DEPTH_ZERO)
return true;
if (depth == DEPTH_ONE)
depth = DEPTH_ZERO;
// get the children via the workspace since we know that this
// resource exists (it is local).
IResource[] children = getChildren(IResource.NONE);
for (int i = 0; i < children.length; i++)
if (!children[i].isLocal(depth))
return false;
return true;
}
@Override
public boolean isPhantom() {
return false;
}
@Deprecated
@Override
public void setDefaultCharset(String charset) {
// directly change the Resource plugin's preference for encoding
Preferences resourcesPreferences = ResourcesPlugin.getPlugin().getPluginPreferences();
if (charset != null)
resourcesPreferences.setValue(ResourcesPlugin.PREF_ENCODING, charset);
else
resourcesPreferences.setToDefault(ResourcesPlugin.PREF_ENCODING);
}
@Override
public void setHidden(boolean isHidden) {
//workspace root cannot be set hidden
}
@Override
public long setLocalTimeStamp(long value) {
if (value < 0)
throw new IllegalArgumentException("Illegal time stamp: " + value); //$NON-NLS-1$
//can't set local time for root
return value;
}
@Deprecated
@Override
public void setReadOnly(boolean readonly) {
//can't set the root read only
}
@Override
public void touch(IProgressMonitor monitor) {
// do nothing for the workspace root
}
}