blob: 571a97e04148d525e23e723229ee42cacc462ed3 [file] [log] [blame]
/*
* Copyright (c) 2012, 2013 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.hibernate;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.commit.CDOCommitHistory;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
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.view.CDOView;
import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
/**
* @author Martin Taal
*/
@Requires(IRepositoryConfig.CAPABILITY_AUDITING)
public class HibernateBugzilla_395684_Test extends AbstractCDOTest
{
@Override
protected void doSetUp() throws Exception
{
disableConsole();
super.doSetUp();
skipStoreWithoutRawAccess();
}
@Override
protected void doTearDown() throws Exception
{
disableConsole();
super.doTearDown();
}
public void testVersionChange() throws Exception
{
CDOSession session = openSession();
{
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Customer customer = getModel1Factory().createCustomer();
customer.setName("Martin");
resource.getContents().add(customer);
transaction.commit();
}
{
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getResource(getResourcePath("/res1"));
Customer customer = (Customer)resource.getContents().get(0);
customer.setName("Eike");
transaction.commit();
}
{
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getResource(getResourcePath("/res1"));
resource.getContents().remove(0);
transaction.commit();
}
getRepository().getRevisionManager().getCache().clear();
{
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getResource(getResourcePath("/res1"));
assertEquals(0, resource.getContents().size());
transaction.commit();
}
{
CDOView view = session.openView();
int i = 0;
for (CDOCommitInfo cdoCommitInfo : getCDOCommitHistory(view).getElements())
{
if (i == 0)
{
assertEquals(1, cdoCommitInfo.getDetachedObjects().size());
assertEquals(1, cdoCommitInfo.getChangedObjects().size());
assertEquals(0, cdoCommitInfo.getNewObjects().size());
CDOIDAndVersion cdoIDAndVersion = cdoCommitInfo.getDetachedObjects().get(0);
// get the view before the delete
CDOView otherView = session.openView(cdoCommitInfo.getTimeStamp() - 1);
CDOObject obj = otherView.getObject(cdoIDAndVersion.getID());
{
final Customer oldCustomer = (Customer)CDOUtil.getEObject(obj);
assertEquals("Eike", oldCustomer.getName());
}
{
final CDORevision cdoRevision = CDOUtil.getRevisionByVersion(obj, cdoIDAndVersion.getVersion());
// get the detached entry
final CDORevision cdoRevisionDetached = CDOUtil.getRevisionByVersion(obj, 1 + cdoIDAndVersion.getVersion());
assertEquals(cdoRevision.getRevised() + 1, cdoRevisionDetached.getTimeStamp());
}
}
else if (i == 1)
{
assertEquals(0, cdoCommitInfo.getDetachedObjects().size());
assertEquals(1, cdoCommitInfo.getChangedObjects().size());
assertEquals(0, cdoCommitInfo.getNewObjects().size());
}
else
{
break;
}
i++;
}
view.close();
}
}
private synchronized CDOCommitHistory getCDOCommitHistory(CDOView audit)
{
CDOCommitHistory history = audit.getHistory();
history.triggerLoad();
long startTime = System.currentTimeMillis();
while (history.isLoading())
{
ConcurrencyUtil.sleep(10);
// waited too long
if (System.currentTimeMillis() - startTime > 5000)
{
throw new IllegalStateException("commit info could not be loaded");
}
}
return history;
}
}