diff options
author | Eike Stepper | 2015-02-16 09:06:27 +0000 |
---|---|---|
committer | Eike Stepper | 2015-02-18 14:42:30 +0000 |
commit | ff0cdf3c7d04462022352bdb47b96c12b66bef03 (patch) | |
tree | f70c0f56fa2bce9e07a616d480fa4f80d00d9be4 /plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java | |
parent | 34a4f1bac60b36b5ba2048243f06c2da92210ec8 (diff) | |
download | cdo-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.java | 268 |
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(); |