Bug 522214 - Refresh preference folder and file before trying to write

The preference folder and file have to be synchronized. If the
folder/file already exists on disk but are not in sync they were tried
to create and failed with a resource exception.
Added a test case reproducing the issue.

Change-Id: Ib6115f71fb0f62198ab546d7ddcd45f1c3c73971
Signed-off-by: Karsten Thoms <karsten.thoms@itemis.de>
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java
index e8772e9..69bcd6c 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectPreferences.java
@@ -624,6 +624,9 @@
 						if (!systemLineSeparator.equals(fileLineSeparator))
 							s = s.replaceAll(systemLineSeparator, fileLineSeparator);
 						InputStream input = new BufferedInputStream(new ByteArrayInputStream(s.getBytes("UTF-8"))); //$NON-NLS-1$
+						// make sure that preference folder and file are in sync
+						fileInWorkspace.getParent().refreshLocal(IResource.DEPTH_ZERO, null);
+						fileInWorkspace.refreshLocal(IResource.DEPTH_ZERO, null);
 						if (fileInWorkspace.exists()) {
 							if (Policy.DEBUG_PREFERENCES)
 								Policy.debug("Setting preference file contents for: " + fileInWorkspace.getFullPath()); //$NON-NLS-1$
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 6caeb56..529697a 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
@@ -1590,4 +1590,32 @@
 		ProjectPreferences.updatePreferences(prefsFile);
 	}
 
+	public void testSettingsFolderCreatedOutsideWorkspace() throws CoreException, BackingStoreException, IOException {
+		String nodeA = "nodeA";
+		String key = "key";
+		String value = "value";
+
+		IProject project1 = getProject(getUniqueString());
+		project1.create(getMonitor());
+		project1.open(getMonitor());
+
+		// create the project settings folder on disk, it will be out of sync with the workspace
+		// see bug#522214
+		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();
+
+		// now add some project preference and save them
+		Preferences prefs1 = new ProjectScope(project1).getNode(nodeA);
+		prefs1.put(key, value);
+		prefs1.flush();
+		assertEquals(value, prefs1.get(key, null));
+
+	}
 }