blob: f4011d1c68fcdd4b1a5c2d4b2f2ff351e9bd409c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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 java.io.IOException;
import java.util.Collections;
import org.eclipse.core.resources.IFile;
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.IJpaFileContentProvider;
import org.eclipse.jpt.core.internal.IJpaRootContentNode;
import org.eclipse.jpt.core.internal.JptCorePlugin;
import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceResource;
import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceXmlResourceFactory;
public class PersistenceXmlJpaFileContentProvider implements IJpaFileContentProvider
{
public static PersistenceXmlJpaFileContentProvider INSTANCE = new PersistenceXmlJpaFileContentProvider();
/**
* Restrict access
*/
private PersistenceXmlJpaFileContentProvider() {
}
public IJpaRootContentNode buildRootContent(IFile resourceFile) {
PersistenceXmlResourceFactory.register();
URI fileURI = URI.createPlatformResourceURI(resourceFile.getFullPath().toString());
PersistenceResource resource = (PersistenceResource) getResourceSet(resourceFile).getResource(fileURI, true);
PersistenceXmlRootContentNode root = PersistenceFactory.eINSTANCE.createPersistenceXmlRootContentNode();
root.setPersistence(resource.getPersistence());
resource.eAdapters().add(buildRootNodeListener(root));
return root;
}
private Adapter buildRootNodeListener(PersistenceXmlRootContentNode root) {
return new RootAdapter(root);
}
protected ResourceSet getResourceSet(IFile file) {
return WorkbenchResourceHelperBase.getResourceSet(file.getProject());
}
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());
}
}
else if (featureId == Resource.RESOURCE__IS_LOADED) {
// 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);
}
}
}
}
}
}