Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2016-07-30 12:19:15 +0000
committerEike Stepper2016-07-30 12:19:38 +0000
commit6dc966a83269a207a5538850648ea23697c682bc (patch)
tree7cf7392277825440a53ca835ba593662729e70e0 /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view
parentdaae9e913594dd5b8317bd26d7e778d6020a8d4d (diff)
downloadcdo-6dc966a83269a207a5538850648ea23697c682bc.tar.gz
cdo-6dc966a83269a207a5538850648ea23697c682bc.tar.xz
cdo-6dc966a83269a207a5538850648ea23697c682bc.zip
[$387563] $Generalize the "lock of new objects on commit" feature to the "lock/unlock objects on commit"
Task-Url: $https://bugs.eclipse.org/bugs/show_bug.cgi?id=387563
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java137
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java23
2 files changed, 99 insertions, 61 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
index 694efefc37..814dcf43a3 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
@@ -99,6 +99,7 @@ import org.eclipse.net4j.util.ref.ReferenceValueMap;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -121,6 +122,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -361,6 +363,16 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
{
CDOLockState lockState = createUpdatedLockStateForNewObject(object, lockType, true);
locksOnNewObjects.add(lockState);
+
+ if (recursive)
+ {
+ for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();)
+ {
+ CDOObject child = CDOUtil.getCDOObject(it.next());
+ lockState = createUpdatedLockStateForNewObject(child, lockType, true);
+ locksOnNewObjects.add(lockState);
+ }
+ }
}
else
{
@@ -429,8 +441,13 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
}
}
- CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjects.size()]);
- updateLockStates(locksOnNewObjectsArray);
+ int locksOnNewObjectsCount = locksOnNewObjects.size();
+ if (locksOnNewObjectsCount != 0)
+ {
+ CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjectsCount]);
+ // updateLockStates(locksOnNewObjectsArray);
+ updateAndNotifyLockStates(Operation.LOCK, lockType, getTimeStamp(), locksOnNewObjectsArray);
+ }
if (result != null)
{
@@ -509,7 +526,8 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
/**
* Notifies other views of lock changes performed in this view
*/
- private void notifyOtherViewsAboutLockChanges(Operation op, LockType type, long timestamp, CDOLockState[] lockStates)
+ protected void notifyOtherViewsAboutLockChanges(Operation op, LockType type, long timestamp,
+ CDOLockState[] lockStates)
{
if (lockStates.length > 0)
{
@@ -637,6 +655,16 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
{
CDOLockState lockState = createUpdatedLockStateForNewObject(object, lockType, false);
locksOnNewObjects.add(lockState);
+
+ if (recursive)
+ {
+ for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();)
+ {
+ CDOObject child = CDOUtil.getCDOObject(it.next());
+ lockState = createUpdatedLockStateForNewObject(child, lockType, false);
+ locksOnNewObjects.add(lockState);
+ }
+ }
}
else
{
@@ -984,83 +1012,69 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
try
{
- List<CDOID> missing = new LinkedList<CDOID>();
- List<CDOLockState> lockStates = new LinkedList<CDOLockState>();
- List<CDOLockState> locksOnNewObjects = new ArrayList<CDOLockState>(ids.size());
+ List<CDOLockState> result = new ArrayList<CDOLockState>();
+ List<CDOLockState> lockStatesToUpdate = new ArrayList<CDOLockState>();
+ Set<CDOID> missingIDs = new LinkedHashSet<CDOID>();
for (CDOID id : ids)
{
- CDOLockState lockState = null;
InternalCDOObject object = getObject(id, false);
if (object != null)
{
- lockState = this.lockStates.get(object);
- }
+ CDOLockState lockState = lockStates.get(object);
+ if (lockState != null)
+ {
+ result.add(lockState);
+ continue;
+ }
- if (lockState != null)
- {
- lockStates.add(lockState);
- }
- else if (loadOnDemand && object != null && FSMUtil.isNew(object))
- {
- Object lockedObject = getLockTarget(object); // CDOID or CDOIDAndBranch
- CDOLockState defaultLockState = CDOLockUtil.createLockState(lockedObject);
- locksOnNewObjects.add(defaultLockState);
- lockStates.add(defaultLockState);
- }
- else
- {
- missing.add(id);
+ if (loadOnDemand && FSMUtil.isNew(object))
+ {
+ Object lockTarget = getLockTarget(this, id);
+ CDOLockState newLockState = CDOLockUtil.createLockState(lockTarget);
+
+ result.add(newLockState);
+ lockStatesToUpdate.add(newLockState);
+ continue;
+ }
}
+
+ missingIDs.add(id);
}
- if (loadOnDemand && (missing.size() > 0 || ids.isEmpty()))
+ if (loadOnDemand && (!missingIDs.isEmpty() || ids.isEmpty()))
{
CDOSessionProtocol sessionProtocol = session.getSessionProtocol();
- CDOLockState[] loadedLockStates = sessionProtocol.getLockStates(viewID, missing, CDOLockState.DEPTH_NONE);
- List<CDOLockState> newLockStateForCache = new ArrayList<CDOLockState>(
- loadedLockStates.length + missing.size());
+ CDOLockState[] loadedLockStates = sessionProtocol.getLockStates(viewID, missingIDs, CDOLockState.DEPTH_NONE);
+
for (CDOLockState loadedLockState : loadedLockStates)
{
- lockStates.add(loadedLockState);
- newLockStateForCache.add(loadedLockState);
+ result.add(loadedLockState);
+ lockStatesToUpdate.add(loadedLockState);
- CDOID cdoID = CDOIDUtil.getCDOID(loadedLockState.getLockedObject());
- if (cdoID != null)
+ CDOID id = CDOIDUtil.getCDOID(loadedLockState.getLockedObject());
+ if (id != null)
{
- missing.remove(cdoID);
+ missingIDs.remove(id);
}
}
- for (CDOID missingLockStateForCDOID : missing)
+ for (CDOID missingID : missingIDs)
{
- Object target;
+ Object lockTarget = getLockTarget(this, missingID);
+ CDOLockState defaultLockState = CDOLockUtil.createLockState(lockTarget);
- InternalCDOObject object = getObject(missingLockStateForCDOID, false);
- if (object != null)
- {
- target = getLockTarget(object); // CDOID or CDOIDAndBranch
- }
- else
- {
- target = missingLockStateForCDOID;
- }
-
- CDOLockState defaultLockState = CDOLockUtil.createLockState(target);
- lockStates.add(defaultLockState);
- newLockStateForCache.add(defaultLockState);
- }
-
- if (options().isLockNotificationEnabled())
- {
- updateLockStates(newLockStateForCache.toArray(new CDOLockState[newLockStateForCache.size()]));
+ result.add(defaultLockState);
+ lockStatesToUpdate.add(defaultLockState);
}
}
- CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjects.size()]);
- updateLockStates(locksOnNewObjectsArray);
+ if (!lockStatesToUpdate.isEmpty())
+ {
+ updateLockStates(lockStatesToUpdate.toArray(new CDOLockState[lockStatesToUpdate.size()]));
+ }
- return lockStates.toArray(new CDOLockState[lockStates.size()]);
+ return result.toArray(new CDOLockState[result.size()]);
}
finally
{
@@ -1079,6 +1093,11 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
return lockStates.get(object);
}
+ protected Map<CDOObject, CDOLockState> getLockStates()
+ {
+ return lockStates;
+ }
+
private CDOBranchPoint getBranchPointForID(CDOID id)
{
// If this view's timestamp is something other than UNSPECIFIED_DATE,
@@ -1822,8 +1841,12 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv
}
CDOID id = object.cdoID();
- boolean branching = view.getSession().getRepositoryInfo().isSupportingBranches();
- if (branching)
+ return getLockTarget(view, id);
+ }
+
+ protected static Object getLockTarget(CDOView view, CDOID id)
+ {
+ if (view.getSession().getRepositoryInfo().isSupportingBranches())
{
return CDOIDUtil.createIDAndBranch(id, view.getBranch());
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java
index 70d0dc1fba..738e562ee5 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java
@@ -13,6 +13,7 @@ package org.eclipse.emf.internal.cdo.view;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.util.StringUtil;
@@ -57,13 +58,13 @@ public class ViewProperties extends Properties<CDOView>
});
add(new Property<CDOView>("branchName") //$NON-NLS-1$
- {
+ {
@Override
protected Object eval(CDOView view)
{
return view.getBranch().getName();
}
- });
+ });
add(new Property<CDOView>("branch", //$NON-NLS-1$
"Branch", "The branch of this view.", CATEGORY_VIEW)
@@ -166,13 +167,27 @@ public class ViewProperties extends Properties<CDOView>
});
add(new Property<CDOView>("historical") //$NON-NLS-1$
- {
+ {
@Override
protected Object eval(CDOView view)
{
return view.getTimeStamp() != CDOBranchPoint.UNSPECIFIED_DATE;
}
- });
+ });
+
+ add(new Property<CDOView>("autoReleaseLocks") //$NON-NLS-1$
+ {
+ @Override
+ protected Object eval(CDOView view)
+ {
+ if (view instanceof CDOTransaction)
+ {
+ return ((CDOTransaction)view).options().isAutoReleaseLocksEnabled();
+ }
+
+ return false;
+ }
+ });
}
public static void main(String[] args)

Back to the top