package de.hub.emffrag.fragmentation; import java.io.IOException; import junit.framework.Assert; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import org.junit.After; import org.junit.Before; import de.hub.emffrag.datastore.DataStoreURIHandler; import de.hub.emffrag.datastore.IDataMap; import de.hub.emffrag.datastore.IDataStore; import de.hub.emffrag.datastore.LongKeyType; import de.hub.emffrag.testmodels.testmodel.frag.meta.TestModelPackage; public class AbstractReflectiveModelTests extends AbstractTests { protected EPackage metaModel = null; protected FInternalObjectImpl object1 = null; protected FInternalObjectImpl object2 = null; protected FInternalObjectImpl object3 = null; protected IDataStore dataStore = null; private EFactory originalFactories[]; private EPackage metaModels[]; @Before public void standardInitialization() { originalFactories = null; metaModels = null; dataStore = createTestDataStore(); metaModel = ReflectiveMetaModelRegistry.instance.registerUserMetaModel(TestModelPackage.eINSTANCE); object1 = new FInternalObjectImpl((EClass)metaModel.getEClassifier("TestObject")); object2 = new FInternalObjectImpl((EClass)metaModel.getEClassifier("TestObject")); object3 = new FInternalObjectImpl((EClass)metaModel.getEClassifier("TestObject")); } protected ResourceFactoryImpl createResourceFactoryImpl() { return new XMIResourceFactoryImpl() { @Override public Resource createResource(URI uri) { return new XMIFragmentImpl(uri, null); } }; } protected ResourceSet createAndConfigureAResourceSet(IDataStore dataStore, EPackage... metaModels) { ResourceSet resourceSet = new ResourceSetImpl(); boolean saveOriginalFactories = false; if (this.originalFactories == null) { this.metaModels = metaModels; this.originalFactories = new EFactory[metaModels.length]; saveOriginalFactories = true; } int i = 0; for (EPackage metaModel : metaModels) { resourceSet.getPackageRegistry().put(metaModel.getNsURI(), metaModel); if (saveOriginalFactories) { originalFactories[i++] = metaModel.getEFactoryInstance(); } metaModel.setEFactoryInstance(new org.eclipse.emf.ecore.impl.EFactoryImpl() { @Override public EObject create(EClass eClass) { return new FInternalObjectImpl(eClass); } }); } resourceSet.getURIConverter().getURIHandlers().add(0, new DataStoreURIHandler(dataStore)); resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put(dataStore.getURI().scheme(), createResourceFactoryImpl()); return resourceSet; } @After public void reset() { int i = 0; if (metaModels != null) { for (EPackage metaModel: metaModels) { metaModel.setEFactoryInstance(originalFactories[i++]); } } } protected Resource[] createResourceSet(IDataStore dataStore, EPackage metaModel, int numberOfResources, boolean loadResources) { IDataMap<Long> index = dataStore.getMap("f_".getBytes(), LongKeyType.instance); ResourceSet resourceSet = createAndConfigureAResourceSet(dataStore, metaModel); Resource[] resources = new Resource[numberOfResources]; for (int i = 0; i < numberOfResources; i++) { URI uri = index.getURI((long) i); if (loadResources) { resources[i] = resourceSet.getResource(uri, true); } else { resources[i] = resourceSet.createResource(uri); } } return resources; } protected void saveResources(Resource[] resources) { for (Resource resource : resources) { try { if (resource.getResourceSet() != null) { resource.save(null); } } catch (IOException e) { Assert.assertTrue("IO error that could not be happening: " + e.getMessage(), false); } } } }