diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java index 690cb8fe72e..16d458a404e 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java @@ -1870,14 +1870,14 @@ public ResourceInfo getResourceInfo(IPath path, boolean phantom, boolean mutable Assert.isNotNull(info, "Tree root info must never be null"); //$NON-NLS-1$ return info; } - ResourceInfo result = null; - if (!tree.includes(path)) { - return null; - } + ResourceInfo result; if (mutable) { + if (!tree.includes(path)) { + return null; + } result = (ResourceInfo) tree.openElementData(path); } else { - result = (ResourceInfo) tree.getElementData(path); + result = (ResourceInfo) tree.getElementDataOrNull(path); } if (result != null && (!phantom && result.isSet(M_PHANTOM))) { return null; diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java index a0820ade654..a7b59d26c85 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java @@ -384,6 +384,26 @@ public DeltaDataTree getDataTree() { return tree; } + /** + * Returns the element data for the given element identifier, or + * null if the element is not present in this tree. + *

+ * Unlike {@link #includes(IPath)} followed by {@link #getElementData(IPath)} + * this performs at most one tree lookup. + */ + public Object getElementDataOrNull(IPath key) { + if (key.isRoot()) { + return null; + } + synchronized (this) { + DataTreeLookup lookup = lookupCache; // Grab it in case it's replaced concurrently. + if (lookup == null || lookup.key != key) { + lookupCache = lookup = tree.lookup(key); + } + return lookup.isPresent ? lookup.data : null; + } + } + /** * Returns the element data for the given element identifier. * The given element must be present in this tree.