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 | |
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')
10 files changed, 253 insertions, 125 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF index ce8a9b8163..a7485662bf 100644 --- a/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF +++ b/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF @@ -26,6 +26,7 @@ Require-Bundle: org.eclipse.core.commands, org.eclipse.jst.jee.ejb, org.eclipse.text, org.eclipse.wst.common.emf, + org.eclipse.wst.common.emfworkbench.integration, org.eclipse.wst.common.frameworks, org.eclipse.wst.common.modulecore, org.eclipse.wst.common.project.facet.core, diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java index 5676d2e104..13c5f41997 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java @@ -22,19 +22,16 @@ package org.eclipse.jpt.core.internal; public interface IJpaContentNode extends IJpaSourceObject { /** - * <!-- begin-user-doc --> - * <!-- end-user-doc --> - * @model kind="operation" required="true" - * @generated - */ - IJpaFile getJpaFile(); - - /** * Return a unique identifier for all of this class of content nodes */ Object getId(); /** + * Return the root content node containing this node + */ + IJpaRootContentNode getRoot(); + + /** * Return the text range to be used for selection. This is the text you want selected * when selecting the object in the editor. StructureView uses this for selection * from the structure to the source editor. 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; diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlJpaFileContentProvider.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlJpaFileContentProvider.java index c39da31019..881402923b 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlJpaFileContentProvider.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlJpaFileContentProvider.java @@ -9,8 +9,8 @@ ******************************************************************************/ package org.eclipse.jpt.core.internal.content.persistence; +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; @@ -20,14 +20,21 @@ import org.eclipse.jpt.core.internal.IJpaRootContentNode; import org.eclipse.jpt.core.internal.JptCorePlugin; import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceArtifactEdit; import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceResource; -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 PersistenceXmlJpaFileContentProvider implements IJpaFileContentProvider { - public static PersistenceXmlJpaFileContentProvider INSTANCE = new PersistenceXmlJpaFileContentProvider(); + //singleton + private static final PersistenceXmlJpaFileContentProvider INSTANCE = new PersistenceXmlJpaFileContentProvider(); - private IFile file; + /** + * Return the singleton. + */ + public static IJpaFileContentProvider instance() { + return INSTANCE; + } /** @@ -37,31 +44,25 @@ public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProv super(); } - public IJpaRootContentNode buildRootContent(IFile resourceFile) { - file = resourceFile; - IPath deployPath = ComponentUtilities.computeDeployPath(resourceFile); - PersistenceArtifactEdit artifactEdit = - PersistenceArtifactEdit.getArtifactEditForWrite( - resourceFile.getProject(), - deployPath.toString()); - PersistenceResource resource = artifactEdit.getPersistenceResource(); - PersistenceXmlRootContentNode root = PersistenceFactory.eINSTANCE.createPersistenceXmlRootContentNode(); - - if (resourceFile.equals(resource.getFile())) { - root.setArtifactEdit(artifactEdit); - root.setPersistence(resource.getPersistence()); - resource.eAdapters().add(buildRootNodeListener(root)); - } - else { - artifactEdit.dispose(); - } - + PersistenceArtifactEdit pae = + PersistenceArtifactEdit.getArtifactEditForRead(resourceFile.getProject()); + PersistenceResource resource = + pae.getPersistenceResource(resourceFile); + PersistenceXmlRootContentNode root = PersistenceFactory.eINSTANCE.createPersistenceXmlRootContentNode(); + root.setResource(resource); + root.setPersistence(resource.getPersistence()); + resource.eAdapters().add(buildRootNodeListener(resourceFile, root)); + pae.addListener(buildReloadListener(resource)); return root; } - private Adapter buildRootNodeListener(PersistenceXmlRootContentNode root) { - return new RootAdapter(root); + private Adapter buildRootNodeListener(IFile resourceFile, PersistenceXmlRootContentNode rootContentNode) { + return new RootAdapter(resourceFile, rootContentNode); + } + + private EditModelListener buildReloadListener(PersistenceResource resource) { + return new ReloadListener(resource); } public String contentType() { @@ -71,24 +72,65 @@ public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProv private class RootAdapter extends AdapterImpl { - PersistenceXmlRootContentNode root; + final IFile resourceFile; + final PersistenceXmlRootContentNode rootContentNode; - private RootAdapter(PersistenceXmlRootContentNode rootContentNode) { + RootAdapter(IFile resourceFile, PersistenceXmlRootContentNode 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) { PersistenceResource resource = (PersistenceResource) notification.getNotifier(); - root.setPersistence(resource.getPersistence()); + this.rootContentNode.setPersistence(resource.getPersistence()); } } + } + } + + + private class ReloadListener implements EditModelListener + { + final PersistenceResource resource; + + ReloadListener(PersistenceResource 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 @@ -104,6 +146,5 @@ public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProv // } // } // } - } } } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlRootContentNode.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlRootContentNode.java index b9ba15d6ad..d23fc189d8 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlRootContentNode.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceXmlRootContentNode.java @@ -24,7 +24,7 @@ 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.persistence.resource.IPersistenceXmlContentNodes; -import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceArtifactEdit; +import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceResource; /** * <!-- begin-user-doc --> @@ -55,7 +55,7 @@ public class PersistenceXmlRootContentNode extends XmlEObject */ protected Persistence persistence; - private PersistenceArtifactEdit artifactEdit; + private PersistenceResource resource; /** @@ -343,8 +343,8 @@ public class PersistenceXmlRootContentNode extends XmlEObject } public void dispose() { - if (artifactEdit != null) { - artifactEdit.dispose(); + if (resource != null) { + resource.releaseFromRead(); } } @@ -372,11 +372,16 @@ public class PersistenceXmlRootContentNode extends XmlEObject return IPersistenceXmlContentNodes.PERSISTENCEXML_ROOT_ID; } + @Override + public IJpaRootContentNode getRoot() { + return this; + } + public void handleJavaElementChangedEvent(ElementChangedEvent event) { // TODO Auto-generated method stub } - public void setArtifactEdit(PersistenceArtifactEdit persistenceArtifactEdit) { - artifactEdit = persistenceArtifactEdit; + public void setResource(PersistenceResource persistenceResource) { + resource = persistenceResource; } }
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceArtifactEdit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceArtifactEdit.java index 2ed71db7e3..38140cb550 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceArtifactEdit.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceArtifactEdit.java @@ -1,5 +1,7 @@ package org.eclipse.jpt.core.internal.content.persistence.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; @@ -9,15 +11,13 @@ public class PersistenceArtifactEdit extends ArtifactEdit { /** * @param aProject - * @param fileURI - this must be in a deployment relevant form - * (e.g "META-INF/persistence.xml" instead of "src/META-INF/persistence.xml") - * @return the persistence artifact for the file URI in project aProject. + * @return a persistence artifact for project aProject. * Opened only for read access (no write) */ - public static PersistenceArtifactEdit getArtifactEditForRead(IProject aProject, String fileURI) { + public static PersistenceArtifactEdit getArtifactEditForRead(IProject aProject) { PersistenceArtifactEdit artifactEdit = null; try { - artifactEdit = new PersistenceArtifactEdit(aProject, URI.createURI(fileURI), true); + artifactEdit = new PersistenceArtifactEdit(aProject, true); } catch (IllegalArgumentException iae) { // suppress illegal argument exception @@ -28,15 +28,13 @@ public class PersistenceArtifactEdit extends ArtifactEdit /** * @param aProject - * @param fileURI - this must be in a deployment relevant form - * (e.g "META-INF/persistence.xml" instead of "src/META-INF/persistence.xml") - * @return the persistence artifact for the file URI in project aProject. + * @return a persistence artifact for the project aProject. * Opened for both write and read access */ - public static PersistenceArtifactEdit getArtifactEditForWrite(IProject aProject, String fileURI) { + public static PersistenceArtifactEdit getArtifactEditForWrite(IProject aProject) { PersistenceArtifactEdit artifactEdit = null; try { - artifactEdit = new PersistenceArtifactEdit(aProject, URI.createURI(fileURI), false); + artifactEdit = new PersistenceArtifactEdit(aProject, false); } catch (IllegalArgumentException iae) { // suppress illegal argument exception @@ -46,19 +44,43 @@ public class PersistenceArtifactEdit extends ArtifactEdit } - private URI fileURI; - - - public PersistenceArtifactEdit(IProject aProject, URI aFileURI, boolean toAccessAsReadOnly) + public PersistenceArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException { super(aProject, toAccessAsReadOnly); - fileURI = aFileURI; } - public PersistenceResource getPersistenceResource() { + /** + * @return a persistence resource for the given file + */ + public PersistenceResource getPersistenceResource(IFile file) { + // This *seems* to do the same basic thing as below, but circumvents the + // URI munging that ArtifactEditModel does (see bug 209093) + try { + PersistenceResource resource = + (PersistenceResource) 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/persistence.xml" instead of "src/META-INF/persistence.xml") + * @return a persistence resource for the given deployment file URI + */ + public PersistenceResource getPersistenceResource(String fileURI) { try { - return (PersistenceResource) getArtifactEditModel().getResource(fileURI); + return (PersistenceResource) getArtifactEditModel().getResource(URI.createURI(fileURI)); } catch (ClassCastException cce) { return null; diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetPostInstallDelegate.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetPostInstallDelegate.java index 9c54db2511..1d986b4fd2 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetPostInstallDelegate.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetPostInstallDelegate.java @@ -82,8 +82,8 @@ public class JpaFacetPostInstallDelegate } PersistenceArtifactEdit pae = - PersistenceArtifactEdit.getArtifactEditForWrite(project, deployPath); - PersistenceResource resource = pae.getPersistenceResource(); + PersistenceArtifactEdit.getArtifactEditForWrite(project); + PersistenceResource resource = pae.getPersistenceResource(deployPath); // fix for bug 202811 - only add content if it does not already have content if (resource.getPersistence() == null) { @@ -112,8 +112,8 @@ public class JpaFacetPostInstallDelegate } OrmArtifactEdit oae = - OrmArtifactEdit.getArtifactEditForWrite(project, deployPath); - OrmResource resource = oae.getOrmResource(); + OrmArtifactEdit.getArtifactEditForWrite(project); + OrmResource resource = oae.getOrmResource(deployPath); // fix for bug 202811 - only add content if it does not already have content if (resource.getEntityMappings() == null) { diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java index 83e7046f6c..731300372d 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java @@ -124,9 +124,9 @@ public abstract class BaseJpaPlatform implements IJpaPlatform public Collection<IJpaFileContentProvider> jpaFileContentProviders() { if (this.contentProviders == null) { this.contentProviders = new ArrayList<IJpaFileContentProvider>(); - this.contentProviders.add(PersistenceXmlJpaFileContentProvider.INSTANCE); + this.contentProviders.add(PersistenceXmlJpaFileContentProvider.instance()); this.contentProviders.add(JavaJpaFileContentProvider.INSTANCE); - this.contentProviders.add(OrmXmlJpaFileContentProvider.INSTANCE); + this.contentProviders.add(OrmXmlJpaFileContentProvider.instance()); } return this.contentProviders; } |