blob: dfba3f62f707011ab496b57972a15dca5140f524 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering, Technische Universitaet Muenchen. 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:
******************************************************************************/
package org.eclipse.emf.emfstore.standalone.core.workspace;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Factory;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.standalone.core.artifacts.Artifact;
import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
import org.eclipse.emf.emfstore.standalone.core.exceptions.NoActiveVCSProviderException;
import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
/**
*
* @author emueller
*/
public class ResourceFactoryRegistry implements Resource.Factory, Resource.Factory.Registry {
/**
* The initial resource factory is kept if a file is not EMF Store managed, so the initial resource factory has to
* handle the file.
*/
private static Map<String, Object> initialResourceFactory = new HashMap<String, Object>();
public static URI CURRENT_URI;
/**
* The Resource.Factory.Registry will be manipulated, so that the EMFStoreResourceFactoryWrapper will be responsible
* for Ecore files.
*/
public static void replaceSupportedFactories() {
Map<String, Object> extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap();
// replace factories for all managed file extensions
for (String fileExtension : FileUtil.getManagedFileExtensions()) {
Object factory = extensionToFactoryMap.get(fileExtension);
for (String key : extensionToFactoryMap.keySet()) {
Object currentFactory = extensionToFactoryMap.get(key);
if (factory == currentFactory) {
// remember initial ResourceFactory
initialResourceFactory.put(key, currentFactory);
// replace factory in registry with an EMF Store adapted one.
extensionToFactoryMap.put(key, new ResourceFactoryRegistry());
}
}
}
}
private Set<IResourceOpenedObserver> resourceOpenedObservers;
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.resource.Resource.Factory#createResource(org.eclipse.emf.common.util.URI)
*/
public Resource createResource(final URI uri) {
// use initial resource factory
Object object = initialResourceFactory.get(uri.fileExtension());
Factory factory = null;
if (object instanceof Resource.Factory.Registry) {
Resource.Factory.Registry registry = (Resource.Factory.Registry) object;
factory = registry.getFactory(uri);
} else if (object instanceof Resource.Factory.Descriptor) {
Resource.Factory.Descriptor descriptor = (Resource.Factory.Descriptor) object;
factory = descriptor.createFactory();
}
XMIResource xmiResource = (XMIResource) factory.createResource(uri);
IFile artifactFile = FileUtil.getFile(xmiResource.getURI());
IVCSProvider activeProvider = VCSProviderRegistry.getInstance().getActiveProvider();
if (activeProvider == IVCSProvider.NONE) {
return xmiResource;
}
try {
// file has been marked to be put under recorder control
if (ArtifactRegistry.getInstance().isFlagged(uri)) {
// IFile historyFile = FileUtil.getHistoryFile(artifactFile);
Artifact artifact = new Artifact(xmiResource, FileUtil.getHistoryURI(xmiResource.getURI()));
ArtifactRegistry.getInstance().register(artifact);
artifact.initialize();
VCSProviderRegistry.getInstance().getActiveProvider().addToVCS(FileUtil.getHistoryFile(artifactFile));
ArtifactRegistry.getInstance().unflag(uri);
} else if (ArtifactRegistry.getInstance().isRegistered(uri)) {
Artifact versionedArtifact = ArtifactRegistry.getInstance().getArtifact(uri);
if (!versionedArtifact.isInitialized()) {
versionedArtifact.initialize(xmiResource);
}
}
} catch (NoActiveVCSProviderException e) {
// should not happen because of guard above
}
CURRENT_URI = uri;
if (resourceOpenedObservers == null) {
initResourceOpenedObservers();
}
notifyResourceOpenedObservers(artifactFile);
return xmiResource;
}
private void notifyResourceOpenedObservers(IResource resource) {
for (IResourceOpenedObserver observer : resourceOpenedObservers) {
observer.resourceOpened(resource);
}
}
private void initResourceOpenedObservers() {
resourceOpenedObservers = new HashSet<IResourceOpenedObserver>();
IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(
"org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened");
for (IConfigurationElement extension : config) {
try {
IResourceOpenedObserver observer = (IResourceOpenedObserver) extension.createExecutableExtension("class");
resourceOpenedObservers.add(observer);
} catch (CoreException e) {
ModelUtil.logWarning("Could not instantiate EMFStore Standalone ResourceOpenedObserver:"
+ e.getMessage());
}
}
if (resourceOpenedObservers.size() == 0) {
throw new IllegalStateException("No ResourceOpenedObserver registered. Artifacts will cause memory leaks. Quitting.");
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getFactory(org.eclipse.emf.common.util.URI)
*/
public Factory getFactory(URI uri) {
return this;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getFactory(org.eclipse.emf.common.util.URI,
* java.lang.String)
*/
public Factory getFactory(URI uri, String contentType) {
return this;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getProtocolToFactoryMap()
*/
public Map<String, Object> getProtocolToFactoryMap() {
// TODO Auto-generated method stub
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getExtensionToFactoryMap()
*/
public Map<String, Object> getExtensionToFactoryMap() {
// TODO Auto-generated method stub
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getContentTypeToFactoryMap()
*/
public Map<String, Object> getContentTypeToFactoryMap() {
// TODO Auto-generated method stub
return null;
}
public static Object getDefaultFactory(String extension) {
return initialResourceFactory.get(extension);
}
}