diff options
author | Eike Stepper | 2016-07-30 13:16:35 +0000 |
---|---|---|
committer | Eike Stepper | 2016-07-30 13:16:35 +0000 |
commit | 915fe3f55eb53acb190536a314e885d2a05d9720 (patch) | |
tree | d7a684ded717d97b89da72d50760a75cbcdd6c6f /plugins/org.eclipse.emf.cdo/src/org | |
parent | 6dc966a83269a207a5538850648ea23697c682bc (diff) | |
download | cdo-915fe3f55eb53acb190536a314e885d2a05d9720.tar.gz cdo-915fe3f55eb53acb190536a314e885d2a05d9720.tar.xz cdo-915fe3f55eb53acb190536a314e885d2a05d9720.zip |
Revert "[$387563] $Generalize the "lock of new objects on commit" feature to the "lock/unlock objects on commit" "
This reverts commit 6dc966a83269a207a5538850648ea23697c682bc.
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org')
10 files changed, 114 insertions, 512 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java index 7bada9a363..4905d74085 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012, 2014 Eike Stepper (Berlin, Germany) and others. + * Copyright (c) 2009-2012, 2014 Eike Stepper (Berlin, 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 @@ -55,6 +55,11 @@ public interface CDOCommitContext public CDOTransaction getTransaction(); /** + * @since 4.1 + */ + public boolean isAutoReleaseLocks(); + + /** * @since 4.0 */ public boolean isPartialCommit(); @@ -75,6 +80,11 @@ public interface CDOCommitContext public List<CDOPackageUnit> getNewPackageUnits(); /** + * @since 4.1 + */ + public Collection<CDOLockState> getLocksOnNewObjects(); + + /** * Returns a map of the new {@link CDOObject objects} that are to be committed with this commit context. */ public Map<CDOID, CDOObject> getNewObjects(); @@ -98,21 +108,4 @@ public interface CDOCommitContext * @since 4.0 */ public Collection<CDOLob<?>> getLobs(); - - /** - * @since 4.1 - * @deprecated As of 4.5 no longer supported. See {@link #getIDsToUnlock()}. - */ - @Deprecated - public boolean isAutoReleaseLocks(); - - /** - * @since 4.1 - */ - public Collection<CDOLockState> getLocksOnNewObjects(); - - /** - * @since 4.6 - */ - public Collection<CDOID> getIDsToUnlock(); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java index 2ed5ff400e..95d4460e3a 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java @@ -292,93 +292,24 @@ public interface CDOTransaction extends CDOView, CDOCommonTransaction, CDOUserTr public void setStaleReferenceCleaner(CDOStaleReferenceCleaner staleReferenceCleaner); /** - * Returns <code>true</code> if locks in this transaction will be released when {@link CDOTransaction#commit()} or - * {@link CDOTransaction#rollback()} are called, <code>false</code> otherwise. + * Returns true if locks in this view will be removes when {@link CDOTransaction#commit()} or + * {@link CDOTransaction#rollback()} is called. * <p> - * The default value is <code>true</code>. - * - * @see #getAutoReleaseLocksExemptions() + * Default value is true. */ public boolean isAutoReleaseLocksEnabled(); /** - * Specifies whether locks in this transaction will be released when {@link CDOTransaction#commit()} or - * {@link CDOTransaction#rollback()} are called. + * Specifies whether locks in this view will be removed when {@link CDOTransaction#commit()} or + * {@link CDOTransaction#rollback()} is called. * <p> - * If set to <code>false</code> all locks will be kept when {@link CDOTransaction#commit()} or - * {@link CDOTransaction#rollback()} are called. + * If false all locks are kept. * <p> - * The default value is <code>true</code>. - * - * @see #getAutoReleaseLocksExemptions() + * Default value is true. */ public void setAutoReleaseLocksEnabled(boolean on); /** - * Returns the set of {@link EObject objects} that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option. - * <p> - * That means: - * <p> - * <ul> - * <li> If {@link #isAutoReleaseLocksEnabled()} returns <code>true</code>, the locks on the objects in this set are <b>not</b> released - * when {@link CDOTransaction#commit()} or {@link CDOTransaction#rollback()} are called. - * <li> If {@link #isAutoReleaseLocksEnabled()} returns <code>false</code>, the locks on the objects in this set <b>are</b> released nevertheless - * when {@link CDOTransaction#commit()} or {@link CDOTransaction#rollback()} are called. - * </ul> - * <p> - * The returned set is unmodifiable. To modify the set use the {@link #clearAutoReleaseLocksExemptions() clearAutoReleaseLocksExemptions()}, - * {@link #addAutoReleaseLocksExemptions(boolean, EObject...) addAutoReleaseLocksExemption()}, - * and {@link #removeAutoReleaseLocksExemptions(boolean, EObject...) removeAutoReleaseLocksExemption()} methods. - * <p> - * <b>Implementation note</b>: This set stores weak references to the contained objects. - * - * @see #clearAutoReleaseLocksExemptions() - * @see #addAutoReleaseLocksExemptions(boolean, EObject...) - * @see #removeAutoReleaseLocksExemptions(boolean, EObject...) - * @since 4.6 - */ - public Set<? extends EObject> getAutoReleaseLocksExemptions(); - - /** - * Returns <code>true</code> if the given object is treated as an exemption to the {@link #isAutoReleaseLocksEnabled()} option, - * <code>false</code> otherwise. - * - * @see #getAutoReleaseLocksExemptions() - * @since 4.6 - */ - public boolean isAutoReleaseLocksExemption(EObject object); - - /** - * Clears the set of {@link EObject objects} that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option. - * - * @see #getAutoReleaseLocksExemptions() - * @see #addAutoReleaseLocksExemptions(boolean, EObject...) - * @see #removeAutoReleaseLocksExemptions(boolean, EObject...) - * @since 4.6 - */ - public void clearAutoReleaseLocksExemptions(); - - /** - * Adds the given {@link EObject object} to the set of objects that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option. - * - * @see #getAutoReleaseLocksExemptions() - * @see #clearAutoReleaseLocksExemptions() - * @see #removeAutoReleaseLocksExemptions(boolean, EObject...) - * @since 4.6 - */ - public void addAutoReleaseLocksExemptions(boolean recursive, EObject... objects); - - /** - * Removes the given {@link EObject object} from the set of objects that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option. - * - * @see #getAutoReleaseLocksExemptions() - * @see #clearAutoReleaseLocksExemptions() - * @see #addAutoReleaseLocksExemptions(boolean, EObject...) - * @since 4.6 - */ - public void removeAutoReleaseLocksExemptions(boolean recursive, EObject... objects); - - /** * Returns the number of milliseconds to wait for the transaction update when {@link CDOTransaction#commit()} is called. * <p> * Default value is 10000. @@ -436,8 +367,7 @@ public interface CDOTransaction extends CDOView, CDOCommonTransaction, CDOUserTr /** * An {@link IOptionsEvent options event} fired from transaction {@link CDOTransaction#options() options} when the - * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks enabled} or - * {@link Options#getAutoReleaseLocksExemptions() auto release locks exemptions} options have changed. + * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks} option has changed. * * @author Eike Stepper * @since 3.0 @@ -446,31 +376,6 @@ public interface CDOTransaction extends CDOView, CDOCommonTransaction, CDOUserTr */ public interface AutoReleaseLocksEvent extends IOptionsEvent { - /** - * An {@link AutoReleaseLocksEvent auto release locks options event} fired from transaction {@link CDOTransaction#options() options} when the - * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks enabled} option has changed. - * - * @author Eike Stepper - * @since 4.6 - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ - public interface AutoReleaseLocksEnabledEvent extends AutoReleaseLocksEvent - { - } - - /** - * An {@link AutoReleaseLocksEvent auto release locks options event} fired from transaction {@link CDOTransaction#options() options} when the - * {@link Options#getAutoReleaseLocksExemptions() auto release locks exemptions} option has changed. - * - * @author Eike Stepper - * @since 4.6 - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ - public interface AutoReleaseLocksExemptionsEvent extends AutoReleaseLocksEvent - { - } } /** diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java index c6ec39bd64..41cd6b114b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java @@ -88,10 +88,8 @@ import org.eclipse.emf.spi.cdo.FSMUtil; import org.eclipse.emf.spi.cdo.InternalCDOObject; import org.eclipse.emf.spi.cdo.InternalCDOView; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.concurrent.locks.Lock; @@ -594,20 +592,6 @@ public final class CDOUtil } /** - * @since 4.6 - */ - public static List<? extends CDOObject> getCDOObjects(EObject... objects) - { - List<CDOObject> result = new ArrayList<CDOObject>(); - for (EObject object : objects) - { - result.add(getCDOObject(object)); - } - - return result; - } - - /** * @since 4.4 */ public static boolean isCDOObject(EObject object) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java index ff9c2cf322..2a6dc0f379 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java @@ -1635,7 +1635,7 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC * @author Eike Stepper * @since 4.1 */ - private final class CDOStoreEcoreEMap extends EcoreEMap<Object, Object> implements InternalCDOLoadable + private final class CDOStoreEcoreEMap extends EcoreEMap<Object, Object>implements InternalCDOLoadable { private static final long serialVersionUID = 1L; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java index 2cd24d3c3c..9f726b234e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java @@ -19,7 +19,6 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.lock.CDOLockState; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.security.CDOPermission; -import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.view.CDOView; @@ -520,28 +519,6 @@ public class ObjectProperties extends Properties<EObject> } }); - add(new Property<EObject>("autoReleaseLocksExemption")//$NON-NLS-1$ - { - @Override - protected Object eval(EObject object) - { - CDOObject cdoObject = getCDOObject(object); - if (cdoObject == null) - { - return false; - } - - CDOView view = cdoObject.cdoView(); - if (view instanceof CDOTransaction) - { - CDOTransaction transaction = (CDOTransaction)view; - return transaction.options().isAutoReleaseLocksExemption(cdoObject); - } - - return false; - } - }); - add(new Property<EObject>("viewHistorical") //$NON-NLS-1$ { @Override 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 8c475d932f..c80de5cabe 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 @@ -96,8 +96,6 @@ import org.eclipse.emf.cdo.transaction.CDOMerger; import org.eclipse.emf.cdo.transaction.CDOSavepoint; 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.CDOTransactionFinishedEvent; import org.eclipse.emf.cdo.transaction.CDOTransactionHandler; @@ -148,7 +146,6 @@ import org.eclipse.net4j.util.transaction.TransactionException; 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.EObject; import org.eclipse.emf.ecore.EPackage; @@ -179,6 +176,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -189,7 +187,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.WeakHashMap; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicInteger; @@ -3643,6 +3640,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa private CDOCommitData commitData; + private Collection<CDOLockState> locksOnNewObjects; + private Map<CDOID, CDOObject> newObjects; private Map<CDOID, CDOObject> detachedObjects; @@ -3653,10 +3652,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa private Map<ByteArrayWrapper, CDOLob<?>> lobs = new HashMap<ByteArrayWrapper, CDOLob<?>>(); - private List<CDOLockState> locksOnNewObjects = new ArrayList<CDOLockState>(); - - private List<CDOID> idsToUnlock = new ArrayList<CDOID>(); - public CDOCommitContextImpl(InternalCDOTransaction transaction) { this.transaction = transaction; @@ -3665,8 +3660,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa private void calculateCommitData() { - OptionsImpl options = (OptionsImpl)transaction.options(); - List<CDOPackageUnit> newPackageUnits = analyzeNewPackages(); newObjects = filterCommittables(transaction.getNewObjects()); @@ -3674,15 +3667,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa for (CDOObject newObject : newObjects.values()) { revisions.add(newObject.cdoRevision()); - - CDOLockState lockState = getLockState(newObject); - if (lockState != null) - { - if (!options.isEffectiveAutoReleaseLock(newObject)) - { - locksOnNewObjects.add(lockState); - } - } } revisionDeltas = filterCommittables(transaction.getRevisionDeltas()); @@ -3716,16 +3700,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa dirtyObjects = filterCommittables(transaction.getDirtyObjects()); - for (CDOObject lockedObject : getLockStates().keySet()) - { - if (!FSMUtil.isTransient(lockedObject)) - { - if (options.isEffectiveAutoReleaseLock(lockedObject)) - { - idsToUnlock.add(lockedObject.cdoID()); - } - } - } + CDOLockState[] locksOnNewObjectsArray = getLockStates(newObjects.keySet(), false); + locksOnNewObjects = Arrays.asList(locksOnNewObjectsArray); commitData = CDOCommitInfoUtil.createCommitData(newPackageUnits, revisions, deltas, detached); } @@ -3781,6 +3757,11 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa return isPartialCommit; } + public boolean isAutoReleaseLocks() + { + return transaction.options().isAutoReleaseLocksEnabled(); + } + public String getCommitComment() { return transaction.getCommitComment(); @@ -3806,6 +3787,11 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa return commitData.getNewPackageUnits(); } + public Collection<CDOLockState> getLocksOnNewObjects() + { + return locksOnNewObjects; + } + public Map<CDOID, CDOObject> getDetachedObjects() { return detachedObjects; @@ -3821,22 +3807,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa return lobs.values(); } - @Deprecated - public boolean isAutoReleaseLocks() - { - return transaction.options().isAutoReleaseLocksEnabled(); - } - - public Collection<CDOLockState> getLocksOnNewObjects() - { - return locksOnNewObjects; - } - - public List<CDOID> getIDsToUnlock() - { - return idsToUnlock; - } - public void preCommit() { if (isDirty()) @@ -4021,26 +3991,10 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa fireEvent(new FinishedEvent(idMappings), listeners); } - Map<CDOObject, CDOLockState> lockStates = getLockStates(); - if (!lockStates.isEmpty()) + CDOLockState[] newLockStates = result.getNewLockStates(); + if (newLockStates != null) { - List<CDOLockState> objectsToUnlock = new ArrayList<CDOLockState>(); - - for (Map.Entry<CDOObject, CDOLockState> entry : lockStates.entrySet()) - { - CDOObject object = entry.getKey(); - if (options().isEffectiveAutoReleaseLock(object)) - { - InternalCDOLockState lockState = (InternalCDOLockState)entry.getValue(); - lockState.updateFrom(InternalCDOLockState.UNLOCKED); - - objectsToUnlock.add(lockState); - } - } - - CDOLockState[] newLockStates = objectsToUnlock.toArray(new CDOLockState[objectsToUnlock.size()]); - notifyOtherViewsAboutLockChanges(CDOLockChangeInfo.Operation.UNLOCK, null, result.getTimeStamp(), - newLockStates); + updateAndNotifyLockStates(CDOLockChangeInfo.Operation.UNLOCK, null, result.getTimeStamp(), newLockStates); } } catch (RuntimeException ex) @@ -4221,14 +4175,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa { private CDOUndoDetector undoDetector = DEFAULT_UNDO_DETECTOR; - private final List<CDOConflictResolver> conflictResolvers = new ArrayList<CDOConflictResolver>(); + private List<CDOConflictResolver> conflictResolvers = new ArrayList<CDOConflictResolver>(); private CDOStaleReferenceCleaner staleReferenceCleaner = CDOStaleReferenceCleaner.DEFAULT; private boolean autoReleaseLocksEnabled = true; - private final Map<EObject, Boolean> autoReleaseLocksExemptions = new WeakHashMap<EObject, Boolean>(); - private long commitInfoTimeout = DEFAULT_COMMIT_INFO_TIMEOUT; public OptionsImpl() @@ -4462,67 +4414,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa if (autoReleaseLocksEnabled != on) { autoReleaseLocksEnabled = on; - event = new AutoReleaseLocksEnabledEventImpl(); - } - } - finally - { - unlockView(); - } - } - - fireEvent(event); - } - - public Set<? extends EObject> getAutoReleaseLocksExemptions() - { - synchronized (getViewMonitor()) - { - lockView(); - - try - { - return new HashSet<EObject>(autoReleaseLocksExemptions.keySet()); - } - finally - { - unlockView(); - } - } - } - - public boolean isAutoReleaseLocksExemption(EObject object) - { - synchronized (getViewMonitor()) - { - lockView(); - - try - { - return autoReleaseLocksExemptions.get(CDOUtil.getCDOObject(object)) == Boolean.TRUE; - } - finally - { - unlockView(); - } - } - } - - public void clearAutoReleaseLocksExemptions() - { - checkActive(); - - IEvent event = null; - synchronized (getViewMonitor()) - { - lockView(); - - try - { - if (!autoReleaseLocksExemptions.isEmpty()) - { - autoReleaseLocksExemptions.clear(); - event = new AutoReleaseLocksExemptionsEventImpl(); + event = new AutoReleaseLocksEventImpl(); } } finally @@ -4534,97 +4426,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa fireEvent(event); } - public void addAutoReleaseLocksExemptions(boolean recursive, EObject... objects) - { - checkActive(); - - IEvent event = null; - synchronized (getViewMonitor()) - { - lockView(); - - try - { - for (EObject object : objects) - { - if (autoReleaseLocksExemptions.put(CDOUtil.getCDOObject(object), Boolean.TRUE) == null) - { - event = new AutoReleaseLocksExemptionsEventImpl(); - } - - if (recursive) - { - for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();) - { - EObject child = it.next(); - if (autoReleaseLocksExemptions.put(CDOUtil.getCDOObject(child), Boolean.TRUE) == null && event == null) - { - event = new AutoReleaseLocksExemptionsEventImpl(); - } - } - } - } - } - finally - { - unlockView(); - } - } - - fireEvent(event); - } - - public void removeAutoReleaseLocksExemptions(boolean recursive, EObject... objects) - { - checkActive(); - - IEvent event = null; - synchronized (getViewMonitor()) - { - lockView(); - - try - { - for (EObject object : objects) - { - if (autoReleaseLocksExemptions.remove(CDOUtil.getCDOObject(object)) != null) - { - event = new AutoReleaseLocksExemptionsEventImpl(); - } - - if (recursive) - { - for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();) - { - EObject child = it.next(); - if (autoReleaseLocksExemptions.remove(CDOUtil.getCDOObject(child)) != null && event == null) - { - event = new AutoReleaseLocksExemptionsEventImpl(); - } - } - } - } - } - finally - { - unlockView(); - } - } - - fireEvent(event); - } - - public boolean isEffectiveAutoReleaseLock(CDOObject newObject) - { - boolean effectiveAutoReleaseLock = autoReleaseLocksEnabled; - if (autoReleaseLocksExemptions.containsKey(newObject)) - { - effectiveAutoReleaseLock = !effectiveAutoReleaseLock; - } - - return effectiveAutoReleaseLock; - } - public long getCommitInfoTimeout() { return commitInfoTimeout; @@ -4698,25 +4499,11 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa /** * @author Eike Stepper */ - private final class AutoReleaseLocksEnabledEventImpl extends OptionsEvent implements AutoReleaseLocksEnabledEvent - { - private static final long serialVersionUID = 1L; - - public AutoReleaseLocksEnabledEventImpl() - { - super(OptionsImpl.this); - } - } - - /** - * @author Eike Stepper - */ - private final class AutoReleaseLocksExemptionsEventImpl extends OptionsEvent - implements AutoReleaseLocksExemptionsEvent + private final class AutoReleaseLocksEventImpl extends OptionsEvent implements AutoReleaseLocksEvent { private static final long serialVersionUID = 1L; - public AutoReleaseLocksExemptionsEventImpl() + public AutoReleaseLocksEventImpl() { super(OptionsImpl.this); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java index 3f29900393..eb1fe86189 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java @@ -94,7 +94,7 @@ public class CDOUndoDetectorImpl implements CDOUndoDetector } /** - * @deprecated As of 4.5 {@link #detectUndo(CDOTransaction, CDORevision, CDORevision, CDOFeatureDelta)} is called. + * @deprecated As of CDO 4.5 {@link #detectUndo(CDOTransaction, CDORevision, CDORevision, CDOFeatureDelta)} is called. */ @Deprecated protected boolean detectUndoContainer(InternalCDORevision cleanRevision, InternalCDORevision currentRevision) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java index 0f1dd2fba3..e475279359 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java @@ -119,6 +119,11 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext return delegateCommitContext.getTransaction(); } + public boolean isAutoReleaseLocks() + { + return delegateCommitContext.isAutoReleaseLocks(); + } + public boolean isPartialCommit() { return delegateCommitContext.isPartialCommit(); @@ -154,6 +159,11 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext return delegateCommitContext.getNewPackageUnits(); } + public Collection<CDOLockState> getLocksOnNewObjects() + { + return delegateCommitContext.getLocksOnNewObjects(); + } + public Map<CDOID, CDOObject> getDetachedObjects() { return delegateCommitContext.getDetachedObjects(); @@ -169,22 +179,6 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext return delegateCommitContext.getLobs(); } - @Deprecated - public boolean isAutoReleaseLocks() - { - return delegateCommitContext.isAutoReleaseLocks(); - } - - public Collection<CDOLockState> getLocksOnNewObjects() - { - return delegateCommitContext.getLocksOnNewObjects(); - } - - public Collection<CDOID> getIDsToUnlock() - { - return delegateCommitContext.getIDsToUnlock(); - } - public Object call() throws Exception { state.handle(this, progressMonitor); 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 814dcf43a3..694efefc37 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,7 +99,6 @@ 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; @@ -122,7 +121,6 @@ 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; @@ -363,16 +361,6 @@ 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 { @@ -441,13 +429,8 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv } } - int locksOnNewObjectsCount = locksOnNewObjects.size(); - if (locksOnNewObjectsCount != 0) - { - CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjectsCount]); - // updateLockStates(locksOnNewObjectsArray); - updateAndNotifyLockStates(Operation.LOCK, lockType, getTimeStamp(), locksOnNewObjectsArray); - } + CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjects.size()]); + updateLockStates(locksOnNewObjectsArray); if (result != null) { @@ -526,8 +509,7 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv /** * Notifies other views of lock changes performed in this view */ - protected void notifyOtherViewsAboutLockChanges(Operation op, LockType type, long timestamp, - CDOLockState[] lockStates) + private void notifyOtherViewsAboutLockChanges(Operation op, LockType type, long timestamp, CDOLockState[] lockStates) { if (lockStates.length > 0) { @@ -655,16 +637,6 @@ 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 { @@ -1012,69 +984,83 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv try { - List<CDOLockState> result = new ArrayList<CDOLockState>(); - List<CDOLockState> lockStatesToUpdate = new ArrayList<CDOLockState>(); - Set<CDOID> missingIDs = new LinkedHashSet<CDOID>(); + List<CDOID> missing = new LinkedList<CDOID>(); + List<CDOLockState> lockStates = new LinkedList<CDOLockState>(); + List<CDOLockState> locksOnNewObjects = new ArrayList<CDOLockState>(ids.size()); for (CDOID id : ids) { + CDOLockState lockState = null; InternalCDOObject object = getObject(id, false); if (object != null) { - CDOLockState lockState = lockStates.get(object); - if (lockState != null) - { - result.add(lockState); - continue; - } - - if (loadOnDemand && FSMUtil.isNew(object)) - { - Object lockTarget = getLockTarget(this, id); - CDOLockState newLockState = CDOLockUtil.createLockState(lockTarget); - - result.add(newLockState); - lockStatesToUpdate.add(newLockState); - continue; - } + lockState = this.lockStates.get(object); } - missingIDs.add(id); + 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 && (!missingIDs.isEmpty() || ids.isEmpty())) + if (loadOnDemand && (missing.size() > 0 || ids.isEmpty())) { CDOSessionProtocol sessionProtocol = session.getSessionProtocol(); - CDOLockState[] loadedLockStates = sessionProtocol.getLockStates(viewID, missingIDs, CDOLockState.DEPTH_NONE); - + CDOLockState[] loadedLockStates = sessionProtocol.getLockStates(viewID, missing, CDOLockState.DEPTH_NONE); + List<CDOLockState> newLockStateForCache = new ArrayList<CDOLockState>( + loadedLockStates.length + missing.size()); for (CDOLockState loadedLockState : loadedLockStates) { - result.add(loadedLockState); - lockStatesToUpdate.add(loadedLockState); + lockStates.add(loadedLockState); + newLockStateForCache.add(loadedLockState); - CDOID id = CDOIDUtil.getCDOID(loadedLockState.getLockedObject()); - if (id != null) + CDOID cdoID = CDOIDUtil.getCDOID(loadedLockState.getLockedObject()); + if (cdoID != null) { - missingIDs.remove(id); + missing.remove(cdoID); } } - for (CDOID missingID : missingIDs) + for (CDOID missingLockStateForCDOID : missing) { - Object lockTarget = getLockTarget(this, missingID); - CDOLockState defaultLockState = CDOLockUtil.createLockState(lockTarget); + Object target; - result.add(defaultLockState); - lockStatesToUpdate.add(defaultLockState); + 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 (!lockStatesToUpdate.isEmpty()) - { - updateLockStates(lockStatesToUpdate.toArray(new CDOLockState[lockStatesToUpdate.size()])); + if (options().isLockNotificationEnabled()) + { + updateLockStates(newLockStateForCache.toArray(new CDOLockState[newLockStateForCache.size()])); + } } - return result.toArray(new CDOLockState[result.size()]); + CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjects.size()]); + updateLockStates(locksOnNewObjectsArray); + + return lockStates.toArray(new CDOLockState[lockStates.size()]); } finally { @@ -1093,11 +1079,6 @@ 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, @@ -1841,12 +1822,8 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv } CDOID id = object.cdoID(); - return getLockTarget(view, id); - } - - protected static Object getLockTarget(CDOView view, CDOID id) - { - if (view.getSession().getRepositoryInfo().isSupportingBranches()) + boolean branching = view.getSession().getRepositoryInfo().isSupportingBranches(); + if (branching) { 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 738e562ee5..70d0dc1fba 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,7 +13,6 @@ 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; @@ -58,13 +57,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) @@ -167,27 +166,13 @@ 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) |