Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkmoore2007-11-12 16:01:14 +0000
committerkmoore2007-11-12 16:01:14 +0000
commit4ae0bc3d4e4ee5273d309ff9fdc13be4307e9dd3 (patch)
tree56c9c622b5044e09be9574f8bcb25e8824effbd6 /jpa/plugins/org.eclipse.jpt.core
parenta2f4738089bd186dec60bf9110cba647ccb52ea4 (diff)
downloadwebtools.dali-4ae0bc3d4e4ee5273d309ff9fdc13be4307e9dd3.tar.gz
webtools.dali-4ae0bc3d4e4ee5273d309ff9fdc13be4307e9dd3.tar.xz
webtools.dali-4ae0bc3d4e4ee5273d309ff9fdc13be4307e9dd3.zip
209275 - fix for deadlock, removed some of the JpaModelManager synchronization
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaModel.java7
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModel.java18
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java65
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCorePlugin.java2
4 files changed, 62 insertions, 30 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaModel.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaModel.java
index 2d3790561b..50fa21bc18 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaModel.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaModel.java
@@ -11,6 +11,7 @@ package org.eclipse.jpt.core.internal;
import java.util.Iterator;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jpt.utility.internal.model.Model;
@@ -43,5 +44,11 @@ public interface IJpaModel extends Model {
* Return the size of the JPA model's list of JPA projects.
*/
int jpaProjectsSize();
+
+ /**
+ * Return the JPA file corresponding to the specified Eclipse file,
+ * or null if unable to associate the specified file with a JPA file.
+ */
+ IJpaFile jpaFile(IFile file) throws CoreException;
}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModel.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModel.java
index 02b8520a66..43db7de935 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModel.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModel.java
@@ -12,6 +12,7 @@ package org.eclipse.jpt.core.internal;
import java.util.ArrayList;
import java.util.Iterator;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
@@ -87,6 +88,10 @@ public class JpaModel extends AbstractModel implements IJpaModel {
return this.jpaProjectHolders.size();
}
+ public synchronized IJpaFile jpaFile(IFile file) throws CoreException {
+ IJpaProject jpaProject = this.jpaProject(file.getProject());
+ return (jpaProject == null) ? null : jpaProject.jpaFile(file);
+ }
// ********** internal methods **********
@@ -119,7 +124,10 @@ public class JpaModel extends AbstractModel implements IJpaModel {
*/
synchronized boolean removeJpaProject(IProject project) {
dumpStackTrace(); // figure out exactly when JPA projects are removed
- return this.jpaProjectHolder(project).remove();
+ if (containsJpaProject(project)) {
+ return this.jpaProjectHolder(project).remove();
+ }
+ return false;
}
/**
@@ -143,11 +151,17 @@ public class JpaModel extends AbstractModel implements IJpaModel {
// ********** events **********
+ synchronized void synchronizeFiles(IProject project, IResourceDelta delta) throws CoreException {
+ if (containsJpaProject(project)) {
+ this.synchronizeJpaFiles(project, delta);
+ }
+ }
+
/**
* Forward the specified resource delta to the JPA project corresponding
* to the specified Eclipse project.
*/
- synchronized void synchronizeJpaFiles(IProject project, IResourceDelta delta) throws CoreException {
+ private void synchronizeJpaFiles(IProject project, IResourceDelta delta) throws CoreException {
this.jpaProjectHolder(project).synchronizeJpaFiles(delta);
}
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 8cbbc72fe3..4c8226fa64 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
@@ -10,7 +10,6 @@
package org.eclipse.jpt.core.internal;
import java.util.ArrayList;
-import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
@@ -27,6 +26,9 @@ import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.IElementChangedListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.jdt.core.IOpenable;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jpt.core.internal.IJpaProject.Config;
@@ -195,15 +197,6 @@ public class JpaModelManager {
}
/**
- * Return the JPA file corresponding to the specified Eclipse file,
- * or null if unable to associate the specified file with a JPA file.
- */
- public synchronized IJpaFile jpaFile(IFile file) throws CoreException {
- IJpaProject jpaProject = this.jpaProject(file.getProject());
- return (jpaProject == null) ? null : jpaProject.jpaFile(file);
- }
-
- /**
* The JPA settings associated with the specified Eclipse project
* have changed in such a way as to require the associated
* JPA project to be completely rebuilt.
@@ -357,7 +350,8 @@ public class JpaModelManager {
* - project close/delete
* - file add/remove
*/
- /* private */ synchronized void resourceChanged(IResourceChangeEvent event) {
+ //not synchronized, synchronizing once we know we are going to access JpaModel
+ /* private */ void resourceChanged(IResourceChangeEvent event) {
if (! (event.getSource() instanceof IWorkspace)) {
return; // this probably shouldn't happen...
}
@@ -382,12 +376,7 @@ public class JpaModelManager {
*/
private void resourcePreDelete(IResourceChangeEvent event) {
debug("Resource (Project) PRE_DELETE: " + event.getResource());
- // we don't get any events from the Facets Framework when a
- // project is deleted, so we need this check...
- IProject project = (IProject) event.getResource();
- if (this.jpaModel.containsJpaProject(project)) {
- this.removeJpaProject(project);
- }
+ this.removeJpaProject((IProject) event.getResource());
}
/**
@@ -424,18 +413,12 @@ public class JpaModelManager {
}
}
- private void synchronizeFiles(IProject project, IResourceDelta delta) {
- if (this.jpaModel.containsJpaProject(project)) {
- this.synchronizeJpaFiles(project, delta);
- }
- }
-
/**
* Checked exceptions bite.
*/
- private void synchronizeJpaFiles(IProject project, IResourceDelta delta) {
+ private void synchronizeFiles(IProject project, IResourceDelta delta) {
try {
- this.jpaModel.synchronizeJpaFiles(project, delta);
+ this.jpaModel.synchronizeFiles(project, delta);
} catch (CoreException ex) {
this.log(ex); // problem traversing the project's resources - not much we can do
}
@@ -490,7 +473,7 @@ public class JpaModelManager {
* also triggers a Facet PROJECT_MODIFIED event and that is where we add
* the JPA project, not here
*/
- private void checkForOpenedProject2(IProject project, IResourceDelta delta) {
+ private synchronized void checkForOpenedProject2(IProject project, IResourceDelta delta) {
if (BitTools.flagIsSet(delta.getFlags(), IResourceDelta.OPEN) && project.isOpen()) {
debug("\tProject CHANGED - OPEN: " + project.getName());
this.checkForTransition(project);
@@ -608,10 +591,38 @@ public class JpaModelManager {
/**
* Forward the event to the JPA model.
*/
- /* private */ synchronized void javaElementChanged(ElementChangedEvent event) {
+ // not synchronized because of a conflict between facet install and
+ // java element change notifiation. synchronize on JpaModel instead.
+ /* private */ void javaElementChanged(ElementChangedEvent event) {
+ if (isAddProjectNotOpenEvent(event)) {
+ return;
+ }
this.jpaModel.javaElementChanged(event);
}
+ //209275 - This particular event only causes problems in a clean workspace the first time a JPA project
+ //is created through the JPA wizard. The second time a JPA project is created, this event occurs, but
+ //it occurs as the wizard is closing so it does not cause a deadlock.
+ private boolean isAddProjectNotOpenEvent(ElementChangedEvent event) {
+ IJavaElementDelta delta = event.getDelta();
+ if (delta.getKind() == IJavaElementDelta.CHANGED) {
+ if (delta.getElement().getElementType() == IJavaElement.JAVA_MODEL) {
+ if (delta.getAffectedChildren().length == 1) {
+ IJavaElementDelta childDelta = delta.getAffectedChildren()[0];
+ if (childDelta.getKind() == IJavaElementDelta.ADDED) {
+ if (childDelta.getElement().getElementType() == IJavaElement.JAVA_PROJECT) {
+ if (childDelta.getAffectedChildren().length == 0) {
+ if (!((IOpenable) childDelta.getElement()).isOpen()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
// ********** preference changed **********
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCorePlugin.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCorePlugin.java
index d42ed1232c..b0239cd3a7 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCorePlugin.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCorePlugin.java
@@ -146,7 +146,7 @@ public class JptCorePlugin extends Plugin {
*/
public static IJpaFile jpaFile(IFile file) {
try {
- return JpaModelManager.instance().jpaFile(file);
+ return jpaModel().jpaFile(file);
} catch (CoreException ex) {
log(ex);
return null;

Back to the top