Patch for Briany (43833,180,000)
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyManager.java index e456c34..24d859f 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyManager.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/PropertyManager.java
@@ -22,7 +22,7 @@ import org.eclipse.core.runtime.*; /** - * + * */ public class PropertyManager implements IManager, ILifecycleListener { protected Workspace workspace; @@ -31,33 +31,27 @@ this.workspace = workspace; } - public void closePropertyStore(IResource target) throws CoreException { + public synchronized void closePropertyStore(IResource target) throws CoreException { PropertyStore store = getPropertyStoreOrNull(target); if (store == null) return; - synchronized (store) { - store.shutdown(null); - setPropertyStore(target, null); - } + store.shutdown(null); + setPropertyStore(target, null); } /** - * Copy all the properties of one resource to another. Both resources - * must have a property store available. + * Copy all the properties of one resource to another. Both resources must + * have a property store available. */ - public void copy(IResource source, IResource destination, int depth) throws CoreException { + public synchronized void copy(IResource source, IResource destination, int depth) throws CoreException { // cache stores to avoid problems in concurrency PropertyStore sourceStore = getPropertyStore(source); PropertyStore destinationStore = getPropertyStore(destination); - synchronized (sourceStore) { - assertRunning(source, sourceStore); - synchronized (destinationStore) { - assertRunning(destination, destinationStore); - copyProperties(source, destination, depth); - sourceStore.commit(); - destinationStore.commit(); - } - } + assertRunning(source, sourceStore); + assertRunning(destination, destinationStore); + copyProperties(source, destination, depth); + sourceStore.commit(); + destinationStore.commit(); } /** @@ -65,14 +59,15 @@ */ private void assertRunning(IResource target, PropertyStore store) throws CoreException { if (!store.isRunning()) { - //if the store is not running then the resource is in the process of being deleted, - //so report the error as if the resource was not found + // if the store is not running then the resource is in the process + // of being deleted, + // so report the error as if the resource was not found String message = Policy.bind("resources.mustExist", target.getFullPath().toString()); //$NON-NLS-1$ throw new ResourceException(IResourceStatus.RESOURCE_NOT_FOUND, target.getFullPath(), message, null); } } - protected void copyProperties(IResource source, IResource destination, int depth) throws CoreException { + private void copyProperties(IResource source, IResource destination, int depth) throws CoreException { PropertyStore sourceStore = getPropertyStore(source); PropertyStore destStore = getPropertyStore(destination); ResourceName sourceName = getPropertyKey(source); @@ -92,54 +87,51 @@ } } - public void deleteProperties(IResource target, int depth) throws CoreException { + public synchronized void deleteProperties(IResource target, int depth) throws CoreException { switch (target.getType()) { - case IResource.FILE : - case IResource.FOLDER : - PropertyStore store = getPropertyStore(target); - synchronized (store) { - assertRunning(target, store); - store.removeAll(getPropertyKey(target), depth); - store.commit(); - } - break; - case IResource.PROJECT : - case IResource.ROOT : - deletePropertyStore(target, true); + case IResource.FILE: + case IResource.FOLDER: + PropertyStore store = getPropertyStore(target); + assertRunning(target, store); + store.removeAll(getPropertyKey(target), depth); + store.commit(); + break; + case IResource.PROJECT: + case IResource.ROOT: + deletePropertyStore(target, true); } } /** - * The resource is being deleted so permanently erase its properties. - * In the case of projects, this means the property store will not be - * accessible again. + * The resource is being deleted so permanently erase its properties. In the + * case of projects, this means the property store will not be accessible + * again. */ - public void deleteResource(IResource target) throws CoreException { + public synchronized void deleteResource(IResource target) throws CoreException { switch (target.getType()) { - case IResource.FILE : - case IResource.FOLDER : - case IResource.ROOT : - deleteProperties(target, IResource.DEPTH_INFINITE); - break; - case IResource.PROJECT : - //permanently delete the store - deletePropertyStore(target, false); + case IResource.FILE: + case IResource.FOLDER: + case IResource.ROOT: + deleteProperties(target, IResource.DEPTH_INFINITE); + break; + case IResource.PROJECT: + // permanently delete the store + deletePropertyStore(target, false); } } - protected void deletePropertyStore(IResource target, boolean restart) throws CoreException { + private void deletePropertyStore(IResource target, boolean restart) throws CoreException { PropertyStore store = getPropertyStoreOrNull(target); if (store == null) return; - synchronized (store) { - store.shutdown(null); - workspace.getMetaArea().getPropertyStoreLocation(target).toFile().delete(); - //if we want to allow restart, null the store and it will be recreated lazily - if (restart) { - ResourceInfo info = getPropertyHost(target).getResourceInfo(false, false); - if (info != null) - info.setPropertyStore(null); - } + store.shutdown(null); + workspace.getMetaArea().getPropertyStoreLocation(target).toFile().delete(); + // if we want to allow restart, null the store and it will be recreated + // lazily + if (restart) { + ResourceInfo info = getPropertyHost(target).getResourceInfo(false, false); + if (info != null) + info.setPropertyStore(null); } } @@ -147,37 +139,37 @@ * Returns the value of the identified property on the given resource as * maintained by this store. */ - public String getProperty(IResource target, QualifiedName name) throws CoreException { + public synchronized String getProperty(IResource target, QualifiedName name) throws CoreException { PropertyStore store = getPropertyStore(target); - synchronized (store) { - assertRunning(target, store); - StoredProperty result = store.get(getPropertyKey(target), name); - return result == null ? null : result.getStringValue(); - } + assertRunning(target, store); + StoredProperty result = store.get(getPropertyKey(target), name); + return result == null ? null : result.getStringValue(); } /** - * Returns the resource which hosts the property store - * for the given resource. + * Returns the resource which hosts the property store for the given + * resource. */ - protected Resource getPropertyHost(IResource target) { + private Resource getPropertyHost(IResource target) { return (Resource) (target.getType() == IResource.ROOT ? target : target.getProject()); } /** - * Returns the key to use in the property store when accessing - * the properties of the given resource. + * Returns the key to use in the property store when accessing the + * properties of the given resource. */ - protected ResourceName getPropertyKey(IResource target) { + private ResourceName getPropertyKey(IResource target) { return new ResourceName("", target.getProjectRelativePath()); //$NON-NLS-1$ } /** - * Returns the property store to use when storing a property for the - * given resource. - * @throws CoreException if the store could not be obtained for any reason. + * Returns the property store to use when storing a property for the given + * resource. + * + * @throws CoreException + * if the store could not be obtained for any reason. */ - protected PropertyStore getPropertyStore(IResource target) throws CoreException { + private PropertyStore getPropertyStore(IResource target) throws CoreException { try { Resource host = getPropertyHost(target); ResourceInfo info = host.getResourceInfo(false, false); @@ -198,16 +190,16 @@ } /** - * Returns the property store to use when storing a property for the - * given resource, or null if the store is not available. + * Returns the property store to use when storing a property for the given + * resource, or null if the store is not available. */ - protected PropertyStore getPropertyStoreOrNull(IResource target) { + private PropertyStore getPropertyStoreOrNull(IResource target) { Resource host = getPropertyHost(target); ResourceInfo info = host.getResourceInfo(false, false); if (info != null) { PropertyStore store = info.getPropertyStore(); if (store != null) { - //sync on the store in case of concurrent deletion + // sync on the store in case of concurrent deletion synchronized (store) { if (store.isRunning()) return store; @@ -217,12 +209,12 @@ return null; } - public void handleEvent(LifecycleEvent event) throws CoreException { + public synchronized void handleEvent(LifecycleEvent event) throws CoreException { if (event.kind == LifecycleEvent.PRE_PROJECT_CLOSE) closePropertyStore(event.resource); } - protected PropertyStore openPropertyStore(IResource target) { + private PropertyStore openPropertyStore(IResource target) { int type = target.getType(); Assert.isTrue(type != IResource.FILE && type != IResource.FOLDER); IPath location = workspace.getMetaArea().getPropertyStoreLocation(target); @@ -233,24 +225,23 @@ return store; } - public void setProperty(IResource target, QualifiedName key, String value) throws CoreException { + public synchronized void setProperty(IResource target, QualifiedName key, String value) throws CoreException { PropertyStore store = getPropertyStore(target); - synchronized (store) { - assertRunning(target, store); - if (value == null) { - store.remove(getPropertyKey(target), key); - } else { - StoredProperty prop = new StoredProperty(key, value); - store.set(getPropertyKey(target), prop); - } - store.commit(); + assertRunning(target, store); + if (value == null) { + store.remove(getPropertyKey(target), key); + } else { + StoredProperty prop = new StoredProperty(key, value); + store.set(getPropertyKey(target), prop); } + store.commit(); } - protected void setPropertyStore(IResource target, PropertyStore value) { - // fetch the info but don't bother making it mutable even though we are going - // to modify it. We don't know whether or not the tree is open and it really doesn't - // matter as the change we are doing does not show up in deltas. + private void setPropertyStore(IResource target, PropertyStore value) { + // fetch the info but don't bother making it mutable even though we are + // going to modify it. We don't know whether or not the tree is open and + // it really doesn't matter as the change we are doing does not show up in + // deltas. ResourceInfo info = getPropertyHost(target).getResourceInfo(false, false); if (info.getType() == IResource.PROJECT) ((ProjectInfo) info).setPropertyStore(value); @@ -258,11 +249,11 @@ ((RootInfo) info).setPropertyStore(value); } - public void shutdown(IProgressMonitor monitor) throws CoreException { + public synchronized void shutdown(IProgressMonitor monitor) throws CoreException { closePropertyStore(workspace.getRoot()); } - public void startup(IProgressMonitor monitor) throws CoreException { + public synchronized void startup(IProgressMonitor monitor) throws CoreException { workspace.addLifecycleListener(this); }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/TestingSupport.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/TestingSupport.java deleted file mode 100644 index ff5d1b2..0000000 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/properties/TestingSupport.java +++ /dev/null
@@ -1,37 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.core.internal.properties; - -import org.eclipse.core.internal.resources.Resource; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; - -/** - * Provides special internal access to the property store implementation. - * This class is to be used for testing purposes only. - * - * @since 2.1 - */ -public class TestingSupport { - - /** - * Return the property store which is associated with the given resource. - * - * @param resource the resource whose property store is being accessed - * @return the resource's property store - * @throws CoreException if there was a problem accessing the resource's property store - * @since 2.1 - */ - public static PropertyStore getPropertyStore(IResource resource) throws CoreException { - return ((Resource) resource).getPropertyManager().getPropertyStore(resource); - } - -} \ No newline at end of file