Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java292
1 files changed, 209 insertions, 83 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
index 0981774776..ab985df8f9 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2021 Eike Stepper (Loehne, Germany) and others.
+ * Copyright (c) 2009-2023 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
@@ -43,7 +43,6 @@ import org.eclipse.emf.cdo.common.lock.CDOLockDelta;
import org.eclipse.emf.cdo.common.lock.CDOLockOwner;
import org.eclipse.emf.cdo.common.lock.CDOLockState;
import org.eclipse.emf.cdo.common.lock.CDOLockUtil;
-import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.model.EMFUtil;
@@ -107,7 +106,8 @@ import org.eclipse.emf.cdo.transaction.CDOStaleReferenceCleaner;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.transaction.CDOTransaction.Options.AutoReleaseLocksEvent.AutoReleaseLocksEnabledEvent;
import org.eclipse.emf.cdo.transaction.CDOTransaction.Options.AutoReleaseLocksEvent.AutoReleaseLocksExemptionsEvent;
-import org.eclipse.emf.cdo.transaction.CDOTransactionConflictEvent;
+import org.eclipse.emf.cdo.transaction.CDOTransactionConflictChangedEvent;
+import org.eclipse.emf.cdo.transaction.CDOTransactionConflictRemovedEvent;
import org.eclipse.emf.cdo.transaction.CDOTransactionFinishedEvent;
import org.eclipse.emf.cdo.transaction.CDOTransactionHandler;
import org.eclipse.emf.cdo.transaction.CDOTransactionHandler1;
@@ -167,6 +167,7 @@ import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
@@ -499,8 +500,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
try
{
- event = new ConflictEvent(object, conflict == 0);
++conflict;
+ event = new ConflictAddedEvent(object, conflict);
}
finally
{
@@ -514,6 +515,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
@Override
public void removeConflict(InternalCDOObject object)
{
+ IEvent event = null;
synchronized (getViewMonitor())
{
lockView();
@@ -523,6 +525,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
if (conflict > 0)
{
--conflict;
+ event = new ConflictRemovedEvent(object, conflict);
}
}
finally
@@ -530,6 +533,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
unlockView();
}
}
+
+ fireEvent(event);
}
/**
@@ -1001,6 +1006,9 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
@Override
protected void handleConflicts(long lastUpdateTime, Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> conflicts, List<CDORevisionDelta> deltas)
{
+ int oldConflicts = -1;
+ List<CDOObject> resolvedObjects = null;
+
synchronized (getViewMonitor())
{
lockView();
@@ -1035,7 +1043,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
revisions.add(conflict.cdoRevision());
}
- int resolved = 0;
+ oldConflicts = conflict;
try
{
@@ -1056,7 +1064,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
CDOObject object = it.next();
if (!object.cdoConflict())
{
- ++resolved;
+ if (resolvedObjects == null)
+ {
+ resolvedObjects = new ArrayList<>();
+ }
+
+ resolvedObjects.add(object);
it.remove();
}
}
@@ -1076,7 +1089,10 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
throw WrappedException.wrap(ex);
}
- conflict -= resolved;
+ if (resolvedObjects != null)
+ {
+ conflict -= resolvedObjects.size();
+ }
Map<CDOID, CDOObject> dirtyObjects = getDirtyObjects();
setDirty(!dirtyObjects.isEmpty());
@@ -1086,6 +1102,19 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
unlockView();
}
}
+
+ if (!ObjectUtil.isEmpty(resolvedObjects))
+ {
+ IListener[] listeners = getListeners();
+ if (listeners.length != 0)
+ {
+ for (CDOObject resolvedObject : resolvedObjects)
+ {
+ --oldConflicts;
+ fireEvent(new ConflictRemovedEvent(resolvedObject, oldConflicts), listeners);
+ }
+ }
+ }
}
/**
@@ -1670,6 +1699,50 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
@Override
public CDOCommitInfo commit(IProgressMonitor monitor) throws CommitException
{
+ CDOCommitInfo info = commitAfterResolveConflicts(monitor);
+ if (info != null)
+ {
+ waitForCommitInfo(info.getTimeStamp());
+ }
+
+ return info;
+ }
+
+ @Override
+ public CDOCommitInfo commitAndClose(IProgressMonitor monitor, boolean keepOpenAfterCommitProblem) throws CommitException
+ {
+ CDOCommitInfo info;
+
+ try
+ {
+ info = commitAfterResolveConflicts(monitor);
+ }
+ catch (Error | RuntimeException | CommitException ex)
+ {
+ if (!keepOpenAfterCommitProblem)
+ {
+ try
+ {
+ close();
+ }
+ catch (Exception ex1)
+ {
+ if (isActive())
+ {
+ OM.LOG.error(ex1);
+ }
+ }
+ }
+
+ throw ex;
+ }
+
+ close();
+ return info;
+ }
+
+ private CDOCommitInfo commitAfterResolveConflicts(IProgressMonitor monitor) throws CommitException
+ {
CDOConflictResolver[] conflictResolvers = options().getConflictResolvers();
if (conflictResolvers.length != 0)
{
@@ -1695,13 +1768,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
}
}
- CDOCommitInfo info = commitSynced(monitor);
- if (info != null)
- {
- waitForCommitInfo(info.getTimeStamp());
- }
-
- return info;
+ return commitSynced(monitor);
}
private void waitForCommitInfo(long timeStamp)
@@ -2902,6 +2969,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
CDODataOutput out = new CDODataOutputImpl(new ExtendedDataOutputStream(stream))
{
@Override
+ public InternalCDOSession getSession()
+ {
+ return CDOTransactionImpl.this.getSession();
+ }
+
+ @Override
public CDOIDProvider getIDProvider()
{
return CDOTransactionImpl.this;
@@ -2994,6 +3067,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
CDODataInput in = new CDODataInputImpl(new ExtendedDataInputStream(stream))
{
@Override
+ public InternalCDOSession getSession()
+ {
+ return CDOTransactionImpl.this.getSession();
+ }
+
+ @Override
public CDOPackageRegistry getPackageRegistry()
{
return getSession().getPackageRegistry();
@@ -3514,7 +3593,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
{
T object = delegate.next();
CDOObject cdoObject = CDOUtil.getCDOObject(object);
- System.out.println(cdoObject);
if (!FSMUtil.isTransient(cdoObject))
{
@@ -4278,50 +4356,51 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
return lockStateCache;
}
- @Override
- protected Collection<CDOID> collectLockStatesAndReturnMissingIDs(Collection<CDOID> ids, boolean loadOnDemand, List<CDOLockState> result)
- {
- if (ObjectUtil.isEmpty(ids))
- {
- for (InternalCDOObject object : getModifiableObjects().values())
- {
- if (FSMUtil.isNew(object))
- {
- addLockStateOfNewObject(object, result);
- }
- }
-
- return ids;
- }
-
- // Filter out ids that are of new objects or that are duplicate.
- List<CDOID> missingIDs = new ArrayList<>();
- Set<CDOID> visited = new HashSet<>();
-
- for (CDOID id : ids)
- {
- if (visited.add(id))
- {
- InternalCDOObject object = getObject(id, false);
- if (object != null && FSMUtil.isNew(object))
- {
- addLockStateOfNewObject(object, result);
- }
- else
- {
- missingIDs.add(id);
- }
- }
- }
-
- return missingIDs;
- }
-
- private void addLockStateOfNewObject(CDOObject object, List<CDOLockState> result)
- {
- CDOLockState lockStateOfNewObject = getLockStateOfNewObject(object);
- result.add(lockStateOfNewObject);
- }
+ // @Override
+ // protected Collection<CDOID> collectLockStatesAndReturnMissingIDs(Collection<CDOID> ids, boolean loadOnDemand,
+ // List<CDOLockState> result)
+ // {
+ // if (ObjectUtil.isEmpty(ids))
+ // {
+ // for (InternalCDOObject object : getModifiableObjects().values())
+ // {
+ // if (FSMUtil.isNew(object))
+ // {
+ // addLockStateOfNewObject(object, result);
+ // }
+ // }
+ //
+ // return Collections.emptySet();
+ // }
+ //
+ // // Filter out ids that are of new objects or that are duplicate.
+ // List<CDOID> missingIDs = new ArrayList<>();
+ // Set<CDOID> visited = new HashSet<>();
+ //
+ // for (CDOID id : ids)
+ // {
+ // if (visited.add(id))
+ // {
+ // InternalCDOObject object = getObject(id, false);
+ // if (object != null && FSMUtil.isNew(object))
+ // {
+ // addLockStateOfNewObject(object, result);
+ // }
+ // else
+ // {
+ // missingIDs.add(id);
+ // }
+ // }
+ // }
+ //
+ // return missingIDs;
+ // }
+ //
+ // private void addLockStateOfNewObject(CDOObject object, List<CDOLockState> result)
+ // {
+ // CDOLockState lockStateOfNewObject = getLockStateOfNewObject(object);
+ // result.add(lockStateOfNewObject);
+ // }
/**
* The caller must have checked FSMUtil.isNew(object) == true.
@@ -4375,14 +4454,16 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
@Override
protected void adjustLockOwner()
{
- CDOLockOwner oldLockOwner = getLockOwner();
+ CDOLockOwner oldOwner = getLockOwner();
super.adjustLockOwner();
- CDOLockOwner newLockOwner = getLockOwner();
+ CDOLockOwner newOwner = getLockOwner();
- if (newLockOwner != oldLockOwner)
+ if (newOwner != oldOwner)
{
- lockStatesOfNewObjects.values().forEach(lockState -> lockState.remapOwner(oldLockOwner, newLockOwner));
-
+ for (InternalCDOLockState lockState : lockStatesOfNewObjects.values())
+ {
+ lockState.remapOwner(oldOwner, newOwner);
+ }
}
}
@@ -5165,17 +5246,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
private void collectLobs(InternalCDORevision revision, Map<ByteArrayWrapper, CDOLob<?>> lobs)
{
- EStructuralFeature[] features = revision.getClassInfo().getAllPersistentFeatures();
- for (int i = 0; i < features.length; i++)
+ for (EAttribute lobAttribute : revision.getClassInfo().getAllPersistentLobAttributes())
{
- EStructuralFeature feature = features[i];
- if (CDOModelUtil.isLob(feature.getEType()))
+ CDOLob<?> lob = (CDOLob<?>)revision.getValue(lobAttribute);
+ if (lob != null)
{
- CDOLob<?> lob = (CDOLob<?>)revision.getValue(feature);
- if (lob != null)
- {
- lobs.put(new ByteArrayWrapper(lob.getID()), lob);
- }
+ lobs.put(new ByteArrayWrapper(lob.getID()), lob);
}
}
}
@@ -5313,37 +5389,87 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
/**
* @author Eike Stepper
*/
- private final class ConflictEvent extends Event implements CDOTransactionConflictEvent
+ private abstract class ConflictChangedEvent extends Event implements CDOTransactionConflictChangedEvent
{
private static final long serialVersionUID = 1L;
- private InternalCDOObject conflictingObject;
+ private final CDOObject conflictingObject;
- private boolean firstConflict;
+ private final int conflicts;
- public ConflictEvent(InternalCDOObject conflictingObject, boolean firstConflict)
+ protected ConflictChangedEvent(CDOObject conflictingObject, int conflicts)
{
this.conflictingObject = conflictingObject;
- this.firstConflict = firstConflict;
+ this.conflicts = conflicts;
}
@Override
- public InternalCDOObject getConflictingObject()
+ public final CDOObject getConflictingObject()
{
return conflictingObject;
}
@Override
+ public final int getConflicts()
+ {
+ return conflicts;
+ }
+
+ @Override
+ protected String formatAdditionalParameters()
+ {
+ return "conflictingObject=" + conflictingObject + ", conflicts=" + conflicts;
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ @SuppressWarnings("deprecation")
+ private final class ConflictAddedEvent extends ConflictChangedEvent implements org.eclipse.emf.cdo.transaction.CDOTransactionConflictEvent
+ {
+ private static final long serialVersionUID = 1L;
+
+ public ConflictAddedEvent(CDOObject conflictingObject, int conflicts)
+ {
+ super(conflictingObject, conflicts);
+ }
+
+ @Override
public boolean isFirstConflict()
{
- return firstConflict;
+ return getConflicts() == 1;
}
@Override
- public String toString()
+ protected String formatAdditionalParameters()
+ {
+ return super.formatAdditionalParameters() + ", firstConflict=" + isFirstConflict();
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private final class ConflictRemovedEvent extends ConflictChangedEvent implements CDOTransactionConflictRemovedEvent
+ {
+ private static final long serialVersionUID = 1L;
+
+ public ConflictRemovedEvent(CDOObject conflictingObject, int conflicts)
+ {
+ super(conflictingObject, conflicts);
+ }
+
+ @Override
+ public boolean wasLastConflict()
+ {
+ return getConflicts() == 0;
+ }
+
+ @Override
+ protected String formatAdditionalParameters()
{
- return MessageFormat.format("CDOTransactionConflictEvent[source={0}, conflictingObject={1}, firstConflict={2}]", //$NON-NLS-1$
- getSource(), getConflictingObject(), isFirstConflict());
+ return super.formatAdditionalParameters() + ", lastConflict=" + wasLastConflict();
}
}

Back to the top