/* * Copyright (c) 2009-2012 Eike Stepper (Berlin, Germany) and others. * 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: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.tests.store.logic; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.common.revision.CDORevisionImpl; import org.eclipse.emf.cdo.internal.server.Repository; import org.eclipse.emf.cdo.internal.server.Session; import org.eclipse.emf.cdo.internal.server.Transaction; import org.eclipse.emf.cdo.internal.server.Transaction.InternalCommitContext; import org.eclipse.emf.cdo.internal.server.TransactionCommitContextImpl.TransactionPackageRegistry; import org.eclipse.emf.cdo.internal.server.protocol.CDOServerProtocol; import org.eclipse.emf.cdo.server.IStore; import org.eclipse.emf.cdo.server.IRepository.Props; import org.eclipse.emf.cdo.tests.mango.MangoPackage; import org.eclipse.emf.cdo.tests.model1.Model1Package; import org.eclipse.emf.cdo.tests.model2.Model2Package; import org.eclipse.emf.cdo.tests.model3.Model3Package; import org.eclipse.emf.cdo.util.ModelUtil; import org.eclipse.emf.internal.cdo.session.SessionUtil; import org.eclipse.net4j.tests.AbstractOMTest; import org.eclipse.net4j.util.om.monitor.Monitor; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Eike Stepper */ public abstract class TestLogic extends AbstractOMTest { public static final String REPOSITORY_NAME = "repo1"; protected Repository repository; public TestLogic() { } @Override protected void doSetUp() throws Exception { repository = createRepository(); repository.activate(); } @Override protected void doTearDown() throws Exception { repository.deactivate(); repository = null; } protected Repository createRepository() { Map<String, String> props = new HashMap<String, String>(); props.put(Props.CURRENT_LRU_CAPACITY, "10000"); props.put(Props.REVISED_LRU_CAPACITY, "10000"); Map<String, String> testProperties = getTestProperties(); if (testProperties != null) { props.putAll(testProperties); } Repository repository = new Repository.Default(); repository.setName(REPOSITORY_NAME); repository.setProperties(props); repository.setStore(createStore()); return repository; } protected boolean withRevisionDeltaSupport() { return false; } protected Map<String, String> getTestProperties() { return null; } protected abstract IStore createStore(); public void testCreateModel1() throws Exception { CommitTemplate template = new CommitTemplate(); template.addNewPackage(Model1Package.eINSTANCE); Transaction transaction = template.run(); verifyCreateModel1(transaction); template.dispose(); } protected abstract void verifyCreateModel1(Transaction transaction) throws Exception; public void testCreateModel2() throws Exception { CommitTemplate template = new CommitTemplate(); template.addNewPackage(Model1Package.eINSTANCE); template.addNewPackage(Model2Package.eINSTANCE); Transaction transaction = template.run(); verifyCreateModel2(transaction); template.dispose(); } protected abstract void verifyCreateModel2(Transaction transaction) throws Exception; public void testCreateModel3() throws Exception { CommitTemplate template = new CommitTemplate(); template.addNewPackage(Model3Package.eINSTANCE); Transaction transaction = template.run(); verifyCreateModel3(transaction); template.dispose(); } protected abstract void verifyCreateModel3(Transaction transaction) throws Exception; public void testCreateMango() throws Exception { CommitTemplate template = new CommitTemplate(); template.addNewPackage(MangoPackage.eINSTANCE); Transaction transaction = template.run(); verifyCreateMango(transaction); template.dispose(); } protected abstract void verifyCreateMango(Transaction transaction) throws Exception; public void testCommitCompany() throws Exception { CommitTemplate template = new CommitTemplate(); template.addNewPackage(Model1Package.eINSTANCE); TestRevision resource = template.addNewResource(1); resource.set("path", "/res1"); TestRevision company = template.addNewObject(2, Model1Package.eINSTANCE.getCompany()); company.set("name", "Sympedia"); company.set("street", "Homestr. 17"); company.set("city", "Berlin"); Transaction transaction = template.run(); verifyCommitCompany(transaction); template.dispose(); } protected abstract void verifyCommitCompany(Transaction transaction) throws Exception; /** * @author Eike Stepper */ protected class CommitTemplate { private int viewID; private CDOServerProtocol protocol; private Session session; private Transaction transaction; private InternalCommitContext transactionCommitContext; private List<EPackage> newPackages = new ArrayList<EPackage>(); private List<CDORevision> newObjects = new ArrayList<CDORevision>(); private List<CDORevisionDelta> dirtyObjectDeltas = new ArrayList<CDORevisionDelta>(); private List<CDOID> detachedObjects = new ArrayList<CDOID>(); public CommitTemplate() { this(1, 12345); } public CommitTemplate(int viewID, long timeStamp) { this.viewID = viewID; protocol = createProtocol(); session = repository.getSessionManager().openSession(protocol); protocol.setInfraStructure(session); transaction = createTransaction(session); transactionCommitContext = transaction.createCommitContext(timeStamp); transactionCommitContext.preCommit(); } public Session getSession() { return session; } public Transaction run() throws Exception { transactionCommitContext.setNewPackages(getNewPackages()); transactionCommitContext.setNewObjects(getNewObjects()); transactionCommitContext.setDirtyObjectDeltas(getDirtyObjectDeltas()); transactionCommitContext.setDetachedObjects(getDetachedObjects()); transactionCommitContext.write(new Monitor()); transactionCommitContext.commit(new Monitor()); transactionCommitContext.postCommit(true); return transaction; } public void dispose() { protocol.deactivate(); } public EPackage addNewPackage(EPackage ePackage) { String uri = ePackage.getNsURI(); String parentURI = EMFUtil.getParentURI(ePackage); String name = ePackage.getName(); boolean dynamic = EMFUtil.isDynamicEPackage(ePackage); String ecore = null; if (parentURI == null) { if (!EcorePackage.eINSTANCE.getNsURI().equals(uri)) { ecore = EMFUtil.ePackageToString(ePackage, EPackage.Registry.INSTANCE); } } TransactionPackageRegistry packageManager = transactionCommitContext.getPackageRegistry(); EPackage newPackage = CDOModelUtil.createPackage(packageManager, uri, name, ecore, dynamic, parentURI); ModelUtil.initializeEPackage(ePackage, newPackage); packageManager.addPackage(newPackage); newPackages.add(newPackage); return newPackage; } public TestRevision addNewResource(int id) { CDOResourcePackage resourcePackage = repository.getPackageRegistry().getCDOResourcePackage(); CDOResourceClass resourceClass = resourcePackage.getCDOResourceClass(); return addRevision(id, resourceClass); } public TestRevision addNewObject(int id, EClass eClass) { String uri = eClass.getEPackage().getNsURI(); EPackage ePackage = transactionCommitContext.getPackageRegistry().lookupPackage(uri); EClass eClass = ePackage.lookupClass(eClass.getClassifierID()); return addRevision(id, eClass); } private TestRevision addRevision(int id, EClass eClass) { CDOIDTemp tempID = CDOIDUtil.createTempObject(id); TestRevision newObject = new TestRevision(eClass, tempID); newObjects.add(newObject); return newObject; } public void addDirtyObjectDelta(CDORevisionDelta dirtyObjectDelta) { dirtyObjectDeltas.add(dirtyObjectDelta); } protected CDOServerProtocol createProtocol() { return new CDOServerProtocol(null); } protected Transaction createTransaction(Session session) { return (Transaction)session.openTransaction(viewID); } private EPackage[] getNewPackages() { return newPackages.toArray(new EPackage[newPackages.size()]); } private CDORevision[] getNewObjects() { return newObjects.toArray(new CDORevision[newObjects.size()]); } private CDORevisionDelta[] getDirtyObjectDeltas() { return dirtyObjectDeltas.toArray(new CDORevisionDelta[dirtyObjectDeltas.size()]); } private CDOID[] getDetachedObjects() { return detachedObjects.toArray(new CDOID[detachedObjects.size()]); } } /** * @author Eike Stepper */ protected class TestRevision extends CDORevisionImpl { public TestRevision(EClass eClass, CDOID id) { super(eClass, id); } public void set(String featureName, Object value) { set(featureName, 0, value); } public void set(String featureName, int index, Object value) { EStructuralFeature feature = getEClass().lookupFeature(featureName); set(feature, index, value); } } }