/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.core.tests.resources; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.tests.internal.filesystem.wrapper.WrapperFileSystem; public class IWorkspaceRootTest extends ResourceTest { public IWorkspaceRootTest() { super(); } public IWorkspaceRootTest(String name) { super(name); } public static Test suite() { // return new IWorkspaceRootTest("testFindFilesForLocationOnWrappedFileSystem"); return new TestSuite(IWorkspaceRootTest.class); } @Override protected void tearDown() throws Exception { IProject[] projects = getWorkspace().getRoot().getProjects(); getWorkspace().delete(projects, true, null); } /** * Tests findFilesForLocation when non-canonical paths are used (bug 155101). */ public void testFindFilesNonCanonicalPath() { // this test is for windows only if (!isWindows()) { return; } IProject project = getWorkspace().getRoot().getProject("testFindFilesNonCanonicalPath"); ensureExistsInWorkspace(project, true); IFile link = project.getFile("file.txt"); IFileStore fileStore = getTempStore(); createFileInFileSystem(fileStore); assertEquals("0.1", EFS.SCHEME_FILE, fileStore.getFileSystem().getScheme()); IPath fileLocationLower = URIUtil.toPath(fileStore.toURI()); fileLocationLower = fileLocationLower.setDevice(fileLocationLower.getDevice().toLowerCase()); IPath fileLocationUpper = fileLocationLower.setDevice(fileLocationLower.getDevice().toUpperCase()); //create the link with lower case device try { link.createLink(fileLocationLower, IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.99", e); } //try to find the file using the upper case device IFile[] files = getWorkspace().getRoot().findFilesForLocation(fileLocationUpper); assertEquals("1.0", 1, files.length); assertEquals("1.1", link, files[0]); } /** * Tests the API method findContainersForLocation. */ public void testFindContainersForLocation() { IWorkspaceRoot root = getWorkspace().getRoot(); IProject p1 = root.getProject("p1"); IProject p2 = root.getProject("p2"); testFindContainersForLocation(p1, p2); } private void replaceProject(IProject project, URI newLocation) throws CoreException { IProjectDescription projectDesc = project.getDescription(); projectDesc.setLocationURI(newLocation); project.move(projectDesc, IResource.REPLACE, null); } public void testFindContainersForLocationOnWrappedFileSystem() { IWorkspaceRoot root = getWorkspace().getRoot(); IProject p1 = root.getProject("p1"); IProject p2 = root.getProject("p2"); ensureExistsInWorkspace(new IResource[] {p1, p2}, true); try { replaceProject(p1, WrapperFileSystem.getWrappedURI(p1.getLocationURI())); } catch (CoreException e) { fail("0.1", e); } try { replaceProject(p2, WrapperFileSystem.getWrappedURI(p2.getLocationURI())); } catch (CoreException e) { fail("0.2", e); } testFindContainersForLocation(p1, p2); } /** * Tests the API method findContainersForLocation. */ public void testFindContainersForLocation(IProject p1, IProject p2) { //should find the workspace root IWorkspaceRoot root = getWorkspace().getRoot(); IContainer[] result = root.findContainersForLocation(root.getLocation()); assertEquals("1.0", 1, result.length); assertEquals("1.1", root, result[0]); //deep linked resource IFolder parent = p2.getFolder("parent"); IFolder link = parent.getFolder("link"); ensureExistsInWorkspace(new IResource[] {p1, p2, parent}, true); try { link.createLink(p1.getLocationURI(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.99", e); } assertResources("2.0", p1, link, root.findContainersForLocation(p1.getLocation())); //existing folder IFolder existing = p2.getFolder("existing"); ensureExistsInWorkspace(existing, true); assertResources("3.0", existing, root.findContainersForLocation(existing.getLocation())); assertResources("3.1", existing, root.findContainersForLocationURI(existing.getLocationURI())); //non-existing IFolder nonExisting = p2.getFolder("nonExisting"); assertResources("3.2", nonExisting, root.findContainersForLocation(nonExisting.getLocation())); assertResources("3.3", nonExisting, root.findContainersForLocationURI(nonExisting.getLocationURI())); //relative path assertResources("3.4", existing, root.findContainersForLocation(existing.getLocation().makeRelative())); assertResources("3.5", nonExisting, root.findContainersForLocation(nonExisting.getLocation().makeRelative())); //relative URI is illegal URI relative = null; try { relative = new URI(null, "hello", null); } catch (URISyntaxException e) { fail("4.99", e); } try { root.findContainersForLocationURI(relative); //should fail fail("4.1"); } catch (RuntimeException e) { //expected } //linked folder that does not overlap a project location IFolder otherLink = p1.getFolder("otherLink"); IFileStore linkStore = getTempStore(); URI location = linkStore.toURI(); try { linkStore.mkdir(EFS.NONE, getMonitor()); otherLink.createLink(location, IResource.NONE, getMonitor()); } catch (CoreException e) { fail("5.99", e); } result = root.findContainersForLocationURI(location); assertResources("5.1", otherLink, result); //child of linked folder IFolder child = otherLink.getFolder("link-child"); URI childLocation = linkStore.getChild(child.getName()).toURI(); result = root.findContainersForLocationURI(childLocation); assertResources("5.1", child, result); } /** * Tests the API method findFilesForLocation. */ public void testFindFilesForLocationOnWrappedFileSystem() { //should not find the workspace root IWorkspaceRoot root = getWorkspace().getRoot(); IProject project = root.getProject("p1"); ensureExistsInWorkspace(project, true); try { replaceProject(project, WrapperFileSystem.getWrappedURI(project.getLocationURI())); } catch (CoreException e) { fail("0.1", e); } testFindFilesForLocation(project); } /** * Tests the API method findFilesForLocation on non-default file system. */ public void testFindFilesForLocation() { //should not find the workspace root IWorkspaceRoot root = getWorkspace().getRoot(); testFindFilesForLocation(root.getProject("p1")); } /** * Tests the API method findFilesForLocation. */ public void testFindFilesForLocation(IProject project) { //should not find the workspace root IWorkspaceRoot root = getWorkspace().getRoot(); IFile[] result = root.findFilesForLocation(root.getLocation()); assertEquals("1.0", 0, result.length); IFile existing = project.getFile("file1"); ensureExistsInWorkspace(existing, true); //existing file final IPath existingFileLocation = existing.getLocation(); result = root.findFilesForLocation(existingFileLocation); assertResources("2.0", existing, result); result = root.findFilesForLocationURI(existing.getLocationURI()); assertResources("2.1", existing, result); //non-existing file IFile nonExisting = project.getFile("nonExisting"); result = root.findFilesForLocation(nonExisting.getLocation()); assertResources("3.1", nonExisting, result); result = root.findFilesForLocationURI(nonExisting.getLocationURI()); assertResources("3.2", nonExisting, result); //relative path result = root.findFilesForLocation(existingFileLocation.makeRelative()); assertResources("4.0", existing, result); result = root.findFilesForLocation(nonExisting.getLocation().makeRelative()); assertResources("4.1", nonExisting, result); //existing file with different case if (!isCaseSensitive(existing)) { IPath differentCase = new Path(existingFileLocation.toOSString().toUpperCase()); result = root.findFilesForLocation(differentCase); assertResources("5.0", existing, result); result = root.findFilesForLocationURI(existing.getLocationURI()); assertResources("5.1", existing, result); } //linked resource IFolder link = project.getFolder("link"); IFileStore linkStore = getTempStore(); URI location = linkStore.toURI(); try { linkStore.mkdir(EFS.NONE, getMonitor()); link.createLink(location, IResource.NONE, getMonitor()); } catch (CoreException e) { fail("5.99", e); } IFile child = link.getFile("link-child.txt"); URI childLocation = linkStore.getChild(child.getName()).toURI(); result = root.findFilesForLocationURI(childLocation); assertResources("2.1", child, result); } /** * Asserts that the given result array contains only the given resource. * @param string * @param file1 * @param result */ private void assertResources(String message, IResource expected, IResource[] actual) { assertEquals(message, 1, actual.length); assertEquals(message, expected, actual[0]); } /** * Asserts that the given result array contains only the two given resources */ private void assertResources(String message, IResource expected0, IResource expected1, IResource[] actual) { assertEquals(message, 2, actual.length); if (actual[0].equals(expected0)) { assertEquals(message, expected1, actual[1]); } else if (actual[0].equals(expected1)) { assertEquals(message, expected0, actual[1]); } else { assertEquals(message, expected0, actual[0]); } } /** * Tests the API method getContainerForLocation. */ public void testGetContainerForLocation() { IWorkspaceRoot root = getWorkspace().getRoot(); assertEquals("1.0", root, root.getContainerForLocation(root.getLocation())); } /** * Tests the AP method getFile(IPath) */ public void testGetFile() { IWorkspaceRoot root = getWorkspace().getRoot(); IFile file = root.getFile(new Path("//P1/a.txt")); assertTrue("1.0", !file.getFullPath().isUNC()); } /** * Tests the API method getFileForLocation */ public void testGetFileForLocation() { IWorkspaceRoot root = getWorkspace().getRoot(); assertTrue("1.0", root.getFileForLocation(root.getLocation()) == null); } public void testPersistentProperty() { IWorkspaceRoot root = getWorkspace().getRoot(); String value = "this is a test property value"; QualifiedName name = new QualifiedName("test", "testProperty"); try { root.setPersistentProperty(name, value); } catch (CoreException e) { fail("1.0", e); } try { String storedValue = root.getPersistentProperty(name); assertEquals("2.0", value, storedValue); } catch (CoreException e) { fail("2.1", e); } try { name = new QualifiedName("test", "testNonProperty"); String storedValue = root.getPersistentProperty(name); assertEquals("3.0", null, storedValue); } catch (CoreException e) { fail("3.1", e); } } /** * Since reading a persistent property doesn't normally happen inside an * operation, try it inside an operation to make sure it still works. * (See bug 14179). */ public void testPersistentPropertyInRunnable() { final IWorkspaceRoot root = getWorkspace().getRoot(); final String value = "this is a test property value"; final QualifiedName name = new QualifiedName("test", "testProperty"); try { getWorkspace().run((IWorkspaceRunnable) monitor -> root.setPersistentProperty(name, value), getMonitor()); } catch (CoreException e) { fail("1.0", e); } try { final String[] storedValue = new String[1]; getWorkspace().run((IWorkspaceRunnable) monitor -> storedValue[0] = root.getPersistentProperty(name), getMonitor()); assertEquals("2.0", value, storedValue[0]); } catch (CoreException e) { fail("2.1", e); } try { final QualifiedName name2 = new QualifiedName("test", "testNonProperty"); final String[] storedValue = new String[1]; getWorkspace().run((IWorkspaceRunnable) monitor -> storedValue[0] = root.getPersistentProperty(name2), getMonitor()); assertEquals("3.0", null, storedValue[0]); } catch (CoreException e) { fail("3.1", e); } } public void testRefreshLocal() { IWorkspaceRoot root = getWorkspace().getRoot(); IProject project = root.getProject("Project"); ensureExistsInWorkspace(project, true); try { project.close(getMonitor()); } catch (CoreException e) { fail("1.0", e); } //refreshing the root shouldn't fail try { root.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } } public void testBug234343_folderInHiddenProject() { IWorkspaceRoot root = getWorkspace().getRoot(); IProject hiddenProject = root.getProject(getUniqueString()); ensureDoesNotExistInWorkspace(hiddenProject); try { hiddenProject.create(null, IResource.HIDDEN, getMonitor()); hiddenProject.open(getMonitor()); } catch (CoreException e) { fail("1.0", e); } IFolder folder = hiddenProject.getFolder("foo"); try { folder.create(true, true, getMonitor()); } catch (CoreException e) { fail("4.99", e); } IContainer[] containers = root.findContainersForLocationURI(folder.getLocationURI()); assertEquals("2.0", 0, containers.length); containers = root.findContainersForLocationURI(folder.getLocationURI(), IContainer.INCLUDE_HIDDEN); assertEquals("3.0", 1, containers.length); } public void testBug234343_fileInHiddenProject() { IWorkspaceRoot root = getWorkspace().getRoot(); IProject hiddenProject = root.getProject(getUniqueString()); ensureDoesNotExistInWorkspace(hiddenProject); try { hiddenProject.create(null, IResource.HIDDEN, getMonitor()); hiddenProject.open(getMonitor()); } catch (CoreException e) { fail("1.0", e); } IFile file = hiddenProject.getFile("foo"); try { file.create(new ByteArrayInputStream("foo".getBytes()), true, getMonitor()); } catch (CoreException e) { fail("2.0", e); } IFile[] files = root.findFilesForLocationURI(file.getLocationURI()); assertEquals("3.0", 0, files.length); files = root.findFilesForLocationURI(file.getLocationURI(), IContainer.INCLUDE_HIDDEN); assertEquals("4.0", 1, files.length); IContainer[] containers = root.findContainersForLocationURI(file.getLocationURI()); assertEquals("5.0", 0, containers.length); containers = root.findContainersForLocationURI(file.getLocationURI(), IContainer.INCLUDE_HIDDEN); assertEquals("6.0", 1, containers.length); } /** * Regression test for bug 476585: IWorkspaceRoot#getFileForLocation(IPath) should return IFile in nested project */ public void testBug476585() { IWorkspaceRoot root = getWorkspace().getRoot(); IProject project = root.getProject("a"); ensureExistsInWorkspace(project, true); String subProjectName = "subProject"; IPath subProjectLocation = project.getLocation().append(subProjectName); IPath fileLocation = subProjectLocation.append("file.txt"); IFile file = root.getFileForLocation(fileLocation); assertEquals("1.0", project, file.getProject()); IPath containerLocation = subProjectLocation.append("folder"); IContainer container = root.getContainerForLocation(containerLocation); assertEquals("1.1", project, container.getProject()); IProject subProject = root.getProject(subProjectName); IProjectDescription newProjectDescription = getWorkspace().newProjectDescription(subProjectName); newProjectDescription.setLocation(subProjectLocation); try { subProject.create(newProjectDescription, getMonitor()); } catch (CoreException e) { fail("1.99", e); } file = root.getFileForLocation(fileLocation); assertNotNull("2.0", file); assertEquals("2.1", subProject, file.getProject()); container = root.getContainerForLocation(containerLocation); assertNotNull("2.2", container); assertEquals("2.3", subProject, container.getProject()); } /* * see bug 232765 for details */ public void testFindMethodsWithHiddenAndTeamPrivateFlags() { checkFindMethods(IResource.NONE, new int[][] {{IResource.NONE, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}); checkFindMethods(IResource.HIDDEN, new int[][] {{IResource.NONE, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}}); checkFindMethods(IResource.TEAM_PRIVATE, new int[][] {{IResource.NONE, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}); checkFindMethods(IResource.TEAM_PRIVATE | IResource.HIDDEN, new int[][] {{IResource.NONE, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {IContainer.INCLUDE_HIDDEN | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}}); } public void checkFindMethods(int updateFlags, int[][] results) { IWorkspaceRoot root = getWorkspace().getRoot(); IProject project = root.getProject(getUniqueString()); ensureDoesNotExistInWorkspace(project); try { project.create(null, IResource.NONE, getMonitor()); project.open(getMonitor()); } catch (CoreException e) { fail("1.0", e); } // a team private folder IFolder teamFolder = createFolder(project, IResource.TEAM_PRIVATE, false); IFile mFileInTeamFolder = createFile(teamFolder, updateFlags, false); IFile mLinkedFileInTeamFolder = createFile(teamFolder, updateFlags, true); IFolder mFolderInTeamFolder = createFolder(teamFolder, updateFlags, false); IFolder mLinkedFolderInTeamFolder = createFolder(teamFolder, updateFlags, true); // a hidden folder IFolder hiddenFolder = createFolder(project, IResource.HIDDEN, false); IFile mFileInHiddenFolder = createFile(hiddenFolder, updateFlags, false); IFile mLinkedFileInHiddenFolder = createFile(hiddenFolder, updateFlags, true); IFolder mFolderInHiddenFolder = createFolder(hiddenFolder, updateFlags, false); IFolder mLinkedFolderInHiddenFolder = createFolder(hiddenFolder, updateFlags, true); // a regular folder IFolder folder = createFolder(project, IResource.NONE, false); IFile mFileInFolder = createFile(folder, updateFlags, false); IFile mLinkedFileInFolder = createFile(folder, updateFlags, true); IFolder mFolderInFolder = createFolder(folder, updateFlags, false); IFolder mLinkedFolderInFolder = createFolder(folder, updateFlags, true); for (int[] result : results) { checkFindContainers(hiddenFolder.getLocationURI(), result[0], result[1]); checkFindFiles(mFileInHiddenFolder.getLocationURI(), result[0], result[4]); checkFindFiles(mLinkedFileInHiddenFolder.getLocationURI(), result[0], result[5]); checkFindContainers(mFolderInHiddenFolder.getLocationURI(), result[0], result[2]); checkFindContainers(mLinkedFolderInHiddenFolder.getLocationURI(), result[0], result[3]); checkFindContainers(folder.getLocationURI(), result[0], result[6]); checkFindFiles(mFileInFolder.getLocationURI(), result[0], result[7]); checkFindFiles(mLinkedFileInFolder.getLocationURI(), result[0], result[8]); checkFindContainers(mFolderInFolder.getLocationURI(), result[0], result[9]); checkFindContainers(mLinkedFolderInFolder.getLocationURI(), result[0], result[10]); checkFindContainers(teamFolder.getLocationURI(), result[0], result[11]); checkFindFiles(mFileInTeamFolder.getLocationURI(), result[0], result[12]); checkFindFiles(mLinkedFileInTeamFolder.getLocationURI(), result[0], result[13]); checkFindContainers(mFolderInTeamFolder.getLocationURI(), result[0], result[14]); checkFindContainers(mLinkedFolderInTeamFolder.getLocationURI(), result[0], result[15]); } } private void checkFindFiles(URI location, int memberFlags, int foundResources) { IFile[] files = getWorkspace().getRoot().findFilesForLocationURI(location, memberFlags); assertEquals(foundResources, files.length); } private void checkFindContainers(URI location, int memberFlags, int foundResources) { IContainer[] containers = getWorkspace().getRoot().findContainersForLocationURI(location, memberFlags); assertEquals(foundResources, containers.length); } private IFile createFile(IContainer parent, int updateFlags, boolean linked) { IFile file = parent.getFile(new Path(getUniqueString())); try { if (linked) { try { IPath path = getTempDir().append(getUniqueString()); path.toFile().createNewFile(); file.createLink(URIUtil.toURI(path), updateFlags, getMonitor()); if ((updateFlags & IResource.TEAM_PRIVATE) == IResource.TEAM_PRIVATE) { file.setTeamPrivateMember(true); } } catch (IOException e) { fail("Can't create the file", e); } } else { file.create(new ByteArrayInputStream("content".getBytes()), updateFlags, getMonitor()); } } catch (CoreException e) { fail("Can't create the file", e); } return file; } private IFolder createFolder(IContainer parent, int updateFlags, boolean linked) { IFolder folder = parent.getFolder(new Path(getUniqueString())); try { if (linked) { IPath path = getTempDir().append(getUniqueString()); path.toFile().mkdir(); folder.createLink(URIUtil.toURI(path), updateFlags, getMonitor()); if ((updateFlags & IResource.TEAM_PRIVATE) == IResource.TEAM_PRIVATE) { folder.setTeamPrivateMember(true); } } else { folder.create(updateFlags, true, getMonitor()); } } catch (CoreException e) { fail("Can't create the folder", e); } return folder; } }