blob: c39da310195903b1f1315d7a2d0baf26728d88ec [file] [log] [blame]
/*******************************************************************************
* 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.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.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.emfutility.ComponentUtilities;
public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProvider
{
public static PersistenceXmlJpaFileContentProvider INSTANCE = new PersistenceXmlJpaFileContentProvider();
private IFile file;
/**
* Restrict access
*/
private PersistenceXmlJpaFileContentProvider() {
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();
}
return root;
}
private Adapter buildRootNodeListener(PersistenceXmlRootContentNode root) {
return new RootAdapter(root);
}
public String contentType() {
return JptCorePlugin.PERSISTENCE_XML_CONTENT_TYPE;
}
private class RootAdapter extends AdapterImpl
{
PersistenceXmlRootContentNode root;
private RootAdapter(PersistenceXmlRootContentNode rootContentNode) {
super();
root = rootContentNode;
}
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());
}
}
// 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);
// }
// }
// }
// }
}
}
}