Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2015-02-16 09:06:27 +0000
committerEike Stepper2015-02-18 14:42:30 +0000
commitff0cdf3c7d04462022352bdb47b96c12b66bef03 (patch)
treef70c0f56fa2bce9e07a616d480fa4f80d00d9be4 /plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java
parent34a4f1bac60b36b5ba2048243f06c2da92210ec8 (diff)
downloadcdo-ff0cdf3c7d04462022352bdb47b96c12b66bef03.tar.gz
cdo-ff0cdf3c7d04462022352bdb47b96c12b66bef03.tar.xz
cdo-ff0cdf3c7d04462022352bdb47b96c12b66bef03.zip
[458349] Consolidate UI
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=458349
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java268
1 files changed, 180 insertions, 88 deletions
diff --git a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java
index 8d271d049b..c2c82a391d 100644
--- a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java
+++ b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java
@@ -63,6 +63,7 @@ import org.eclipse.emf.cdo.transaction.CDOMerger;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.transaction.CDOTransactionFinishedEvent;
import org.eclipse.emf.cdo.util.CommitException;
+import org.eclipse.emf.cdo.util.ConcurrentAccessException;
import org.eclipse.emf.cdo.util.ReadOnlyException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.workspace.CDOWorkspace;
@@ -453,123 +454,142 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace
public InternalCDOTransaction merge(CDOMerger merger, String branchPath, long timeStamp)
{
final InternalCDOSession remoteSession = openRemoteSession();
- if (timeStamp == CDOBranchPoint.UNSPECIFIED_DATE)
+
+ try
{
- timeStamp = remoteSession.getLastUpdateTime();
- }
+ if (timeStamp == CDOBranchPoint.UNSPECIFIED_DATE)
+ {
+ timeStamp = remoteSession.getLastUpdateTime();
+ }
- final long newTimeStamp = timeStamp;
+ final long newTimeStamp = timeStamp;
- final InternalCDOBranchManager branchManager = remoteSession.getBranchManager();
- final CDOBranchPoint basePoint = branchManager.getBranch(branchPath).getPoint(this.timeStamp);
- final CDOBranchPoint remotePoint = branchManager.getBranch(branchPath).getPoint(newTimeStamp);
+ final InternalCDOBranchManager branchManager = remoteSession.getBranchManager();
+ final CDOBranchPoint basePoint = branchManager.getBranch(branchPath).getPoint(this.timeStamp);
+ final CDOBranchPoint remotePoint = branchManager.getBranch(branchPath).getPoint(newTimeStamp);
- final CDOBranchPointRange range = CDOBranchUtil.createRange(basePoint, remotePoint);
+ final CDOBranchPointRange range = CDOBranchUtil.createRange(basePoint, remotePoint);
- final CDOChangeSetData remoteData = remoteSession.getSessionProtocol().loadChangeSets(range)[0];
- final CDOChangeSetData localData = getLocalChanges();
- final CDOChangeSetData result = getMergeResult(merger, basePoint, remotePoint, localData, remoteData);
+ final CDOChangeSetData remoteData = remoteSession.getSessionProtocol().loadChangeSets(range)[0];
+ final CDOChangeSetData localData = getLocalChanges();
+ final CDOChangeSetData result = getMergeResult(merger, basePoint, remotePoint, localData, remoteData);
- final InternalCDOTransaction transaction = (InternalCDOTransaction)getLocalSession().openTransaction();
- initView(transaction);
+ final InternalCDOTransaction transaction = (InternalCDOTransaction)getLocalSession().openTransaction();
+ initView(transaction);
- transaction.applyChangeSet(result, new BaseRevisionProvider(), this, null, false);
- transaction.addTransactionHandler(new CDODefaultTransactionHandler3()
- {
- @Override
- public void committedTransaction(CDOTransaction transaction, CDOCommitContext commitContext, CDOCommitInfo result)
+ transaction.applyChangeSet(result, new BaseRevisionProvider(), this, null, false);
+ transaction.addTransactionHandler(new CDODefaultTransactionHandler3()
{
- try
- {
- Set<CDOID> affectedIDs = getAffectedIDs(commitContext, remoteData);
-
- CDORevisionProvider local = CDOWorkspaceImpl.this;
- CDORevisionProvider remote = new ManagedRevisionProvider(remoteSession.getRevisionManager(), remotePoint);
-
- updateBase(affectedIDs, local, remote);
- setTimeStamp(newTimeStamp);
- }
- finally
+ @Override
+ public void rolledBackTransaction(CDOTransaction transaction)
{
closeRemoteSession(remoteSession);
}
- }
- private void updateBase(Set<CDOID> affectedIDs, CDORevisionProvider local, CDORevisionProvider remote)
- {
- for (CDOID id : affectedIDs)
+ @Override
+ public void committedTransaction(CDOTransaction transaction, CDOCommitContext commitContext,
+ CDOCommitInfo result)
{
- CDORevision localRevision = getRevision(id, local);
- CDORevision remoteRevision = getRevision(id, remote);
- if (localRevision == null)
+ try
{
- if (remoteRevision == null)
- {
- // Unchanged
- base.deregisterObject(id);
- }
- else
- {
- // Detached
- base.registerChangedOrDetachedObject((InternalCDORevision)remoteRevision);
- }
+ Set<CDOID> affectedIDs = getAffectedIDs(commitContext, remoteData);
+
+ CDORevisionProvider local = CDOWorkspaceImpl.this;
+ CDORevisionProvider remote = new ManagedRevisionProvider(remoteSession.getRevisionManager(), remotePoint);
+
+ updateBase(affectedIDs, local, remote);
+ setTimeStamp(newTimeStamp);
}
- else
+ finally
{
- if (remoteRevision == null)
- {
- // Added
- base.registerAddedObject(id);
- }
- else
+ closeRemoteSession(remoteSession);
+ }
+ }
+
+ private void updateBase(Set<CDOID> affectedIDs, CDORevisionProvider local, CDORevisionProvider remote)
+ {
+ for (CDOID id : affectedIDs)
+ {
+ CDORevision localRevision = getRevision(id, local);
+ CDORevision remoteRevision = getRevision(id, remote);
+ if (localRevision == null)
{
- CDORevisionDelta delta = localRevision.compare(remoteRevision);
- if (delta.isEmpty())
+ if (remoteRevision == null)
{
// Unchanged
base.deregisterObject(id);
}
else
{
- // Changed
+ // Detached
base.registerChangedOrDetachedObject((InternalCDORevision)remoteRevision);
}
}
+ else
+ {
+ if (remoteRevision == null)
+ {
+ // Added
+ base.registerAddedObject(id);
+ }
+ else
+ {
+ // Unchanged
+ base.deregisterObject(id);
+
+ CDORevisionDelta delta = localRevision.compare(remoteRevision);
+ if (!delta.isEmpty())
+ {
+ // Changed
+ base.registerChangedOrDetachedObject((InternalCDORevision)remoteRevision);
+ }
+ }
+ }
}
}
- }
- private Set<CDOID> getAffectedIDs(CDOCommitContext commitContext, final CDOChangeSetData remoteData)
- {
- Set<CDOID> affectedIDs = new HashSet<CDOID>();
+ private Set<CDOID> getAffectedIDs(CDOCommitContext commitContext, final CDOChangeSetData remoteData)
+ {
+ Set<CDOID> affectedIDs = new HashSet<CDOID>();
- // Base IDs
- affectedIDs.addAll(base.getIDs());
+ // Base IDs
+ affectedIDs.addAll(base.getIDs());
- // Remote IDs
- affectedIDs.addAll(remoteData.getChangeKinds().keySet());
+ // Remote IDs
+ affectedIDs.addAll(remoteData.getChangeKinds().keySet());
- // Local IDs
- affectedIDs.addAll(commitContext.getNewObjects().keySet());
- affectedIDs.addAll(commitContext.getDirtyObjects().keySet());
- affectedIDs.addAll(commitContext.getDetachedObjects().keySet());
+ // Local IDs
+ affectedIDs.addAll(commitContext.getNewObjects().keySet());
+ affectedIDs.addAll(commitContext.getDirtyObjects().keySet());
+ affectedIDs.addAll(commitContext.getDetachedObjects().keySet());
- return affectedIDs;
- }
+ return affectedIDs;
+ }
- private CDORevision getRevision(CDOID id, CDORevisionProvider revisionProvider)
- {
- CDORevision revision = revisionProvider.getRevision(id);
- if (revision instanceof DetachedCDORevision)
+ private CDORevision getRevision(CDOID id, CDORevisionProvider revisionProvider)
{
- revision = null;
- }
+ CDORevision revision = revisionProvider.getRevision(id);
+ if (revision instanceof DetachedCDORevision)
+ {
+ revision = null;
+ }
- return revision;
- }
- });
+ return revision;
+ }
+ });
- return transaction;
+ return transaction;
+ }
+ catch (RuntimeException ex)
+ {
+ closeRemoteSession(remoteSession);
+ throw ex;
+ }
+ catch (Error ex)
+ {
+ closeRemoteSession(remoteSession);
+ throw ex;
+ }
}
private CDOChangeSetData getMergeResult(CDOMerger merger, CDOBranchPoint basePoint, CDOBranchPoint remotePoint,
@@ -587,8 +607,69 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace
public void revert()
{
- // TODO: implement CDOWorkspaceImpl.revert()
- throw new UnsupportedOperationException();
+ CDOChangeSetData revertData = getLocalChanges(false);
+
+ IStoreAccessor.Raw accessor = getLocalWriter(null);
+ StoreThreadLocal.setAccessor(accessor);
+
+ for (CDORevisionKey key : revertData.getChangedObjects())
+ {
+ CDOID id = key.getID();
+ InternalCDORevision baseRevision = (InternalCDORevision)base.getRevision(id);
+ accessor.rawStore(baseRevision, new Monitor());
+ }
+
+ accessor.rawCommit(1, new Monitor());
+ StoreThreadLocal.release();
+ localRepository.getRevisionManager().getCache().clear();
+ localSession.getRevisionManager().getCache().clear();
+
+ // InternalCDOTransaction transaction = (InternalCDOTransaction)getLocalSession().openTransaction();
+ //
+ // try
+ // {
+ // revert(transaction);
+ // }
+ // catch (ConcurrentAccessException ex)
+ // {
+ // ex.printStackTrace();
+ // }
+ // catch (CommitException ex)
+ // {
+ // ex.printStackTrace();
+ // }
+ // finally
+ // {
+ // transaction.close();
+ // }
+ }
+
+ private void revert(InternalCDOTransaction transaction) throws ConcurrentAccessException, CommitException
+ {
+ CDOChangeSetData revertData = getLocalChanges(false);
+
+ // for (CDORevisionKey key : revertData.getChangedObjects())
+ // {
+ // if (key instanceof InternalCDORevisionDelta)
+ // {
+ // InternalCDORevisionDelta revisionDelta = (InternalCDORevisionDelta)key;
+ // CDORevision baseRevision = base.getRevision(revisionDelta.getID());
+ // if (baseRevision != null)
+ // {
+ // revisionDelta.setTarget(baseRevision);
+ // }
+ // }
+ // }
+
+ if (!revertData.isEmpty())
+ {
+ CDORevisionProvider targetProvider = new BaseRevisionProvider();
+ ApplyChangeSetResult result = transaction.applyChangeSet(revertData, this, targetProvider, null, false);
+ transaction.commit();
+ }
+
+ base.clear();
+ setDirty(false);
}
public void replace(String branchPath, long timeStamp)
@@ -860,8 +941,19 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace
public CDOChangeSetData getLocalChanges()
{
+ return getLocalChanges(true);
+ }
+
+ private CDOChangeSetData getLocalChanges(boolean forward)
+ {
Set<CDOID> ids = base.getIDs();
- return CDORevisionUtil.createChangeSetData(ids, base, this, true);
+
+ if (forward)
+ {
+ return CDORevisionUtil.createChangeSetData(ids, base, this, true);
+ }
+
+ return CDORevisionUtil.createChangeSetData(ids, this, base, false);
}
public CDOSessionConfigurationFactory getRemoteSessionConfigurationFactory()
@@ -869,6 +961,11 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace
return remoteSessionConfigurationFactory;
}
+ public IManagedContainer getContainer()
+ {
+ return container;
+ }
+
protected IManagedContainer createContainer(IStore local)
{
IManagedContainer container = ContainerUtil.createContainer();
@@ -879,11 +976,6 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace
return container;
}
- protected IManagedContainer getContainer()
- {
- return container;
- }
-
protected String getLocalAcceptorName()
{
return "acceptor-for-" + localRepository.getUUID();

Back to the top