Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpfullbright2007-11-09 15:29:12 +0000
committerpfullbright2007-11-09 15:29:12 +0000
commit82eeb4abf3b912c44366973f7f1ea1e84cf55622 (patch)
treee50e56af74e736160f3d63df1effc0282399d033 /jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm
parent22035461086e7f739dba03bd217f7360bae6a7ab (diff)
downloadwebtools.dali-82eeb4abf3b912c44366973f7f1ea1e84cf55622.tar.gz
webtools.dali-82eeb4abf3b912c44366973f7f1ea1e84cf55622.tar.xz
webtools.dali-82eeb4abf3b912c44366973f7f1ea1e84cf55622.zip
fix for bug 208147 - we no longer hang on to "edit" state for emf resources
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlJpaFileContentProvider.java104
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRootContentNode.java18
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmArtifactEdit.java56
3 files changed, 120 insertions, 58 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlJpaFileContentProvider.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlJpaFileContentProvider.java
index a70beb1c94..98a51c94da 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlJpaFileContentProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlJpaFileContentProvider.java
@@ -9,63 +9,59 @@
******************************************************************************/
package org.eclipse.jpt.core.internal.content.orm;
+import java.io.IOException;
import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
import org.eclipse.jpt.core.internal.IJpaFileContentProvider;
import org.eclipse.jpt.core.internal.IJpaRootContentNode;
import org.eclipse.jpt.core.internal.JptCorePlugin;
import org.eclipse.jpt.core.internal.content.orm.resource.OrmArtifactEdit;
-import org.eclipse.jpt.core.internal.emfutility.ComponentUtilities;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider
{
- public static OrmXmlJpaFileContentProvider INSTANCE = new OrmXmlJpaFileContentProvider();
+ //singleton
+ private static final OrmXmlJpaFileContentProvider INSTANCE = new OrmXmlJpaFileContentProvider();
- private IFile file;
+ /**
+ * Return the singleton.
+ */
+ public static IJpaFileContentProvider instance() {
+ return INSTANCE;
+ }
/**
* Restrict access
*/
private OrmXmlJpaFileContentProvider() {
-
+ super();
}
public IJpaRootContentNode buildRootContent(IFile resourceFile) {
- file = resourceFile;
- IPath deployPath = ComponentUtilities.computeDeployPath(resourceFile);
- OrmArtifactEdit artifactEdit =
- OrmArtifactEdit.getArtifactEditForWrite(
- resourceFile.getProject(),
- deployPath.toString());
- OrmResource resource = artifactEdit.getOrmResource();
+ OrmArtifactEdit oae =
+ OrmArtifactEdit.getArtifactEditForRead(resourceFile.getProject());
+ OrmResource resource =
+ oae.getOrmResource(resourceFile);
XmlRootContentNode root = OrmFactory.eINSTANCE.createXmlRootContentNode();
-
- if (resourceFile.equals(resource.getFile())) {
- root.setArtifactEdit(artifactEdit);
- root.setEntityMappings(resource.getEntityMappings());
- resource.eAdapters().add(buildRootNodeListener(root));
- }
- else {
- artifactEdit.dispose();
- }
-
+ root.setResource(resource);
+ root.setEntityMappings(resource.getEntityMappings());
+ resource.eAdapters().add(buildRootNodeListener(resourceFile, root));
+ oae.addListener(buildReloadListener(resource));
return root;
}
- private Adapter buildRootNodeListener(XmlRootContentNode root) {
- return new RootAdapter(root);
+ private Adapter buildRootNodeListener(IFile resourceFile, XmlRootContentNode root) {
+ return new RootAdapter(resourceFile, root);
}
- protected ResourceSet getResourceSet(IFile file) {
- return WorkbenchResourceHelperBase.getResourceSet(file.getProject());
+ private EditModelListener buildReloadListener(OrmResource resource) {
+ return new ReloadListener(resource);
}
public String contentType() {
@@ -75,28 +71,69 @@ public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider
private class RootAdapter extends AdapterImpl
{
- XmlRootContentNode root;
+ final IFile resourceFile;
+ final XmlRootContentNode rootContentNode;
- private RootAdapter(XmlRootContentNode rootContentNode) {
+ RootAdapter(IFile resourceFile, XmlRootContentNode rootContentNode) {
super();
- root = rootContentNode;
+ this.resourceFile = resourceFile;
+ this.rootContentNode = rootContentNode;
}
+ @Override
public void notifyChanged(Notification notification) {
int featureId = notification.getFeatureID(Resource.class);
if (featureId == Resource.RESOURCE__CONTENTS) {
if (notification.getEventType() == Notification.ADD
|| notification.getEventType() == Notification.REMOVE) {
OrmResource resource = (OrmResource) notification.getNotifier();
- root.setEntityMappings(resource.getEntityMappings());
+ this.rootContentNode.setEntityMappings(resource.getEntityMappings());
}
}
+ }
+ }
+
+
+ private class ReloadListener implements EditModelListener
+ {
+ final OrmResource resource;
+
+ ReloadListener(OrmResource resource) {
+ super();
+ this.resource = resource;
+ }
+
+ public void editModelChanged(EditModelEvent anEvent) {
+ switch (anEvent.getEventCode()) {
+ case EditModelEvent.UNLOADED_RESOURCE :
+ if (anEvent.getChangedResources().contains(resource)
+ && ! resource.isLoaded()) {
+ try {
+ resource.load(resource.getResourceSet().getLoadOptions());
+ }
+ catch (IOException ioe) {
+ JptCorePlugin.log(ioe);
+ }
+ }
+ break;
+ case EditModelEvent.REMOVED_RESOURCE :
+ if (anEvent.getChangedResources().contains(resource)) {
+ anEvent.getEditModel().removeListener(this);
+ }
+ break;
+// case EditModelEvent.SAVE :
+// case EditModelEvent.PRE_DISPOSE :
+ }
+
+ }
// commenting out for now - this *was* a workaround for 202190, but with ArtifactEdit
// usage, it no longer works
+ //
+ // 11/07/07 - Actually, it has now been replaced by the above code
// else if (featureId == Resource.RESOURCE__IS_LOADED) {
// if (file.exists()) {
// // dumb translator is unloading my resource, reload it
// if (notification.getNewBooleanValue() == false) {
-// OrmResource resource = (OrmResource) notification.getNotifier();
+// PersistenceResource resource = (PersistenceResource) notification.getNotifier();
// try {
// resource.load(Collections.EMPTY_MAP);
// }
@@ -107,6 +144,5 @@ public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider
// }
// }
// }
- }
}
}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRootContentNode.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRootContentNode.java
index 79e0c36d95..383e50f83d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRootContentNode.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRootContentNode.java
@@ -22,7 +22,6 @@ import org.eclipse.jpt.core.internal.ITextRange;
import org.eclipse.jpt.core.internal.JpaCorePackage;
import org.eclipse.jpt.core.internal.JpaFile;
import org.eclipse.jpt.core.internal.XmlEObject;
-import org.eclipse.jpt.core.internal.content.orm.resource.OrmArtifactEdit;
/**
* <!-- begin-user-doc -->
@@ -53,7 +52,7 @@ public class XmlRootContentNode extends XmlEObject
*/
protected EntityMappingsInternal entityMappings;
- private OrmArtifactEdit artifactEdit;
+ private OrmResource resource;
/**
@@ -80,6 +79,11 @@ public class XmlRootContentNode extends XmlEObject
return IXmlContentNodes.XML_ROOT_ID;
}
+ @Override
+ public IJpaRootContentNode getRoot() {
+ return this;
+ }
+
/**
* Returns the value of the '<em><b>Jpa File</b></em>' container reference.
* It is bidirectional and its opposite is '{@link org.eclipse.jpt.core.internal.JpaFile#getContent <em>Content</em>}'.
@@ -327,8 +331,8 @@ public class XmlRootContentNode extends XmlEObject
}
public void dispose() {
- if (artifactEdit != null) {
- artifactEdit.dispose();
+ if (resource != null) {
+ resource.releaseFromRead();
}
}
@@ -365,8 +369,8 @@ public class XmlRootContentNode extends XmlEObject
getEntityMappings().handleJavaElementChangedEvent(event);
}
}
-
- public void setArtifactEdit(OrmArtifactEdit ormArtifactEdit) {
- artifactEdit = ormArtifactEdit;
+
+ public void setResource(OrmResource ormResource) {
+ resource = ormResource;
}
}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmArtifactEdit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmArtifactEdit.java
index 10f0065d9b..c41fdcec5a 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmArtifactEdit.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmArtifactEdit.java
@@ -1,5 +1,7 @@
package org.eclipse.jpt.core.internal.content.orm.resource;
+import java.io.IOException;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jpt.core.internal.JptCorePlugin;
@@ -10,15 +12,13 @@ public class OrmArtifactEdit extends ArtifactEdit
{
/**
* @param aProject
- * @param fileURI - this must be in a deployment relevant form
- * (e.g "META-INF/orm.xml" instead of "src/META-INF/orm.xml")
- * @return the orm artifact for the file URI in project aProject.
+ * @return an orm artifact for the project aProject.
* Opened only for read access (no write)
*/
- public static OrmArtifactEdit getArtifactEditForRead(IProject aProject, String fileURI) {
+ public static OrmArtifactEdit getArtifactEditForRead(IProject aProject) {
OrmArtifactEdit artifactEdit = null;
try {
- artifactEdit = new OrmArtifactEdit(aProject, URI.createURI(fileURI), true);
+ artifactEdit = new OrmArtifactEdit(aProject, true);
}
catch (IllegalArgumentException iae) {
// suppress illegal argument exception
@@ -29,15 +29,13 @@ public class OrmArtifactEdit extends ArtifactEdit
/**
* @param aProject
- * @param fileURI - this must be in a deployment relevant form
- * (e.g "META-INF/orm.xml" instead of "src/META-INF/orm.xml")
- * @return the orm artifact for the file URI in project aProject.
+ * @return an orm artifact for the project aProject.
* Opened for both write and read access
*/
- public static OrmArtifactEdit getArtifactEditForWrite(IProject aProject, String fileURI) {
+ public static OrmArtifactEdit getArtifactEditForWrite(IProject aProject) {
OrmArtifactEdit artifactEdit = null;
try {
- artifactEdit = new OrmArtifactEdit(aProject, URI.createURI(fileURI), false);
+ artifactEdit = new OrmArtifactEdit(aProject, false);
}
catch (IllegalArgumentException iae) {
// suppress illegal argument exception
@@ -47,19 +45,43 @@ public class OrmArtifactEdit extends ArtifactEdit
}
- private URI fileURI;
-
-
- public OrmArtifactEdit(IProject aProject, URI aFileURI, boolean toAccessAsReadOnly)
+ public OrmArtifactEdit(IProject aProject, boolean toAccessAsReadOnly)
throws IllegalArgumentException {
super(aProject, toAccessAsReadOnly);
- fileURI = aFileURI;
}
- public OrmResource getOrmResource() {
+ /**
+ * @return an orm resource for the given file
+ */
+ public OrmResource getOrmResource(IFile file) {
+ // This *seems* to do the same basic thing as below, but circumvents the
+ // URI munging that ArtifactEditModel does (see bug 209093)
+ try {
+ OrmResource resource =
+ (OrmResource) getArtifactEditModel().createResource(URI.createPlatformResourceURI(file.getFullPath().toString()));
+ if (! resource.isLoaded()) {
+ resource.load(getArtifactEditModel().getResourceSet().getLoadOptions());
+ }
+ return resource;
+ }
+ catch (ClassCastException cce) {
+ return null;
+ }
+ catch (IOException ioe) {
+ JptCorePlugin.log(ioe);
+ return null;
+ }
+ }
+
+ /**
+ * @param fileURI - this must be in a deployment relevant form
+ * (e.g "META-INF/orm.xml" instead of "src/META-INF/orm.xml")
+ * @return an orm resource for the given deployment file URI
+ */
+ public OrmResource getOrmResource(String fileURI) {
try {
- return (OrmResource) getArtifactEditModel().getResource(fileURI);
+ return (OrmResource) getArtifactEditModel().getResource(URI.createURI(fileURI));
}
catch (ClassCastException cce) {
return null;

Back to the top