Bug 479450 - Set project encoding when creating a new project

This change automatically writes project encoding property on opening
just created projects to the project local settings, if that property
doesn't exist yet.

Change-Id: I63a12a16c563154f12bba4e17e6be39a755674f2
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.resources/+/96963
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
index ead6c1f..bbac6b8 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
@@ -23,6 +23,7 @@
 import java.util.*;
 import org.eclipse.core.filesystem.*;
 import org.eclipse.core.internal.events.LifecycleEvent;
+import org.eclipse.core.internal.preferences.EclipsePreferences;
 import org.eclipse.core.internal.utils.*;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.resources.team.IMoveDeleteHook;
@@ -1095,6 +1096,11 @@
 						monitor.worked(Policy.opWork * 60 / 100);
 					}
 				}
+
+				// Project is new and does not have any content already (not imported)
+				if (!used && !unknownChildren) {
+					writeEncodingAfterOpen(monitor);
+				}
 				//creation of this project may affect overlapping resources
 				workspace.getAliasManager().updateAliases(this, getStore(), IResource.DEPTH_INFINITE, monitor);
 			} catch (OperationCanceledException e) {
@@ -1108,6 +1114,28 @@
 		}
 	}
 
+	/**
+	 * Try to set encoding if we open the project for the first time. See bug 479450
+	 */
+	private void writeEncodingAfterOpen(IProgressMonitor monitor) throws CoreException {
+		IPath settings = new Path(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).append(ResourcesPlugin.PI_RESOURCES)
+				.addFileExtension(EclipsePreferences.PREFS_FILE_EXTENSION);
+		IFile file = getFile(settings);
+
+		// The file could not yet be up-to-date with underlined resource
+		// force refresh to force reading project preferences via
+		// org.eclipse.core.internal.resources.ProjectPreferences.updatePreferences(IFile)
+		IPath location = file.getLocation();
+		if (!file.exists() && location != null && location.toFile().exists()) {
+			file.refreshLocal(IResource.DEPTH_ZERO, monitor);
+		}
+		String charset = workspace.getCharsetManager().getCharsetFor(getFullPath(), false);
+		if (charset == null) {
+			String encoding = ResourcesPlugin.getEncoding();
+			workspace.getCharsetManager().setCharsetFor(getFullPath(), encoding);
+		}
+	}
+
 	@Override
 	public void open(IProgressMonitor monitor) throws CoreException {
 		open(IResource.NONE, monitor);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java
index c37354b..d736c3b 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java
@@ -91,8 +91,8 @@
 			@Override
 			public boolean visit(IResource resource) {
 				resourceCount++;
-				//We have 1 root + 3 folders + 4 elements --> 8 elements to visit at most
-				assertTrue(resourceCount <= 8);
+				// We have 1 root + 4 folders + 5 elements --> 10 elements to visit at most
+				assertTrue(resourceCount <= 10);
 				return true;
 			}
 		});
@@ -120,7 +120,9 @@
 			resourceCount[0]++;
 			return true;
 		});
-		//We have 1 root + 1 folder + 1 file (.project) --> 3 elements to visit
-		assertEquals(3, resourceCount[0]);
+		// We have 1 root + 1 folder + 1 file (.project)
+		// + .settings / resources prefs
+		// --> 5 elements to visit
+		assertEquals(5, resourceCount[0]);
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java
index 317922b..168b0e8 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java
@@ -398,7 +398,7 @@
 		assertEquals("0.8", value1, node.get(key1, null));
 		assertEquals("0.9", value2, node.get(key2, null));
 		IFile prefsFile = getFileInWorkspace(project1, ResourcesPlugin.PI_RESOURCES);
