/* | |
* Copyright (c) 2004 - 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; | |
import org.eclipse.emf.cdo.common.revision.CDORevision; | |
import org.eclipse.emf.cdo.eresource.CDOResource; | |
import org.eclipse.emf.cdo.server.CDOServerUtil; | |
import org.eclipse.emf.cdo.server.IRepository; | |
import org.eclipse.emf.cdo.server.ISession; | |
import org.eclipse.emf.cdo.server.ISessionManager; | |
import org.eclipse.emf.cdo.server.IStoreAccessor.CommitContext; | |
import org.eclipse.emf.cdo.server.ITransaction; | |
import org.eclipse.emf.cdo.session.CDOSession; | |
import org.eclipse.emf.cdo.spi.server.InternalRepository; | |
import org.eclipse.emf.cdo.spi.server.InternalStore; | |
import org.eclipse.emf.cdo.spi.server.ObjectWriteAccessHandler; | |
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig; | |
import org.eclipse.emf.cdo.tests.model1.Customer; | |
import org.eclipse.emf.cdo.transaction.CDOTransaction; | |
import org.eclipse.emf.cdo.util.CDOUtil; | |
import org.eclipse.emf.cdo.util.CommitException; | |
import org.eclipse.emf.cdo.view.CDOView; | |
import org.eclipse.net4j.util.om.monitor.OMMonitor; | |
import org.eclipse.emf.ecore.EClass; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.EPackage; | |
import org.eclipse.emf.ecore.EStructuralFeature; | |
import org.eclipse.emf.ecore.impl.EPackageImpl; | |
import java.util.Arrays; | |
import java.util.HashMap; | |
import java.util.HashSet; | |
import java.util.Map; | |
import java.util.Set; | |
/** | |
* @author Eike Stepper | |
*/ | |
public class RepositoryTest extends AbstractCDOTest | |
{ | |
public void testInsertProperties() throws Exception | |
{ | |
Map<String, String> expected = new HashMap<String, String>(); | |
expected.put("BOOLEAN", "true"); | |
expected.put("INTEGER", "1234567"); | |
expected.put("LONG", "12345671234567"); | |
expected.put("DOUBLE", "1234567.1234567"); | |
expected.put("STRING", "Arbitrary text"); | |
InternalStore store = getRepository().getStore(); | |
store.setPersistentProperties(expected); | |
Map<String, String> actual = store.getPersistentProperties(expected.keySet()); | |
assertEquals(expected, actual); | |
} | |
public void testUpdateProperties() throws Exception | |
{ | |
Map<String, String> expected = new HashMap<String, String>(); | |
expected.put("BOOLEAN", "true"); | |
expected.put("INTEGER", "1234567"); | |
expected.put("LONG", "12345671234567"); | |
expected.put("DOUBLE", "1234567.1234567"); | |
expected.put("STRING", "Arbitrary text"); | |
InternalStore store = getRepository().getStore(); | |
store.setPersistentProperties(expected); | |
expected.put("BOOLEAN", "false"); | |
expected.put("INTEGER", "555555"); | |
expected.put("LONG", "5555555555555555"); | |
expected.put("DOUBLE", "555555.555555"); | |
expected.put("STRING", "Different text"); | |
store.setPersistentProperties(expected); | |
Map<String, String> actual = store.getPersistentProperties(expected.keySet()); | |
assertEquals(expected, actual); | |
} | |
public void testRemoveProperties() throws Exception | |
{ | |
Map<String, String> expected = new HashMap<String, String>(); | |
expected.put("BOOLEAN", "true"); | |
expected.put("INTEGER", "1234567"); | |
expected.put("LONG", "12345671234567"); | |
expected.put("DOUBLE", "1234567.1234567"); | |
expected.put("STRING", "Arbitrary text"); | |
InternalStore store = getRepository().getStore(); | |
store.setPersistentProperties(expected); | |
Map<String, String> actual = store.getPersistentProperties(expected.keySet()); | |
assertEquals(expected, actual); | |
Set<String> names = new HashSet<String>(Arrays.asList(new String[] { "INTEGER", "DOUBLE" })); | |
store.removePersistentProperties(names); | |
expected.remove("INTEGER"); | |
expected.remove("DOUBLE"); | |
actual = store.getPersistentProperties(expected.keySet()); | |
assertEquals(expected, actual); | |
} | |
public void testSessionClosed() throws Exception | |
{ | |
CDOSession session = openSession(); | |
CDOTransaction transaction = session.openTransaction(); | |
CDOResource resource = transaction.createResource(getResourcePath("/res1")); | |
resource.getContents().add(createCustomer("Eike")); | |
transaction.commit(); // Ensure that model1 is committed to the repository | |
ISessionManager sessionManager = getRepository().getSessionManager(); | |
assertEquals(1, sessionManager.getSessions().length); | |
session.close(); | |
sleep(100); | |
assertEquals(0, sessionManager.getSessions().length); | |
} | |
/** | |
* See bug 329254 | |
*/ | |
@Requires(IRepositoryConfig.CAPABILITY_RESTARTABLE) | |
// hibernate will recreate the systeminfo table at repository | |
// restart (this is due to test settings) | |
@Skips("Hibernate") | |
public void testLastCommitTime() throws Exception | |
{ | |
CDOSession session = openSession(); | |
CDOTransaction transaction = session.openTransaction(); | |
CDOResource resource = transaction.createResource(getResourcePath("/res1")); | |
resource.getContents().add(createCustomer("Eike")); | |
long timeStamp = transaction.commit().getTimeStamp(); | |
session.close(); | |
InternalRepository repository = restartRepository(); | |
assertEquals(timeStamp, repository.getLastCommitTimeStamp()); | |
} | |
public void testWriteAccessHandlers() throws Exception | |
{ | |
CDOSession session = openSession(); | |
CDOTransaction transaction = session.openTransaction(); | |
CDOResource resource = transaction.createResource(getResourcePath("/res1")); | |
resource.getContents().add(createCustomer("Eike")); | |
transaction.commit(); // Ensure that model1 is committed to the repository | |
getRepository().addHandler(new IRepository.WriteAccessHandler() | |
{ | |
public void handleTransactionBeforeCommitting(ITransaction transaction, CommitContext commitContext, | |
OMMonitor monitor) throws RuntimeException | |
{ | |
// Use the package registry of the commit context to catch new packages! | |
EPackage model1Package = commitContext.getPackageRegistry().getEPackage(getModel1Package().getNsURI()); | |
EClass customerClass = (EClass)model1Package.getEClassifier("Customer"); | |
EStructuralFeature nameFeature = customerClass.getEStructuralFeature("name"); | |
for (CDORevision revision : commitContext.getNewObjects()) | |
{ | |
if (revision.getEClass() == customerClass) | |
{ | |
String name = (String)revision.data().get(nameFeature, 0); | |
if ("Admin".equals(name)) | |
{ | |
throw new IllegalStateException("Adding a customer with name 'Admin' is not allowed"); | |
} | |
} | |
} | |
} | |
public void handleTransactionAfterCommitted(ITransaction transaction, CommitContext commitContext, | |
OMMonitor monitor) | |
{ | |
} | |
}); | |
resource.getContents().add(createCustomer("Simon")); | |
transaction.commit(); | |
resource.getContents().add(createCustomer("Admin")); | |
try | |
{ | |
transaction.commit(); | |
fail("CommitException expected"); | |
} | |
catch (CommitException expected) | |
{ | |
// Success | |
transaction.rollback(); | |
} | |
resource.getContents().add(createCustomer("Martin")); | |
transaction.commit(); | |
resource.getContents().add(createCustomer("Nick")); | |
transaction.commit(); | |
session.close(); | |
} | |
public void testWriteAccessHandlers_WithServerCDOView() throws Exception | |
{ | |
CDOSession session = openSession(); | |
CDOTransaction transaction = session.openTransaction(); | |
CDOResource resource = transaction.createResource(getResourcePath("/res1")); | |
resource.getContents().add(createCustomer("Eike")); | |
transaction.commit(); // Ensure that model1 is committed to the repository | |
getRepository().addHandler(new IRepository.WriteAccessHandler() | |
{ | |
public void handleTransactionBeforeCommitting(ITransaction transaction, CommitContext commitContext, | |
OMMonitor monitor) throws RuntimeException | |
{ | |
CDOView view = CDOServerUtil.openView(commitContext, isConfig(LEGACY)); | |
for (CDORevision revision : commitContext.getNewObjects()) | |
{ | |
EObject object = view.getObject(revision.getID()); | |
object = CDOUtil.getEObject(object); // Make legacy mode happy | |
if (object instanceof Customer) | |
{ | |
Customer customer = (Customer)object; | |
String name = customer.getName(); | |
if ("Admin".equals(name)) | |
{ | |
throw new IllegalStateException("Adding a customer with name 'Admin' is not allowed"); | |
} | |
} | |
} | |
view.close(); | |
} | |
public void handleTransactionAfterCommitted(ITransaction transaction, CommitContext commitContext, | |
OMMonitor monitor) | |
{ | |
} | |
}); | |
resource.getContents().add(createCustomer("Simon")); | |
transaction.commit(); | |
resource.getContents().add(createCustomer("Admin")); | |
try | |
{ | |
transaction.commit(); | |
fail("CommitException expected"); | |
} | |
catch (CommitException expected) | |
{ | |
// Success | |
transaction.rollback(); | |
} | |
resource.getContents().add(createCustomer("Martin")); | |
transaction.commit(); | |
resource.getContents().add(createCustomer("Nick")); | |
transaction.commit(); | |
session.close(); | |
} | |
public void testObjectWriteAccessHandler() throws Exception | |
{ | |
CDOSession session = openSession(); | |
CDOTransaction transaction = session.openTransaction(); | |
CDOResource resource = transaction.createResource(getResourcePath("/res1")); | |
resource.getContents().add(createCustomer("Eike")); | |
transaction.commit(); // Ensure that model1 is committed to the repository | |
getRepository().addHandler(new ObjectWriteAccessHandler(isConfig(LEGACY)) | |
{ | |
@Override | |
protected void handleTransactionBeforeCommitting(OMMonitor monitor) throws RuntimeException | |
{ | |
for (EObject object : getNewObjects()) | |
{ | |
if (object instanceof Customer) | |
{ | |
Customer customer = (Customer)object; | |
String name = customer.getName(); | |
if ("Admin".equals(name)) | |
{ | |
throw new IllegalStateException("Adding a customer with name 'Admin' is not allowed"); | |
} | |
} | |
} | |
} | |
}); | |
resource.getContents().add(createCustomer("Simon")); | |
transaction.commit(); | |
resource.getContents().add(createCustomer("Admin")); | |
try | |
{ | |
transaction.commit(); | |
fail("CommitException expected"); | |
} | |
catch (CommitException expected) | |
{ | |
// Success | |
transaction.rollback(); | |
} | |
resource.getContents().add(createCustomer("Martin")); | |
transaction.commit(); | |
resource.getContents().add(createCustomer("Nick")); | |
transaction.commit(); | |
session.close(); | |
} | |
@CleanRepositoriesBefore | |
public void testReadAccessHandlers() throws Exception | |
{ | |
{ | |
CDOSession session = openSession(); | |
CDOTransaction transaction = session.openTransaction(); | |
CDOResource resource = transaction.createResource(getResourcePath("/res1")); | |
resource.getContents().add(createCustomer("Eike")); | |
resource.getContents().add(createCustomer("Simon")); | |
resource.getContents().add(createCustomer("Admin")); | |
resource.getContents().add(createCustomer("Martin")); | |
resource.getContents().add(createCustomer("Nick")); | |
transaction.commit(); | |
session.close(); | |
} | |
getRepository().addHandler(new CDOServerUtil.RepositoryReadAccessValidator() | |
{ | |
EPackage model1Package = getRepository().getPackageRegistry().getEPackage(getModel1Package().getNsURI()); | |
EClass customerClass = (EClass)model1Package.getEClassifier("Customer"); | |
EStructuralFeature nameFeature = customerClass.getEStructuralFeature("name"); | |
@Override | |
protected String validate(ISession session, CDORevision revision) | |
{ | |
EClass eClass = revision.getEClass(); | |
EPackage ePackage = eClass.getEPackage(); | |
assertNotSame("Revision has dynamic package: " + ePackage.getName(), EPackageImpl.class.getName(), ePackage | |
.getClass().getName()); | |
if (eClass == customerClass) | |
{ | |
String name = (String)revision.data().get(nameFeature, 0); | |
if ("Admin".equals(name)) | |
{ | |
return "Confidential!"; | |
} | |
} | |
return null; | |
} | |
}); | |
CDOSession session = openSession(); | |
CDOView view = session.openView(); | |
CDOResource resource = view.getResource(getResourcePath("/res1")); | |
int read = 0; | |
try | |
{ | |
for (EObject object : resource.getContents()) | |
{ | |
Customer customer = (Customer)object; | |
System.out.println(customer.getName()); | |
++read; | |
} | |
} | |
catch (Exception ex) | |
{ | |
} | |
assertEquals(2, read); | |
session.close(); | |
} | |
private Customer createCustomer(String name) | |
{ | |
Customer customer = getModel1Factory().createCustomer(); | |
customer.setName(name); | |
return customer; | |
} | |
} |