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));
+
+ }
}