/* * 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; } }