From cf2a8cf84e689e5f86d5dd7a55b197460020c435 Mon Sep 17 00:00:00 2001 From: gkessler Date: Tue, 26 Jan 2010 21:57:34 +0000 Subject: [295409] ResourceException when MetaDataModelManager tries to set a property on a project that is closed, and [296595] Memory leak - MetaDataModelManager --- .../metadata/internal/MetaDataModelManager.java | 29 +++++++++++++--------- .../query/TaglibDomainMetaDataQueryHelper.java | 7 ++++-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java index a2b9476f3..d4899baa8 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java @@ -68,10 +68,15 @@ public class MetaDataModelManager implements IResourceChangeListener{ */ public synchronized static MetaDataModelManager getInstance(final IProject project){ MetaDataModelManager repo = null; - repo = getFromSessionProperty(project); - if (repo == null) { - repo = new MetaDataModelManager(project); - ResourcesPlugin.getWorkspace().addResourceChangeListener(repo, IResourceChangeEvent.PRE_CLOSE); + if (project != null && project.isAccessible()) { + repo = getFromSessionProperty(project); + if (repo == null) { + repo = new MetaDataModelManager(project); + ResourcesPlugin.getWorkspace().addResourceChangeListener( + repo, + (IResourceChangeEvent.PRE_CLOSE + | IResourceChangeEvent.PRE_DELETE)); + } } return repo; } @@ -94,7 +99,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ } } catch(CoreException ce) { JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to recover MetaDataModelManager for: "+project.getName(), ce); //$NON-NLS-1$ - } + } return repo; } @@ -103,7 +108,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ * IProject instance. */ private void setAsSessionProperty() { - if (project != null) {//&& project.isAccessible()) { + if (project != null && project.isAccessible()) { try { project.setSessionProperty(KEY_SESSIONPROPERTY, this); } catch(CoreException ce) { @@ -116,7 +121,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ * Releases a project's MetaDataModelManager instance by removing from project session property * @param aProject */ - private void removeAsSessionProperty(IProject aProject){ + private void removeAsSessionProperty(final IProject aProject){ try { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); aProject.setSessionProperty(KEY_SESSIONPROPERTY, null); @@ -169,7 +174,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ * org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org * .eclipse.core.resources.IResourceChangeEvent) */ - public void resourceChanged(IResourceChangeEvent event) { + public void resourceChanged(final IResourceChangeEvent event) { if (event.getType() == IResourceChangeEvent.PRE_CLOSE || event.getType() == IResourceChangeEvent.PRE_DELETE) { // a project is closing - release and cleanup @@ -190,7 +195,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ } } - private MetaDataModel loadMetadata(ModelKeyDescriptor modelKeyDescriptor) { + private MetaDataModel loadMetadata(final ModelKeyDescriptor modelKeyDescriptor) { if (!Thread.holdsLock(GLOBAL_INSTANCE_LOCK)) { JSFCommonPlugin .log(IStatus.ERROR, @@ -198,7 +203,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ return null; } - IDomainLoadingStrategy strategy = DomainLoadingStrategyRegistry + final IDomainLoadingStrategy strategy = DomainLoadingStrategyRegistry .getInstance().getLoadingStrategy( modelKeyDescriptor.getDomain()); ; @@ -209,7 +214,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ "Internal Error: Unable to locate metadata loading strategy for: " + modelKeyDescriptor.toString()); //$NON-NLS-1$ return null; } - MetaDataModel model = StandardModelFactory.getInstance().createModel( + final MetaDataModel model = StandardModelFactory.getInstance().createModel( modelKeyDescriptor, strategy);// new MetaDataModel(modelKey, // strategy); model.load(); @@ -218,7 +223,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ return model; } - private void addModel(MetaDataModel model) { + private void addModel(final MetaDataModel model) { if (model != null) models.put(model); } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java index d44103e80..52dd507c9 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java @@ -192,8 +192,11 @@ public final class TaglibDomainMetaDataQueryHelper{ mgr = MetaDataModelManager.getInstance(modelContext.getProject()); else //temp(?) mgr = MetaDataModelManager.getSharedInstance(); - - return mgr.getModel(modelContext); + + if (mgr != null) + return mgr.getModel(modelContext); + + return null; } /** -- cgit v1.2.3