diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java index 14f6a86bfa5..15931305333 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java @@ -972,7 +972,7 @@ public ProjectDescription read(IProject target, boolean creation) throws CoreExc String msg = NLS.bind(Messages.resources_readProjectMeta, target.getName()); error = new ResourceException(IResourceStatus.FAILED_READ_METADATA, target.getFullPath(), msg, e); } catch (IOException ex) { - // ignore + Policy.log(ex); } if (error == null && description == null) { String msg = NLS.bind(Messages.resources_readProjectMeta, target.getName()); diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java index 8a6506c484c..3502ac2f9a7 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ProjectDescription.java @@ -19,13 +19,35 @@ package org.eclipse.core.internal.resources; import java.net.URI; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.internal.events.BuildCommand; import org.eclipse.core.internal.utils.FileUtil; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; +import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.ICommand; +import org.eclipse.core.resources.IDynamicReferenceProvider; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; public class ProjectDescription extends ModelObject implements IProjectDescription { // constants @@ -100,7 +122,7 @@ public class ProjectDescription extends ModelObject implements IProjectDescripti // fields protected URI location = null; - protected String[] natures = EMPTY_STRING_ARRAY; + protected volatile String[] natures = EMPTY_STRING_ARRAY; protected URI snapshotLocation = null; public ProjectDescription() { diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java index ea86481c65f..c5483cd4bc9 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java @@ -277,12 +277,13 @@ public void testBug297871() throws Throwable { assertHasEnabledNature(NATURE_EARTH); assertThat(project.getNature(NATURE_EARTH)).isNotNull(); + Files.copy(descTmp.toPath(), desc.toPath(), StandardCopyOption.REPLACE_EXISTING); // Make sure enough time has past to bump file's // timestamp during the copy - Thread.sleep(1000); - - Files.copy(descTmp.toPath(), desc.toPath(), StandardCopyOption.REPLACE_EXISTING); + org.eclipse.core.tests.resources.ResourceTestUtil + .touchInFilesystem(project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME)); + // should read file from filesystem, creating new IProjectDescription: project.refreshLocal(IResource.DEPTH_INFINITE, createTestMonitor()); assertDoesNotHaveNature(NATURE_EARTH); assertThat(project.getNature(NATURE_EARTH)).isNull();