/******************************************************************************* * Copyright (c) 2008, 2015 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: * Serge Beauchamp (Freescale Semiconductor) - initial API and implementation *******************************************************************************/ package org.eclipse.core.tests.resources; import java.io.File; import java.io.IOException; import java.net.URI; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.internal.resources.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; /** * Tests the following API methods: * {@link IContainer#addFilter(String, int, String, int, IProgressMonitor)} * {@link IContainer#removeFilter(String, int, String, int, IProgressMonitor)} * {@link IContainer#getFilters()} * * This test tests resource filters with projects, folders, linked resource folders, * and moving those resources to different parents. */ public class FilteredResourceTest extends ResourceTest { private static final String REGEX_FILTER_PROVIDER = "org.eclipse.core.resources.regexFilterMatcher"; protected String childName = "File.txt"; protected IProject closedProject; protected IFile existingFileInExistingProject; protected IFolder existingFolderInExistingFolder; protected IFolder existingFolderInExistingProject; protected IProject existingProject; protected IPath localFile; protected IPath localFolder; protected IFile nonExistingFileInExistingFolder; protected IFile nonExistingFileInExistingProject; protected IFile nonExistingFileInOtherExistingProject; protected IFolder nonExistingFolderInExistingFolder; protected IFolder nonExistingFolderInExistingProject; protected IFolder nonExistingFolderInOtherExistingProject; protected IFolder nonExistingFolder2InOtherExistingProject; protected IProject otherExistingProject; public static Test suite() { return new TestSuite(FilteredResourceTest.class); } public FilteredResourceTest() { super(); } public FilteredResourceTest(String name) { super(name); } protected void doCleanup() throws Exception { ensureExistsInWorkspace(new IResource[] {existingProject, otherExistingProject, closedProject, existingFolderInExistingProject, existingFolderInExistingFolder, existingFileInExistingProject}, true); closedProject.close(getMonitor()); ensureDoesNotExistInWorkspace(new IResource[] {nonExistingFolderInExistingProject, nonExistingFolderInExistingFolder, nonExistingFolderInOtherExistingProject, nonExistingFolder2InOtherExistingProject, nonExistingFileInExistingProject, nonExistingFileInOtherExistingProject, nonExistingFileInExistingFolder}); resolve(localFolder).toFile().mkdirs(); createFileInFileSystem(resolve(localFile), getRandomContents()); } /** * Maybe overridden in subclasses that use path variables. */ protected IPath resolve(IPath path) { return path; } /** * Maybe overridden in subclasses that use path variables. */ protected URI resolve(URI uri) { return uri; } @Override protected void setUp() throws Exception { super.setUp(); existingProject = getWorkspace().getRoot().getProject("ExistingProject"); otherExistingProject = getWorkspace().getRoot().getProject("OtherExistingProject"); closedProject = getWorkspace().getRoot().getProject("ClosedProject"); existingFolderInExistingProject = existingProject.getFolder("existingFolderInExistingProject"); existingFolderInExistingFolder = existingFolderInExistingProject.getFolder("existingFolderInExistingFolder"); nonExistingFolderInExistingProject = existingProject.getFolder("nonExistingFolderInExistingProject"); nonExistingFolderInOtherExistingProject = otherExistingProject.getFolder("nonExistingFolderInOtherExistingProject"); nonExistingFolder2InOtherExistingProject = otherExistingProject.getFolder("nonExistingFolder2InOtherExistingProject"); nonExistingFolderInExistingFolder = existingFolderInExistingProject.getFolder("nonExistingFolderInExistingFolder"); existingFileInExistingProject = existingProject.getFile("existingFileInExistingProject"); nonExistingFileInExistingProject = existingProject.getFile("nonExistingFileInExistingProject"); nonExistingFileInOtherExistingProject = otherExistingProject.getFile("nonExistingFileInOtherExistingProject"); nonExistingFileInExistingFolder = existingFolderInExistingProject.getFile("nonExistingFileInExistingFolder"); localFolder = getRandomLocation(); localFile = localFolder.append(childName); doCleanup(); } @Override protected void tearDown() throws Exception { super.tearDown(); Workspace.clear(resolve(localFolder).toFile()); } /** * Tests the creation of a simple filter on a folder. */ public void testCreateFilterOnFolder() { try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); existingFolderInExistingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo"); IFile bar = existingFolderInExistingProject.getFile("bar"); ensureExistsInWorkspace(new IResource[] {foo, bar}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } //close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("1.2", e); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 1); assertEquals("1.5", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.6", filters[0].getFileInfoMatcherDescription().getArguments(), "foo"); assertEquals("1.7", filters[0].getType(), IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS); assertEquals("1.8", filters[0].getResource(), existingFolderInExistingProject); IResource members[] = null; try { members = existingFolderInExistingProject.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "foo"); IWorkspace workspace = existingProject.getWorkspace(); assertTrue("2.3", !workspace.validateFiltered(bar).isOK()); assertTrue("2.4", workspace.validateFiltered(foo).isOK()); } /** * Tests the creation of a simple filter on a project. */ public void testCreateFilterOnProject() { try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); existingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FOLDERS, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFolder foo = existingProject.getFolder("foo"); IFolder bar = existingProject.getFolder("bar"); ensureExistsInWorkspace(new IResource[] {foo, bar}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } //close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("1.2", e); } IResourceFilterDescription[] filters = null; try { filters = existingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 1); assertEquals("1.5", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.6", filters[0].getFileInfoMatcherDescription().getArguments(), "foo"); assertEquals("1.7", filters[0].getType(), IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FOLDERS); assertEquals("1.8", filters[0].getResource(), existingProject); IResource members[] = null; try { members = existingProject.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 3); for (IResource member : members) { if (member.getType() == IResource.FOLDER) { assertEquals("2.1", member.getType(), IResource.FOLDER); assertEquals("2.2", member.getName(), "foo"); } } IWorkspace workspace = existingProject.getWorkspace(); assertTrue("2.1", !workspace.validateFiltered(bar).isOK()); assertTrue("2.2", workspace.validateFiltered(foo).isOK()); } /** * Tests the creation of a simple filter on a linked folder. */ public void testCreateFilterOnLinkedFolder() { IPath location = getRandomLocation(); IFolder folder = nonExistingFolderInExistingProject; //try to create without the flag (should fail) try { folder.createLink(location, IResource.NONE, getMonitor()); fail("1.0"); } catch (CoreException e) { //should fail } try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); folder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = folder.getFile("foo"); IFile bar = folder.getFile("bar"); ensureExistsInWorkspace(new IResource[] {foo, bar}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } //close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("1.2", e); } IResourceFilterDescription[] filters = null; try { filters = folder.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 1); assertEquals("1.5", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.6", filters[0].getFileInfoMatcherDescription().getArguments(), "foo"); assertEquals("1.7", filters[0].getType(), IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES); assertEquals("1.8", filters[0].getResource(), folder); IResource members[] = null; try { members = folder.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "foo"); IWorkspace workspace = existingProject.getWorkspace(); assertTrue("2.1", !workspace.validateFiltered(bar).isOK()); assertTrue("2.2", workspace.validateFiltered(foo).isOK()); } /** * Tests the creation of two different filters on a linked folder and the original. * Regression for bug 267201 */ public void testCreateFilterOnLinkedFolderAndTarget() { IPath location = existingFolderInExistingFolder.getLocation(); IFolder folder = nonExistingFolderInExistingProject; try { folder.createLink(location, IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.5"); } FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.cpp"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.h"); IResourceFilterDescription filterDescription2 = null; try { folder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); filterDescription2 = existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IResource members[] = null; try { members = folder.members(); } catch (CoreException e) { fail("1.1", e); } assertEquals("1.2", members.length, 0); try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", members.length, 0); IFile newFile = existingFolderInExistingFolder.getFile("foo.cpp"); try { assertTrue("1.5", newFile.getLocation().toFile().createNewFile()); } catch (IOException e1) { fail("1.6", e1); } try { existingFolderInExistingFolder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.7", e); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.8", e); } assertEquals("1.9", members.length, 1); assertEquals("2.0", members[0].getType(), IResource.FILE); assertEquals("2.1", members[0].getName(), "foo.cpp"); try { members = folder.members(); } catch (CoreException e) { fail("2.2", e); } assertEquals("2.3", members.length, 0); newFile = existingFolderInExistingFolder.getFile("foo.h"); try { assertTrue("2.5", newFile.getLocation().toFile().createNewFile()); } catch (IOException e1) { fail("2.6", e1); } try { existingFolderInExistingFolder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("2.7", e); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("2.8", e); } assertEquals("2.9", members.length, 1); assertEquals("3.0", members[0].getType(), IResource.FILE); assertEquals("3.1", members[0].getName(), "foo.cpp"); try { members = folder.members(); } catch (CoreException e) { fail("3.2", e); } assertEquals("3.3", members.length, 0); try { folder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("3.4", e); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("3.8", e); } assertEquals("3.9", members.length, 1); assertEquals("4.0", members[0].getType(), IResource.FILE); assertEquals("4.1", members[0].getName(), "foo.cpp"); try { members = folder.members(); } catch (CoreException e) { fail("4.2", e); } assertEquals("4.3", members.length, 1); assertEquals("4.4", members[0].getType(), IResource.FILE); assertEquals("4.5", members[0].getName(), "foo.h"); // create a file that shows under both newFile = existingFolderInExistingFolder.getFile("foo.text"); try { assertTrue("5.5", newFile.getLocation().toFile().createNewFile()); } catch (IOException e1) { fail("5.6", e1); } try { existingFolderInExistingFolder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("5.7", e); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("5.8", e); } assertEquals("5.9", members.length, 2); assertEquals("6.0", members[0].getType(), IResource.FILE); assertEquals("6.1", members[0].getName(), "foo.cpp"); assertEquals("6.2", members[1].getType(), IResource.FILE); assertEquals("6.3", members[1].getName(), "foo.text"); try { members = folder.members(); } catch (CoreException e) { fail("6.4", e); } assertEquals("6.5", members.length, 2); assertEquals("6.6", members[0].getType(), IResource.FILE); assertEquals("6.7", members[0].getName(), "foo.h"); assertEquals("6.8", members[1].getType(), IResource.FILE); assertEquals("6.9", members[1].getName(), "foo.text"); // delete the common file try { newFile.delete(true, getMonitor()); } catch (CoreException e) { fail("7.0", e); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("7.1", e); } assertEquals("7.2", members.length, 1); assertEquals("7.3", members[0].getType(), IResource.FILE); assertEquals("7.4", members[0].getName(), "foo.cpp"); try { members = folder.members(); } catch (CoreException e) { fail("7.5", e); } assertEquals("7.6", members.length, 1); assertEquals("7.7", members[0].getType(), IResource.FILE); assertEquals("7.8", members[0].getName(), "foo.h"); // remove the first filter try { filterDescription2.delete(0, getMonitor()); } catch (CoreException e) { fail("8.0"); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("8.1", e); } assertEquals("8.2", members.length, 2); assertEquals("8.3", members[0].getType(), IResource.FILE); assertEquals("8.4", members[0].getName(), "foo.cpp"); assertEquals("8.4.1", members[1].getType(), IResource.FILE); assertEquals("8.4.2", members[1].getName(), "foo.h"); try { members = folder.members(); } catch (CoreException e) { fail("8.5", e); } assertEquals("8.6", members.length, 1); assertEquals("8.7", members[0].getType(), IResource.FILE); assertEquals("8.8", members[0].getName(), "foo.h"); // add the filter again try { existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("9.0"); } try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("9.1", e); } assertEquals("9.2", members.length, 1); assertEquals("9.3", members[0].getType(), IResource.FILE); assertEquals("9.4", members[0].getName(), "foo.cpp"); try { members = folder.members(); } catch (CoreException e) { fail("9.5", e); } assertEquals("9.6", members.length, 1); assertEquals("9.7", members[0].getType(), IResource.FILE); assertEquals("9.8", members[0].getName(), "foo.h"); } public void testIResource_isFiltered() { IFolder folder = existingFolderInExistingProject.getFolder("virtual_folder.txt"); IFile file = existingFolderInExistingProject.getFile("linked_file.txt"); try { folder.create(IResource.VIRTUAL, true, getMonitor()); } catch (CoreException e1) { fail("0.79", e1); } try { file.createLink(existingFileInExistingProject.getLocation(), 0, getMonitor()); } catch (CoreException e1) { fail("0.89", e1); } FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.txt"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("0.99", e); } IWorkspace workspace = existingProject.getWorkspace(); assertTrue("1.0", workspace.validateFiltered(folder).isOK()); assertTrue("1.1", workspace.validateFiltered(file).isOK()); } /** * Tests the creation of two different filters on a linked folder and the original. * Check that creating and modifying files in the workspace doesn't make them appear in * excluded locations. * Regression for bug 267201 */ public void testCreateFilterOnLinkedFolderAndTarget2() { final IPath location = existingFolderInExistingFolder.getLocation(); final IFolder folder = nonExistingFolderInExistingProject; try { folder.createLink(location, IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.5"); } FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.h"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.cpp"); try { folder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); existingFolderInExistingFolder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IResource members[] = null; // Create 'foo.cpp' in existingFolder... IFile newFile = existingFolderInExistingFolder.getFile("foo.cpp"); try { create(newFile, true); members = existingFolderInExistingFolder.members(); } catch (CoreException e1) { fail("1.6", e1); } assertEquals("1.9", 1, members.length); assertEquals("2.0", IResource.FILE, members[0].getType()); assertEquals("2.1", "foo.cpp", members[0].getName()); // Create a 'foo.h' under folder newFile = folder.getFile("foo.h"); try { create(newFile, true); } catch (CoreException e1) { fail("2.6", e1); } // Check that foo.h has appeared in 'folder' try { // // Refreshing restores sanity (hides the .cpp files)... // folder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); members = folder.members(); } catch (CoreException e) { fail("4.2", e); } assertEquals("4.3", 1, members.length); assertEquals("4.4", IResource.FILE, members[0].getType()); assertEquals("4.5", "foo.h", members[0].getName()); // Check it hasn't appeared in existingFolder... try { // // Refresh restores sanity... // existingFolderInExistingFolder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("2.8", e); } assertEquals("2.9", 1, members.length); assertEquals("3.0", IResource.FILE, members[0].getType()); assertEquals("3.1", "foo.cpp", members[0].getName()); // And refreshing doesn't change things try { existingFolderInExistingFolder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("2.8", e); } assertEquals("2.9", 1, members.length); assertEquals("3.0", IResource.FILE, members[0].getType()); assertEquals("3.1", "foo.cpp", members[0].getName()); // Check modifying foo.h doesn't make it appear try { modifyInWorkspace(folder.getFile("foo.h")); members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("2.8", e); } assertEquals("2.9", 1, members.length); assertEquals("3.0", IResource.FILE, members[0].getType()); assertEquals("3.1", "foo.cpp", members[0].getName()); } /** * Tests that filtering a child directory which is linked from * else where works * * Main tree: * existingProject/existingFolderInExsitingProject/existingFolderInExistingFolder * Links: * otherExistingProject/nonExistingFolderInOtherExistingProject => existingProject/existingFolderInExsitingProject (filter * of type folder) * otherExistingProject/nonExistingFolder2InOtherExistingProject => existingProject/existingFolderInExsitingProject/existingFolderInExistingFolder * This is a regression test for Bug 268518. */ public void testCreateFilterOnLinkedFolderWithAlias() { final IProject project = otherExistingProject; final IPath parentLoc = existingFolderInExistingProject.getLocation(); final IPath childLoc = existingFolderInExistingFolder.getLocation(); final IFolder folder1 = nonExistingFolderInOtherExistingProject; final IFolder folder2 = nonExistingFolder2InOtherExistingProject; assertTrue("0.1", !folder1.exists()); assertTrue("0.2", !folder2.exists()); assertTrue("0.3", parentLoc.isPrefixOf(childLoc)); FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*"); IResourceFilterDescription filterDescription1 = null; try { // Filter out all children from existingFolderInExistingProject filterDescription1 = folder1.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("0.5", e); } try { folder1.createLink(parentLoc, IResource.NONE, getMonitor()); folder2.createLink(childLoc, IResource.NONE, getMonitor()); existingProject.close(getMonitor()); } catch (CoreException e) { fail("1.0", e); } try { assertTrue("12.0", folder1.exists()); assertTrue("12.2", folder2.exists()); assertTrue("12.4", folder1.isLinked()); assertTrue("12.6", folder2.isLinked()); assertTrue("12.8", folder1.getLocation().equals(parentLoc)); assertTrue("12.10", folder2.getLocation().equals(childLoc)); assertTrue("12.12", folder1.members().length == 0); assertTrue("12.14", folder2.members().length == 0); } catch (CoreException e) { fail("12.20", e); } // Need to unset M_USED on the project's resource info, or // reconcileLinks will never be called... Workspace workspace = ((Workspace) ResourcesPlugin.getWorkspace()); try { try { workspace.prepareOperation(project, getMonitor()); workspace.beginOperation(true); ResourceInfo ri = ((Resource) project).getResourceInfo(false, true); ri.clear(ICoreConstants.M_USED); } finally { workspace.endOperation(project, true); } } catch (CoreException e) { fail("2.90", e); } try { project.close(getMonitor()); assertTrue("3.1", !project.isOpen()); // Create a file under existingFolderInExistingFolder createFileInFileSystem(childLoc.append("foo")); // Reopen the project project.open(IResource.NONE, getMonitor()); } catch (CoreException e) { fail("3.0", e); } try { assertTrue("22.0", folder1.exists()); assertTrue("22.2", folder2.exists()); assertTrue("22.4", folder1.isLinked()); assertTrue("22.6", folder2.isLinked()); assertTrue("22.8", folder1.getLocation().equals(parentLoc)); assertTrue("22.10", folder2.getLocation().equals(childLoc)); assertTrue("22.12", folder1.members().length == 0); assertTrue("22.12", folder2.members().length == 1); } catch (CoreException e) { fail("22.20", e); } // Swap the links around, loading may be order independent... try { folder2.createLink(parentLoc, IResource.REPLACE, getMonitor()); folder1.createLink(childLoc, IResource.REPLACE | IResource.FORCE, getMonitor()); // Filter out all children from existingFolderInExistingProject folder2.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); filterDescription1.delete(0, getMonitor()); assertTrue(folder1.getFilters().length == 0); } catch (CoreException e) { fail("3.0", e); } // Need to unset M_USED on the project's resource info, or // reconcileLinks will never be called... try { try { workspace.prepareOperation(project, getMonitor()); workspace.beginOperation(true); ResourceInfo ri = ((Resource) project).getResourceInfo(false, true); ri.clear(ICoreConstants.M_USED); } finally { workspace.endOperation(project, true); } } catch (CoreException e) { fail("4.5", e); } try { project.close(getMonitor()); assertTrue("3.1", !project.isOpen()); project.open(IResource.NONE, getMonitor()); } catch (CoreException e) { fail("5.0", e); } try { assertTrue("32.0", folder1.exists()); assertTrue("32.2", folder2.exists()); assertTrue("32.4", folder1.isLinked()); assertTrue("32.6", folder2.isLinked()); assertTrue("32.8", folder2.getLocation().equals(parentLoc)); assertTrue("32.10", folder1.getLocation().equals(childLoc)); assertTrue("32.12", folder1.members().length == 1); assertTrue("32.12", folder2.members().length == 0); } catch (CoreException e) { fail("32.20", e); } } /** * Tests that filtering a child directory which is linked from * else where works * * Main tree: * existingProject/existingFolderInExsitingProject/existingFolderInExistingFolder * Links: * otherExistingProject/nonExistingFolderInOtherExistingProject => existingProject/existingFolderInExsitingProject (filter * of type folder) * otherExistingProject/nonExistingFolder2InOtherExistingProject => existingProject/existingFolderInExsitingProject/existingFolderInExistingFolder * This is a regression test for Bug 268518. */ public void testCreateFilterOnLinkedFolderWithAlias2() { final IProject project = otherExistingProject; final IPath parentLoc = existingFolderInExistingProject.getLocation(); final IPath childLoc = existingFolderInExistingFolder.getLocation(); final IFolder folder1 = nonExistingFolderInOtherExistingProject; final IFolder folder2 = nonExistingFolder2InOtherExistingProject; assertTrue("0.1", !folder1.exists()); assertTrue("0.2", !folder2.exists()); assertTrue("0.3", parentLoc.isPrefixOf(childLoc)); FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*"); IResourceFilterDescription filterDescription1 = null; try { // Filter out all children from existingFolderInExistingProject filterDescription1 = folder1.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("0.5", e); } try { folder1.createLink(parentLoc, IResource.NONE, getMonitor()); folder2.createLink(childLoc, IResource.NONE, getMonitor()); existingProject.close(getMonitor()); } catch (CoreException e) { fail("1.0", e); } try { assertTrue("12.0", folder1.exists()); assertTrue("12.2", folder2.exists()); assertTrue("12.4", folder1.isLinked()); assertTrue("12.6", folder2.isLinked()); assertTrue("12.8", folder1.getLocation().equals(parentLoc)); assertTrue("12.10", folder2.getLocation().equals(childLoc)); assertTrue("12.12", folder1.members().length == 0); assertTrue("12.14", folder2.members().length == 0); } catch (CoreException e) { fail("12.20", e); } // Need to unset M_USED on the project's resource info, or // reconcileLinks will never be called... Workspace workspace = ((Workspace) ResourcesPlugin.getWorkspace()); try { try { workspace.prepareOperation(project, getMonitor()); workspace.beginOperation(true); ResourceInfo ri = ((Resource) project).getResourceInfo(false, true); ri.clear(ICoreConstants.M_USED); } finally { workspace.endOperation(project, true); } } catch (CoreException e) { fail("2.90", e); } try { // Create a file under existingFolderInExistingFolder create(folder2.getFile("foo"), true); } catch (CoreException e) { fail("3.0", e); } try { assertTrue("22.0", folder1.exists()); assertTrue("22.2", folder2.exists()); assertTrue("22.4", folder1.isLinked()); assertTrue("22.6", folder2.isLinked()); assertTrue("22.8", folder1.getLocation().equals(parentLoc)); assertTrue("22.10", folder2.getLocation().equals(childLoc)); assertTrue("22.12", folder1.members().length == 0); assertTrue("22.12", folder2.members().length == 1); } catch (CoreException e) { fail("22.20", e); } // Swap the links around, loading may be order independent... try { folder2.createLink(parentLoc, IResource.REPLACE | IResource.NONE, getMonitor()); folder1.createLink(childLoc, IResource.REPLACE | IResource.FORCE, getMonitor()); // Filter out all children from existingFolderInExistingProject folder2.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); filterDescription1.delete(0, getMonitor()); assertTrue(folder1.getFilters().length == 0); } catch (CoreException e) { fail("4.0", e); } try { assertTrue("32.0", folder1.exists()); assertTrue("32.2", folder2.exists()); assertTrue("32.4", folder1.isLinked()); assertTrue("32.6", folder2.isLinked()); assertTrue("32.8", folder2.getLocation().equals(parentLoc)); assertTrue("32.10", folder1.getLocation().equals(childLoc)); assertTrue("32.12", folder1.members().length == 1); assertTrue("32.12", folder2.members().length == 0); } catch (CoreException e) { fail("32.20", e); } } /** * Tests the creation of a simple filter on a linked folder before the resource creation. */ public void testCreateFilterOnLinkedFolderBeforeCreation() { IPath location = existingFolderInExistingFolder.getLocation(); IFolder folder = nonExistingFolderInExistingProject; assertTrue("0.1", !folder.exists()); FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); try { folder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("0.5"); } try { folder.createLink(location, IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = folder.getFile("foo"); IFile bar = folder.getFile("bar"); ensureExistsInWorkspace(new IResource[] {foo, bar}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } //close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("1.2", e); } IResourceFilterDescription[] filters = null; try { filters = folder.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 1); assertEquals("1.5", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.6", filters[0].getFileInfoMatcherDescription().getArguments(), "foo"); assertEquals("1.7", filters[0].getType(), IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES); assertEquals("1.8", filters[0].getResource(), folder); IResource members[] = null; try { members = folder.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "foo"); } /** * Tests the creation and removal of a simple filter on a folder. */ public void testCreateAndRemoveFilterOnFolder() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); IResourceFilterDescription filterDescription = null; try { filterDescription = existingFolderInExistingFolder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingFolder.getFile("foo"); IFile bar = existingFolderInExistingFolder.getFile("bar"); ensureExistsInWorkspace(new IResource[] {foo, bar}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } //close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("1.2", e); } try { filterDescription.delete(0, getMonitor()); } catch (CoreException e) { fail("1.3", e); } //close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("1.4", e); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingFolder.getFilters(); } catch (CoreException e) { fail("1.5", e); } assertEquals("1.6", filters.length, 0); IResource members[] = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.7", e); } assertEquals("1.8", members.length, 2); assertEquals("1.9", members[0].getType(), IResource.FILE); assertEquals("2.0", members[0].getName(), "bar"); assertEquals("2.1", members[1].getType(), IResource.FILE); assertEquals("2.2", members[1].getName(), "foo"); } /** * Tests the creation and removal of a simple filter on a folder. */ public void testCreateAndRemoveFilterOnFolderWithoutClosingProject() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); IResourceFilterDescription filterDescription = null; try { filterDescription = existingFolderInExistingFolder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingFolder.getFile("foo"); IFile bar = existingFolderInExistingFolder.getFile("bar"); ensureExistsInWorkspace(new IResource[] {foo, bar}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } try { filterDescription.delete(0, getMonitor()); } catch (CoreException e) { fail("1.3", e); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingFolder.getFilters(); } catch (CoreException e) { fail("1.5", e); } assertEquals("1.6", filters.length, 0); IResource members[] = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.7", e); } assertEquals("1.8", members.length, 2); assertEquals("1.9", members[0].getType(), IResource.FILE); assertEquals("2.0", members[0].getName(), "bar"); assertEquals("2.1", members[1].getType(), IResource.FILE); assertEquals("2.2", members[1].getName(), "foo"); } /** * Tests the creation of the include-only filter. */ public void testIncludeOnlyFilter() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.c"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFile file = existingFolderInExistingProject.getFile("file.c"); IFile bar = existingFolderInExistingProject.getFile("bar.h"); ensureExistsInWorkspace(new IResource[] {foo, bar, file}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IResource members[] = null; try { members = existingFolderInExistingProject.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 2); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "file.c"); assertEquals("2.3", members[1].getType(), IResource.FILE); assertEquals("2.4", members[1].getName(), "foo.c"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.c"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("3.0"); } try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("3.1", e); } members = null; try { members = existingFolderInExistingProject.members(); } catch (CoreException e) { fail("3.2", e); } assertEquals("3.3", members.length, 2); assertEquals("3.4", members[0].getType(), IResource.FILE); assertEquals("3.5", members[0].getName(), "file.c"); assertEquals("3.6", members[1].getType(), IResource.FILE); assertEquals("3.7", members[1].getName(), "foo.c"); } /** * Tests the creation of the exclude-all filter. */ public void testExcludeAllFilter() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.c"); try { existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingFolder.getFile("foo.c"); IFile file = existingFolderInExistingFolder.getFile("file.c"); IFile fooh = existingFolderInExistingFolder.getFile("foo.h"); IFile bar = existingFolderInExistingFolder.getFile("bar.h"); ensureExistsInWorkspace(new IResource[] {foo, bar, file, fooh}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IResource members[] = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 2); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "bar.h"); assertEquals("2.3", members[1].getType(), IResource.FILE); assertEquals("2.4", members[1].getName(), "foo.h"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("3.0"); } try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("3.1", e); } members = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("3.2", e); } assertEquals("3.3", members.length, 1); assertEquals("3.4", members[0].getType(), IResource.FILE); assertEquals("3.5", members[0].getName(), "bar.h"); } /** * Tests the creation of the mixed include-only exclude-all filter. */ public void testMixedFilter() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.c"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFile file = existingFolderInExistingProject.getFile("file.c"); IFile fooh = existingFolderInExistingProject.getFile("foo.h"); IFile bar = existingFolderInExistingProject.getFile("bar.h"); ensureExistsInWorkspace(new IResource[] {foo, bar, file, fooh}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IResource members[] = null; try { members = existingFolderInExistingProject.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "file.c"); } /** * Tests the creation of inheritable filter. */ public void testInheritedFilter() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.c"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.INHERITABLE | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingFolder.getFile("foo.c"); IFile file = existingFolderInExistingFolder.getFile("file.c"); IFile fooh = existingFolderInExistingFolder.getFile("foo.h"); IFile bar = existingFolderInExistingFolder.getFile("bar.h"); ensureExistsInWorkspace(new IResource[] {foo, bar, file, fooh}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IResource members[] = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "file.c"); } /** * Tests the creation of FOLDER filter. */ public void testFolderOnlyFilters() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingFolder.getFile("foo.c"); IFolder food = existingFolderInExistingFolder.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IResource members[] = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FILE); assertEquals("2.2", members[0].getName(), "foo.c"); } /** * Tests the creation of FILE filter. */ public void testFileOnlyFilters() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingFolder.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingFolder.getFile("foo.c"); IFolder food = existingFolderInExistingFolder.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IResource members[] = null; try { members = existingFolderInExistingFolder.members(); } catch (CoreException e) { fail("1.9", e); } assertEquals("2.0", members.length, 1); assertEquals("2.1", members[0].getType(), IResource.FOLDER); assertEquals("2.2", members[0].getName(), "foo.d"); } /** * Tests moving a folder with filters. */ public void testMoveFolderWithFilterToAnotherProject() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFolder food = existingFolderInExistingProject.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IFolder destination = otherExistingProject.getFolder("destination"); try { existingFolderInExistingProject.move(destination.getFullPath(), 0, getMonitor()); } catch (CoreException e) { fail("1.2"); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 0); filters = null; try { filters = destination.getFilters(); } catch (CoreException e) { fail("1.5", e); } assertEquals("1.6", filters.length, 1); assertEquals("1.7", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.8", filters[0].getFileInfoMatcherDescription().getArguments(), "foo.*"); assertEquals("1.9", filters[0].getType(), IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES); assertEquals("2.0", filters[0].getResource(), destination); } /** * Tests copying a folder with filters. */ public void testCopyFolderWithFilterToAnotherProject() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFolder food = existingFolderInExistingProject.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } IFolder destination = otherExistingProject.getFolder("destination"); try { existingFolderInExistingProject.copy(destination.getFullPath(), 0, getMonitor()); } catch (CoreException e) { fail("1.2"); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 1); assertEquals("1.5", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.6", filters[0].getFileInfoMatcherDescription().getArguments(), "foo.*"); assertEquals("1.7", filters[0].getType(), IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES); assertEquals("1.8", filters[0].getResource(), existingFolderInExistingProject); filters = null; try { filters = destination.getFilters(); } catch (CoreException e) { fail("2.0", e); } assertEquals("2.1", filters.length, 1); assertEquals("2.2", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("2.3", filters[0].getFileInfoMatcherDescription().getArguments(), "foo.*"); assertEquals("2.4", filters[0].getType(), IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES); assertEquals("2.5", filters[0].getResource(), destination); } /** * Tests copying a folder with filters to another folder. */ public void testCopyFolderWithFilterToAnotherFolder() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFolder food = existingFolderInExistingProject.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } ensureExistsInWorkspace(new IResource[] {nonExistingFolderInExistingProject}, true); IFolder destination = nonExistingFolderInExistingProject.getFolder("destination"); try { existingFolderInExistingProject.copy(destination.getFullPath(), 0, getMonitor()); } catch (CoreException e) { fail("1.2"); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 1); assertEquals("1.5", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("1.6", filters[0].getFileInfoMatcherDescription().getArguments(), "foo.*"); assertEquals("1.7", filters[0].getType(), IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES); assertEquals("1.8", filters[0].getResource(), existingFolderInExistingProject); filters = null; try { filters = destination.getFilters(); } catch (CoreException e) { fail("2.0", e); } assertEquals("2.1", filters.length, 1); assertEquals("2.2", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("2.3", filters[0].getFileInfoMatcherDescription().getArguments(), "foo.*"); assertEquals("2.4", filters[0].getType(), IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES); assertEquals("2.5", filters[0].getResource(), destination); } /** * Tests moving a folder with filters to another folder. */ public void testMoveFolderWithFilterToAnotherFolder() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFolder food = existingFolderInExistingProject.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } ensureExistsInWorkspace(new IResource[] {nonExistingFolderInExistingProject}, true); IFolder destination = nonExistingFolderInExistingProject.getFolder("destination"); try { existingFolderInExistingProject.move(destination.getFullPath(), 0, getMonitor()); } catch (CoreException e) { fail("1.2"); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 0); filters = null; try { filters = destination.getFilters(); } catch (CoreException e) { fail("2.0", e); } assertEquals("2.1", filters.length, 1); assertEquals("2.2", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("2.3", filters[0].getFileInfoMatcherDescription().getArguments(), "foo.*"); assertEquals("2.4", filters[0].getType(), IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES); assertEquals("2.5", filters[0].getResource(), destination); } /** * Tests deleting a folder with filters. */ public void testDeleteFolderWithFilterToAnotherFolder() { FileInfoMatcherDescription matcherDescription1 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo.*"); FileInfoMatcherDescription matcherDescription2 = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*\\.c"); try { existingFolderInExistingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES, matcherDescription1, 0, getMonitor()); existingFolderInExistingFolder.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES, matcherDescription2, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } IFile foo = existingFolderInExistingProject.getFile("foo.c"); IFolder food = existingFolderInExistingProject.getFolder("foo.d"); ensureExistsInWorkspace(new IResource[] {foo, food}, true); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } ensureExistsInWorkspace(new IResource[] {nonExistingFolderInExistingProject}, true); try { existingFolderInExistingProject.delete(0, getMonitor()); } catch (CoreException e) { fail("1.2"); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("1.3", e); } assertEquals("1.4", filters.length, 0); filters = null; try { filters = existingFolderInExistingFolder.getFilters(); } catch (CoreException e) { fail("2.0", e); } assertEquals("2.1", filters.length, 0); } /* Regression test for Bug 304276 */ public void testInvalidCharactersInRegExFilter() { RegexFileInfoMatcher matcher = new RegexFileInfoMatcher(); try { matcher.initialize(existingProject, "*:*"); fail("1.0"); } catch (CoreException e) { } } /** * Regression test for Bug 302146 */ public void testBug302146() { try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "foo"); existingFolderInExistingProject.createFilter(IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.0"); } // close and reopen the project try { existingProject.close(getMonitor()); existingProject.open(getMonitor()); } catch (CoreException e) { fail("2.0", e); } IResourceFilterDescription[] filters = null; try { filters = existingFolderInExistingProject.getFilters(); } catch (CoreException e) { fail("3.0", e); } // check that filters are recreated when the project is reopened // it means that .project was updated with filter details assertEquals("4.0", filters.length, 1); assertEquals("4.1", filters[0].getFileInfoMatcherDescription().getId(), REGEX_FILTER_PROVIDER); assertEquals("4.2", filters[0].getFileInfoMatcherDescription().getArguments(), "foo"); assertEquals("4.3", filters[0].getType(), IResourceFilterDescription.INCLUDE_ONLY | IResourceFilterDescription.FILES | IResourceFilterDescription.FOLDERS); assertEquals("4.4", filters[0].getResource(), existingFolderInExistingProject); try { new ProjectDescriptionReader().read(existingProject.getFile(".project").getLocation()); } catch (IOException e) { fail("5.0", e); } } /** * Regression for Bug 317783 - Resource filters do not work at all in "Project Explorer" * The problem is that a client calls explicitly refreshLocal on a folder that is filtered out by * resource filters and that doesn't exist in the workspace. This used to cause the resource to * appear in the workspace, along with all its children, in spite of active resource filters to the * contrary. */ public void test317783() { IFolder folder = existingProject.getFolder("foo"); ensureExistsInWorkspace(folder, true); IFile file = folder.getFile("bar.txt"); ensureExistsInWorkspace(file, "content"); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*"); existingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.2"); } try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.3", e); } IResource members[] = null; try { members = existingProject.members(); } catch (CoreException e) { fail("1.4", e); } assertEquals("1.5", 2, members.length); assertEquals("1.6", ".project", members[0].getName()); assertEquals("1.7", existingFileInExistingProject.getName(), members[1].getName()); try { folder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("2.0", e); } try { members = existingProject.members(); } catch (CoreException e) { fail("2.1", e); } assertEquals("2.2", 2, members.length); assertEquals("2.3", ".project", members[0].getName()); assertEquals("2.4", existingFileInExistingProject.getName(), members[1].getName()); assertEquals("2.5", false, folder.exists()); assertEquals("2.6", false, file.exists()); } /** * Regression for Bug 317824 - Renaming a project that contains resource filters fails, * and copying a project that contains resource filters removes the resource filters. */ public void test317824() { IFolder folder = existingProject.getFolder("foo"); ensureExistsInWorkspace(folder, true); IFile file = folder.getFile("bar.txt"); ensureExistsInWorkspace(file, "content"); try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, ".*"); existingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.2"); } try { assertEquals(1, existingProject.getFilters().length); } catch (CoreException e) { fail("1.3", e); } try { existingProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("1.4", e); } IPath newPath = existingProject.getFullPath().removeLastSegments(1).append(existingProject.getName() + "_moved"); try { existingProject.move(newPath, true, getMonitor()); } catch (CoreException e) { fail("1.5", e); } IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(existingProject.getName() + "_moved"); try { assertTrue(newProject.exists()); assertEquals(1, newProject.getFilters().length); } catch (CoreException e) { fail("1.6", e); } newPath = newProject.getFullPath().removeLastSegments(1).append(newProject.getName() + "_copy"); try { newProject.copy(newPath, true, getMonitor()); } catch (CoreException e) { fail("1.7", e); } newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(newProject.getName() + "_copy"); try { assertTrue(newProject.exists()); assertEquals(1, newProject.getFilters().length); } catch (CoreException e) { fail("1.8", e); } } /** * Regression test for bug 328464 */ public void test328464() { IFolder folder = existingProject.getFolder(getUniqueString()); ensureExistsInWorkspace(folder, true); IFile file_a_txt = folder.getFile("a.txt"); ensureExistsInWorkspace(file_a_txt, true); try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, "a\\.txt"); existingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FILES | IResourceFilterDescription.INHERITABLE, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.0", e); } assertFalse("2.0", existingProject.getWorkspace().validateFiltered(file_a_txt).isOK()); // rename a.txt to A.txt in the file system File ioFile = file_a_txt.getLocation().toFile(); assertTrue("3.0", ioFile.exists()); ioFile.renameTo(new File(file_a_txt.getLocation().removeLastSegments(1).append("A.txt").toString())); assertFalse("4.0", existingProject.getWorkspace().validateFiltered(file_a_txt).isOK()); try { folder.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); } catch (CoreException e) { fail("5.0", e); } assertFalse("6.0", file_a_txt.exists()); assertFalse("7.0", existingProject.getWorkspace().validateFiltered(file_a_txt).isOK()); IFile file_A_txt = folder.getFile("A.txt"); assertTrue("9.0", file_A_txt.exists()); assertTrue("10.0", existingProject.getWorkspace().validateFiltered(file_A_txt).isOK()); } /** * Regression test for bug 343914 */ public void test343914() { String subProjectName = "subProject"; IPath subProjectLocation = existingProject.getLocation().append(subProjectName); try { FileInfoMatcherDescription matcherDescription = new FileInfoMatcherDescription(REGEX_FILTER_PROVIDER, subProjectName); existingProject.createFilter(IResourceFilterDescription.EXCLUDE_ALL | IResourceFilterDescription.FOLDERS | IResourceFilterDescription.FILES | IResourceFilterDescription.INHERITABLE, matcherDescription, 0, getMonitor()); } catch (CoreException e) { fail("1.0", e); } IPath fileLocation = subProjectLocation.append("file.txt"); IWorkspaceRoot root = getWorkspace().getRoot(); IFile result = root.getFileForLocation(fileLocation); assertTrue("2.0", result == null); IFile[] results = root.findFilesForLocation(fileLocation); assertTrue("2.1", results.length == 0); IPath containerLocation = subProjectLocation.append("folder"); IContainer resultContainer = root.getContainerForLocation(containerLocation); assertTrue("2.2", resultContainer == null); IContainer[] resultsContainer = root.findContainersForLocation(containerLocation); assertTrue("2.3", resultsContainer.length == 0); IProject subProject = root.getProject(subProjectName); IProjectDescription newProjectDescription = getWorkspace().newProjectDescription(subProjectName); newProjectDescription.setLocation(subProjectLocation); try { subProject.create(newProjectDescription, getMonitor()); } catch (CoreException e) { fail("2.99", e); } result = root.getFileForLocation(fileLocation); assertTrue("3.0", result != null); assertEquals("3.1", subProject, result.getProject()); results = root.findFilesForLocation(fileLocation); assertTrue("3.2", results.length == 1); assertEquals("3.3", subProject, results[0].getProject()); resultContainer = root.getContainerForLocation(containerLocation); assertTrue("3.4", resultContainer != null); assertEquals("3.5", subProject, resultContainer.getProject()); resultsContainer = root.findContainersForLocation(containerLocation); assertTrue("3.6", resultsContainer.length == 1); assertEquals("3.7", subProject, resultsContainer[0].getProject()); } }