/******************************************************************************* * 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 * Alexander Kurtakov <akurtako@redhat.com> - Bug 459343 *******************************************************************************/ package org.eclipse.core.tests.internal.localstore; import java.io.*; import java.net.URI; import java.util.Hashtable; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.internal.localstore.IUnifiedTreeVisitor; import org.eclipse.core.internal.localstore.UnifiedTree; import org.eclipse.core.internal.resources.Resource; import org.eclipse.core.internal.resources.Workspace; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; /** * */ public class UnifiedTreeTest extends LocalStoreTest { protected static int limit = 10; public UnifiedTreeTest() { super(); } public UnifiedTreeTest(String name) { super(name); } protected void createFiles(IFileStore folder, Hashtable<String, String> set) throws Exception { for (int i = 0; i < limit; i++) { IFileStore child = folder.getChild("fsFile" + i); OutputStream out = null; try { out = child.openOutputStream(EFS.NONE, null); out.write("contents".getBytes()); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { //ignore } } set.put(child.toString(), ""); } } protected void createFiles(final IContainer target, final Hashtable<String, String> set) throws CoreException { final Workspace workspace = (Workspace) getWorkspace(); IWorkspaceRunnable operation = monitor -> { for (int i = 0; i < limit; i++) { IFile child = target.getFile(new Path("wbFile" + i)); workspace.createResource(child, false); String location = child.getLocation().toOSString(); set.put(location, ""); } }; workspace.run(operation, null); } protected void createResourcesInFileSystem(IFileStore folder, Hashtable<String, String> set) throws Exception { createFiles(folder, set); for (int i = 0; i < limit; i++) { IFileStore child = folder.getChild("fsFolder" + i); child.mkdir(EFS.NONE, null); set.put(child.toString(), ""); if (i < (limit / 2)) { createFiles(child, set); } } } protected void createResourcesInWorkspace(IContainer target, Hashtable<String, String> set) throws CoreException { createFiles(target, set); for (int i = 0; i < limit; i++) { IFolder child = target.getFolder(new Path("wbFolder" + i)); child.create(true, true, null); String location = child.getLocation().toOSString(); set.put(location, ""); if (i < (limit / 2)) { createFiles(child, set); } } } public static Test suite() { //TestSuite suite = new TestSuite(); //suite.addTest(new UnifiedTreeTest("testTraverseMechanismInProjectWithMappings")); //return suite; return new TestSuite(UnifiedTreeTest.class); } /** * Creates some resources in the file system and some in the workspace. After that, * makes sure the visitor is going to walk through all of them. */ public void testTraverseMechanismInFolder() throws Throwable { /* create common objects */ IProject project = projects[0]; IFolder folder = project.getFolder("root"); folder.create(true, true, null); /* Create a hash table to hold all resources the tree should visit. The resources are going to be removed from the hash table as the visitor visits it. */ final Hashtable<String, String> set = new Hashtable<>(); /* create some workspace structure */ createResourcesInWorkspace(folder, set); /* create some file system structure */ createResourcesInFileSystem(((Resource) folder).getStore(), set); /* create a visitor */ IUnifiedTreeVisitor visitor = node -> { /* test the node.getLocalName() method */ final IResource resource = node.getResource(); final IFileStore store = ((Resource) resource).getStore(); if (node.existsInFileSystem()) { assertEquals("1.0", store.fetchInfo().getName(), node.getLocalName()); } assertEquals("1.1", store, node.getStore()); /* remove from the hash table the resource we're visiting */ set.remove(resource.getLocation().toOSString()); return true; }; /* instantiate a unified tree and use the visitor */ UnifiedTree tree = new UnifiedTree(folder); tree.accept(visitor); /* if the hash table is empty, we walked through all resources */ assertTrue("2.0", set.isEmpty()); } /** * Creates some resources in the file system and some in the workspace. After that, * makes sure the visitor is going to walk through some of them. */ public void testTraverseMechanismInFolderSkippingSomeChildren() throws Throwable { /* create common objects */ IProject project = projects[0]; IFolder folder = project.getFolder("root"); folder.create(true, true, null); /* Create a hash table to hold all resources the tree should visit. The resources are going to be removed from the hash table as the visitor visits it. */ final Hashtable<String, String> set = new Hashtable<>(); /* create some workspace structure */ createResourcesInWorkspace(folder, set); /* create some file system structure */ createResourcesInFileSystem(((Resource) folder).getStore(), set); /* create a visitor */ IUnifiedTreeVisitor visitor = node -> { /* test the node.getLocalName() method */ final IResource resource = node.getResource(); IFileStore store = ((Resource) resource).getStore(); String key = store.fetchInfo().getName(); if (node.existsInFileSystem()) { assertEquals("1.0", key, node.getLocalName()); } assertEquals("1.1", store, node.getStore()); /* force children to be added to the queue */ node.getChildren(); /* skip some resources */ if (resource.getName().startsWith("fsFolder")) { return false; } /* remove from the hash table the resource we're visiting */ set.remove(resource.getLocation().toOSString()); return true; }; /**/ int initialSize = set.size(); /* instantiate a unified tree and use the visitor */ UnifiedTree tree = new UnifiedTree(folder); tree.accept(visitor); /* if the hash table is empty, we walked through all resources */ assertTrue("2.0", !set.isEmpty()); assertTrue("2.1", set.size() != initialSize); } /** * Creates some resources in the file system and some in the workspace. After that, * makes sure the visitor is going to walk through all of them. */ public void testTraverseMechanismInProject() throws Throwable { /* create common objects */ IProject project = projects[0]; /* Create a hash table to hold all resources the tree should visit. The resources are going to be removed from the hash table as the visitor visits it. */ final Hashtable<String, String> set = new Hashtable<>(); /* create some workspace structure */ createResourcesInWorkspace(project, set); /* create some file system structure */ createResourcesInFileSystem(((Resource) project).getStore(), set); /* create a visitor */ IUnifiedTreeVisitor visitor = node -> { /* test the node.getLocalName() method */ final IResource resource = node.getResource(); IFileStore store = ((Resource) resource).getStore(); if (node.existsInFileSystem()) { assertEquals("1.0", store.fetchInfo().getName(), node.getLocalName()); } assertEquals("1.1", store, node.getStore()); /* remove from the hash table the resource we're visiting */ set.remove(resource.getLocation().toOSString()); return true; }; /* instantiate a unified tree and use the visitor */ UnifiedTree tree = new UnifiedTree(project); tree.accept(visitor); /* if the hash table is empty, we walked through all resources */ assertTrue("2.0", set.isEmpty()); } /** * Regression test for 342968 - Resource layers asks IFileTree for info of linked resources */ public void test342968() throws CoreException { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("test"); ensureExistsInWorkspace(project, true); project.open(getMonitor()); IProjectDescription description = project.getDescription(); URI projectLocation = Test342968FileSystem.getTestUriFor(EFS.getLocalFileSystem().fromLocalFile(new File(ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile(), "test")).toURI()); description.setLocationURI(projectLocation); project.delete(false, false, null); project.create(description, IResource.NONE, null); project.open(getMonitor()); assertTrue(project.getLocationURI().equals(projectLocation)); IFolder link = project.getFolder("link"); File file = new File(ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile(), "link"); file.mkdir(); link.createLink(EFS.getLocalFileSystem().fromLocalFile(file).toURI(), IResource.NONE, null); IFile rf = link.getFile("fileTest342968.txt"); rf.create(new ByteArrayInputStream("test342968".getBytes()), false, null); assertTrue("1.0", rf.exists()); project.refreshLocal(IResource.DEPTH_INFINITE, null); assertTrue("2.0", rf.exists()); } public void test368376() throws CoreException, IOException { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getUniqueString()); ensureExistsInWorkspace(project, true); String filePath = "a/b/c/file.txt"; File javaFile = new File(project.getLocation().toFile(), filePath); assertTrue(javaFile.getParentFile().mkdirs()); assertTrue(javaFile.createNewFile()); IFolder folder = project.getFolder("a"); IFile file = project.getFile(filePath); assertFalse(folder.exists()); assertFalse(file.exists()); file.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); assertTrue(folder.exists()); assertTrue(file.exists()); assertTrue(folder.isSynchronized(IResource.DEPTH_INFINITE)); project.delete(true, getMonitor()); } }