Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoritrimble2010-01-07 01:08:04 +0000
committeritrimble2010-01-07 01:08:04 +0000
commit5459d4898b762a9ba1f67390c611bd24783aa7ea (patch)
tree197d7f4835cde854960b1e10cd1edc2fdd704704
parent34c39d4c3480e704e6868c529e35e1406841f79c (diff)
downloadwebtools.jsf-5459d4898b762a9ba1f67390c611bd24783aa7ea.tar.gz
webtools.jsf-5459d4898b762a9ba1f67390c611bd24783aa7ea.tar.xz
webtools.jsf-5459d4898b762a9ba1f67390c611bd24783aa7ea.zip
https://bugs.eclipse.org/bugs/show_bug.cgi?id=296596
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java9
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java5
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java70
3 files changed, 59 insertions, 25 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
index 943fecb99..f9f9ac35d 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
@@ -163,10 +163,9 @@ public abstract class AbstractJSFAppConfigLocater implements IJSFAppConfigLocate
/*
* (non-Javadoc)
- * @see java.lang.Object#finalize()
+ * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#dispose()
*/
- protected void finalize() {
- removeAllConfigProviders();
- }
-
+ public void dispose() {
+ removeAllConfigProviders();
+ }
}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
index 6c0a6a2a5..f4536673e 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
@@ -50,6 +50,11 @@ public interface IJSFAppConfigLocater {
public void stopLocating();
/**
+ * Disposes of the instance.
+ */
+ public void dispose();
+
+ /**
* Gets the set of {@link IJSFAppConfigProvider} instances that this
* locater has located.
*
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
index 764e02f28..f2caf5608 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
@@ -28,12 +28,14 @@ import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
@@ -205,7 +207,7 @@ public class JSFAppConfigManager implements IResourceChangeListener {
setAsSessionProperty();
//add resource change listener
IWorkspace workspace = ResourcesPlugin.getWorkspace();
- workspace.addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
+ workspace.addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE);
}
/**
@@ -252,6 +254,7 @@ public class JSFAppConfigManager implements IResourceChangeListener {
while (itConfigLocaters.hasNext()) {
IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
configLocater.stopLocating();
+ configLocater.dispose();
}
}
@@ -260,8 +263,28 @@ public class JSFAppConfigManager implements IResourceChangeListener {
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
- IResourceDelta delta = event.getDelta();
- if (delta.getKind() == IResourceDelta.CHANGED) {
+ if (event.getType() == IResourceChangeEvent.PRE_CLOSE
+ || event.getType() == IResourceChangeEvent.PRE_DELETE) {
+ // a project is closing - release and cleanup
+ final IProject aProject = (IProject) event.getResource();
+ if (aProject != null && aProject.equals(this.project)) {
+ SafeRunnable.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ JSFCorePlugin.log("Unexpected Program Error: disposing resources", exception); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ dispose();
+ }
+ });
+
+ return;
+ }
+ }
+
+ IResourceDelta delta = event.getDelta();
+ if (delta != null && delta.getKind() == IResourceDelta.CHANGED) {
IResourceDelta[] removedDeltas = delta.getAffectedChildren(IResourceDelta.REMOVED);
if (removedDeltas.length == 1) {
IResourceDelta removedDelta = removedDeltas[0];
@@ -414,23 +437,30 @@ public class JSFAppConfigManager implements IResourceChangeListener {
return facesConfigModels;
}
- /*
- * (non-Javadoc)
- * @see java.lang.Object#finalize()
- */
- protected void finalize() {
- //remove resource change listener
- IWorkspace workspace = ResourcesPlugin.getWorkspace();
- workspace.removeResourceChangeListener(this);
- //remove session property from project
- unsetAsSessionProperty();
- //instruct locaters to stop locating
- stopConfigLocaters();
- //clear collections
- configLocaters.clear();
- configProvidersChangeListeners.clear();
- facesConfigChangeListeners.clear();
- }
+ /**
+ * Disposes of resources by:
+ * <ul>
+ * <li>removing a resource change listener to the workspace</li>
+ * <li>removing instance as a session property of the IProject instance</li>
+ * <li>invoking the stopLocating() method on all configLocaters</li>
+ * <li>clearing the configLocaters collection</li>
+ * <li>clearing the configProvidersChangeListeners collection</li>
+ * <li>clearing the facesConfigChangeListeners collection</li>
+ * </ul>
+ */
+ protected void dispose() {
+ //remove resource change listener
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ workspace.removeResourceChangeListener(this);
+ //remove session property from project
+ unsetAsSessionProperty();
+ //instruct locaters to stop locating
+ stopConfigLocaters();
+ //clear collections
+ configLocaters.clear();
+ configProvidersChangeListeners.clear();
+ facesConfigChangeListeners.clear();
+ }
/**
* Gets list of all ManagedBeanType instances from all known faces-config

Back to the top