blob: 9e13909597a829de8a0ff2f800c2719b0fdc34a2 [file] [log] [blame]
package org.eclipse.emf.texo.store;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.texo.component.ComponentProvider;
import org.eclipse.emf.texo.converter.EMFModelConverter;
import org.eclipse.emf.texo.converter.ModelEMFConverter;
/**
* An object store which loads the dataset from an EMF resource and persists/saves it in the same uris.
*
* @author <a href="mtaal@elver.org">Martin Taal</a>
*/
public class EMFResourceObjectStore extends MemoryObjectStore {
private Resource resource;
private ResourceSet resourceSet;
private URIConverter uriConverter = null;
/**
* Loads the underlying resource in memory
*/
@Override
public void begin() {
resource = createResource();
try {
final boolean loadFile = resource.getResourceSet().getURIConverter().exists(resource.getURI(),
Collections.emptyMap());
System.err.println("Loading file " + loadFile);
if (loadFile) {
resource.load(getResourceLoadOptions());
final List<EObject> eObjects = new ArrayList<EObject>();
final Iterator<EObject> iterator = resource.getAllContents();
while (iterator.hasNext()) {
eObjects.add(iterator.next());
}
EMFModelConverter emfModelConverter = ComponentProvider.getInstance().newInstance(EMFModelConverter.class);
final List<Object> content = emfModelConverter.convert(eObjects);
// add the data
addData(content);
} else {
resource.getContents().clear();
}
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
protected Map<?, ?> getResourceLoadOptions() {
return Collections.emptyMap();
}
protected Map<?, ?> getResourceSaveOptions() {
final Map<String, String> options = new HashMap<String, String>();
options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
return options;
}
protected Resource createResource() {
if (resource != null) {
return resource;
}
resourceSet = new ResourceSetImpl();
resourceSet.setURIConverter(getURIConverter());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml", //$NON-NLS-1$
new XMLResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", //$NON-NLS-1$
new XMIResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", //$NON-NLS-1$
new XMIResourceFactoryImpl());
return resourceSet.createResource(getUri());
}
/**
* Method to indicate that a transaction can be committed by the underlying implementation.
*/
@Override
public void commit() {
try {
resource.getContents().clear();
ModelEMFConverter modelEMFConverter = ComponentProvider.getInstance().newInstance(ModelEMFConverter.class);
final List<EObject> eObjects = new ArrayList<EObject>();
final List<Object> toConvert = new ArrayList<Object>();
for (List<Object> objs : getData().values()) {
toConvert.addAll(objs);
}
eObjects.addAll(modelEMFConverter.convert(toConvert));
for (EObject eObject : eObjects) {
if (eObject.eResource() == null && eObject.eContainer() == null) {
resource.getContents().add(eObject);
}
}
resource.save(getResourceSaveOptions());
resource = null;
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
/**
* Method to indicate that a transaction can be rolled back by the underlying implementation.
*/
@Override
public void rollback() {
resource.unload();
resource = null;
}
/**
* Method to indicate that the underlying implementation can be closed.
*/
@Override
public void close() {
resource = null;
}
public URIConverter getURIConverter() {
if (uriConverter == null) {
uriConverter = ComponentProvider.getInstance().newInstance(TexoEMFResourceURIConverter.class);
}
return uriConverter;
}
public void setURIConverter(URIConverter converter) {
uriConverter = converter;
}
protected Resource getResource() {
return resource;
}
protected void setResource(Resource resource) {
this.resource = resource;
}
}