diff options
author | pfullbright | 2007-11-09 15:29:12 +0000 |
---|---|---|
committer | pfullbright | 2007-11-09 15:29:12 +0000 |
commit | 82eeb4abf3b912c44366973f7f1ea1e84cf55622 (patch) | |
tree | e50e56af74e736160f3d63df1effc0282399d033 /jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm | |
parent | 22035461086e7f739dba03bd217f7360bae6a7ab (diff) | |
download | webtools.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')
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; |