bug 193606
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
index 08ecf88..f69d462 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
@@ -33,6 +33,8 @@
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jpt.core.internal.prefs.JpaPreferenceConstants;
import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
public class JpaModelManager
{
@@ -40,6 +42,8 @@
private final IResourceChangeListener resourceChangeListener;
+ private final IFacetedProjectListener facetedProjectListener;
+
private final IElementChangedListener elementChangeListener;
private final IPropertyChangeListener preferencesListener;
@@ -60,16 +64,18 @@
private JpaModelManager() {
super();
- this.model = JpaCoreFactory.eINSTANCE.createJpaModel();
- this.resourceChangeListener = new ResourceChangeListener();
- this.elementChangeListener = new ElementChangeListener();
- this.preferencesListener = new PreferencesListener();
+ model = JpaCoreFactory.eINSTANCE.createJpaModel();
+ resourceChangeListener = new ResourceChangeListener();
+ facetedProjectListener = new FacetedProjectListener();
+ elementChangeListener = new ElementChangeListener();
+ preferencesListener = new PreferencesListener();
}
void start() {
try {
this.buildWorkspace();
ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener);
+ FacetedProjectFramework.addListener(facetedProjectListener, IFacetedProjectEvent.Type.values());
JavaCore.addElementChangedListener(elementChangeListener);
JptCorePlugin.getPlugin().getPluginPreferences().addPropertyChangeListener(preferencesListener);
}
@@ -296,6 +302,7 @@
switch (event.getType()){
case IResourceChangeEvent.PRE_DELETE :
+ case IResourceChangeEvent.PRE_CLOSE :
try {
if ((resource.getType() == IResource.PROJECT)
&& (FacetedProjectFramework.hasProjectFacet(
@@ -314,9 +321,6 @@
checkForFilesBeingAddedOrRemoved(delta);
}
return;
-
- case IResourceChangeEvent.PRE_CLOSE :
- return;
}
}
}
@@ -403,19 +407,7 @@
JptCorePlugin.log(ce);
}
}
- }
- else {
- // project has been closed. dispose jpa project if it exists.
- if (jpaProject != null) {
- jpaProject.dispose();
- }
}
- }
- else if ((delta.getFlags() & IResourceDelta.DESCRIPTION) != 0) {
- // again, not sure ...
- }
- else {
- // ...
}
break;
}
@@ -481,7 +473,70 @@
}
- // ********** element change listener **********
+ // **************** faceted project listener ******************************
+
+ private static class FacetedProjectListener
+ implements IFacetedProjectListener
+ {
+ ThreadLocal<FacetedProjectChangeProcessor> processors =
+ new ThreadLocal<FacetedProjectChangeProcessor>();
+
+ FacetedProjectListener() {
+ super();
+ }
+
+ public void handleEvent(IFacetedProjectEvent event) {
+ getProcessor().handleEvent(event);
+ }
+
+ public FacetedProjectChangeProcessor getProcessor() {
+ FacetedProjectChangeProcessor processor = processors.get();
+ if (processor == null) {
+ processor = new FacetedProjectChangeProcessor();
+ processors.set(processor);
+ }
+ return processor;
+ }
+ }
+
+
+ private static class FacetedProjectChangeProcessor
+ {
+ private JpaModel model;
+
+ FacetedProjectChangeProcessor() {
+ model = JpaModelManager.instance().model;
+ }
+
+ protected void handleEvent(IFacetedProjectEvent event) {
+ IProject project = event.getProject().getProject();
+ JpaProject jpaProject = (JpaProject) model.getJpaProject(project);
+ boolean jpaFacetExists = false;
+ try {
+ jpaFacetExists = FacetedProjectFramework.hasProjectFacet(project, JptCorePlugin.FACET_ID);
+ }
+ catch (CoreException ce) {
+ // nothing to do, assume facet doesn't exist
+ JptCorePlugin.log(ce);
+ }
+
+ if (jpaFacetExists && jpaProject == null) {
+ try {
+ JpaModelManager.instance().createFilledJpaProject(project);
+ }
+ catch (CoreException ce) {
+ // nothing to do, nothing we *can* do
+ JptCorePlugin.log(ce);
+ }
+ }
+ else if (jpaProject != null && ! jpaFacetExists) {
+ jpaProject.dispose();
+ }
+ }
+ }
+
+
+ // **************** element change listener *******************************
private static class ElementChangeListener
implements IElementChangedListener
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
index 3013a57..15b88af 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
@@ -148,6 +148,12 @@
* This is set to false when that job is completed
*/
boolean resynching = false;
+
+ /**
+ * Flag to indicate that the disposing job has been scheduled or is running
+ * (or has been run, in some cases)
+ */
+ boolean disposing = false;
/**
* Flag to indicate that the resynchJob needs to be run. This is
@@ -573,6 +579,10 @@
* Dispose and remove project
*/
void dispose() {
+ if (disposing) return;
+
+ disposing = true;
+
Job job = new Job("Disposing JPA project ...") {
@Override
protected IStatus run(IProgressMonitor monitor) {
@@ -696,7 +706,9 @@
//passing it on to the JpaModel. We don't currently support
//multiple projects having cross-references
public void resynch() {
- if (!this.resynching) {
+ if (disposing) return;
+
+ if (! this.resynching) {
this.resynching = true;
this.needsToResynch = false;
this.resynchJob.schedule();