blob: 1e2268f1615d2b1c66a0410d661fe3c4702cac06 [file] [log] [blame]
/**
* Copyright (c) 2004 - 2010 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.InternalStore;
import org.eclipse.emf.cdo.spi.server.ObjectWriteAccessHandler;
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.HashMap;
import java.util.Map;
/**
* @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.setPropertyValues(expected);
Map<String, String> actual = store.getPropertyValues(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.setPropertyValues(expected);
expected.put("BOOLEAN", "false");
expected.put("INTEGER", "555555");
expected.put("LONG", "5555555555555555");
expected.put("DOUBLE", "555555.555555");
expected.put("STRING", "Different text");
store.setPropertyValues(expected);
Map<String, String> actual = store.getPropertyValues(expected.keySet());
assertEquals(expected, actual);
}
public void testSessionClosed() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource("/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);
}
public void testWriteAccessHandlers() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource("/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("/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("/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();
}
public void testReadAccessHandlers() throws Exception
{
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource("/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("/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;
}
}