-		assertTrue("1.0", !prefsFile.exists());
+		assertTrue("1.0", prefsFile.exists());
 		try {
 			node.flush();
 		} catch (BackingStoreException e) {
@@ -478,8 +478,8 @@
 		IProject project2 = getProject(getUniqueString());
 		ensureExistsInWorkspace(new IResource[] {project1}, true);
 		Preferences node = new ProjectScope(project1).getNode(ResourcesPlugin.PI_RESOURCES);
+		assertTrue("1.0", getFileInWorkspace(project1, ResourcesPlugin.PI_RESOURCES).exists());
 		node.put("key", "value");
-		assertTrue("1.0", !getFileInWorkspace(project1, ResourcesPlugin.PI_RESOURCES).exists());
 		try {
 			node.flush();
 		} catch (BackingStoreException e) {
@@ -508,6 +508,7 @@
 	public void test_61277c() {
 		IProject project1 = getProject(getUniqueString());
 		ensureExistsInWorkspace(new IResource[] {project1}, true);
+		assertTrue("1.0", getFileInWorkspace(project1, ResourcesPlugin.PI_RESOURCES).exists());
 		Preferences node = new ProjectScope(project1).getNode(ResourcesPlugin.PI_RESOURCES);
 		String key1 = "key";
 		String emptyKey = "";
@@ -515,8 +516,6 @@
 		String value2 = getUniqueString();
 		node.put(key1, value1);
 		node.put(emptyKey, value2);
-		assertTrue("1.0", !getFileInWorkspace(project1, ResourcesPlugin.PI_RESOURCES).exists());
-
 		try {
 			node.flush();
 		} catch (BackingStoreException e) {
@@ -729,6 +728,7 @@
 
 		// copy the pref file to the destination project
 		try {
+			getFileInWorkspace(project2, ResourcesPlugin.PI_RESOURCES).delete(true, null);
 			prefFile.copy(getFileInWorkspace(project2, ResourcesPlugin.PI_RESOURCES).getFullPath(), true, null);
 		} catch (CoreException e) {
 			fail("4.0", e);
@@ -1259,8 +1259,8 @@
 
 		Preferences node = new ProjectScope(project1).getNode("");
 		String[] childrenNames = node.childrenNames();
-		assertEquals(1, childrenNames.length);
-		assertEquals(nodeA, childrenNames[0]);
+		assertEquals(2, childrenNames.length);
+		assertEquals(nodeA, childrenNames[1]);
 		node = node.node(nodeA);
 		childrenNames = node.childrenNames();
 		assertEquals(1, childrenNames.length);
@@ -1586,9 +1586,8 @@
 		File projectFolder = new File(project1.getLocationURI());
 		File settingsFolder = new File(projectFolder, ".settings");
 		assertTrue(projectFolder.exists());
-		assertFalse(settingsFolder.exists());
-		settingsFolder.mkdir();
 		assertTrue(settingsFolder.exists());
+
 		// create the preference file also out of synch with the workspace
 		File prefsFile = new File(settingsFolder, "nodeA.prefs");
 		prefsFile.createNewFile();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java
index 6aa9c93..31751c0 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java
@@ -481,13 +481,13 @@
 			}
 			IFile regularPrefs = getResourcesPreferenceFile(project1, false);
 			IFile derivedPrefs = getResourcesPreferenceFile(project1, true);
-			assertDoesNotExistInWorkspace("0.2", regularPrefs);
+			assertExistsInWorkspace("0.2", regularPrefs);
 			assertDoesNotExistInWorkspace("0.3", derivedPrefs);
 
 			//1 - setting preference on project
 			verifier.reset();
-			verifier.addExpectedChange(regularPrefs.getParent(), IResourceDelta.ADDED, 0);
-			verifier.addExpectedChange(regularPrefs, IResourceDelta.ADDED, 0);
+			verifier.addExpectedChange(regularPrefs.getParent(), IResourceDelta.CHANGED, 0);
+			verifier.addExpectedChange(regularPrefs, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
 			setDerivedEncodingStoredSeparately("1.0", project1, true);
 			assertTrue("1.1", verifier.waitForEvent(10000));
 			assertTrue("1.2 " + verifier.getMessage(), verifier.isDeltaValid());
@@ -910,6 +910,12 @@
 			IFile file1 = project.getFile("file1.txt");
 			IFile file2 = folder1.getFile("file2.txt");
 			IFile file3 = folder2.getFile("file3.txt");
+
+			ensureExistsInWorkspace(new IResource[] { project }, true);
+			assertEquals(ResourcesPlugin.getEncoding(), project.getDefaultCharset(false));
+			project.setDefaultCharset(null, getMonitor());
+			assertEquals(null, project.getDefaultCharset(false));
+
 			ensureExistsInWorkspace(new IResource[] {file1, file2, file3}, true);
 			// project and children should be using the workspace's default now
 			assertCharsetIs("1.0", ResourcesPlugin.getEncoding(), new IResource[] {workspace.getRoot(), project, file1, folder1, file2, folder2, file3}, true);
@@ -1063,7 +1069,7 @@
 			ensureExistsInWorkspace(new IResource[] {file1, file2}, true);
 
 			IFile resourcesPrefs = getResourcesPreferenceFile(project, false);
-			assertTrue("0.9", !resourcesPrefs.exists());
+			assertTrue("0.9", resourcesPrefs.exists());
 
 			try {
 				file1.setCharset("CHARSET1", getMonitor());
@@ -1119,7 +1125,8 @@
 			ensureExistsInWorkspace(new IResource[] {project, folder1}, true);
 			verifier.reset();
 			verifier.addExpectedChange(folder1, IResourceDelta.CHANGED, IResourceDelta.ENCODING);
-			verifier.addExpectedChange(new IResource[] {prefs, prefs.getParent()}, IResourceDelta.ADDED, 0);
+			verifier.addExpectedChange(new IResource[] { prefs.getParent() }, IResourceDelta.CHANGED, 0);
+			verifier.addExpectedChange(new IResource[] { prefs }, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
 			try {
 				folder1.setDefaultCharset("new_charset", getMonitor());
 			} catch (CoreException e) {
@@ -1257,7 +1264,8 @@
 			// change from default
 			verifier.reset();
 			verifier.addExpectedChange(file1, IResourceDelta.CHANGED, IResourceDelta.ENCODING);
-			verifier.addExpectedChange(new IResource[] {prefs, prefs.getParent()}, IResourceDelta.ADDED, 0);
+			verifier.addExpectedChange(new IResource[] { prefs.getParent() }, IResourceDelta.CHANGED, 0);
+			verifier.addExpectedChange(new IResource[] { prefs }, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
 			try {
 				file1.setCharset("FOO", getMonitor());
 			} catch (CoreException e) {
@@ -1267,9 +1275,8 @@
 
 			// change to default (clear it)
 			verifier.reset();
+			verifier.addExpectedChange(prefs, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
 			verifier.addExpectedChange(file1, IResourceDelta.CHANGED, IResourceDelta.ENCODING);
-			verifier.addExpectedChange(prefs.getParent(), IResourceDelta.CHANGED, 0);
-			verifier.addExpectedChange(prefs, IResourceDelta.REMOVED, 0);
 			try {
 				file1.setCharset(null, getMonitor());
 			} catch (CoreException e) {
@@ -1279,11 +1286,10 @@
 
 			// change to default (equal to it but it doesn't inherit)
 			verifier.reset();
+			verifier.addExpectedChange(prefs, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
 			verifier.addExpectedChange(file1, IResourceDelta.CHANGED, IResourceDelta.ENCODING);
-			verifier.addExpectedChange(prefs.getParent(), IResourceDelta.CHANGED, 0);
-			verifier.addExpectedChange(prefs, IResourceDelta.ADDED, 0);
 			try {
-				file1.setCharset(file1.getCharset(), getMonitor());
+				file1.setCharset(project.getDefaultCharset(), getMonitor());
 			} catch (CoreException e) {
 				fail("1.2.0", e);
 			}
@@ -1342,7 +1348,7 @@
 			IFile file1 = project.getFile("file1.txt");
 			IFile file2 = folder.getFile("file2.txt");
 			ensureExistsInWorkspace(new IResource[] {file1, file2}, true);
-			assertDoesNotExistInWorkspace("1.0", getResourcesPreferenceFile(project, false));
+			assertExistsInWorkspace("1.0", getResourcesPreferenceFile(project, false));
 			project.setDefaultCharset("FOO", getMonitor());
 			assertExistsInWorkspace("2.0", getResourcesPreferenceFile(project, false));
 			project.setDefaultCharset(null, getMonitor());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java
index cc222bc..78f3642 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java
@@ -99,7 +99,7 @@
 			fail("2.0", e);
 		}
 		// +1 for the project description file
-		assertEquals("2.1", 3, members.length);
+		assertEquals("2.1", 4, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -141,14 +141,14 @@
 			fail("7.0", e);
 		}
 		// +1 for the project description file
-		assertEquals("7.1", 3, members.length);
+		assertEquals("7.1", 4, members.length);
 		try {
 			members = project.members(IContainer.INCLUDE_HIDDEN);
 		} catch (CoreException e) {
 			fail("7.2", e);
 		}
 		// +1 for the project description file
-		assertEquals("7.3", 3, members.length);
+		assertEquals("7.3", 4, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -164,7 +164,7 @@
 			fail("8.1", e);
 		}
 		// +1 for project description, -1 for hidden folder
-		assertEquals("8.2", 2, members.length);
+		assertEquals("8.2", 3, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -177,7 +177,7 @@
 			fail("8.5", e);
 		}
 		// +1 for project description, -1 for hidden folder
-		assertEquals("8.6", 2, members.length);
+		assertEquals("8.6", 3, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -190,7 +190,7 @@
 			fail("8.9", e);
 		}
 		// +1 for project description
-		assertEquals("8.10", 3, members.length);
+		assertEquals("8.10", 4, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -219,7 +219,7 @@
 			fail("9.6", e);
 		}
 		// +1 for project description
-		assertEquals("9.7", 3, members.length);
+		assertEquals("9.7", 4, members.length);
 		try {
 			members = folder.members(IContainer.INCLUDE_HIDDEN);
 		} catch (CoreException e) {
@@ -237,7 +237,9 @@
 		IFolder folder = project.getFolder("folder");
 		IFile file = project.getFile("file.txt");
 		IFile subFile = folder.getFile("subfile.txt");
-		IResource[] resources = new IResource[] {project, folder, file, subFile};
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
+		IResource[] resources = new IResource[] { project, folder, file, subFile, settings, prefs };
 		ensureExistsInWorkspace(resources, true);
 		IResource description = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
 
@@ -279,6 +281,8 @@
 		visitor.addExpected(project);
 		visitor.addExpected(file);
 		visitor.addExpected(description);
+		visitor.addExpected(settings);
+		visitor.addExpected(prefs);
 		try {
 			project.accept(visitor);
 		} catch (CoreException e) {
@@ -290,6 +294,8 @@
 		visitor.addExpected(project);
 		visitor.addExpected(file);
 		visitor.addExpected(description);
+		visitor.addExpected(settings);
+		visitor.addExpected(prefs);
 		try {
 			project.accept(visitor, IResource.DEPTH_INFINITE, IResource.NONE);
 		} catch (CoreException e) {
@@ -569,7 +575,9 @@
 		IFile file = project.getFile("file.txt");
 		IFile subFile = folder.getFile("subfile.txt");
 		IFile description = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
-		final IResource[] resources = new IResource[] {project, folder, file, subFile};
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
+		final IResource[] resources = new IResource[] { project, folder, file, subFile, settings, prefs };
 		final ResourceDeltaVerifier listener = new ResourceDeltaVerifier();
 		getWorkspace().addResourceChangeListener(listener);
 		try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java
index a1e576c..3677ef4 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java
@@ -49,9 +49,11 @@
 	IFolder folder1; //below project2
 	IFolder folder2; //below folder1
 	IFolder folder3; //same as file1
+	IFolder settings; // .settings
 	/* some random resource handles */
 	IProject project1;
 	IFile project1MetaData;
+	IFile prefs; // org.eclipse.core.resources.prefs
 	IProject project2;
 	IFile project2MetaData;
 	ResourceDeltaVerifier verifier;
@@ -208,6 +210,8 @@
 		folder1 = project1.getFolder("Folder" + 1);
 		folder2 = folder1.getFolder("Folder" + 2);
 		folder3 = folder1.getFolder("File" + 1);
+		settings = project1.getFolder(".settings");
+		prefs = settings.getFile("org.eclipse.core.resources.prefs");
 		file1 = folder1.getFile("File" + 1);
 		file2 = folder1.getFile("File" + 2);
 		file3 = folder2.getFile("File" + 1);
@@ -1248,10 +1252,17 @@
 			verifier.addExpectedChange(project1.getFile(".project"), IResourceDelta.REMOVED, IResourceDelta.MOVED_TO, null, project2.getFile(".project").getFullPath());
 			verifier.addExpectedChange(folder1, IResourceDelta.REMOVED, IResourceDelta.MOVED_TO, null, project2.getFolder(folder1.getProjectRelativePath()).getFullPath());
 			verifier.addExpectedChange(file1, IResourceDelta.REMOVED, IResourceDelta.MOVED_TO, null, project2.getFile(file1.getProjectRelativePath()).getFullPath());
+			
+			verifier.addExpectedChange(settings, IResourceDelta.REMOVED, IResourceDelta.MOVED_TO, null, project2.getFolder(settings.getProjectRelativePath()).getFullPath());
+			verifier.addExpectedChange(prefs, IResourceDelta.REMOVED, IResourceDelta.MOVED_TO, null, project2.getFile(prefs.getProjectRelativePath()).getFullPath());
+			
 			verifier.addExpectedChange(project2, IResourceDelta.ADDED, IResourceDelta.OPEN | IResourceDelta.DESCRIPTION | IResourceDelta.MOVED_FROM, project1.getFullPath(), null);
 			verifier.addExpectedChange(project2.getFile(".project"), IResourceDelta.ADDED, IResourceDelta.CONTENT | IResourceDelta.MOVED_FROM, project1.getFile(".project").getFullPath(), null);
 			verifier.addExpectedChange(project2.getFolder(folder1.getProjectRelativePath()), IResourceDelta.ADDED, IResourceDelta.MOVED_FROM, folder1.getFullPath(), null);
 			verifier.addExpectedChange(project2.getFile(file1.getProjectRelativePath()), IResourceDelta.ADDED, IResourceDelta.MOVED_FROM, file1.getFullPath(), null);
+			
+			verifier.addExpectedChange(project2.getFolder(settings.getProjectRelativePath()), IResourceDelta.ADDED, IResourceDelta.MOVED_FROM, settings.getFullPath(), null);
+			verifier.addExpectedChange(project2.getFile(prefs.getProjectRelativePath()), IResourceDelta.ADDED, IResourceDelta.MOVED_FROM, prefs.getFullPath(), null);
 			getWorkspace().run((IWorkspaceRunnable) m -> {
 				m.beginTask("Creating and moving", 100);
 				try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java
index fbdb938..c004340 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java
@@ -2518,6 +2518,8 @@
 	// https://bugs.eclipse.org/461838
 	public void testAcceptProxyVisitorAlphabetic() throws CoreException {
 		IProject project = getWorkspace().getRoot().getProject("P");
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
 		IFolder a = project.getFolder("a");
 		IFile a1 = a.getFile("a1.txt");
 		IFile a2 = a.getFile("a2.txt");
@@ -2525,7 +2527,7 @@
 		IFile b1 = b.getFile("b1.txt");
 		IFile b2 = b.getFile("B2.txt");
 
-		ensureExistsInWorkspace(new IResource[] {project, a, a1, a2, b, b1, b2}, true);
+		ensureExistsInWorkspace(new IResource[] {project, settings, prefs, a, a1, a2, b, b1, b2}, true);
 
 		final List<IResource> actualOrder = new ArrayList<>();
 		IResourceProxyVisitor visitor = proxy -> {
@@ -2535,7 +2537,7 @@
 
 		project.accept(visitor, IResource.DEPTH_INFINITE, IResource.NONE);
 
-		List<IResource> expectedOrder = Arrays.asList(project, project.getFile(".project"), a, a1, a2, b, b2, b1);
+		List<IResource> expectedOrder = Arrays.asList(project, project.getFile(".project"),  settings, prefs, a, a1, a2, b, b2, b1);
 		assertEquals("1.0", expectedOrder.toString(), actualOrder.toString());
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java
index 096a10d..57f2845 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java
@@ -85,7 +85,9 @@
 		IFolder folder = project.getFolder("folder");
 		IFile file = project.getFile("file.txt");
 		IFile subFile = folder.getFile("subfile.txt");
-		IResource[] resources = new IResource[] {project, folder, file, subFile};
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
+		IResource[] resources = new IResource[] { project, folder, file, subFile, settings, prefs };
 		IResource[] members = null;
 		ensureExistsInWorkspace(resources, true);
 
@@ -99,7 +101,7 @@
 			fail("2.0", e);
 		}
 		// +1 for the project description file
-		assertEquals("2.1", 3, members.length);
+		assertEquals("2.1", 4, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -141,14 +143,14 @@
 			fail("7.0", e);
 		}
 		// +1 for the project description file
-		assertEquals("7.1", 3, members.length);
+		assertEquals("7.1", 4, members.length);
 		try {
 			members = project.members(IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS);
 		} catch (CoreException e) {
 			fail("7.2", e);
 		}
 		// +1 for the project description file
-		assertEquals("7.3", 3, members.length);
+		assertEquals("7.3", 4, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -164,7 +166,7 @@
 			fail("8.1", e);
 		}
 		// +1 for project description, -1 for team private folder
-		assertEquals("8.2", 2, members.length);
+		assertEquals("8.2", 3, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -177,7 +179,7 @@
 			fail("8.5", e);
 		}
 		// +1 for project description, -1 for team private folder
-		assertEquals("8.6", 2, members.length);
+		assertEquals("8.6", 3, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -190,7 +192,7 @@
 			fail("8.9", e);
 		}
 		// +1 for project description
-		assertEquals("8.10", 3, members.length);
+		assertEquals("8.10", 4, members.length);
 		try {
 			members = folder.members();
 		} catch (CoreException e) {
@@ -219,7 +221,7 @@
 			fail("9.6", e);
 		}
 		// +1 for project description
-		assertEquals("9.7", 3, members.length);
+		assertEquals("9.7", 4, members.length);
 		try {
 			members = folder.members(IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS);
 		} catch (CoreException e) {
@@ -244,7 +246,9 @@
 		IFolder folder = project.getFolder("folder");
 		IFile file = project.getFile("file.txt");
 		IFile subFile = folder.getFile("subfile.txt");
-		IResource[] resources = new IResource[] {project, folder, file, subFile};
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
+		IResource[] resources = new IResource[] { project, folder, file, subFile, settings, prefs };
 		ensureExistsInWorkspace(resources, true);
 		IResource description = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
 
@@ -286,6 +290,8 @@
 		visitor.addExpected(project);
 		visitor.addExpected(file);
 		visitor.addExpected(description);
+		visitor.addExpected(settings);
+		visitor.addExpected(prefs);
 		try {
 			project.accept(visitor);
 		} catch (CoreException e) {
@@ -297,6 +303,8 @@
 		visitor.addExpected(project);
 		visitor.addExpected(file);
 		visitor.addExpected(description);
+		visitor.addExpected(settings);
+		visitor.addExpected(prefs);
 		try {
 			project.accept(visitor, IResource.DEPTH_INFINITE, IResource.NONE);
 		} catch (CoreException e) {
@@ -607,8 +615,10 @@
 		final IFolder folder = project.getFolder("folder");
 		IFile file = project.getFile("file.txt");
 		IFile subFile = folder.getFile("subfile.txt");
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
 		IFile description = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
-		final IResource[] resources = new IResource[] {project, folder, file, subFile};
+		IResource[] resources = new IResource[] { project, folder, file, subFile, settings, prefs };
 
 		final ResourceDeltaVerifier listener = new ResourceDeltaVerifier();
 		getWorkspace().addResourceChangeListener(listener);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_028981.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_028981.java
index fa96816..5410a1a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_028981.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_028981.java
@@ -36,6 +36,8 @@
 		IFile phantomFile = project.getFile("phantom.txt");
 		IFile regularFile = project.getFile("regular.txt");
 		IFile projectDescriptionFile = project.getFile(".project");
+		IFolder settings = project.getFolder(".settings");
+		IFile prefs = settings.getFile("org.eclipse.core.resources.prefs");
 
 		ensureExistsInWorkspace(new IResource[] {teamPrivateFile, regularFile}, true);
 		try {
@@ -61,6 +63,8 @@
 		verifier.addExpected(project);
 		verifier.addExpected(projectDescriptionFile);
 		verifier.addExpected(regularFile);
+		verifier.addExpected(settings);
+		verifier.addExpected(prefs);
 		try {
 			project.accept(verifier);
 		} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_192631.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_192631.java
index 91c5d3c..c055378 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_192631.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_192631.java
@@ -80,13 +80,13 @@
 		linkB.createLink(commonB, IResource.NONE, getMonitor());
 
 		toVisit.addAll(Arrays.asList(new URI[] {projectA.getLocationURI(), commonA, folderA, projectA.getFile(".project").getLocationURI()}));
-		toVisitCount[0] = 4;
+		toVisitCount[0] = 6;
 		projectA.accept(visitor);
 		assertTrue("1.1", toVisit.isEmpty());
 		assertEquals("1.2", 0, toVisitCount[0]);
 
 		toVisit.addAll(Arrays.asList(new URI[] {projectB.getLocationURI(), commonB, folderB, projectB.getFile(".project").getLocationURI()}));
-		toVisitCount[0] = 4;
+		toVisitCount[0] = 6;
 		projectB.accept(visitor);
 		assertTrue("2.1", toVisit.isEmpty());
 		assertEquals("2.2", 0, toVisitCount[0]);
@@ -125,13 +125,13 @@
 		linkB.createLink(commonB, IResource.NONE, getMonitor());
 
 		toVisit.addAll(Arrays.asList(new URI[] {projectA.getLocationURI(), commonA, folderA, projectA.getFile(".project").getLocationURI()}));
-		toVisitCount[0] = 4;
+		toVisitCount[0] = 6;
 		projectA.accept(visitor);
 		assertTrue("1.1", toVisit.isEmpty());
 		assertEquals("1.2", 0, toVisitCount[0]);
 
 		toVisit.addAll(Arrays.asList(new URI[] {projectB.getLocationURI(), commonB, folderB, projectB.getFile(".project").getLocationURI()}));
-		toVisitCount[0] = 4;
+		toVisitCount[0] = 6;
 		projectB.accept(visitor);
 		assertTrue("2.1", toVisit.isEmpty());
 		assertEquals("2.2", 0, toVisitCount[0]);
@@ -170,13 +170,13 @@
 		linkB.createLink(commonB, IResource.NONE, getMonitor());
 
 		toVisit.addAll(Arrays.asList(new URI[] {projectA.getLocationURI(), commonA, folderA, projectA.getFile(".project").getLocationURI()}));
-		toVisitCount[0] = 4;
+		toVisitCount[0] = 6;
 		projectA.accept(visitor);
 		assertTrue("1.1", toVisit.isEmpty());
 		assertEquals("1.2", 0, toVisitCount[0]);
 
 		toVisit.addAll(Arrays.asList(new URI[] {projectB.getLocationURI(), commonB, folderB, projectB.getFile(".project").getLocationURI()}));
-		toVisitCount[0] = 4;
+		toVisitCount[0] = 6;
 		projectB.accept(visitor);
 		assertTrue("2.1", toVisit.isEmpty());
 		assertEquals("2.2", 0, toVisitCount[0]);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_332543.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_332543.java
index 6615c65..bf3e5ea 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_332543.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_332543.java
@@ -97,12 +97,12 @@
 		IFile f = project.getFile("foo.txt");
 		ensureExistsInFileSystem(f);
 
-		// Set our evil IOException on close() fs.
-		WrapperFileSystem.setCustomFileStore(IOErrOnCloseFileStore.class);
-
 		// Now open the project
 		project.open(getMonitor());
 
+		// Set our evil IOException on close() fs.
+		WrapperFileSystem.setCustomFileStore(IOErrOnCloseFileStore.class);
+
 		// Try #setContents on an existing file
 		try {
 			f.setContents(wrap.apply(new ByteArrayInputStream("Random".getBytes())), false, true, getMonitor());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/PR_1GEAB3C_Test.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/PR_1GEAB3C_Test.java
index 57f0454..481fe8d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/PR_1GEAB3C_Test.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/PR_1GEAB3C_Test.java
@@ -13,6 +13,7 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.regression;
 
+import org.eclipse.core.internal.preferences.EclipsePreferences;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.SubMonitor;
@@ -67,8 +68,12 @@
 	public void test_1GEAB3C() {
 		verifier.reset();
 		final IProject project = getWorkspace().getRoot().getProject("MyAddedAndOpenedProject");
+		IFile prefs = project.getFolder(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME)
+				.getFile(ResourcesPlugin.PI_RESOURCES + "." + EclipsePreferences.PREFS_FILE_EXTENSION);
 		verifier.addExpectedChange(project, IResourceDelta.ADDED, IResourceDelta.OPEN);
 		verifier.addExpectedChange(project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME), IResourceDelta.ADDED, 0);
+		verifier.addExpectedChange(new IResource[] { prefs.getParent() }, IResourceDelta.ADDED, 0);
+		verifier.addExpectedChange(new IResource[] { prefs }, IResourceDelta.ADDED, 0);
 		IWorkspaceRunnable body = monitor -> {
 			monitor.beginTask("Creating and deleting", 100);
 			try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java
index 0f6c7a9..7eac3ab 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java
@@ -50,7 +50,7 @@
 			project.open(null);
 		}
 
-		assertEquals("2.0", 2, project.members().length);
+		assertEquals("2.0", 3, project.members().length);
 		assertTrue("2.1", folder.exists());
 		assertTrue("2.2", file.exists());
 	}