diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse')
20 files changed, 565 insertions, 421 deletions
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 f69d462b04..9a02709e11 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 @@ -161,6 +161,33 @@ public class JpaModelManager } /** + * Determine whether project should be created, then create it if necessary + */ + private synchronized void processProject(IProject project) { + 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 (jpaProject == null && jpaFacetExists) { + try { + JpaModelManager.instance().createFilledJpaProject(project); + } + catch (CoreException ce) { + JptCorePlugin.log(ce); + } + } + else if (jpaProject != null && ! jpaFacetExists) { + jpaProject.dispose(); + } + } + + /** * INTERNAL ONLY * * Fills the IJpaProject associated with the IProject, if it exists @@ -383,8 +410,6 @@ public class JpaModelManager // - if the project is closed, it has already lost its jpa facet IProject project = (IProject) resource; - // could be problems here ... - JpaProject jpaProject = (JpaProject) model.getJpaProject(project); switch (delta.getKind()) { case IResourceDelta.REMOVED : // we should have already handled this in the PRE_DELETE event @@ -397,16 +422,7 @@ public class JpaModelManager case IResourceDelta.CHANGED : if ((delta.getFlags() & IResourceDelta.OPEN) != 0) { if (project.isOpen()) { - // project has been opened, but don't create it if it's already there - // (which can happen on project creation) - if (jpaProject == null) { - try { - JpaModelManager.instance().createFilledJpaProject(project); - } - catch (CoreException ce) { - JptCorePlugin.log(ce); - } - } + JpaModelManager.instance().processProject(project); } } break; @@ -509,29 +525,7 @@ public class JpaModelManager } 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(); - } + JpaModelManager.instance().processProject(event.getProject().getProject()); } } 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 38c42985ff..eafe676c29 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 @@ -15,8 +15,6 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jpt.core.internal.content.orm.OrmInit; -import org.eclipse.jpt.core.internal.content.persistence.PersistenceInit; import org.osgi.framework.BundleContext; public class JptCorePlugin extends Plugin @@ -133,8 +131,6 @@ public class JptCorePlugin extends Plugin public void start(BundleContext context) throws Exception { super.start(context); modelManager().start(); - OrmInit.init(); - PersistenceInit.init(); } @Override diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmInit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmInit.java deleted file mode 100644 index b93a2b8831..0000000000 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmInit.java +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2007 Oracle. All rights reserved. This program and - * the accompanying materials are made available under the terms of the - * Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Oracle - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.core.internal.content.orm; - -import org.eclipse.emf.ecore.EFactory; -import org.eclipse.emf.ecore.EPackage; -import org.eclipse.jpt.core.internal.content.orm.resource.OrmXmlResourceFactory; -import org.eclipse.wst.common.componentcore.internal.impl.WTPEntityResolver; -import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities; -import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil; - -public class OrmInit -{ - private static boolean initialized = false; - - public static void init() { - init(true); - } - - public static void init(boolean shouldPreregisterPackages) { - if (! initialized) { - initialized = true; - DOMUtilities.setDefaultEntityResolver(WTPEntityResolver.INSTANCE); - initResourceFactories(); - } - if (shouldPreregisterPackages) { - preregisterPackages(); - } - } - - private static void initResourceFactories() { - OrmXmlResourceFactory.register(); - } - - private static void preregisterPackages() { - ExtendedEcoreUtil.preRegisterPackage( - "orm.xmi", //$NON-NLS-1$ - new EPackage.Descriptor() { - public EPackage getEPackage() { - return OrmPackage.eINSTANCE; - } - - public EFactory getEFactory() { - return OrmFactory.eINSTANCE; - } - } - ); - } -} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlResource.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmResource.java index 6f6d02c524..85e0f02b0a 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmXmlResource.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmResource.java @@ -8,13 +8,19 @@ *******************************************************************************/ package org.eclipse.jpt.core.internal.content.orm; +import org.eclipse.core.resources.IFile; import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; -public interface OrmXmlResource extends TranslatorResource +public interface OrmResource extends TranslatorResource { /** * Return the root object */ - EntityMappingsInternal getXmlFileContent(); + EntityMappingsInternal getEntityMappings(); + + /** + * Return the platform file associated with this resource + */ + IFile getFile(); } 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 c85ec9cb20..aea9b9256b 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,28 +9,25 @@ ******************************************************************************/ package org.eclipse.jpt.core.internal.content.orm; -import java.io.IOException; -import java.util.Collections; - 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.common.util.URI; 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.IJpaFile; 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.OrmXmlResourceFactory; +import org.eclipse.jpt.core.internal.content.orm.resource.OrmArtifactEdit; +import org.eclipse.jpt.core.internal.emfutility.ComponentUtilities; public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider { //singleton private static final OrmXmlJpaFileContentProvider INSTANCE = new OrmXmlJpaFileContentProvider(); + /** * Return the singleton. */ @@ -48,13 +45,24 @@ public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider public IJpaRootContentNode buildRootContent(IJpaFile jpaFile) { IFile resourceFile = jpaFile.getFile(); - OrmXmlResourceFactory.register(); - URI fileURI = URI.createPlatformResourceURI(resourceFile.getFullPath().toString(), true); - OrmXmlResource resource = (OrmXmlResource) getResourceSet(resourceFile).getResource(fileURI, true); + IPath deployPath = ComponentUtilities.computeDeployPath(resourceFile); + OrmArtifactEdit artifactEdit = + OrmArtifactEdit.getArtifactEditForWrite( + resourceFile.getProject(), + deployPath.toString()); + OrmResource resource = artifactEdit.getOrmResource(); XmlRootContentNode root = OrmFactory.eINSTANCE.createXmlRootContentNode(); + + if (resourceFile.equals(resource.getFile())) { + root.setArtifactEdit(artifactEdit); + root.setEntityMappings(resource.getEntityMappings()); + resource.eAdapters().add(buildRootNodeListener(resourceFile, root)); + } + else { + artifactEdit.dispose(); + } + jpaFile.setContent(root); - root.setEntityMappings(resource.getXmlFileContent()); - resource.eAdapters().add(buildRootNodeListener(resourceFile, root)); return root; } @@ -62,10 +70,6 @@ public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider return new RootAdapter(resourceFile, root); } - protected ResourceSet getResourceSet(IFile file) { - return WorkbenchResourceHelperBase.getResourceSet(file.getProject()); - } - public String contentType() { return JptCorePlugin.ORM_XML_CONTENT_TYPE; } @@ -87,25 +91,27 @@ public class OrmXmlJpaFileContentProvider implements IJpaFileContentProvider if (featureId == Resource.RESOURCE__CONTENTS) { if (notification.getEventType() == Notification.ADD || notification.getEventType() == Notification.REMOVE) { - OrmXmlResource resource = (OrmXmlResource) notification.getNotifier(); - this.rootContentNode.setEntityMappings(resource.getXmlFileContent()); - } - } - else if (featureId == Resource.RESOURCE__IS_LOADED) { - if (this.resourceFile.exists()) { - // dumb translator is unloading my resource, reload it - if (notification.getNewBooleanValue() == false) { - OrmXmlResource resource = (OrmXmlResource) notification.getNotifier(); - try { - resource.load(Collections.EMPTY_MAP); - } - catch (IOException ioe) { - // hmmm, log for now - JptCorePlugin.log(ioe); - } - } + OrmResource resource = (OrmResource) notification.getNotifier(); + this.rootContentNode.setEntityMappings(resource.getEntityMappings()); } } + // commenting out for now - this *was* a workaround for 202190, but with ArtifactEdit + // usage, it no longer works +// 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(); +// try { +// resource.load(Collections.EMPTY_MAP); +// } +// catch (IOException ioe) { +// // hmmm, log for now +// JptCorePlugin.log(ioe); +// } +// } +// } +// } } } } 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 dc02b8e28d..381cdd76da 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 @@ -18,9 +18,11 @@ import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jpt.core.internal.IJpaContentNode; import org.eclipse.jpt.core.internal.IJpaFile; import org.eclipse.jpt.core.internal.IJpaRootContentNode; +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 --> @@ -50,7 +52,10 @@ public class XmlRootContentNode extends XmlEObject * @ordered */ protected EntityMappingsInternal entityMappings; - + + private OrmArtifactEdit artifactEdit; + + /** * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -321,6 +326,17 @@ public class XmlRootContentNode extends XmlEObject return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass); } + public void dispose() { + if (artifactEdit != null) { + artifactEdit.dispose(); + } + } + + @Override + public ITextRange fullTextRange() { + return ITextRange.Empty.instance(); + } + /* (non-Javadoc) * * @see IJpaRootContentNode#getContentNode(int) @@ -337,14 +353,12 @@ public class XmlRootContentNode extends XmlEObject * @see IJpaRootContentNode#handleJavaElementChangedEvent(ElementChangedEvent) */ public void handleJavaElementChangedEvent(ElementChangedEvent event) { - getEntityMappings().handleJavaElementChangedEvent(event); + if (getEntityMappings() != null) { + getEntityMappings().handleJavaElementChangedEvent(event); + } } - - /* (non-Javadoc) - * - * @see IJpaRootContentNode#dispose() - */ - public void dispose() { - // TODO + + public void setArtifactEdit(OrmArtifactEdit ormArtifactEdit) { + artifactEdit = ormArtifactEdit; } } 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 new file mode 100644 index 0000000000..10f0065d9b --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmArtifactEdit.java @@ -0,0 +1,68 @@ +package org.eclipse.jpt.core.internal.content.orm.resource; + +import org.eclipse.core.resources.IProject; +import org.eclipse.emf.common.util.URI; +import org.eclipse.jpt.core.internal.JptCorePlugin; +import org.eclipse.jpt.core.internal.content.orm.OrmResource; +import org.eclipse.wst.common.componentcore.ArtifactEdit; + +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. + * Opened only for read access (no write) + */ + public static OrmArtifactEdit getArtifactEditForRead(IProject aProject, String fileURI) { + OrmArtifactEdit artifactEdit = null; + try { + artifactEdit = new OrmArtifactEdit(aProject, URI.createURI(fileURI), true); + } + catch (IllegalArgumentException iae) { + // suppress illegal argument exception + JptCorePlugin.log(iae); + } + return 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. + * Opened for both write and read access + */ + public static OrmArtifactEdit getArtifactEditForWrite(IProject aProject, String fileURI) { + OrmArtifactEdit artifactEdit = null; + try { + artifactEdit = new OrmArtifactEdit(aProject, URI.createURI(fileURI), false); + } + catch (IllegalArgumentException iae) { + // suppress illegal argument exception + JptCorePlugin.log(iae); + } + return artifactEdit; + } + + + private URI fileURI; + + + public OrmArtifactEdit(IProject aProject, URI aFileURI, boolean toAccessAsReadOnly) + throws IllegalArgumentException { + super(aProject, toAccessAsReadOnly); + fileURI = aFileURI; + } + + + public OrmResource getOrmResource() { + try { + return (OrmResource) getArtifactEditModel().getResource(fileURI); + } + catch (ClassCastException cce) { + return null; + } + } +} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmResourceFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmResourceFactory.java new file mode 100644 index 0000000000..3cde563841 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmResourceFactory.java @@ -0,0 +1,30 @@ +package org.eclipse.jpt.core.internal.content.orm.resource; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.wst.common.internal.emf.resource.Renderer; +import org.eclipse.wst.common.internal.emf.resource.RendererFactory; +import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; +import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory; + +public class OrmResourceFactory extends TranslatorResourceFactory +{ + public OrmResourceFactory() { + this(RendererFactory.getDefaultRendererFactory()); + } + + public OrmResourceFactory(RendererFactory aRendererFactory, boolean listeningForUpdates) { + super(aRendererFactory, listeningForUpdates); + } + + public OrmResourceFactory(RendererFactory aRendererFactory) { + super(aRendererFactory); + } + + + /** + * @see TranslatorResourceFactory#createResource(URI, Renderer) + */ + protected TranslatorResource createResource(URI uri, Renderer renderer) { + return new OrmResourceImpl(uri, renderer); + } +} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmXmlResourceImpl.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmResourceImpl.java index 62f1eab457..3e84f7c62f 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmXmlResourceImpl.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmResourceImpl.java @@ -8,25 +8,30 @@ *******************************************************************************/ package org.eclipse.jpt.core.internal.content.orm.resource; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.URIConverter; +import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; +import org.eclipse.jem.util.plugin.JEMUtilPlugin; import org.eclipse.jpt.core.internal.content.orm.EntityMappingsInternal; -import org.eclipse.jpt.core.internal.content.orm.OrmXmlResource; +import org.eclipse.jpt.core.internal.content.orm.OrmResource; import org.eclipse.wst.common.internal.emf.resource.Renderer; import org.eclipse.wst.common.internal.emf.resource.Translator; import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl; -public class OrmXmlResourceImpl extends TranslatorResourceImpl - implements OrmXmlResource +public class OrmResourceImpl extends TranslatorResourceImpl + implements OrmResource { - private Translator rootTranslator; - public OrmXmlResourceImpl(Renderer aRenderer) { + public OrmResourceImpl(Renderer aRenderer) { super(aRenderer); } - public OrmXmlResourceImpl(URI uri, Renderer aRenderer) { + public OrmResourceImpl(URI uri, Renderer aRenderer) { super(uri, aRenderer); } @@ -78,9 +83,37 @@ public class OrmXmlResourceImpl extends TranslatorResourceImpl } /** - * @see OrmXmlResource#getXmlFileContent() + * @see OrmResource#getEntityMappings() */ - public EntityMappingsInternal getXmlFileContent() { + public EntityMappingsInternal getEntityMappings() { return (EntityMappingsInternal) getRootObject(); } + + public IFile getFile() { + IFile file = null; + file = getFile(getURI()); + if (file == null) { + if (getResourceSet() != null) { + URIConverter converter = getResourceSet().getURIConverter(); + URI convertedUri = converter.normalize(getURI()); + if (! getURI().equals(convertedUri)) { + file = getFile(convertedUri); + } + } + } + return file; + } + + /** + * Return the IFile for the <code>uri</code> within the Workspace. This URI is assumed to be + * absolute in the following format: platform:/resource/.... + */ + private IFile getFile(URI uri) { + if (WorkbenchResourceHelperBase.isPlatformResourceURI(uri)) { + String fileString = URI.decode(uri.path()); + fileString = fileString.substring(JEMUtilPlugin.PLATFORM_RESOURCE.length() + 1); + return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString)); + } + return null; + } } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmXmlResourceFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmXmlResourceFactory.java deleted file mode 100644 index 00b4b8fbce..0000000000 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/OrmXmlResourceFactory.java +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 Oracle. All rights reserved. This - * program and the accompanying materials are made available under the terms of - * the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: Oracle. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.core.internal.content.orm.resource; - -import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry; -import org.eclipse.wst.common.internal.emf.resource.Renderer; -import org.eclipse.wst.common.internal.emf.resource.RendererFactory; -import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; -import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory; -import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERendererFactory; - -public class OrmXmlResourceFactory extends TranslatorResourceFactory -{ - public static final String ORM_XML_FILE_NAME = "orm.xml"; //$NON-NLS-1$ - public static final URI ORM_XML_FILE_URI = URI.createURI(ORM_XML_FILE_NAME); //$NON-NLS-1$ - - /** - * Register myself with the Resource.Factory.Registry - */ - public static void registerWith(RendererFactory rendererFactory) { - WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment(ORM_XML_FILE_NAME, new OrmXmlResourceFactory(rendererFactory)); - } - - /** - * Register myself using the default renderer factory. - * @see #registerWith(RendererFactory) - */ - public static void register() { - registerWith(EMF2DOMSSERendererFactory.INSTANCE); - } - - public static Resource.Factory getRegisteredFactory() { - return WTPResourceFactoryRegistry.INSTANCE.getFactory(ORM_XML_FILE_URI); - } - - - public OrmXmlResourceFactory(RendererFactory aRendererFactory, boolean listeningForUpdates) { - super(aRendererFactory, listeningForUpdates); - } - - public OrmXmlResourceFactory(RendererFactory aRendererFactory) { - super(aRendererFactory); - } - - /** - * @see TranslatorResourceFactory#createResource(URI, Renderer) - */ - protected TranslatorResource createResource(URI uri, Renderer renderer) { - return new OrmXmlResourceImpl(uri, renderer); - } -} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceInit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceInit.java deleted file mode 100644 index 462191e630..0000000000 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/PersistenceInit.java +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 Oracle. All rights reserved. This - * program and the accompanying materials are made available under the terms of - * the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: Oracle. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.core.internal.content.persistence; - -import org.eclipse.emf.ecore.EFactory; -import org.eclipse.emf.ecore.EPackage; -import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceXmlResourceFactory; -import org.eclipse.wst.common.componentcore.internal.impl.WTPEntityResolver; -import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities; -import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil; - -public class PersistenceInit -{ - private static boolean initialized = false; - - public static void init() { - init(true); - } - - public static void init(boolean shouldPreregisterPackages) { - if (! initialized) { - initialized = true; - DOMUtilities.setDefaultEntityResolver(WTPEntityResolver.INSTANCE); - initResourceFactories(); - } - if (shouldPreregisterPackages) { - preregisterPackages(); - } - } - - private static void initResourceFactories() { - PersistenceXmlResourceFactory.register(); - } - - private static void preregisterPackages() { - ExtendedEcoreUtil.preRegisterPackage( - "packaging.xmi", //$NON-NLS-1$ - new EPackage.Descriptor() { - public EPackage getEPackage() { - return PersistencePackage.eINSTANCE; - } - - public EFactory getEFactory() { - return PersistenceFactory.eINSTANCE; - } - } - ); - } -} 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 8757acbcd8..cea5a4b6ad 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,29 +9,26 @@ ******************************************************************************/ package org.eclipse.jpt.core.internal.content.persistence; -import java.io.IOException; -import java.util.Collections; - 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.common.util.URI; 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.IJpaFile; 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.persistence.resource.PersistenceArtifactEdit; import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceResource; -import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceXmlResourceFactory; +import org.eclipse.jpt.core.internal.emfutility.ComponentUtilities; public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProvider { //singleton private static final PersistenceXmlJpaFileContentProvider INSTANCE = new PersistenceXmlJpaFileContentProvider(); + /** * Return the singleton. */ @@ -49,13 +46,24 @@ public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProv public IJpaRootContentNode buildRootContent(IJpaFile jpaFile) { IFile resourceFile = jpaFile.getFile(); - PersistenceXmlResourceFactory.register(); - URI fileURI = URI.createPlatformResourceURI(resourceFile.getFullPath().toString(), true); - PersistenceResource resource = (PersistenceResource) getResourceSet(resourceFile).getResource(fileURI, true); + 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(resourceFile, root)); + } + else { + artifactEdit.dispose(); + } + jpaFile.setContent(root); - root.setPersistence(resource.getPersistence()); - resource.eAdapters().add(buildRootNodeListener(resourceFile, root)); return root; } @@ -63,10 +71,6 @@ public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProv return new RootAdapter(resourceFile, rootContentNode); } - protected ResourceSet getResourceSet(IFile file) { - return WorkbenchResourceHelperBase.getResourceSet(file.getProject()); - } - public String contentType() { return JptCorePlugin.PERSISTENCE_XML_CONTENT_TYPE; } @@ -93,21 +97,23 @@ public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProv this.rootContentNode.setPersistence(resource.getPersistence()); } } - else if (featureId == Resource.RESOURCE__IS_LOADED) { - if (this.resourceFile.exists()) { - // dumb translator is unloading my resource, reload it - if (notification.getNewBooleanValue() == false) { - PersistenceResource resource = (PersistenceResource) notification.getNotifier(); - try { - resource.load(Collections.EMPTY_MAP); - } - catch (IOException ioe) { - // hmmm, log for now - JptCorePlugin.log(ioe); - } - } - } - } + // commenting out for now - this *was* a workaround for 202190, but with ArtifactEdit + // usage, it no longer works +// else if (featureId == Resource.RESOURCE__IS_LOADED) { +// if (file.exists()) { +// // dumb translator is unloading my resource, reload it +// if (notification.getNewBooleanValue() == false) { +// PersistenceResource resource = (PersistenceResource) notification.getNotifier(); +// try { +// resource.load(Collections.EMPTY_MAP); +// } +// catch (IOException ioe) { +// // hmmm, log for now +// JptCorePlugin.log(ioe); +// } +// } +// } +// } } } } 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 f19b7294a3..0bd7a0802a 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 @@ -19,10 +19,12 @@ import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jpt.core.internal.IJpaContentNode; import org.eclipse.jpt.core.internal.IJpaFile; import org.eclipse.jpt.core.internal.IJpaRootContentNode; +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.persistence.resource.IPersistenceXmlContentNodes; +import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceArtifactEdit; /** * <!-- begin-user-doc --> @@ -52,7 +54,10 @@ public class PersistenceXmlRootContentNode extends XmlEObject * @ordered */ protected Persistence persistence; - + + private PersistenceArtifactEdit artifactEdit; + + /** * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -336,23 +341,34 @@ public class PersistenceXmlRootContentNode extends XmlEObject } return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass); } - + public void dispose() { - // TODO Auto-generated method stub + if (artifactEdit != null) { + artifactEdit.dispose(); + } } - - public void handleJavaElementChangedEvent(ElementChangedEvent event) { - // TODO Auto-generated method stub + + @Override + public ITextRange fullTextRange() { + return ITextRange.Empty.instance(); } - + public IJpaContentNode getContentNode(int offset) { if (getPersistence() == null || !getPersistence().getNode().contains(offset)) { return this; } return getPersistence().getContentNode(offset); } - + public Object getId() { return IPersistenceXmlContentNodes.PERSISTENCEXML_ROOT_ID; } -} // PersistenceXmlRootContentNode + + public void handleJavaElementChangedEvent(ElementChangedEvent event) { + // TODO Auto-generated method stub + } + + public void setArtifactEdit(PersistenceArtifactEdit persistenceArtifactEdit) { + artifactEdit = persistenceArtifactEdit; + } +}
\ 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 new file mode 100644 index 0000000000..2ed71db7e3 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceArtifactEdit.java @@ -0,0 +1,67 @@ +package org.eclipse.jpt.core.internal.content.persistence.resource; + +import org.eclipse.core.resources.IProject; +import org.eclipse.emf.common.util.URI; +import org.eclipse.jpt.core.internal.JptCorePlugin; +import org.eclipse.wst.common.componentcore.ArtifactEdit; + +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. + * Opened only for read access (no write) + */ + public static PersistenceArtifactEdit getArtifactEditForRead(IProject aProject, String fileURI) { + PersistenceArtifactEdit artifactEdit = null; + try { + artifactEdit = new PersistenceArtifactEdit(aProject, URI.createURI(fileURI), true); + } + catch (IllegalArgumentException iae) { + // suppress illegal argument exception + JptCorePlugin.log(iae); + } + return 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. + * Opened for both write and read access + */ + public static PersistenceArtifactEdit getArtifactEditForWrite(IProject aProject, String fileURI) { + PersistenceArtifactEdit artifactEdit = null; + try { + artifactEdit = new PersistenceArtifactEdit(aProject, URI.createURI(fileURI), false); + } + catch (IllegalArgumentException iae) { + // suppress illegal argument exception + JptCorePlugin.log(iae); + } + return artifactEdit; + } + + + private URI fileURI; + + + public PersistenceArtifactEdit(IProject aProject, URI aFileURI, boolean toAccessAsReadOnly) + throws IllegalArgumentException { + super(aProject, toAccessAsReadOnly); + fileURI = aFileURI; + } + + + public PersistenceResource getPersistenceResource() { + try { + return (PersistenceResource) getArtifactEditModel().getResource(fileURI); + } + catch (ClassCastException cce) { + return null; + } + } +} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResource.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResource.java index d05495ab4d..178ba8a88b 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResource.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResource.java @@ -8,7 +8,13 @@ *******************************************************************************/ package org.eclipse.jpt.core.internal.content.persistence.resource; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.URIConverter; +import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; +import org.eclipse.jem.util.plugin.JEMUtilPlugin; import org.eclipse.jpt.core.internal.content.persistence.Persistence; import org.eclipse.wst.common.internal.emf.resource.Renderer; import org.eclipse.wst.common.internal.emf.resource.Translator; @@ -17,7 +23,6 @@ import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl; public class PersistenceResource extends TranslatorResourceImpl { - public PersistenceResource(Renderer aRenderer) { super(aRenderer); } @@ -72,4 +77,32 @@ public class PersistenceResource extends TranslatorResourceImpl public Persistence getPersistence() { return (Persistence) getRootObject(); } + + public IFile getFile() { + IFile file = null; + file = getFile(getURI()); + if (file == null) { + if (getResourceSet() != null) { + URIConverter converter = getResourceSet().getURIConverter(); + URI convertedUri = converter.normalize(getURI()); + if (! getURI().equals(convertedUri)) { + file = getFile(convertedUri); + } + } + } + return file; + } + + /** + * Return the IFile for the <code>uri</code> within the Workspace. This URI is assumed to be + * absolute in the following format: platform:/resource/.... + */ + private IFile getFile(URI uri) { + if (WorkbenchResourceHelperBase.isPlatformResourceURI(uri)) { + String fileString = URI.decode(uri.path()); + fileString = fileString.substring(JEMUtilPlugin.PLATFORM_RESOURCE.length() + 1); + return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString)); + } + return null; + } } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResourceFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResourceFactory.java new file mode 100644 index 0000000000..d999172406 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceResourceFactory.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2006, 2007 Oracle. All rights reserved. This + * program and the accompanying materials are made available under the terms of + * the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: Oracle. - initial API and implementation + *******************************************************************************/ +package org.eclipse.jpt.core.internal.content.persistence.resource; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.wst.common.internal.emf.resource.Renderer; +import org.eclipse.wst.common.internal.emf.resource.RendererFactory; +import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; +import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory; + +public class PersistenceResourceFactory extends TranslatorResourceFactory +{ + public PersistenceResourceFactory() { + this(RendererFactory.getDefaultRendererFactory()); + } + + public PersistenceResourceFactory(RendererFactory aRendererFactory, boolean listeningForUpdates) { + super(aRendererFactory, listeningForUpdates); + } + + public PersistenceResourceFactory(RendererFactory aRendererFactory) { + super(aRendererFactory); + } + + + /** + * @see TranslatorResourceFactory#createResource(URI, Renderer) + */ + protected TranslatorResource createResource(URI uri, Renderer renderer) { + return new PersistenceResource(uri, renderer); + } +} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceXmlResourceFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceXmlResourceFactory.java deleted file mode 100644 index ee8a066f16..0000000000 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceXmlResourceFactory.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 Oracle. All rights reserved. This - * program and the accompanying materials are made available under the terms of - * the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: Oracle. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.core.internal.content.persistence.resource; - -import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry; -import org.eclipse.wst.common.internal.emf.resource.Renderer; -import org.eclipse.wst.common.internal.emf.resource.RendererFactory; -import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; -import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory; -import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERendererFactory; - -public class PersistenceXmlResourceFactory extends TranslatorResourceFactory -{ - public static final String PERSISTENCE_XML_FILE_NAME = "persistence.xml"; //$NON-NLS-1$ - public static final URI PERSISTENCE_XML_FILE_URI = URI.createURI(PERSISTENCE_XML_FILE_NAME); //$NON-NLS-1$ - - /** - * Register myself with the Resource.Factory.Registry - */ - public static void registerWith(RendererFactory rendererFactory) { - WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment(PERSISTENCE_XML_FILE_NAME, new PersistenceXmlResourceFactory(rendererFactory)); - } - - /** - * Register myself using the default renderer factory. - * @see #registerWith(RendererFactory) - */ - public static void register() { - registerWith(EMF2DOMSSERendererFactory.INSTANCE); - } - - public static Resource.Factory getRegisteredFactory() { - return WTPResourceFactoryRegistry.INSTANCE.getFactory(PERSISTENCE_XML_FILE_URI); - } - - public PersistenceXmlResourceFactory(RendererFactory aRendererFactory, boolean listeningForUpdates) { - super(aRendererFactory, listeningForUpdates); - } - - public PersistenceXmlResourceFactory(RendererFactory aRendererFactory) { - super(aRendererFactory); - } - - /** - * @see TranslatorResourceFactory#createResource(URI, Renderer) - */ - protected TranslatorResource createResource(URI uri, Renderer renderer) { - return new PersistenceResource(uri, renderer); - } -} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/emfutility/ComponentUtilities.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/emfutility/ComponentUtilities.java new file mode 100644 index 0000000000..a6aa26fdb1 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/emfutility/ComponentUtilities.java @@ -0,0 +1,67 @@ +package org.eclipse.jpt.core.internal.emfutility; + +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.core.runtime.IPath; +import org.eclipse.jpt.utility.internal.CollectionTools; +import org.eclipse.jpt.utility.internal.iterators.EmptyIterator; +import org.eclipse.jpt.utility.internal.iterators.FilteringIterator; +import org.eclipse.jpt.utility.internal.iterators.TreeIterator; +import org.eclipse.wst.common.componentcore.ComponentCore; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualFile; +import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; +import org.eclipse.wst.common.componentcore.resources.IVirtualResource; + +public class ComponentUtilities +{ + /** + * Return the deployment path for the given source file. If there is no + * corresponding deployment file, null will be returned. + */ + public static IPath computeDeployPath(IFile sourceFile) { + // Unfortunately, the only current way to do this is to exhaustively + // search all deployment files and attempt to match to this file. + // Bug 202943 has been logged to track this issue. + for (IVirtualFile virtualFile : CollectionTools.iterable(allVirtualFiles(sourceFile.getProject()))) { + for (IFile underlyingFile : virtualFile.getUnderlyingFiles()) { + if (sourceFile.equals(underlyingFile)) { + return virtualFile.getRuntimePath(); + } + } + } + return null; + } + + private static Iterator<IVirtualFile> allVirtualFiles(IProject project) { + return new FilteringIterator<IVirtualFile>(allVirtualResources(project)) { + @Override + protected boolean accept(Object o) { + return ((IVirtualResource) o).getType() == IVirtualResource.FILE; + } + }; + } + + private static Iterator<IVirtualResource> allVirtualResources(IProject project) { + IVirtualComponent virtualComponent = ComponentCore.createComponent(project); + + if (virtualComponent == null) { + return EmptyIterator.instance(); + } + + return new TreeIterator<IVirtualResource>(virtualComponent.getRootFolder()) { + @Override + protected Iterator<? extends IVirtualResource> children(IVirtualResource next) { + if (next.getType() == IVirtualResource.FOLDER) { + try { + return CollectionTools.iterator(((IVirtualFolder) next).members()); + } + catch (CoreException ce) { /* fall through, return default case */ } + } + return EmptyIterator.instance(); + } + }; + } +} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetInstallDelegate.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetInstallDelegate.java index 288e9b1261..791160aff7 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetInstallDelegate.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetInstallDelegate.java @@ -17,6 +17,7 @@ import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jpt.utility.internal.CollectionTools; import org.eclipse.jpt.utility.internal.StringTools; import org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil; import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants; @@ -61,15 +62,17 @@ public class JpaFacetInstallDelegate ) }; } + IClasspathEntry jpaLibraryEntry = JavaCore.newContainerEntry( new Path(JavaCore.USER_LIBRARY_CONTAINER_ID + "/" + jpaLibrary), null, attributes, true); - IClasspathEntry[] newClasspath = new IClasspathEntry[newLength]; - System.arraycopy(classpath, 0, newClasspath, 0, newLength - 1); - newClasspath[newLength - 1] = jpaLibraryEntry; - - javaProject.setRawClasspath(newClasspath, monitor); + if (! CollectionTools.contains(classpath, jpaLibraryEntry)) { + IClasspathEntry[] newClasspath = new IClasspathEntry[newLength]; + System.arraycopy(classpath, 0, newClasspath, 0, newLength - 1); + newClasspath[newLength - 1] = jpaLibraryEntry; + javaProject.setRawClasspath(newClasspath, monitor); + } } if (monitor != 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 e4cd4cb256..9c54db2511 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 @@ -8,37 +8,37 @@ *******************************************************************************/ package org.eclipse.jpt.core.internal.facet; -import java.io.IOException; -import java.util.Iterator; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.resource.ResourceSet; -import org.eclipse.jdt.core.IClasspathEntry; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; import org.eclipse.jpt.core.internal.JpaModelManager; import org.eclipse.jpt.core.internal.JptCorePlugin; import org.eclipse.jpt.core.internal.content.orm.EntityMappingsInternal; import org.eclipse.jpt.core.internal.content.orm.OrmFactory; -import org.eclipse.jpt.core.internal.content.orm.OrmXmlResource; +import org.eclipse.jpt.core.internal.content.orm.OrmResource; +import org.eclipse.jpt.core.internal.content.orm.resource.OrmArtifactEdit; import org.eclipse.jpt.core.internal.content.persistence.Persistence; import org.eclipse.jpt.core.internal.content.persistence.PersistenceFactory; import org.eclipse.jpt.core.internal.content.persistence.PersistenceUnit; +import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceArtifactEdit; import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceResource; -import org.eclipse.jpt.utility.internal.CollectionTools; +import org.eclipse.jst.j2ee.internal.J2EEConstants; +import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; +import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework; import org.eclipse.wst.common.project.facet.core.IDelegate; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; public class JpaFacetPostInstallDelegate implements IDelegate, IJpaFacetDataModelProperties { + private final static String WEB_PROJECT_DEPLOY_PREFIX = J2EEConstants.WEB_INF_CLASSES; + + private final static String PERSISTENCE_XML_FILE_PATH = "META-INF/persistence.xml"; + private final static String ORM_XML_FILE_PATH = "META-INF/orm.xml"; + public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException { @@ -70,64 +70,59 @@ public class JpaFacetPostInstallDelegate } private void createPersistenceXml(IProject project, IDataModel dataModel) { - String sourceFolder = computeSourceFolder(project); - - URI fileURI = URI.createPlatformResourceURI(sourceFolder + "/META-INF/persistence.xml", false); - PersistenceResource resource = (PersistenceResource) getResourceSet(project).createResource(fileURI); - Persistence persistence = PersistenceFactory.eINSTANCE.createPersistence(); - persistence.setVersion("1.0"); - PersistenceUnit pUnit = PersistenceFactory.eINSTANCE.createPersistenceUnit(); - pUnit.setName(project.getName()); - persistence.getPersistenceUnits().add(pUnit); - + String deployPath = PERSISTENCE_XML_FILE_PATH; try { - resource.getContents().add(persistence); - resource.save(null); + if (FacetedProjectFramework.hasProjectFacet(project, IModuleConstants.JST_WEB_MODULE)) { + deployPath = WEB_PROJECT_DEPLOY_PREFIX + "/" + deployPath; + } } - catch (IOException e) { - JptCorePlugin.log(e); + catch (CoreException ce) { + // could not determine project facets. assume it doesn't have the facet. + JptCorePlugin.log(ce); } - } - - private void createOrmXml(IProject project, IDataModel dataModel) { - String sourceFolder = computeSourceFolder(project); - URI fileURI = URI.createPlatformResourceURI(sourceFolder + "/" + ORM_XML_FILE_PATH, false); - OrmXmlResource resource = (OrmXmlResource) getResourceSet(project).createResource(fileURI); - EntityMappingsInternal entityMappings = OrmFactory.eINSTANCE.createEntityMappingsInternal(); - entityMappings.setVersion("1.0"); + PersistenceArtifactEdit pae = + PersistenceArtifactEdit.getArtifactEditForWrite(project, deployPath); + PersistenceResource resource = pae.getPersistenceResource(); - try { - resource.getContents().add(entityMappings); - resource.save(null); - } - catch (IOException e) { - JptCorePlugin.log(e); + // fix for bug 202811 - only add content if it does not already have content + if (resource.getPersistence() == null) { + Persistence persistence = PersistenceFactory.eINSTANCE.createPersistence(); + persistence.setVersion("1.0"); + PersistenceUnit pUnit = PersistenceFactory.eINSTANCE.createPersistenceUnit(); + pUnit.setName(project.getName()); + persistence.getPersistenceUnits().add(pUnit); + resource.getContents().add(persistence); + pae.save(null); } + + pae.dispose(); } - private String computeSourceFolder(IProject project) { - IJavaProject jproject = JavaCore.create(project); - IClasspathEntry[] classpath; - + private void createOrmXml(IProject project, IDataModel dataModel) { + String deployPath = ORM_XML_FILE_PATH; try { - classpath = jproject.getRawClasspath(); + if (FacetedProjectFramework.hasProjectFacet(project, IModuleConstants.JST_WEB_MODULE)) { + deployPath = WEB_PROJECT_DEPLOY_PREFIX + "/" + deployPath; + } } - catch (JavaModelException jme) { - classpath = new IClasspathEntry[0]; + catch (CoreException ce) { + // could not determine project facets. assume it doesn't have the facet. + JptCorePlugin.log(ce); } - for (Iterator stream = CollectionTools.iterator(classpath); stream.hasNext(); ) { - IClasspathEntry next = (IClasspathEntry) stream.next(); - if (next.getEntryKind() == IClasspathEntry.CPE_SOURCE) { - return next.getPath().toString(); - } + OrmArtifactEdit oae = + OrmArtifactEdit.getArtifactEditForWrite(project, deployPath); + OrmResource resource = oae.getOrmResource(); + + // fix for bug 202811 - only add content if it does not already have content + if (resource.getEntityMappings() == null) { + EntityMappingsInternal entityMappings = OrmFactory.eINSTANCE.createEntityMappingsInternal(); + entityMappings.setVersion("1.0"); + resource.getContents().add(entityMappings); + oae.save(null); } - return "/" + project.getName(); - } - - private ResourceSet getResourceSet(IProject project) { - return WorkbenchResourceHelperBase.getResourceSet(project); + oae.dispose(); } } |