blob: 92357e04d993004e9255effd814782f2a60fc719 [file] [log] [blame]
/*
* Copyright (c) 2009-2012, 2016, 2019 Eike Stepper (Loehne, 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:
* Simon McDuff - initial API and implementation
*/
package org.eclipse.emf.internal.cdo.transaction;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.lob.CDOLob;
import org.eclipse.emf.cdo.common.lock.CDOLockState;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectExternalImpl;
import org.eclipse.emf.cdo.spi.common.revision.CDOReferenceAdjuster;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.internal.cdo.messages.Messages;
import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.spi.cdo.CDOSessionProtocol.CommitTransactionResult;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
import org.eclipse.emf.spi.cdo.InternalCDOTransaction;
import org.eclipse.emf.spi.cdo.InternalCDOTransaction.InternalCDOCommitContext;
import org.eclipse.emf.spi.cdo.InternalCDOXATransaction;
import org.eclipse.emf.spi.cdo.InternalCDOXATransaction.InternalCDOXACommitContext;
import org.eclipse.core.runtime.IProgressMonitor;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Simon McDuff
* @since 2.0
*/
public class CDOXACommitContextImpl implements InternalCDOXACommitContext
{
private InternalCDOXATransaction transactionManager;
private IProgressMonitor progressMonitor;
private CDOXAState state;
private CommitTransactionResult result;
private InternalCDOCommitContext delegateCommitContext;
private Map<CDOIDTempObjectExternalImpl, InternalCDOTransaction> requestedIDs = new HashMap<>();
private Map<InternalCDOObject, CDOIDTempObjectExternalImpl> objectToID = new HashMap<>();
public CDOXACommitContextImpl(InternalCDOXATransaction manager, InternalCDOCommitContext commitContext)
{
transactionManager = manager;
delegateCommitContext = commitContext;
}
@Override
public InternalCDOXATransaction getTransactionManager()
{
return transactionManager;
}
@Override
public void setProgressMonitor(IProgressMonitor progressMonitor)
{
this.progressMonitor = progressMonitor;
}
@Override
public CDOXAState getState()
{
return state;
}
@Override
public void setState(CDOXAState state)
{
this.state = state;
}
@Override
public CommitTransactionResult getResult()
{
return result;
}
@Override
public void setResult(CommitTransactionResult result)
{
this.result = result;
}
@Override
public int getViewID()
{
return delegateCommitContext.getViewID();
}
@Override
public String getUserID()
{
return delegateCommitContext.getUserID();
}
@Override
public CDOBranch getBranch()
{
return delegateCommitContext.getBranch();
}
@Override
public InternalCDOTransaction getTransaction()
{
return delegateCommitContext.getTransaction();
}
@Override
public boolean isPartialCommit()
{
return delegateCommitContext.isPartialCommit();
}
@Override
public CDOCommitData getCommitData()
{
return delegateCommitContext.getCommitData();
}
@Override
public String getCommitComment()
{
return delegateCommitContext.getCommitComment();
}
@Override
public CDOBranchPoint getCommitMergeSource()
{
return delegateCommitContext.getCommitMergeSource();
}
@Override
public Map<CDOIDTempObjectExternalImpl, InternalCDOTransaction> getRequestedIDs()
{
return requestedIDs;
}
@Override
public Map<CDOID, CDOObject> getDirtyObjects()
{
return delegateCommitContext.getDirtyObjects();
}
@Override
public Map<CDOID, CDOObject> getNewObjects()
{
return delegateCommitContext.getNewObjects();
}
@Override
public List<CDOPackageUnit> getNewPackageUnits()
{
return delegateCommitContext.getNewPackageUnits();
}
@Override
public Map<CDOID, CDOObject> getDetachedObjects()
{
return delegateCommitContext.getDetachedObjects();
}
@Override
public Map<CDOID, CDORevisionDelta> getRevisionDeltas()
{
return delegateCommitContext.getRevisionDeltas();
}
@Override
public Collection<CDOLob<?>> getLobs()
{
return delegateCommitContext.getLobs();
}
@Override
@Deprecated
public boolean isAutoReleaseLocks()
{
return delegateCommitContext.isAutoReleaseLocks();
}
@Override
public Collection<CDOLockState> getLocksOnNewObjects()
{
return delegateCommitContext.getLocksOnNewObjects();
}
@Override
public Collection<CDOID> getIDsToUnlock()
{
return delegateCommitContext.getIDsToUnlock();
}
@Override
public Object call() throws Exception
{
state.handle(this, progressMonitor);
return true;
}
@Override
public CDOID provideCDOID(Object idOrObject)
{
CDOID id = getTransaction().provideCDOID(idOrObject);
if (id instanceof CDOIDTempObjectExternalImpl)
{
if (idOrObject instanceof InternalEObject)
{
CDOIDTempObjectExternalImpl proxyTemp = (CDOIDTempObjectExternalImpl)id;
if (!requestedIDs.containsKey(proxyTemp))
{
InternalCDOObject cdoObject = (InternalCDOObject)CDOUtil.getCDOObject((InternalEObject)idOrObject);
InternalCDOTransaction cdoTransaction = (InternalCDOTransaction)cdoObject.cdoView();
getTransactionManager().add(cdoTransaction, proxyTemp);
requestedIDs.put(proxyTemp, cdoTransaction);
objectToID.put(cdoObject, proxyTemp);
}
}
else
{
throw new ImplementationError(MessageFormat.format(Messages.getString("CDOXACommitContextImpl.0"), idOrObject)); //$NON-NLS-1$
}
}
return id;
}
@Override
public void preCommit()
{
delegateCommitContext.preCommit();
}
@Override
public void postCommit(CommitTransactionResult result)
{
if (result != null)
{
if (result.getRollbackMessage() != null)
{
final CDOReferenceAdjuster defaultReferenceAdjuster = result.getReferenceAdjuster();
result.setReferenceAdjuster(new CDOReferenceAdjuster()
{
@Override
public Object adjustReference(Object id, EStructuralFeature feature, int index)
{
CDOIDTempObjectExternalImpl externalID = objectToID.get(id);
if (externalID != null)
{
id = externalID;
}
return defaultReferenceAdjuster.adjustReference(id, feature, index);
}
});
}
delegateCommitContext.postCommit(result);
}
}
@Override
public String toString()
{
return MessageFormat.format("CDOXACommitContext[{0}, {1}]", transactionManager, state);
}
}