diff options
62 files changed, 1794 insertions, 698 deletions
diff --git a/features/org.eclipse.emf.cdo-feature/feature.xml b/features/org.eclipse.emf.cdo-feature/feature.xml index 03d6062372..9799634f5e 100644 --- a/features/org.eclipse.emf.cdo-feature/feature.xml +++ b/features/org.eclipse.emf.cdo-feature/feature.xml @@ -13,7 +13,7 @@ <feature id="org.eclipse.emf.cdo" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.emf.cdo.defs-feature/feature.xml b/features/org.eclipse.emf.cdo.defs-feature/feature.xml index 2d0a3ee599..2b8f3a2a25 100644 --- a/features/org.eclipse.emf.cdo.defs-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.defs-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.defs" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.emf.cdo.epp-feature/feature.xml b/features/org.eclipse.emf.cdo.epp-feature/feature.xml index 32f3677491..709e38f5bf 100644 --- a/features/org.eclipse.emf.cdo.epp-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.epp-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.epp" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.emf.cdo.explorer-feature/feature.xml b/features/org.eclipse.emf.cdo.explorer-feature/feature.xml index 8482d22137..4b0a638e03 100644 --- a/features/org.eclipse.emf.cdo.explorer-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.explorer-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.explorer" label="%featureName" - version="4.4.0.qualifier" + version="4.5.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg"> diff --git a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml index 37de3f73e1..7177707f0b 100644 --- a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.sdk" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/features/org.eclipse.emf.cdo.server-feature/feature.xml b/features/org.eclipse.emf.cdo.server-feature/feature.xml index 579b725fbd..afc8747202 100644 --- a/features/org.eclipse.emf.cdo.server-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.server-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.server" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml b/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml index 1e15b7afed..9a8ece9761 100644 --- a/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.server.hibernate" label="%featureName" - version="4.2.300.qualifier" + version="4.2.400.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.emf.cdo.tests-feature/feature.xml b/features/org.eclipse.emf.cdo.tests-feature/feature.xml index ff9e97c7b9..c7288c73ad 100644 --- a/features/org.eclipse.emf.cdo.tests-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.tests-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.tests" label="%featureName" - version="4.2.300.qualifier" + version="4.2.400.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.net4j-feature/feature.xml b/features/org.eclipse.net4j-feature/feature.xml index 7c97421f40..0891d328c3 100644 --- a/features/org.eclipse.net4j-feature/feature.xml +++ b/features/org.eclipse.net4j-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/features/org.eclipse.net4j.db-feature/feature.xml b/features/org.eclipse.net4j.db-feature/feature.xml index c65973c2bb..15fe440a56 100644 --- a/features/org.eclipse.net4j.db-feature/feature.xml +++ b/features/org.eclipse.net4j.db-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j.db" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.net4j.defs-feature/feature.xml b/features/org.eclipse.net4j.defs-feature/feature.xml index c08b74ace9..b907ccee41 100644 --- a/features/org.eclipse.net4j.defs-feature/feature.xml +++ b/features/org.eclipse.net4j.defs-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j.defs" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/features/org.eclipse.net4j.sdk-feature/feature.xml b/features/org.eclipse.net4j.sdk-feature/feature.xml index e538401696..4ead21b3bb 100644 --- a/features/org.eclipse.net4j.sdk-feature/feature.xml +++ b/features/org.eclipse.net4j.sdk-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j.sdk" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/features/org.eclipse.net4j.util-feature/feature.xml b/features/org.eclipse.net4j.util-feature/feature.xml index db78136d07..090cf7b7ce 100644 --- a/features/org.eclipse.net4j.util-feature/feature.xml +++ b/features/org.eclipse.net4j.util-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j.util" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/features/org.eclipse.net4j.util.ui-feature/feature.xml b/features/org.eclipse.net4j.util.ui-feature/feature.xml index 2e654465f0..897cc10c4e 100644 --- a/features/org.eclipse.net4j.util.ui-feature/feature.xml +++ b/features/org.eclipse.net4j.util.ui-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j.util.ui" label="%featureName" - version="4.5.0.qualifier" + version="4.6.0.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF index f9852b96bc..05e58aba70 100644 --- a/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.common -Bundle-Version: 4.5.0.qualifier +Bundle-Version: 4.6.0.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -14,21 +14,21 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";visibili org.eclipse.emf.ecore.change;bundle-version="[2.5.0,3.0.0)";visibility:=reexport, org.eclipse.emf.ecore.xmi;bundle-version="[2.5.0,3.0.0)";visibility:=reexport, org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", - org.eclipse.emf.cdo.common.admin;version="4.5.0", - org.eclipse.emf.cdo.common.branch;version="4.5.0", - org.eclipse.emf.cdo.common.commit;version="4.5.0", - org.eclipse.emf.cdo.common.commit.handler;version="4.5.0", - org.eclipse.emf.cdo.common.id;version="4.5.0", - org.eclipse.emf.cdo.common.lob;version="4.5.0", - org.eclipse.emf.cdo.common.lock;version="4.5.0", - org.eclipse.emf.cdo.common.model;version="4.5.0", - org.eclipse.emf.cdo.common.protocol;version="4.5.0", - org.eclipse.emf.cdo.common.revision;version="4.5.0", - org.eclipse.emf.cdo.common.revision.delta;version="4.5.0", - org.eclipse.emf.cdo.common.security;version="4.5.0", - org.eclipse.emf.cdo.common.util;version="4.5.0", - org.eclipse.emf.cdo.internal.common;version="4.5.0"; +Export-Package: org.eclipse.emf.cdo.common;version="4.6.0", + org.eclipse.emf.cdo.common.admin;version="4.6.0", + org.eclipse.emf.cdo.common.branch;version="4.6.0", + org.eclipse.emf.cdo.common.commit;version="4.6.0", + org.eclipse.emf.cdo.common.commit.handler;version="4.6.0", + org.eclipse.emf.cdo.common.id;version="4.6.0", + org.eclipse.emf.cdo.common.lob;version="4.6.0", + org.eclipse.emf.cdo.common.lock;version="4.6.0", + org.eclipse.emf.cdo.common.model;version="4.6.0", + org.eclipse.emf.cdo.common.protocol;version="4.6.0", + org.eclipse.emf.cdo.common.revision;version="4.6.0", + org.eclipse.emf.cdo.common.revision.delta;version="4.6.0", + org.eclipse.emf.cdo.common.security;version="4.6.0", + org.eclipse.emf.cdo.common.util;version="4.6.0", + org.eclipse.emf.cdo.internal.common;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.common, org.eclipse.emf.cdo.common.db, org.eclipse.emf.cdo, @@ -38,11 +38,11 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.server.hibernate", - org.eclipse.emf.cdo.internal.common.branch;version="4.5.0"; + org.eclipse.emf.cdo.internal.common.branch;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.server.hibernate", - org.eclipse.emf.cdo.internal.common.bundle;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.common.commit;version="4.5.0"; + org.eclipse.emf.cdo.internal.common.bundle;version="4.6.0";x-internal:=true, + org.eclipse.emf.cdo.internal.common.commit;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.common, org.eclipse.emf.cdo.common.db, org.eclipse.emf.cdo, @@ -51,7 +51,7 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.common.id;version="4.5.0"; + org.eclipse.emf.cdo.internal.common.id;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.common, org.eclipse.emf.cdo.common.db, org.eclipse.emf.cdo, @@ -62,9 +62,9 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.admin, org.eclipse.emf.cdo.server.admin", - org.eclipse.emf.cdo.internal.common.lock;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.common.messages;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.common.model;version="4.5.0"; + org.eclipse.emf.cdo.internal.common.lock;version="4.6.0";x-internal:=true, + org.eclipse.emf.cdo.internal.common.messages;version="4.6.0";x-internal:=true, + org.eclipse.emf.cdo.internal.common.model;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.common, org.eclipse.emf.cdo.common.db, org.eclipse.emf.cdo, @@ -73,7 +73,7 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.common.revision;version="4.5.0"; + org.eclipse.emf.cdo.internal.common.revision;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.common, org.eclipse.emf.cdo.common.db, org.eclipse.emf.cdo, @@ -82,7 +82,7 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.common.revision.delta;version="4.5.0"; + org.eclipse.emf.cdo.internal.common.revision.delta;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.common, org.eclipse.emf.cdo.common.db, org.eclipse.emf.cdo, @@ -91,12 +91,12 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.5.0", org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.spi.common;version="4.5.0", - org.eclipse.emf.cdo.spi.common.admin;version="4.5.0", - org.eclipse.emf.cdo.spi.common.branch;version="4.5.0", - org.eclipse.emf.cdo.spi.common.commit;version="4.5.0", - org.eclipse.emf.cdo.spi.common.id;version="4.5.0", - org.eclipse.emf.cdo.spi.common.lock;version="4.5.0", - org.eclipse.emf.cdo.spi.common.model;version="4.5.0", - org.eclipse.emf.cdo.spi.common.protocol;version="4.5.0", - org.eclipse.emf.cdo.spi.common.revision;version="4.5.0" + org.eclipse.emf.cdo.spi.common;version="4.6.0", + org.eclipse.emf.cdo.spi.common.admin;version="4.6.0", + org.eclipse.emf.cdo.spi.common.branch;version="4.6.0", + org.eclipse.emf.cdo.spi.common.commit;version="4.6.0", + org.eclipse.emf.cdo.spi.common.id;version="4.6.0", + org.eclipse.emf.cdo.spi.common.lock;version="4.6.0", + org.eclipse.emf.cdo.spi.common.model;version="4.6.0", + org.eclipse.emf.cdo.spi.common.protocol;version="4.6.0", + org.eclipse.emf.cdo.spi.common.revision;version="4.6.0" diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java index 4d5b8bddc2..cb0dac0f83 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java @@ -10,8 +10,10 @@ */ package org.eclipse.emf.cdo.spi.common.lock; +import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.lock.CDOLockOwner; import org.eclipse.emf.cdo.common.lock.CDOLockState; +import org.eclipse.emf.cdo.internal.common.lock.CDOLockStateImpl; /** * If the meaning of this type isn't clear, there really should be more of a description here... @@ -23,6 +25,11 @@ import org.eclipse.emf.cdo.common.lock.CDOLockState; */ public interface InternalCDOLockState extends CDOLockState { + /** + * @since 4.6 + */ + public static final CDOLockState UNLOCKED = new CDOLockStateImpl(CDOID.NULL); + public void addReadLockOwner(CDOLockOwner lockOwner); public boolean removeReadLockOwner(CDOLockOwner lockOwner); diff --git a/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF index 32eca96ebf..6d13a12a79 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.emf.cdo.net4j; singleton:=true -Bundle-Version: 4.1.400.qualifier +Bundle-Version: 4.1.500.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,17 +10,17 @@ Bundle-Activator: org.eclipse.emf.cdo.internal.net4j.bundle.OM$Activator Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport, org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.internal.net4j;version="4.1.400"; +Export-Package: org.eclipse.emf.cdo.internal.net4j;version="4.1.500"; x-friends:="org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.examples", - org.eclipse.emf.cdo.internal.net4j.bundle;version="4.1.400";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.net4j.messages;version="4.1.400";x-internal:=true, - org.eclipse.emf.cdo.internal.net4j.protocol;version="4.1.400"; + org.eclipse.emf.cdo.internal.net4j.bundle;version="4.1.500";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.internal.net4j.messages;version="4.1.500";x-internal:=true, + org.eclipse.emf.cdo.internal.net4j.protocol;version="4.1.500"; x-friends:="org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.examples", - org.eclipse.emf.cdo.net4j;version="4.1.400" + org.eclipse.emf.cdo.net4j;version="4.1.500" Bundle-ActivationPolicy: lazy diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java index acf0b462c9..3f84e0d70f 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java @@ -69,26 +69,24 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com private static long sleepMillisForTesting = 0L; - private CDOIDProvider idProvider; // CDOTransaction + private final int commitNumber; - private int commitNumber; + private final String commitComment; - private String commitComment; + private final CDOCommitData commitData; - private boolean releaseLocks; + private final Collection<CDOLob<?>> lobs; - private CDOCommitData commitData; + private final Collection<CDOLockState> locksOnNewObjects; - private Collection<CDOLob<?>> lobs; + private final Collection<CDOID> idsToUnlock; - private Collection<CDOLockState> locksOnNewObjects; - - private int viewID; + private final int viewID; /** * Is <code>null</code> in {@link CommitDelegationRequest}. */ - private InternalCDOTransaction transaction; + private final InternalCDOTransaction transaction; private boolean clearResourcePathCache; @@ -100,20 +98,23 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com public CommitTransactionRequest(CDOClientProtocol protocol, short signalID, InternalCDOCommitContext context) { super(protocol, signalID); - transaction = context.getTransaction(); + CommitToken commitToken = transaction.getCommitToken(); if (commitToken != null) { commitNumber = commitToken.getCommitNumber(); } + else + { + commitNumber = 0; + } commitComment = context.getCommitComment(); - releaseLocks = context.isAutoReleaseLocks(); - idProvider = context.getTransaction(); commitData = context.getCommitData(); lobs = context.getLobs(); locksOnNewObjects = context.getLocksOnNewObjects(); + idsToUnlock = context.getIDsToUnlock(); viewID = context.getViewID(); } @@ -127,7 +128,7 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com @Override protected CDOIDProvider getIDProvider() { - return idProvider; + return transaction; } @Override @@ -150,33 +151,43 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com List<CDOIDAndVersion> detachedObjects = commitData.getDetachedObjects(); out.writeLong(getLastUpdateTime()); - out.writeBoolean(releaseLocks); out.writeInt(commitNumber); out.writeString(commitComment); - out.writeInt(newPackageUnits.size()); out.writeInt(locksOnNewObjects.size()); + out.writeInt(idsToUnlock.size()); + out.writeInt(newPackageUnits.size()); out.writeInt(newObjects.size()); out.writeInt(changedObjects.size()); out.writeInt(detachedObjects.size()); if (TRACER.isEnabled()) { - TRACER.format("Writing {0} new package units", newPackageUnits.size()); //$NON-NLS-1$ + TRACER.format("Writing {0} locks on new objects", locksOnNewObjects.size()); //$NON-NLS-1$ } - for (CDOPackageUnit newPackageUnit : newPackageUnits) + for (CDOLockState lockState : locksOnNewObjects) { - out.writeCDOPackageUnit(newPackageUnit, true); + out.writeCDOLockState(lockState); } if (TRACER.isEnabled()) { - TRACER.format("Writing {0} locks on new objects", locksOnNewObjects.size()); //$NON-NLS-1$ + TRACER.format("Writing {0} unlocks on changed objects", idsToUnlock.size()); //$NON-NLS-1$ } - for (CDOLockState lockState : locksOnNewObjects) + for (CDOID id : idsToUnlock) { - out.writeCDOLockState(lockState); + out.writeCDOID(id); + } + + if (TRACER.isEnabled()) + { + TRACER.format("Writing {0} new package units", newPackageUnits.size()); //$NON-NLS-1$ + } + + for (CDOPackageUnit newPackageUnit : newPackageUnits) + { + out.writeCDOPackageUnit(newPackageUnit, true); } if (TRACER.isEnabled()) @@ -319,7 +330,7 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com } CommitTransactionResult result = new CommitTransactionResult(); - result.setIDProvider(idProvider); + result.setIDProvider(transaction); result.setClearResourcePathCache(clearResourcePathCache); result.setRollbackReason(in.readByte()); result.setRollbackMessage(in.readString()); @@ -345,7 +356,7 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com protected CommitTransactionResult confirmingResult(CDODataInput in) throws IOException { CommitTransactionResult result = new CommitTransactionResult(); - result.setIDProvider(idProvider); + result.setIDProvider(transaction); result.setClearResourcePathCache(clearResourcePathCache); result.setBranchPoint(in.readCDOBranchPoint()); result.setPreviousTimeStamp(in.readLong()); diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF index bdab554bc5..be3924ee4b 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server.hibernate;singleton:=true -Bundle-Version: 4.2.300.qualifier +Bundle-Version: 4.2.400.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -14,11 +14,11 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", org.eclipse.emf.cdo.common;bundle-version="[4.0.0,5.0.0)", org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport, org.eclipse.net4j.db;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.server.hibernate;version="4.2.300", - org.eclipse.emf.cdo.server.internal.hibernate;version="4.2.300";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate", - org.eclipse.emf.cdo.server.internal.hibernate.bundle;version="4.2.300";x-internal:=true, - org.eclipse.emf.cdo.server.internal.hibernate.info;version="4.2.300";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate", - org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;version="4.2.300";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate" +Export-Package: org.eclipse.emf.cdo.server.hibernate;version="4.2.400", + org.eclipse.emf.cdo.server.internal.hibernate;version="4.2.400";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate", + org.eclipse.emf.cdo.server.internal.hibernate.bundle;version="4.2.400";x-internal:=true, + org.eclipse.emf.cdo.server.internal.hibernate.info;version="4.2.400";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate", + org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;version="4.2.400";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate" Import-Package: org.apache.log4j;version="[1.2.0,2.0.0)", org.eclipse.emf.teneo;version="[2.0.1,3.0.0)", org.eclipse.emf.teneo.annotations.mapper;version="[2.0.1,3.0.0)", diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java index ee8b86b579..6692fb2f87 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java @@ -125,6 +125,7 @@ public class HibernateRawCommitContext implements InternalCommitContext { } + @Deprecated public boolean isAutoReleaseLocksEnabled() { return false; @@ -160,6 +161,11 @@ public class HibernateRawCommitContext implements InternalCommitContext return null; } + public CDOID[] getIDsToUnlock() + { + return null; + } + public InternalCDORevision[] getNewObjects() { return newObjects.toArray(new InternalCDORevision[0]); @@ -303,6 +309,10 @@ public class HibernateRawCommitContext implements InternalCommitContext { } + public void setIDsToUnlock(CDOID[] idsToUnlock) + { + } + public void setNewObjects(InternalCDORevision[] newObjects) { } @@ -327,6 +337,7 @@ public class HibernateRawCommitContext implements InternalCommitContext { } + @Deprecated public void setAutoReleaseLocksEnabled(boolean on) { } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF index 048d55afcd..9254099351 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server.net4j;singleton:=true -Bundle-Version: 4.1.300.qualifier +Bundle-Version: 4.1.400.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -12,6 +12,6 @@ Bundle-ClassPath: . Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional, org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport, org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.1.300";x-internal:=true, - org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.1.300";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.server.net4j;version="4.1.300" +Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.1.400";x-internal:=true, + org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.1.400";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.server.net4j;version="4.1.400" diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java index 0b38c4471c..facc99bf1f 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java @@ -126,19 +126,44 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori commitContext.preWrite(); long lastUpdateTime = in.readLong(); - boolean autoReleaseLocksEnabled = in.readBoolean(); int commitNumber = in.readInt(); String commitComment = in.readString(); - InternalCDOPackageUnit[] newPackageUnits = new InternalCDOPackageUnit[in.readInt()]; CDOLockState[] locksOnNewObjects = new CDOLockState[in.readInt()]; + CDOID[] idsToUnlock = new CDOID[in.readInt()]; + InternalCDOPackageUnit[] newPackageUnits = new InternalCDOPackageUnit[in.readInt()]; InternalCDORevision[] newObjects = new InternalCDORevision[in.readInt()]; InternalCDORevisionDelta[] dirtyObjectDeltas = new InternalCDORevisionDelta[in.readInt()]; CDOID[] detachedObjects = new CDOID[in.readInt()]; - monitor.begin(newPackageUnits.length + newObjects.length + dirtyObjectDeltas.length + detachedObjects.length); + monitor.begin(locksOnNewObjects.length + idsToUnlock.length + newPackageUnits.length + newObjects.length + + dirtyObjectDeltas.length + detachedObjects.length); try { + // Locks on new objects + if (TRACER.isEnabled()) + { + TRACER.format("Reading {0} locks on new objects", locksOnNewObjects.length); //$NON-NLS-1$ + } + + for (int i = 0; i < locksOnNewObjects.length; i++) + { + locksOnNewObjects[i] = in.readCDOLockState(); + monitor.worked(); + } + + // Unlocks on changed objects + if (TRACER.isEnabled()) + { + TRACER.format("Reading {0} IDs to unlock", idsToUnlock.length); //$NON-NLS-1$ + } + + for (int i = 0; i < idsToUnlock.length; i++) + { + idsToUnlock[i] = in.readCDOID(); + monitor.worked(); + } + // New package units if (TRACER.isEnabled()) { @@ -161,18 +186,6 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori EMFUtil.safeResolveAll(resourceSet); } - // Locks on new objects - if (TRACER.isEnabled()) - { - TRACER.format("Reading {0} locks on new objects", locksOnNewObjects.length); //$NON-NLS-1$ - } - - for (int i = 0; i < locksOnNewObjects.length; i++) - { - locksOnNewObjects[i] = in.readCDOLockState(); - monitor.worked(); - } - // New objects if (TRACER.isEnabled()) { @@ -274,7 +287,6 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori commitContext.setCommitNumber(commitNumber); commitContext.setLastUpdateTime(lastUpdateTime); - commitContext.setAutoReleaseLocksEnabled(autoReleaseLocksEnabled); commitContext.setClearResourcePathCache(clearResourcePathCache); commitContext.setUsingEcore(usingEcore); commitContext.setUsingEtypes(usingEtypes); @@ -287,6 +299,8 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori commitContext.setDetachedObjectVersions(detachedObjectVersions); commitContext.setCommitComment(commitComment); commitContext.setLobs(getIndicationStream()); + commitContext.setLocksOnNewObjects(locksOnNewObjects); + commitContext.setIDsToUnlock(idsToUnlock); } finally { diff --git a/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF index 8a287f1d7e..3e0cb2e804 100644 --- a/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server;singleton:=true -Bundle-Version: 4.5.0.qualifier +Bundle-Version: 4.6.0.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,18 +10,18 @@ Bundle-Activator: org.eclipse.emf.cdo.internal.server.bundle.OM$Activator Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ClassPath: . Require-Bundle: org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.internal.server;version="4.5.0"; +Export-Package: org.eclipse.emf.cdo.internal.server;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.server.db, org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.workspace, org.eclipse.emf.cdo.server.hibernate", - org.eclipse.emf.cdo.internal.server.bundle;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.server.embedded;version="4.5.0";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.server.mem;version="4.5.0";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.server.messages;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.server.syncing;version="4.5.0";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.server;version="4.5.0", - org.eclipse.emf.cdo.server.embedded;version="4.5.0", - org.eclipse.emf.cdo.server.mem;version="4.5.0", - org.eclipse.emf.cdo.spi.server;version="4.5.0" + org.eclipse.emf.cdo.internal.server.bundle;version="4.6.0";x-internal:=true, + org.eclipse.emf.cdo.internal.server.embedded;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.internal.server.mem;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.internal.server.messages;version="4.6.0";x-internal:=true, + org.eclipse.emf.cdo.internal.server.syncing;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.server;version="4.6.0", + org.eclipse.emf.cdo.server.embedded;version="4.6.0", + org.eclipse.emf.cdo.server.mem;version="4.6.0", + org.eclipse.emf.cdo.spi.server;version="4.6.0" diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java index a6872ffee7..bf696c809f 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java @@ -61,11 +61,6 @@ public abstract class DelegatingCommitContext implements IStoreAccessor.CommitCo return getDelegate().getCommitComment(); } - public boolean isAutoReleaseLocksEnabled() - { - return getDelegate().isAutoReleaseLocksEnabled(); - } - public InternalCDOPackageRegistry getPackageRegistry() { return getDelegate().getPackageRegistry(); @@ -136,11 +131,22 @@ public abstract class DelegatingCommitContext implements IStoreAccessor.CommitCo return getDelegate().isUsingEtypes(); } + @Deprecated + public boolean isAutoReleaseLocksEnabled() + { + return getDelegate().isAutoReleaseLocksEnabled(); + } + public CDOLockState[] getLocksOnNewObjects() { return getDelegate().getLocksOnNewObjects(); } + public CDOID[] getIDsToUnlock() + { + return getDelegate().getIDsToUnlock(); + } + public CDOBranchVersion[] getDetachedObjectVersions() { return getDelegate().getDetachedObjectVersions(); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java index 5163a45593..b20e5a377b 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java @@ -78,6 +78,7 @@ import org.eclipse.net4j.util.CheckUtil; import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.collection.IndexedList; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; +import org.eclipse.net4j.util.concurrent.RWOLockManager; import org.eclipse.net4j.util.concurrent.RWOLockManager.LockState; import org.eclipse.net4j.util.io.ExtendedDataInputStream; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; @@ -92,7 +93,6 @@ import org.eclipse.emf.ecore.EStructuralFeature; import java.text.MessageFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -147,8 +147,6 @@ public class TransactionCommitContext implements InternalCommitContext private InternalCDOPackageUnit[] newPackageUnits = new InternalCDOPackageUnit[0]; - private CDOLockState[] locksOnNewObjects = new CDOLockState[0]; - private InternalCDORevision[] newObjects = new InternalCDORevision[0]; private InternalCDORevisionDelta[] dirtyObjectDeltas = new InternalCDORevisionDelta[0]; @@ -179,7 +177,7 @@ public class TransactionCommitContext implements InternalCommitContext private List<CDOIDReference> xRefs; - private List<LockState<Object, IView>> postCommitLockStates; + private final List<LockState<Object, IView>> postCommitLockStates = new ArrayList<LockState<Object, IView>>(); private boolean hasChanges; @@ -187,10 +185,12 @@ public class TransactionCommitContext implements InternalCommitContext private boolean ensuringReferentialIntegrity; - private boolean autoReleaseLocksEnabled; - private ExtendedDataInputStream lobs; + private CDOLockState[] locksOnNewObjects = new CDOLockState[0]; + + private CDOID[] idsToUnlock = new CDOID[0]; + private Map<Object, Object> data; private CommitNotificationInfo commitNotificationInfo = new CommitNotificationInfo(); @@ -238,11 +238,6 @@ public class TransactionCommitContext implements InternalCommitContext return lastUpdateTime; } - public boolean isAutoReleaseLocksEnabled() - { - return autoReleaseLocksEnabled; - } - public byte getRollbackReason() { return rollbackReason; @@ -294,11 +289,6 @@ public class TransactionCommitContext implements InternalCommitContext return newPackageUnits; } - public CDOLockState[] getLocksOnNewObjects() - { - return locksOnNewObjects; - } - public InternalCDORevision[] getNewObjects() { return newObjects; @@ -526,11 +516,6 @@ public class TransactionCommitContext implements InternalCommitContext this.newPackageUnits = newPackageUnits; } - public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects) - { - this.locksOnNewObjects = locksOnNewObjects; - } - public void setNewObjects(InternalCDORevision[] newObjects) { this.newObjects = newObjects; @@ -561,11 +546,6 @@ public class TransactionCommitContext implements InternalCommitContext this.lastUpdateTime = lastUpdateTime; } - public void setAutoReleaseLocksEnabled(boolean on) - { - autoReleaseLocksEnabled = on; - } - public void setCommitNumber(int commitNumber) { this.commitNumber = commitNumber; @@ -586,6 +566,38 @@ public class TransactionCommitContext implements InternalCommitContext lobs = in; } + @Deprecated + public boolean isAutoReleaseLocksEnabled() + { + return false; + } + + @Deprecated + public void setAutoReleaseLocksEnabled(boolean on) + { + // Do nothing. + } + + public CDOLockState[] getLocksOnNewObjects() + { + return locksOnNewObjects; + } + + public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects) + { + this.locksOnNewObjects = locksOnNewObjects; + } + + public CDOID[] getIDsToUnlock() + { + return idsToUnlock; + } + + public void setIDsToUnlock(CDOID[] idsToUnlock) + { + this.idsToUnlock = idsToUnlock; + } + public <T> T getData(Object key) { if (data == null) @@ -1107,50 +1119,6 @@ public class TransactionCommitContext implements InternalCommitContext } } - protected synchronized void unlockObjects() - { - // Unlock objects locked during commit - if (!lockedObjects.isEmpty()) - { - lockManager.unlock2(LockType.WRITE, transaction, lockedObjects); - lockedObjects.clear(); - } - - // Release durable locks that have been acquired on detached objects - if (detachedObjects.length > 0) - { - boolean branching = repository.isSupportingBranches(); - Collection<? extends Object> unlockables; - if (branching) - { - List<CDOIDAndBranch> keys = new ArrayList<CDOIDAndBranch>(detachedObjects.length); - for (CDOID id : detachedObjects) - { - CDOIDAndBranch idAndBranch = CDOIDUtil.createIDAndBranch(id, branch); - keys.add(idAndBranch); - } - - unlockables = keys; - } - else - { - unlockables = Arrays.asList(detachedObjects); - } - - // We only need to consider detached objects that have been explicitly locked - Collection<Object> detachedObjectsToUnlock = new ArrayList<Object>(); - for (Object unlockable : unlockables) - { - if (lockManager.hasLock(LockType.WRITE, transaction, unlockable)) - { - detachedObjectsToUnlock.add(unlockable); - } - } - - lockManager.unlock2(true, LockType.WRITE, transaction, detachedObjectsToUnlock, false); - } - } - protected void computeDirtyObjects(OMMonitor monitor) { try @@ -1355,7 +1323,7 @@ public class TransactionCommitContext implements InternalCommitContext } } - unlockObjects(); + releaseImplicitLocks(); } } @@ -1374,24 +1342,22 @@ public class TransactionCommitContext implements InternalCommitContext addRevisions(dirtyObjects, monitor.fork()); reviseDetachedObjects(monitor.fork()); - unlockObjects(); + releaseImplicitLocks(); monitor.worked(); - applyLocksOnNewObjects(); + acquireLocksOnNewObjects(); monitor.worked(); - if (autoReleaseLocksEnabled) + autoReleaseExplicitLocks(); + monitor.worked(); + + if (!postCommitLockStates.isEmpty()) { - postCommitLockStates = lockManager.unlock2(true, transaction); - if (!postCommitLockStates.isEmpty()) - { - // TODO (CD) Does doing this here make sense? - // The commit notifications get sent later, from postCommit. - sendLockNotifications(postCommitLockStates); - } + // TODO (CD) Does doing this here make sense? + // The commit notifications get sent later, from postCommit. + sendLockNotifications(postCommitLockStates); } - monitor.worked(); repository.notifyWriteAccessHandlers(transaction, this, false, monitor.fork()); } catch (Throwable t) @@ -1404,15 +1370,26 @@ public class TransactionCommitContext implements InternalCommitContext } } - protected void applyLocksOnNewObjects() throws InterruptedException + protected synchronized void releaseImplicitLocks() + { + // Unlock objects locked during commit + if (!lockedObjects.isEmpty()) + { + lockManager.unlock2(LockType.WRITE, transaction, lockedObjects); + lockedObjects.clear(); + } + } + + protected void acquireLocksOnNewObjects() throws InterruptedException { final CDOLockOwner owner = CDOLockUtil.createLockOwner(transaction); + final boolean mapIDs = transaction.getRepository().getIDGenerationLocation() == IDGenerationLocation.STORE; for (CDOLockState lockState : locksOnNewObjects) { Object target = lockState.getLockedObject(); - if (transaction.getRepository().getIDGenerationLocation() == IDGenerationLocation.STORE) + if (mapIDs) { CDOIDAndBranch idAndBranch = target instanceof CDOIDAndBranch ? (CDOIDAndBranch)target : null; CDOID id = idAndBranch != null ? ((CDOIDAndBranch)target).getID() : (CDOID)target; @@ -1422,13 +1399,60 @@ public class TransactionCommitContext implements InternalCommitContext target = idAndBranch != null ? CDOIDUtil.createIDAndBranch(newID, idAndBranch.getBranch()) : newID; } + LockState<Object, IView> postCommitLockState = null; for (LockType type : LockType.values()) { if (lockState.isLocked(type, owner, false)) { - lockManager.lock2(type, transaction, Collections.singleton(target), 0); + List<LockState<Object, IView>> lockStates = lockManager.lock2(type, transaction, + Collections.singleton(target), 0); + postCommitLockState = lockStates.get(0); } } + + if (postCommitLockState != null) + { + postCommitLockStates.add(postCommitLockState); + } + } + } + + protected void autoReleaseExplicitLocks() throws InterruptedException + { + List<Object> targets = new ArrayList<Object>(); + + // Release locks that have been sent from the client. + for (CDOID id : idsToUnlock) + { + Object target = lockManager.getLockKey(id, branch); + targets.add(target); + } + + // Release durable locks that have been acquired on detached objects. + for (CDOID id : detachedObjects) + { + Object target = lockManager.getLockKey(id, branch); + if (lockManager.hasLock(LockType.WRITE, transaction, target)) + { + // We only need to consider detached objects that have been explicitly locked + targets.add(target); + } + } + + try + { + RWOLockManager.setUnlockAll(true); + + List<LockState<Object, IView>> lockStates = lockManager.unlock2(true, LockType.WRITE, transaction, targets, + false); + if (lockStates != null) + { + postCommitLockStates.addAll(lockStates); + } + } + finally + { + RWOLockManager.setUnlockAll(false); } } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java index 0151075080..2ddb48c2e3 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java @@ -1022,13 +1022,6 @@ public abstract class SynchronizableRepository extends Repository.Default implem throw new UnsupportedOperationException(); } - public Collection<CDOLockState> getLocksOnNewObjects() - { - CDOLockState[] locksOnNewObjectsArr = WriteThroughCommitContext.this.getLocksOnNewObjects(); - Collection<CDOLockState> locksOnNewObjects = Arrays.asList(locksOnNewObjectsArr); - return locksOnNewObjects; - } - public Collection<CDOLob<?>> getLobs() { return Collections.emptySet(); // TODO (CD) Did we forget to support this earlier? @@ -1074,11 +1067,24 @@ public abstract class SynchronizableRepository extends Repository.Default implem return WriteThroughCommitContext.this.getUserID(); } + @Deprecated public boolean isAutoReleaseLocks() { return WriteThroughCommitContext.this.isAutoReleaseLocksEnabled(); } + public Collection<CDOLockState> getLocksOnNewObjects() + { + CDOLockState[] locksOnNewObjectsArray = WriteThroughCommitContext.this.getLocksOnNewObjects(); + return Arrays.asList(locksOnNewObjectsArray); + } + + public Collection<CDOID> getIDsToUnlock() + { + CDOID[] idsToUnlockArray = WriteThroughCommitContext.this.getIDsToUnlock(); + return Arrays.asList(idsToUnlockArray); + } + public String getCommitComment() { return WriteThroughCommitContext.this.getCommitComment(); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java index 332a01f1da..1d4f132e69 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java @@ -312,11 +312,6 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com public long getLastUpdateTime(); /** - * @since 3.0 - */ - public boolean isAutoReleaseLocksEnabled(); - - /** * Returns the temporary, transactional package manager associated with the commit operation represented by this * <code>CommitContext</code>. In addition to the packages registered with the session this package manager also * contains the new packages that are part of this commit operation. @@ -350,14 +345,6 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com public InternalCDOPackageUnit[] getNewPackageUnits(); /** - * Returns an array of the locks on the new objects that are part of the commit operation represented by this - * <code>CommitContext</code>. - * - * @since 4.1 - */ - public CDOLockState[] getLocksOnNewObjects(); - - /** * Returns an array of the new objects that are part of the commit operation represented by this * <code>CommitContext</code>. */ @@ -420,6 +407,27 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com public ExtendedDataInputStream getLobs(); /** + * + * @since 3.0 + * @deprecated As of 4.5 no longer supported. See {@link #getIDsToUnlock()}. + */ + @Deprecated + public boolean isAutoReleaseLocksEnabled(); + + /** + * Returns an array of the locks on the new objects that are part of the commit operation represented by this + * <code>CommitContext</code>. + * + * @since 4.1 + */ + public CDOLockState[] getLocksOnNewObjects(); + + /** + * @since 4.6 + */ + public CDOID[] getIDsToUnlock(); + + /** * Returns an unmodifiable map from all temporary IDs to their persistent counter parts. */ public Map<CDOID, CDOID> getIDMappings(); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java index 786f3af1e3..fd885b81a5 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java @@ -118,11 +118,6 @@ public interface InternalCommitContext extends IStoreAccessor.CommitContext, CDO public void setNewPackageUnits(InternalCDOPackageUnit[] newPackageUnits); - /** - * @since 4.1 - */ - public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects); - public void setNewObjects(InternalCDORevision[] newObjects); public void setDirtyObjectDeltas(InternalCDORevisionDelta[] dirtyObjectDeltas); @@ -144,9 +139,23 @@ public interface InternalCommitContext extends IStoreAccessor.CommitContext, CDO */ public void setLastUpdateTime(long lastUpdateTime); + /** + * @deprecated As of 4.5 no longer supported. See {@link #setIDsToUnlock(CDOID[])}. + */ + @Deprecated public void setAutoReleaseLocksEnabled(boolean on); /** + * @since 4.1 + */ + public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects); + + /** + * @since 4.6 + */ + public void setIDsToUnlock(CDOID[] idsToUnlock); + + /** * @since 4.5 */ public void setCommitNumber(int commitNumber); diff --git a/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF index 51fdfbfdf2..79959cf1d4 100644 --- a/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.tests;singleton:=true -Bundle-Version: 4.0.500.qualifier +Bundle-Version: 4.0.600.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -47,18 +47,18 @@ Export-Package: base;version="4.0.200", interface_;version="4.0.200", interface_.impl;version="4.0.200", interface_.util;version="4.0.200", - org.eclipse.emf.cdo.tests;version="4.0.500", - org.eclipse.emf.cdo.tests.bugzilla;version="4.0.500", - org.eclipse.emf.cdo.tests.bundle;version="4.0.500";x-internal:=true, - org.eclipse.emf.cdo.tests.config;version="4.0.500", - org.eclipse.emf.cdo.tests.config.impl;version="4.0.500", - org.eclipse.emf.cdo.tests.defs;version="4.0.500", - org.eclipse.emf.cdo.tests.extra;version="4.0.500", - org.eclipse.emf.cdo.tests.offline;version="4.0.500", - org.eclipse.emf.cdo.tests.performance;version="4.0.500", - org.eclipse.emf.cdo.tests.performance.framework;version="4.0.500", - org.eclipse.emf.cdo.tests.revisioncache;version="4.0.500", - org.eclipse.emf.cdo.tests.util;version="4.0.500", + org.eclipse.emf.cdo.tests;version="4.0.600", + org.eclipse.emf.cdo.tests.bugzilla;version="4.0.600", + org.eclipse.emf.cdo.tests.bundle;version="4.0.600";x-internal:=true, + org.eclipse.emf.cdo.tests.config;version="4.0.600", + org.eclipse.emf.cdo.tests.config.impl;version="4.0.600", + org.eclipse.emf.cdo.tests.defs;version="4.0.600", + org.eclipse.emf.cdo.tests.extra;version="4.0.600", + org.eclipse.emf.cdo.tests.offline;version="4.0.600", + org.eclipse.emf.cdo.tests.performance;version="4.0.600", + org.eclipse.emf.cdo.tests.performance.framework;version="4.0.600", + org.eclipse.emf.cdo.tests.revisioncache;version="4.0.600", + org.eclipse.emf.cdo.tests.util;version="4.0.600", reference;version="4.0.200", reference.impl;version="4.0.200"; x-friends:="org.eclipse.emf.cdo.dawn.tests, diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java index 0746b51808..775239a919 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java @@ -1255,7 +1255,7 @@ public class LockingManagerTest extends AbstractLockingTest assertEquals(false, CDOUtil.getCDOObject(category2).cdoWriteLock().isLocked()); // Implicit locks always released } - public void testAutoReleaseLocksOnChangedObject() throws Exception + public void testAutoReleaseExplicitLocks() throws Exception { Company company = getModel1Factory().createCompany(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java index d5a46ec911..c484fbc925 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java @@ -309,8 +309,10 @@ public class LockingNotificationsTest extends AbstractLockingTest CDOTransaction tx1 = session1.openTransaction(); tx1.options().setAutoReleaseLocksEnabled(true); + CDOResource res1 = tx1.getOrCreateResource(getResourcePath("r1")); res1.getContents().clear(); + Company company = getModel1Factory().createCompany(); res1.getContents().add(company); tx1.commit(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java index bdebdba5b6..6721079c85 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java @@ -63,6 +63,14 @@ public class SessionTest extends AbstractCDOTest private static final char[] PASSWORD2 = "invalid".toCharArray(); //$NON-NLS-1$ + @Override + public void setUp() throws Exception + { + super.setUp(); + enableConsole(); + + } + public void testIsSupportingAudits() throws Exception { CDOSession session = openSession(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355045_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355045_Test.java new file mode 100644 index 0000000000..fad9c66cd3 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355045_Test.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2004 - 2012 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Esteban Dugueperoux - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.CDOState; +import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode; +import org.eclipse.emf.cdo.common.lock.CDOLockState; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.model1.Category; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; + +import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; + +import org.junit.Assert; + +import java.util.Collections; + +/** + * @author Esteban Dugueperoux + */ +public class Bugzilla_355045_Test extends AbstractCDOTest +{ + private static final String RESOURCE_PATH = "/test1"; + + private CDOTransaction transaction; + + private Company company; + + private Category category1; + + @Override + public void setUp() throws Exception + { + super.setUp(); + CDOSession cdoSession = openSession(); + cdoSession.options().setLockNotificationMode(LockNotificationMode.ALWAYS); + transaction = cdoSession.openTransaction(); + // cdoTransaction.options().setAutoReleaseLocksEnabled(false); + CDOResource cdoResource = transaction.createResource(getResourcePath(RESOURCE_PATH)); + + company = getModel1Factory().createCompany(); + category1 = getModel1Factory().createCategory(); + company.getCategories().add(category1); + + cdoResource.getContents().add(company); + cdoResource.save(Collections.emptyMap()); + } + + public void testLockOnCommitOfSingleNewObject() throws Exception + { + Category category2 = getModel1Factory().createCategory(); + category2.setName("category2"); + category1.getCategories().add(category2); + + transaction.lockObjects(CDOUtil.getCDOObjects(category2), LockType.WRITE, DEFAULT_TIMEOUT); + transaction.options().addAutoReleaseLocksExemptions(true, category2); + assertLockStatus(category2, true, false); + + transaction.commit(); + assertEquals(CDOState.CLEAN, CDOUtil.getCDOObject(category2).cdoState()); + assertLockStatus(category2, true, false); + } + + public void testRecursiveLockOnCommitOfNewObjectsTree() throws Exception + { + Category category2 = getModel1Factory().createCategory(); + category2.setName("category2"); + Category category4 = getModel1Factory().createCategory(); + category4.setName("category4"); + Category category5 = getModel1Factory().createCategory(); + category5.setName("category5"); + Category category6 = getModel1Factory().createCategory(); + category6.setName("category6"); + Category category7 = getModel1Factory().createCategory(); + category7.setName("category7"); + + category2.getCategories().add(category4); + category2.getCategories().add(category5); + category4.getCategories().add(category6); + category5.getCategories().add(category7); + category1.getCategories().add(category2); + + Category category3 = getModel1Factory().createCategory(); + category3.setName("category3"); + Category category8 = getModel1Factory().createCategory(); + category8.setName("category8"); + Category category9 = getModel1Factory().createCategory(); + category9.setName("category9"); + Category category10 = getModel1Factory().createCategory(); + category10.setName("category10"); + Category category11 = getModel1Factory().createCategory(); + category11.setName("category11"); + + category3.getCategories().add(category8); + category3.getCategories().add(category9); + category8.getCategories().add(category10); + category9.getCategories().add(category11); + category1.getCategories().add(category3); + + transaction.lockObjects(CDOUtil.getCDOObjects(category2), LockType.WRITE, DEFAULT_TIMEOUT, true); + transaction.options().addAutoReleaseLocksExemptions(true, category2); + + assertLockStatus(category1, false, false); + assertLockStatus(category2, true, true); + assertLockStatus(category3, false, true); + + transaction.lockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE, DEFAULT_TIMEOUT, true); + transaction.options().addAutoReleaseLocksExemptions(true, category3); + + assertLockStatus(category1, false, false); + assertLockStatus(category2, true, true); + assertLockStatus(category3, true, true); + + transaction.unlockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE); + + assertLockStatus(category1, false, false); + assertLockStatus(category2, true, true); + assertLockStatus(category3, false, false); + assertLockStatus(category8, true, true); + assertLockStatus(category9, true, true); + + transaction.commit(); + + assertLockStatus(category1, false, false); + assertLockStatus(category2, true, true); + assertLockStatus(category3, false, false); + assertLockStatus(category8, true, true); + assertLockStatus(category9, true, true); + } + + public void testRecursiveLockOfObjectsTreeContainingASubTreeOfNewObjects() throws Exception + { + Category category2 = getModel1Factory().createCategory(); + category2.setName("category2"); + Category category4 = getModel1Factory().createCategory(); + category4.setName("category4"); + Category category5 = getModel1Factory().createCategory(); + category5.setName("category5"); + Category category6 = getModel1Factory().createCategory(); + category6.setName("category6"); + Category category7 = getModel1Factory().createCategory(); + category7.setName("category7"); + + category2.getCategories().add(category4); + category2.getCategories().add(category5); + category4.getCategories().add(category6); + category5.getCategories().add(category7); + category1.getCategories().add(category2); + + Category category3 = getModel1Factory().createCategory(); + category3.setName("category3"); + Category category8 = getModel1Factory().createCategory(); + category8.setName("category8"); + Category category9 = getModel1Factory().createCategory(); + category9.setName("category9"); + Category category10 = getModel1Factory().createCategory(); + category10.setName("category10"); + Category category11 = getModel1Factory().createCategory(); + category11.setName("category11"); + + category3.getCategories().add(category8); + category3.getCategories().add(category9); + category8.getCategories().add(category10); + category9.getCategories().add(category11); + category1.getCategories().add(category3); + + transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true); + transaction.options().addAutoReleaseLocksExemptions(false, category1); + assertLockStatus(category1, true, false); + + transaction.commit(); + assertLockStatus(category1, true, false); + } + + private void assertLockStatus(Category category, boolean lockedByMe, boolean recursive) + { + CDOObject categoryCDOObject = CDOUtil.getCDOObject(category); + CDOLockState cdoLockState = categoryCDOObject.cdoLockState(); + Assert.assertEquals( + "new object " + category.getName() + + (lockedByMe ? " should be locally locked" : " shouldn't be locally locked"), + lockedByMe, cdoLockState.isLocked(LockType.WRITE, transaction, false)); + + if (recursive) + { + for (Category subCategory : category.getCategories()) + { + assertLockStatus(subCategory, lockedByMe, recursive); + } + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java new file mode 100644 index 0000000000..2a93570d3d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2004 - 2012 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Esteban Dugueperoux - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode; +import org.eclipse.emf.cdo.common.lock.CDOLockState; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.model1.Category; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; + +import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; +import org.eclipse.net4j.util.io.IOUtil; + +import java.util.Collections; +import java.util.List; + +/** + * @author Esteban Dugueperoux + */ +public class Bugzilla_387563_Test extends AbstractCDOTest +{ + private CDOTransaction transaction; + + private Company company; + + private Category category1; + + private Category category2; + + private Category category3; + + private Category category4; + + private Category category5; + + @Override + protected void doSetUp() throws Exception + { + super.doSetUp(); + + CDOSession session = openSession(); + session.options().setLockNotificationMode(LockNotificationMode.ALWAYS); + + transaction = session.openTransaction(); + // transaction.options().setAutoReleaseLocksEnabled(false); + + CDOResource resource = transaction.createResource(getResourcePath("test1")); + + category1 = getModel1Factory().createCategory(); + category1.setName("category1"); + + category2 = getModel1Factory().createCategory(); + category2.setName("category2"); + + category3 = getModel1Factory().createCategory(); + category3.setName("category3"); + + category4 = getModel1Factory().createCategory(); + category4.setName("category4"); + + category5 = getModel1Factory().createCategory(); + category5.setName("category5"); + + Category category6 = getModel1Factory().createCategory(); + category6.setName("category6"); + + Category category7 = getModel1Factory().createCategory(); + category7.setName("category7"); + + Category category8 = getModel1Factory().createCategory(); + category8.setName("category8"); + + Category category9 = getModel1Factory().createCategory(); + category9.setName("category9"); + + Category category10 = getModel1Factory().createCategory(); + category10.setName("category10"); + + Category category11 = getModel1Factory().createCategory(); + category11.setName("category11"); + + category1.getCategories().add(category2); + category1.getCategories().add(category3); + category2.getCategories().add(category4); + category2.getCategories().add(category5); + category3.getCategories().add(category8); + category3.getCategories().add(category9); + category4.getCategories().add(category6); + category5.getCategories().add(category7); + category8.getCategories().add(category10); + category9.getCategories().add(category11); + + company = getModel1Factory().createCompany(); + company.getCategories().add(category1); + + resource.getContents().add(company); + + log("", Collections.singletonList(category1)); + } + + public void testPartialLockOnCommit() throws Exception + { + transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true); + + // Mark all objects to stay locked on commit + transaction.options().addAutoReleaseLocksExemptions(true, category1); + assertLockStatus(category1, true, true); + + // Mark category2 to be unlocked on commit + transaction.options().removeAutoReleaseLocksExemptions(false, category2); + assertLockStatus(category1, true, true); + + // Mark category3 and its descendants to be unlocked on commit + transaction.options().removeAutoReleaseLocksExemptions(true, category3); + assertLockStatus(category1, true, true); + + transaction.commit(); + assertLockStatus(category1, true, false); + assertLockStatus(category2, false, false); + assertLockStatus(category3, false, true); + assertLockStatus(category4, true, true); + assertLockStatus(category5, true, true); + } + + public void testPartialUnlockOnCommit() throws Exception + { + transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true); + + // Mark category1 and its descendants to stay locked on commit + transaction.options().addAutoReleaseLocksExemptions(true, category1); + assertLockStatus(category1, true, true); + + transaction.unlockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE, true); + assertLockStatus(category3, false, true); + + transaction.commit(); + assertLockStatus(category1, true, false); + assertLockStatus(category2, true, true); + assertLockStatus(category3, false, true); + } + + private static void assertLockStatus(Category category, boolean expected, boolean recursive) + { + CDOObject cdoObject = CDOUtil.getCDOObject(category); + CDOLockState lockState = cdoObject.cdoLockState(); + + assertEquals( + "new object " + category.getName() + (expected ? " should be locally locked" : " shouldn't be locally locked."), + expected, lockState.isLocked(LockType.WRITE, cdoObject.cdoView(), false)); + + if (recursive) + { + for (Category subCategory : category.getCategories()) + { + assertLockStatus(subCategory, expected, recursive); + } + } + } + + private static void log(String indent, List<Category> categories) + { + for (Category category : categories) + { + IOUtil.OUT().println(indent + category.getName() + " --> " + CDOUtil.getCDOObject(category).cdoID()); + log(indent + " ", category.getCategories()); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563b_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563b_Test.java new file mode 100644 index 0000000000..31baf15857 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563b_Test.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.common.lock.CDOLockState; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractLockingTest; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; + +/** + * @author Eike Stepper + */ +public class Bugzilla_387563b_Test extends AbstractLockingTest +{ + public void testNoImplicitLockingOfNewObject() throws Exception + { + Company company = getModel1Factory().createCompany(); + + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + transaction.options().setAutoReleaseLocksEnabled(true); + + CDOResource resource = transaction.createResource(getResourcePath("test1")); + resource.getContents().add(company); + + CDOObject cdoObject = CDOUtil.getCDOObject(company); + CDOLockState lockState = cdoObject.cdoLockState(); + assertNull(lockState.getWriteLockOwner()); + + transaction.commit(); + assertWriteLock(false, company); + } + + public void testExplicitLockingOfNewObject() throws Exception + { + Company company = getModel1Factory().createCompany(); + + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + transaction.options().setAutoReleaseLocksEnabled(true); + + CDOResource resource = transaction.createResource(getResourcePath("test1")); + resource.getContents().add(company); + + CDOObject cdoObject = CDOUtil.getCDOObject(company); + cdoObject.cdoWriteLock().lock(); + + CDOLockState lockState = cdoObject.cdoLockState(); + assertEquals(transaction, lockState.getWriteLockOwner()); + + transaction.commit(); + assertWriteLock(false, company); + } + + public void testExplicitLockingOfNewObjectExemption() throws Exception + { + Company company = getModel1Factory().createCompany(); + + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + transaction.options().setAutoReleaseLocksEnabled(true); + transaction.options().addAutoReleaseLocksExemptions(false, company); + + CDOResource resource = transaction.createResource(getResourcePath("test1")); + resource.getContents().add(company); + + CDOObject cdoObject = CDOUtil.getCDOObject(company); + cdoObject.cdoWriteLock().lock(); + + CDOLockState lockState = cdoObject.cdoLockState(); + assertEquals(transaction, lockState.getWriteLockOwner()); + + transaction.commit(); + assertWriteLock(true, company); + } + + public void testExplicitLockingAndUnlockingOfNewObject() throws Exception + { + Company company = getModel1Factory().createCompany(); + + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + transaction.options().setAutoReleaseLocksEnabled(true); + transaction.options().addAutoReleaseLocksExemptions(false, company); + + CDOResource resource = transaction.createResource(getResourcePath("test1")); + resource.getContents().add(company); + + CDOObject cdoObject = CDOUtil.getCDOObject(company); + cdoObject.cdoWriteLock().lock(); + + CDOLockState lockState = cdoObject.cdoLockState(); + assertEquals(transaction, lockState.getWriteLockOwner()); + + cdoObject.cdoWriteLock().unlock(); + lockState = cdoObject.cdoLockState(); + assertNull(lockState.getWriteLockOwner()); + + transaction.commit(); + assertWriteLock(false, company); + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java index 0957d57d57..a6fcb011b5 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java @@ -28,8 +28,6 @@ import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; import org.eclipse.emf.ecore.util.EcoreUtil; -import org.junit.Assert; - import java.util.Collections; /** @@ -56,77 +54,78 @@ public class Bugzilla_466951_Test extends AbstractCDOTest ISignalProtocol<?> protocol = ((org.eclipse.emf.cdo.net4j.CDONet4jSession)session1).options().getNet4jProtocol(); SignalCounter signalCounter = new SignalCounter(protocol); - int nbLockStateRequest = signalCounter.getCountFor(LockStateRequest.class); - assertEquals(0, nbLockStateRequest); - - CDOObject companyCDOObject = CDOUtil.getCDOObject(company); - CDOLockState lockState = companyCDOObject.cdoLockState(); - Object expectedLockedObject = companyCDOObject.cdoID(); - if (session1.getRepositoryInfo().isSupportingBranches()) - { - expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch()); - } - - assertEquals(expectedLockedObject, lockState.getLockedObject()); - Assert.assertTrue(lockState.getReadLockOwners().isEmpty()); - assertNull(lockState.getWriteLockOwner()); - assertNull(lockState.getWriteOptionOwner()); - transaction1.lockObjects(Collections.singleton(companyCDOObject), LockType.WRITE, -1); - - lockState = companyCDOObject.cdoLockState(); - expectedLockedObject = companyCDOObject.cdoID(); - if (session1.getRepositoryInfo().isSupportingBranches()) + try { - expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch()); + assertEquals(0, signalCounter.removeCountFor(LockStateRequest.class)); + + CDOObject companyCDOObject = CDOUtil.getCDOObject(company); + CDOLockState lockState = companyCDOObject.cdoLockState(); + Object expectedLockedObject = companyCDOObject.cdoID(); + if (session1.getRepositoryInfo().isSupportingBranches()) + { + expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch()); + } + + assertEquals(expectedLockedObject, lockState.getLockedObject()); + assertTrue(lockState.getReadLockOwners().isEmpty()); + assertNull(lockState.getWriteLockOwner()); + assertNull(lockState.getWriteOptionOwner()); + + transaction1.lockObjects(Collections.singleton(companyCDOObject), LockType.WRITE, -1); + + lockState = companyCDOObject.cdoLockState(); + expectedLockedObject = companyCDOObject.cdoID(); + if (session1.getRepositoryInfo().isSupportingBranches()) + { + expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch()); + } + + assertEquals(expectedLockedObject, lockState.getLockedObject()); + assertTrue(lockState.getReadLockOwners().isEmpty()); + assertEquals(transaction1, lockState.getWriteLockOwner()); + assertNull(lockState.getWriteOptionOwner()); + + EcoreUtil.delete(company); + assertEquals(CDOState.TRANSIENT, companyCDOObject.cdoState()); + lockState = companyCDOObject.cdoLockState(); + assertNull(lockState); + + Company company2 = getModel1Factory().createCompany(); + resource1.getContents().add(company2); + + CDOObject companyCDOObject2 = CDOUtil.getCDOObject(company2); + lockState = companyCDOObject2.cdoLockState(); + expectedLockedObject = companyCDOObject2.cdoID(); + if (session1.getRepositoryInfo().isSupportingBranches()) + { + expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch()); + } + + assertEquals(expectedLockedObject, lockState.getLockedObject()); + assertTrue(lockState.getReadLockOwners().isEmpty()); + assertNull(lockState.getWriteLockOwner()); + assertNull(lockState.getWriteOptionOwner()); + assertEquals(0, signalCounter.removeCountFor(LockStateRequest.class)); + + transaction1.commit(); + + lockState = companyCDOObject2.cdoLockState(); + expectedLockedObject = companyCDOObject2.cdoID(); + if (session1.getRepositoryInfo().isSupportingBranches()) + { + expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch()); + } + + assertEquals(expectedLockedObject, lockState.getLockedObject()); + assertTrue(lockState.getReadLockOwners().isEmpty()); + assertNull(lockState.getWriteLockOwner()); + assertNull(lockState.getWriteOptionOwner()); + assertEquals(0, signalCounter.removeCountFor(LockStateRequest.class)); } - - assertEquals(expectedLockedObject, lockState.getLockedObject()); - Assert.assertTrue(lockState.getReadLockOwners().isEmpty()); - assertEquals(transaction1, lockState.getWriteLockOwner()); - assertNull(lockState.getWriteOptionOwner()); - - EcoreUtil.delete(company); - assertEquals(CDOState.TRANSIENT, companyCDOObject.cdoState()); - lockState = companyCDOObject.cdoLockState(); - assertNull(lockState); - - Company company2 = getModel1Factory().createCompany(); - resource1.getContents().add(company2); - - CDOObject companyCDOObject2 = CDOUtil.getCDOObject(company2); - lockState = companyCDOObject2.cdoLockState(); - expectedLockedObject = companyCDOObject2.cdoID(); - if (session1.getRepositoryInfo().isSupportingBranches()) + finally { - expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch()); + signalCounter.dispose(); } - - assertEquals(expectedLockedObject, lockState.getLockedObject()); - Assert.assertTrue(lockState.getReadLockOwners().isEmpty()); - assertNull(lockState.getWriteLockOwner()); - assertNull(lockState.getWriteOptionOwner()); - - nbLockStateRequest = signalCounter.getCountFor(LockStateRequest.class); - assertEquals(0, nbLockStateRequest); - - transaction1.commit(); - - lockState = companyCDOObject2.cdoLockState(); - expectedLockedObject = companyCDOObject2.cdoID(); - if (session1.getRepositoryInfo().isSupportingBranches()) - { - expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch()); - } - - assertEquals(expectedLockedObject, lockState.getLockedObject()); - Assert.assertTrue(lockState.getReadLockOwners().isEmpty()); - assertNull(lockState.getWriteLockOwner()); - assertNull(lockState.getWriteOptionOwner()); - - nbLockStateRequest = signalCounter.getCountFor(LockStateRequest.class); - assertEquals(0, nbLockStateRequest); - - protocol.removeListener(signalCounter); } } diff --git a/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF index fc258b6e14..575ed4ced0 100644 --- a/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.emf.cdo.ui;singleton:=true -Bundle-Version: 4.5.0.qualifier +Bundle-Version: 4.5.100.qualifier Bundle-Activator: org.eclipse.emf.cdo.internal.ui.bundle.OM$Activator Bundle-Vendor: %providerName Bundle-ClassPath: . @@ -27,7 +27,7 @@ Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)";reso org.eclipse.emf.ecp.edit;bundle-version="[1.5.0,2.0.0)";resolution:=optional, org.eclipse.emf.ecp.edit.swt;bundle-version="[1.5.0,2.0.0)";resolution:=optional, org.eclipse.emf.ecp.ui.view.swt;bundle-version="[1.5.0,2.0.0)";resolution:=optional -Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; +Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -37,7 +37,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.actions;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.actions;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -47,7 +47,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.handlers;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.handlers;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -57,9 +57,9 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.actions.delegates;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.ui.bundle;version="4.5.0";x-internal:=true, - org.eclipse.emf.cdo.internal.ui.dialogs;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.actions.delegates;version="4.5.100";x-internal:=true, + org.eclipse.emf.cdo.internal.ui.bundle;version="4.5.100";x-internal:=true, + org.eclipse.emf.cdo.internal.ui.dialogs;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -69,7 +69,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.dnd;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.dnd;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -79,7 +79,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.editor;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.editor;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -89,7 +89,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.filters;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.filters;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -99,7 +99,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.history;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.history;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -109,7 +109,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.messages;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.messages;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -119,7 +119,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.perspectives;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.perspectives;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -129,7 +129,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.preferences;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.preferences;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -139,7 +139,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.transfer;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.transfer;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -149,7 +149,7 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.internal.ui.views;version="4.5.0"; + org.eclipse.emf.cdo.internal.ui.views;version="4.5.100"; x-friends:="org.eclipse.emf.cdo.ui.defs, org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.ui.location, @@ -159,5 +159,5 @@ Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0"; org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.ui.team, org.eclipse.emf.cdo.ui.compare", - org.eclipse.emf.cdo.ui;version="4.5.0", - org.eclipse.emf.cdo.ui.widgets;version="4.5.0" + org.eclipse.emf.cdo.ui;version="4.5.100", + org.eclipse.emf.cdo.ui.widgets;version="4.5.100" diff --git a/plugins/org.eclipse.emf.cdo.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.ui/plugin.xml index 3f9cb46f1e..cdd6485193 100644 --- a/plugins/org.eclipse.emf.cdo.ui/plugin.xml +++ b/plugins/org.eclipse.emf.cdo.ui/plugin.xml @@ -411,7 +411,6 @@ </iterate> </with> </visibleWhen> - </command> <command commandId="org.eclipse.emf.cdo.ui.UnlockObject" diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java index 0af905748a..9966a073fd 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java @@ -30,7 +30,9 @@ import java.util.List; /** * @author Simon McDuff + * @deprecated As of 4.6 no longer supported. */ +@Deprecated public abstract class AbstractLockObjectsAction extends EditingDomainAction { private List<InternalCDOObject> objects = new ArrayList<InternalCDOObject>(); diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AutoReleaseLockExemptionAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AutoReleaseLockExemptionAction.java new file mode 100644 index 0000000000..794f1cf0a9 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AutoReleaseLockExemptionAction.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.internal.ui.actions; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.internal.ui.messages.Messages; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; + +import org.eclipse.emf.ecore.EObject; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.viewers.IStructuredSelection; + +/** + * @author Eike Stepper + */ +public class AutoReleaseLockExemptionAction extends EditingDomainAction +{ + public static final String ID = "AutoReleaseLockExemption"; //$NON-NLS-1$ + + private static final String TITLE = Messages.getString("AutoReleaseLockExemptionAction.1"); //$NON-NLS-1$ + + private CDOObject selectedObject; + + public AutoReleaseLockExemptionAction() + { + super(TITLE); + setId(ID); + } + + public void selectionChanged(IStructuredSelection selection) + { + selectedObject = null; + + if (selection != null && selection.size() == 1) + { + Object element = selection.getFirstElement(); + if (element instanceof EObject) + { + EObject object = (EObject)element; + selectedObject = CDOUtil.getCDOObject(object); + } + } + } + + public boolean init() + { + if (selectedObject != null && selectedObject.cdoWriteLock().isLocked()) + { + CDOTransaction transaction = (CDOTransaction)selectedObject.cdoView(); + setChecked(transaction.options().isAutoReleaseLocksExemption(selectedObject)); + return true; + } + + return false; + } + + @Override + public void update() + { + setEnabled(true); + } + + @Override + protected void doRun(IProgressMonitor progressMonitor) throws Exception + { + if (selectedObject != null) + { + CDOTransaction transaction = (CDOTransaction)selectedObject.cdoView(); + if (transaction.options().isAutoReleaseLocksExemption(selectedObject)) + { + transaction.options().removeAutoReleaseLocksExemptions(false, selectedObject); + } + else + { + transaction.options().addAutoReleaseLocksExemptions(false, selectedObject); + } + } + + update(); + } +} diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java index b42596924f..ff5c91113b 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java @@ -24,7 +24,9 @@ import org.eclipse.core.runtime.IProgressMonitor; * {@link CDOSession session}. * * @author Victor Roldan Betancort + * @deprecated As of 4.6 no longer supported. */ +@Deprecated public class ChangePassiveUpdateAction extends EditingDomainAction { public static final String ID = "change-passiveupdate"; //$NON-NLS-1$ diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java index b2be9b79c2..707ccb2b26 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java @@ -19,7 +19,9 @@ import org.eclipse.emf.spi.cdo.InternalCDOObject; /** * @author Simon McDuff + * @deprecated As of 4.6 no longer supported. */ +@Deprecated public class ReadLockObjectsAction extends AbstractLockObjectsAction { public static final String ID = "readlock-objects"; //$NON-NLS-1$ diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java index a96f14771d..3f418f7bc9 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java @@ -19,7 +19,9 @@ import org.eclipse.emf.spi.cdo.InternalCDOObject; /** * @author Simon McDuff + * @deprecated As of 4.6 no longer supported. */ +@Deprecated public class WriteLockObjectsAction extends AbstractLockObjectsAction { public static final String ID = "writelock-objects"; //$NON-NLS-1$ diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java index f5977d7f87..2e6e898465 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java @@ -12,12 +12,8 @@ package org.eclipse.emf.cdo.internal.ui.editor; import org.eclipse.emf.cdo.eresource.CDOResource; -import org.eclipse.emf.cdo.internal.ui.actions.ChangePassiveUpdateAction; +import org.eclipse.emf.cdo.internal.ui.actions.AutoReleaseLockExemptionAction; import org.eclipse.emf.cdo.internal.ui.actions.ImportRootsAction; -import org.eclipse.emf.cdo.internal.ui.actions.ReadLockObjectsAction; -import org.eclipse.emf.cdo.internal.ui.actions.WriteLockObjectsAction; -import org.eclipse.emf.cdo.internal.ui.messages.Messages; -import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.common.ui.viewer.IViewerProvider; import org.eclipse.emf.edit.domain.EditingDomain; @@ -76,17 +72,7 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i /** * @ADDED */ - protected ReadLockObjectsAction readLockObjectsAction; - - /** - * @ADDED - */ - protected WriteLockObjectsAction writeLockObjectsAction; - - /** - * @ADDED - */ - protected ChangePassiveUpdateAction changePassiveUpdateAction; + protected AutoReleaseLockExemptionAction autoReleaseLockExemptionAction; /** * This keeps track of the active editor. @@ -196,12 +182,7 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i loadResourceAction.setId(LOAD_RESOURCE_ID); importRootsAction = new ImportRootsAction(); - importRootsAction.setId(ImportRootsAction.ID); - - changePassiveUpdateAction = new ChangePassiveUpdateAction(); - - readLockObjectsAction = new ReadLockObjectsAction(); - writeLockObjectsAction = new WriteLockObjectsAction(); + autoReleaseLockExemptionAction = new AutoReleaseLockExemptionAction(); validateAction = new ValidateAction(); controlAction = new ControlAction(); @@ -375,18 +356,10 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { - if (readLockObjectsAction != null) - { - readLockObjectsAction.selectionChanged((IStructuredSelection)selection); - } - - if (writeLockObjectsAction != null) - { - writeLockObjectsAction.selectionChanged((IStructuredSelection)selection); - } - if (((IStructuredSelection)selection).size() == 1) { + autoReleaseLockExemptionAction.selectionChanged((IStructuredSelection)selection); + Object object = ((IStructuredSelection)selection).getFirstElement(); EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain(); @@ -394,16 +367,13 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i newChildDescriptors = domain.getNewChildDescriptors(object, null); newSiblingDescriptors = domain.getNewChildDescriptors(null, object); - if (importRootsAction != null) + if (object instanceof CDOResource) { - if (object instanceof CDOResource) - { - importRootsAction.setTargetResource((CDOResource)object); - } - else - { - importRootsAction.setTargetResource(null); - } + importRootsAction.setTargetResource((CDOResource)object); + } + else + { + importRootsAction.setTargetResource(null); } } } @@ -578,37 +548,21 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i refreshViewerAction.setId(REFRESH_VIEWER_ID); menuManager.insertAfter("ui-actions", refreshViewerAction); //$NON-NLS-1$ - MenuManager lockingSubMenu = new MenuManager(Messages.getString("CDOActionBarContributor_0")); //$NON-NLS-1$ - lockingSubMenu.add(new Separator("ui-actions")); //$NON-NLS-1$ - - lockingSubMenu.insertAfter("ui-actions", writeLockObjectsAction); //$NON-NLS-1$ - writeLockObjectsAction.update(); - - lockingSubMenu.insertAfter("ui-actions", readLockObjectsAction); //$NON-NLS-1$ - readLockObjectsAction.update(); - - menuManager.insertAfter("ui-actions", lockingSubMenu); //$NON-NLS-1$ - - menuManager.insertAfter("ui-actions", changePassiveUpdateAction); //$NON-NLS-1$ - changePassiveUpdateAction.update(); - changePassiveUpdateAction.setEnabled(true); + if (autoReleaseLockExemptionAction.init()) + { + menuManager.insertAfter("additions", autoReleaseLockExemptionAction); //$NON-NLS-1$ + autoReleaseLockExemptionAction.update(); + } super.addGlobalActions(menuManager); if (loadResourceAction != null) { - if (importRootsAction != null) - { - menuManager.insertAfter(loadResourceAction.getId(), importRootsAction); - } + menuManager.insertAfter(loadResourceAction.getId(), importRootsAction); } else { - if (importRootsAction != null) - { - menuManager.insertBefore("additions-end", importRootsAction); //$NON-NLS-1$ - } - + menuManager.insertBefore("additions-end", importRootsAction); //$NON-NLS-1$ menuManager.insertBefore("additions-end", new Separator()); //$NON-NLS-1$ } } @@ -631,28 +585,15 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i @Override public void activate() { - if (importRootsAction != null) + importRootsAction.setActiveWorkbenchPart(activeEditor); + Object input = ((CDOEditor)getActiveEditor()).getViewer().getInput(); + if (input instanceof CDOResource) { - importRootsAction.setActiveWorkbenchPart(activeEditor); - Object input = ((CDOEditor)getActiveEditor()).getViewer().getInput(); - if (input instanceof CDOResource) - { - importRootsAction.setTargetResource((CDOResource)input); - } - else - { - importRootsAction.setTargetResource(null); - } + importRootsAction.setTargetResource((CDOResource)input); } - - if (changePassiveUpdateAction != null) + else { - Object input = ((CDOEditor)getActiveEditor()).getViewer().getInput(); - if (input instanceof CDOResource) - { - CDOView view = ((CDOResource)input).cdoView(); - changePassiveUpdateAction.setSession(view.getSession()); - } + importRootsAction.setTargetResource(null); } super.activate(); @@ -664,11 +605,8 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i @Override public void deactivate() { - if (importRootsAction != null) - { - importRootsAction.setActiveWorkbenchPart(null); - importRootsAction.setTargetResource(null); - } + importRootsAction.setActiveWorkbenchPart(null); + importRootsAction.setTargetResource(null); super.deactivate(); } @@ -680,9 +618,6 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i public void update() { super.update(); - if (importRootsAction != null) - { - importRootsAction.update(); - } + importRootsAction.update(); } } diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties index 6f4045eb55..0c5302e65c 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties @@ -91,6 +91,7 @@ CDOWatchListView.7=Remove all subscriptions CDOWatchListView.8=Reset Changes CDOWatchListView.9=Reset all change notifications from the selected subscriptions ChangePassiveUpdateAction.1=Passive Updates +AutoReleaseLockExemptionAction.1=Auto Release Lock Exemption ChangePasswordAction_0=Change Password... ChangePasswordAction_1=Change the connected user's password CloseSessionAction.0=Close diff --git a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF index f2978ba366..175d5a6fc3 100644 --- a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.emf.cdo; singleton:=true -Bundle-Version: 4.5.0.qualifier +Bundle-Version: 4.6.0.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,29 +10,29 @@ Bundle-Activator: org.eclipse.emf.internal.cdo.bundle.Activator$Implementation Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)";resolution:=optional, org.eclipse.emf.cdo.common;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo;version="4.5.0", - org.eclipse.emf.cdo.eresource;version="4.5.0", - org.eclipse.emf.cdo.eresource.impl;version="4.5.0", - org.eclipse.emf.cdo.eresource.util;version="4.5.0", - org.eclipse.emf.cdo.eresource.validation;version="4.5.0", - org.eclipse.emf.cdo.etypes;version="4.5.0", - org.eclipse.emf.cdo.etypes.impl;version="4.5.0", - org.eclipse.emf.cdo.etypes.util;version="4.5.0", - org.eclipse.emf.cdo.session;version="4.5.0", - org.eclipse.emf.cdo.session.remote;version="4.5.0", - org.eclipse.emf.cdo.transaction;version="4.5.0", - org.eclipse.emf.cdo.util;version="4.5.0", - org.eclipse.emf.cdo.view;version="4.5.0", - org.eclipse.emf.internal.cdo;version="4.5.0", - org.eclipse.emf.internal.cdo.analyzer;version="4.5.0"; +Export-Package: org.eclipse.emf.cdo;version="4.6.0", + org.eclipse.emf.cdo.eresource;version="4.6.0", + org.eclipse.emf.cdo.eresource.impl;version="4.6.0", + org.eclipse.emf.cdo.eresource.util;version="4.6.0", + org.eclipse.emf.cdo.eresource.validation;version="4.6.0", + org.eclipse.emf.cdo.etypes;version="4.6.0", + org.eclipse.emf.cdo.etypes.impl;version="4.6.0", + org.eclipse.emf.cdo.etypes.util;version="4.6.0", + org.eclipse.emf.cdo.session;version="4.6.0", + org.eclipse.emf.cdo.session.remote;version="4.6.0", + org.eclipse.emf.cdo.transaction;version="4.6.0", + org.eclipse.emf.cdo.util;version="4.6.0", + org.eclipse.emf.cdo.view;version="4.6.0", + org.eclipse.emf.internal.cdo;version="4.6.0", + org.eclipse.emf.internal.cdo.analyzer;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.bundle;version="4.5.0";x-friends:="org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.messages;version="4.5.0";x-internal:=true, - org.eclipse.emf.internal.cdo.object;version="4.5.0"; + org.eclipse.emf.internal.cdo.bundle;version="4.6.0";x-friends:="org.eclipse.emf.cdo.ui", + org.eclipse.emf.internal.cdo.messages;version="4.6.0";x-internal:=true, + org.eclipse.emf.internal.cdo.object;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, @@ -42,14 +42,14 @@ Export-Package: org.eclipse.emf.cdo;version="4.5.0", org.eclipse.emf.cdo.explorer, org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.edit", - org.eclipse.emf.internal.cdo.query;version="4.5.0"; + org.eclipse.emf.internal.cdo.query;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests.objectivity", - org.eclipse.emf.internal.cdo.session;version="4.5.0"; + org.eclipse.emf.internal.cdo.session;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, @@ -60,26 +60,26 @@ Export-Package: org.eclipse.emf.cdo;version="4.5.0", org.eclipse.emf.cdo.security.ui, org.eclipse.emf.cdo.explorer, org.eclipse.emf.cdo.explorer.ui", - org.eclipse.emf.internal.cdo.session.remote;version="4.5.0"; + org.eclipse.emf.internal.cdo.session.remote;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.transaction;version="4.5.0"; + org.eclipse.emf.internal.cdo.transaction;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.explorer.ui", - org.eclipse.emf.internal.cdo.util;version="4.5.0"; + org.eclipse.emf.internal.cdo.util;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.view;version="4.5.0"; + org.eclipse.emf.internal.cdo.view;version="4.6.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, @@ -88,5 +88,5 @@ Export-Package: org.eclipse.emf.cdo;version="4.5.0", org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.explorer, org.eclipse.emf.cdo.explorer.ui", - org.eclipse.emf.spi.cdo;version="4.5.0" + org.eclipse.emf.spi.cdo;version="4.6.0" Bundle-ActivationPolicy: lazy diff --git a/plugins/org.eclipse.emf.cdo/plugin.xml b/plugins/org.eclipse.emf.cdo/plugin.xml index 454a816c61..c8289c24b8 100644 --- a/plugins/org.eclipse.emf.cdo/plugin.xml +++ b/plugins/org.eclipse.emf.cdo/plugin.xml @@ -59,19 +59,19 @@ id="org.eclipse.emf.cdo.view.properties" type="org.eclipse.emf.cdo.view.CDOView" namespace="org.eclipse.emf.cdo.view" - properties="open,viewID,branchName,branch,timeStamp,lastUpdateTime,readOnly,dirty,durable,sessionID,userID,userAuthenticated,historical" + properties="open,viewID,branchName,branch,timeStamp,lastUpdateTime,rootResourcePermission,readOnly,dirty,durable,sessionID,userID,userAuthenticated,historical,autoReleaseLocks" class="org.eclipse.emf.internal.cdo.view.ViewProperties$Tester"/> <propertyTester id="org.eclipse.emf.cdo.object.properties" type="org.eclipse.emf.ecore.EObject" namespace="org.eclipse.emf.cdo.object" - properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,viewHistorical,uri" + properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,autoReleaseLocksExemption,viewHistorical,uri" class="org.eclipse.emf.internal.cdo.object.ObjectProperties$Tester"/> <propertyTester id="org.eclipse.emf.cdo.object.properties" type="org.eclipse.emf.cdo.CDOElement" namespace="org.eclipse.emf.cdo.object" - properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,viewHistorical,uri" + properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,autoReleaseLocksExemption,viewHistorical,uri" class="org.eclipse.emf.internal.cdo.object.ObjectProperties$ElementTester"/> </extension> 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 4905d74085..7bada9a363 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,11 +55,6 @@ public interface CDOCommitContext public CDOTransaction getTransaction(); /** - * @since 4.1 - */ - public boolean isAutoReleaseLocks(); - - /** * @since 4.0 */ public boolean isPartialCommit(); @@ -80,11 +75,6 @@ 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(); @@ -108,4 +98,21 @@ 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 95d4460e3a..2ed5ff400e 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,24 +292,93 @@ public interface CDOTransaction extends CDOView, CDOCommonTransaction, CDOUserTr public void setStaleReferenceCleaner(CDOStaleReferenceCleaner staleReferenceCleaner); /** - * Returns true if locks in this view will be removes when {@link CDOTransaction#commit()} or - * {@link CDOTransaction#rollback()} is called. + * 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. * <p> - * Default value is true. + * The default value is <code>true</code>. + * + * @see #getAutoReleaseLocksExemptions() */ public boolean isAutoReleaseLocksEnabled(); /** - * Specifies whether locks in this view will be removed when {@link CDOTransaction#commit()} or - * {@link CDOTransaction#rollback()} is called. + * Specifies whether locks in this transaction will be released when {@link CDOTransaction#commit()} or + * {@link CDOTransaction#rollback()} are called. * <p> - * If false all locks are kept. + * If set to <code>false</code> all locks will be kept when {@link CDOTransaction#commit()} or + * {@link CDOTransaction#rollback()} are called. * <p> - * Default value is true. + * The default value is <code>true</code>. + * + * @see #getAutoReleaseLocksExemptions() */ 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. @@ -367,7 +436,8 @@ 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} option has changed. + * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks enabled} or + * {@link Options#getAutoReleaseLocksExemptions() auto release locks exemptions} options have changed. * * @author Eike Stepper * @since 3.0 @@ -376,6 +446,31 @@ 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 41cd6b114b..c6ec39bd64 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,8 +88,10 @@ 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; @@ -592,6 +594,20 @@ 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 2a6dc0f379..ff9c2cf322 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 9f726b234e..2cd24d3c3c 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,6 +19,7 @@ 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; @@ -519,6 +520,28 @@ 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 c80de5cabe..8c475d932f 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,6 +96,8 @@ 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; @@ -146,6 +148,7 @@ 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; @@ -176,7 +179,6 @@ 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; @@ -187,6 +189,7 @@ 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; @@ -3640,8 +3643,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa private CDOCommitData commitData; - private Collection<CDOLockState> locksOnNewObjects; - private Map<CDOID, CDOObject> newObjects; private Map<CDOID, CDOObject> detachedObjects; @@ -3652,6 +3653,10 @@ 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; @@ -3660,6 +3665,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa private void calculateCommitData() { + OptionsImpl options = (OptionsImpl)transaction.options(); + List<CDOPackageUnit> newPackageUnits = analyzeNewPackages(); newObjects = filterCommittables(transaction.getNewObjects()); @@ -3667,6 +3674,15 @@ 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()); @@ -3700,8 +3716,16 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa dirtyObjects = filterCommittables(transaction.getDirtyObjects()); - CDOLockState[] locksOnNewObjectsArray = getLockStates(newObjects.keySet(), false); - locksOnNewObjects = Arrays.asList(locksOnNewObjectsArray); + for (CDOObject lockedObject : getLockStates().keySet()) + { + if (!FSMUtil.isTransient(lockedObject)) + { + if (options.isEffectiveAutoReleaseLock(lockedObject)) + { + idsToUnlock.add(lockedObject.cdoID()); + } + } + } commitData = CDOCommitInfoUtil.createCommitData(newPackageUnits, revisions, deltas, detached); } @@ -3757,11 +3781,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa return isPartialCommit; } - public boolean isAutoReleaseLocks() - { - return transaction.options().isAutoReleaseLocksEnabled(); - } - public String getCommitComment() { return transaction.getCommitComment(); @@ -3787,11 +3806,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa return commitData.getNewPackageUnits(); } - public Collection<CDOLockState> getLocksOnNewObjects() - { - return locksOnNewObjects; - } - public Map<CDOID, CDOObject> getDetachedObjects() { return detachedObjects; @@ -3807,6 +3821,22 @@ 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()) @@ -3991,10 +4021,26 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa fireEvent(new FinishedEvent(idMappings), listeners); } - CDOLockState[] newLockStates = result.getNewLockStates(); - if (newLockStates != null) + Map<CDOObject, CDOLockState> lockStates = getLockStates(); + if (!lockStates.isEmpty()) { - updateAndNotifyLockStates(CDOLockChangeInfo.Operation.UNLOCK, null, result.getTimeStamp(), newLockStates); + 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); } } catch (RuntimeException ex) @@ -4175,12 +4221,14 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa { private CDOUndoDetector undoDetector = DEFAULT_UNDO_DETECTOR; - private List<CDOConflictResolver> conflictResolvers = new ArrayList<CDOConflictResolver>(); + private final 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() @@ -4414,7 +4462,67 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa if (autoReleaseLocksEnabled != on) { autoReleaseLocksEnabled = on; - event = new AutoReleaseLocksEventImpl(); + 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(); } } finally @@ -4426,6 +4534,97 @@ 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; @@ -4499,11 +4698,25 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa /** * @author Eike Stepper */ - private final class AutoReleaseLocksEventImpl extends OptionsEvent implements AutoReleaseLocksEvent + 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 static final long serialVersionUID = 1L; - public AutoReleaseLocksEventImpl() + public AutoReleaseLocksExemptionsEventImpl() { 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 eb1fe86189..3f29900393 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 CDO 4.5 {@link #detectUndo(CDOTransaction, CDORevision, CDORevision, CDOFeatureDelta)} is called. + * @deprecated As of 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 e475279359..0f1dd2fba3 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,11 +119,6 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext return delegateCommitContext.getTransaction(); } - public boolean isAutoReleaseLocks() - { - return delegateCommitContext.isAutoReleaseLocks(); - } - public boolean isPartialCommit() { return delegateCommitContext.isPartialCommit(); @@ -159,11 +154,6 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext return delegateCommitContext.getNewPackageUnits(); } - public Collection<CDOLockState> getLocksOnNewObjects() - { - return delegateCommitContext.getLocksOnNewObjects(); - } - public Map<CDOID, CDOObject> getDetachedObjects() { return delegateCommitContext.getDetachedObjects(); @@ -179,6 +169,22 @@ 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 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) diff --git a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF index a1071bf9f4..55a3c2dfb9 100644 --- a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j.util;singleton:=true -Bundle-Version: 3.6.0.qualifier +Bundle-Version: 3.7.0.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -15,34 +15,34 @@ Import-Package: org.eclipse.osgi.service.debug;version="[1.0.0,2.0.0)";resolutio org.osgi.framework;version="[1.3.0,2.0.0)";resolution:=optional, org.osgi.service.log;version="[1.3.0,2.0.0)";resolution:=optional, org.osgi.util.tracker;version="[1.3.0,2.0.0)";resolution:=optional -Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.6.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests", - org.eclipse.net4j.internal.util.container;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs", - org.eclipse.net4j.internal.util.factory;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs", - org.eclipse.net4j.internal.util.om;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs", - org.eclipse.net4j.internal.util.om.pref;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs", - org.eclipse.net4j.internal.util.table;version="3.6.0";x-internal:=true, - org.eclipse.net4j.internal.util.test;version="3.6.0";x-friends:="org.eclipse.net4j.tests", - org.eclipse.net4j.util;version="3.6.0", - org.eclipse.net4j.util.cache;version="3.6.0", - org.eclipse.net4j.util.collection;version="3.6.0", - org.eclipse.net4j.util.concurrent;version="3.6.0", - org.eclipse.net4j.util.confirmation;version="3.6.0", - org.eclipse.net4j.util.container;version="3.6.0", - org.eclipse.net4j.util.container.delegate;version="3.6.0", - org.eclipse.net4j.util.event;version="3.6.0", - org.eclipse.net4j.util.factory;version="3.6.0", - org.eclipse.net4j.util.fsm;version="3.6.0", - org.eclipse.net4j.util.io;version="3.6.0", - org.eclipse.net4j.util.lifecycle;version="3.6.0", - org.eclipse.net4j.util.om;version="3.6.0", - org.eclipse.net4j.util.om.log;version="3.6.0", - org.eclipse.net4j.util.om.monitor;version="3.6.0", - org.eclipse.net4j.util.om.pref;version="3.6.0", - org.eclipse.net4j.util.om.trace;version="3.6.0", - org.eclipse.net4j.util.options;version="3.6.0", - org.eclipse.net4j.util.properties;version="3.6.0", - org.eclipse.net4j.util.ref;version="3.6.0", - org.eclipse.net4j.util.registry;version="3.6.0", - org.eclipse.net4j.util.security;version="3.6.0", - org.eclipse.net4j.util.transaction;version="3.6.0" +Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.7.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests", + org.eclipse.net4j.internal.util.container;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs", + org.eclipse.net4j.internal.util.factory;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs", + org.eclipse.net4j.internal.util.om;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs", + org.eclipse.net4j.internal.util.om.pref;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs", + org.eclipse.net4j.internal.util.table;version="3.7.0";x-internal:=true, + org.eclipse.net4j.internal.util.test;version="3.7.0";x-friends:="org.eclipse.net4j.tests", + org.eclipse.net4j.util;version="3.7.0", + org.eclipse.net4j.util.cache;version="3.7.0", + org.eclipse.net4j.util.collection;version="3.7.0", + org.eclipse.net4j.util.concurrent;version="3.7.0", + org.eclipse.net4j.util.confirmation;version="3.7.0", + org.eclipse.net4j.util.container;version="3.7.0", + org.eclipse.net4j.util.container.delegate;version="3.7.0", + org.eclipse.net4j.util.event;version="3.7.0", + org.eclipse.net4j.util.factory;version="3.7.0", + org.eclipse.net4j.util.fsm;version="3.7.0", + org.eclipse.net4j.util.io;version="3.7.0", + org.eclipse.net4j.util.lifecycle;version="3.7.0", + org.eclipse.net4j.util.om;version="3.7.0", + org.eclipse.net4j.util.om.log;version="3.7.0", + org.eclipse.net4j.util.om.monitor;version="3.7.0", + org.eclipse.net4j.util.om.pref;version="3.7.0", + org.eclipse.net4j.util.om.trace;version="3.7.0", + org.eclipse.net4j.util.options;version="3.7.0", + org.eclipse.net4j.util.properties;version="3.7.0", + org.eclipse.net4j.util.ref;version="3.7.0", + org.eclipse.net4j.util.registry;version="3.7.0", + org.eclipse.net4j.util.security;version="3.7.0", + org.eclipse.net4j.util.transaction;version="3.7.0" Eclipse-BuddyPolicy: registered diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java index 6a3ff3a6a3..7e9e087bb2 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java @@ -57,6 +57,20 @@ public final class HashBag<T> implements Set<T> return counter.getValue(); } + /** + * @since 3.7 + */ + public int removeCounterFor(T o) + { + Counter counter = map.remove(o); + if (counter == null) + { + return 0; + } + + return counter.getValue(); + } + public boolean add(T o) { return add(o, 1); diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java index 437445d636..565ba7925d 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java @@ -40,6 +40,8 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo { private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_CONCURRENCY, RWOLockManager.class); + private static final ThreadLocal<Boolean> UNLOCK_ALL = new ThreadLocal<Boolean>(); + private final List<LockState<OBJECT, CONTEXT>> EMPTY_RESULT = Collections.emptyList(); private final Map<OBJECT, LockState<OBJECT, CONTEXT>> objectToLockStateMap = createObjectToLocksMap(); @@ -106,7 +108,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo lock(type, context, Collections.singleton(objectToLock), timeout); } - public synchronized void unlock(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) + public void unlock(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) { unlock2(type, context, objectsToUnlock); } @@ -114,57 +116,18 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) { - if (objectsToUnlock.isEmpty()) - { - return EMPTY_RESULT; - } - - if (TRACER.isEnabled()) - { - TRACER.format("Unlock : {0} --> {1}", objectsToUnlock, context); //$NON-NLS-1$ - } - - Set<LockState<OBJECT, CONTEXT>> lockStates = new HashSet<LockState<OBJECT, CONTEXT>>(); - - Iterator<? extends OBJECT> it = objectsToUnlock.iterator(); - while (it.hasNext()) - { - OBJECT o = it.next(); - LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(o); - - if (lockState == null) - { - continue; - } - - for (LockType lockType : LockType.values()) - { - while (lockState.canUnlock(lockType, context)) - { - lockState.unlock(lockType, context); - lockStates.add(lockState); - } - } - } - - for (LockState<OBJECT, CONTEXT> lockState : lockStates) - { - removeLockStateForContext(context, lockState); - - if (lockState.hasNoLocks()) - { - objectToLockStateMap.remove(lockState.getLockedObject()); - } - } - - notifyAll(); - - return new LinkedList<RWOLockManager.LockState<OBJECT, CONTEXT>>(lockStates); + return unlock2(LockType.values(), context, objectsToUnlock); } public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) { + return unlock2(new LockType[] { type }, context, objectsToUnlock); + } + + private List<LockState<OBJECT, CONTEXT>> unlock2(LockType[] types, CONTEXT context, + Collection<? extends OBJECT> objectsToUnlock) + { if (objectsToUnlock.isEmpty()) { return EMPTY_RESULT; @@ -172,25 +135,34 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo if (TRACER.isEnabled()) { - TRACER.format("Unlock", objectsToUnlock, context); //$NON-NLS-1$ + TRACER.format("Unlock: {0} --> {1}", context, objectsToUnlock); //$NON-NLS-1$ } - List<LockState<OBJECT, CONTEXT>> lockStates = new LinkedList<LockState<OBJECT, CONTEXT>>(); + Set<LockState<OBJECT, CONTEXT>> result = new HashSet<LockState<OBJECT, CONTEXT>>(); - Iterator<? extends OBJECT> it = objectsToUnlock.iterator(); - while (it.hasNext()) + for (OBJECT o : objectsToUnlock) { - OBJECT o = it.next(); LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(o); - if (lockState != null && lockState.canUnlock(type, context)) + if (lockState != null) { - lockStates.add(lockState); + for (LockType type : types) + { + while (lockState.canUnlock(type, context)) + { + lockState.unlock(type, context); + result.add(lockState); + + if (UNLOCK_ALL.get() != Boolean.TRUE) + { + break; + } + } + } } } - for (LockState<OBJECT, CONTEXT> lockState : lockStates) + for (LockState<OBJECT, CONTEXT> lockState : result) { - lockState.unlock(type, context); if (!lockState.hasLocks(context)) { removeLockStateForContext(context, lockState); @@ -204,7 +176,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo notifyAll(); - return lockStates; + return new LinkedList<RWOLockManager.LockState<OBJECT, CONTEXT>>(result); } public synchronized void unlock(CONTEXT context) @@ -229,11 +201,11 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo for (LockState<OBJECT, CONTEXT> lockState : lockStates) { - for (LockType lockType : LockType.values()) + for (LockType type : LockType.values()) { - while (lockState.hasLock(lockType, context, false)) + while (lockState.hasLock(type, context, false)) { - lockState.unlock(lockType, context); + lockState.unlock(type, context); } } @@ -442,6 +414,22 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo wait(waitTime); } + + } + + /** + * @since 3.7 + */ + public static void setUnlockAll(boolean on) + { + if (on) + { + UNLOCK_ALL.set(Boolean.TRUE); + } + else + { + UNLOCK_ALL.remove(); + } } /** @@ -482,8 +470,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo return lockedObject; } - public boolean hasLock(org.eclipse.net4j.util.concurrent.IRWLockManager.LockType type, CONTEXT view, - boolean byOthers) + public boolean hasLock(LockType type, CONTEXT view, boolean byOthers) { CheckUtil.checkArg(view, "view"); @@ -517,7 +504,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo return false; } - public boolean hasLock(org.eclipse.net4j.util.concurrent.IRWLockManager.LockType type) + public boolean hasLock(LockType type) { switch (type) { @@ -534,6 +521,49 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo return false; } + public Set<CONTEXT> getReadLockOwners() + { + return Collections.unmodifiableSet(readLockOwners); + } + + public CONTEXT getWriteLockOwner() + { + return writeLockOwner; + } + + public CONTEXT getWriteOptionOwner() + { + return writeOptionOwner; + } + + @Override + public int hashCode() + { + return lockedObject.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + + if (obj == null) + { + return false; + } + + if (!(obj instanceof LockState)) + { + return false; + } + + LockState<?, ?> other = (LockState<?, ?>)obj; + return lockedObject.equals(other.lockedObject); + } + @Override public String toString() { @@ -808,20 +838,5 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo { writeOptionOwner = null; } - - public Set<CONTEXT> getReadLockOwners() - { - return Collections.unmodifiableSet(readLockOwners); - } - - public CONTEXT getWriteLockOwner() - { - return writeLockOwner; - } - - public CONTEXT getWriteOptionOwner() - { - return writeOptionOwner; - } } } diff --git a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF index 67e3c0df64..4f83a32180 100644 --- a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j;singleton:=true -Bundle-Version: 4.5.0.qualifier +Bundle-Version: 4.6.0.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -11,7 +11,7 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ClassPath: . Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional, org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)";visibility:=reexport -Export-Package: org.eclipse.internal.net4j;version="4.5.0"; +Export-Package: org.eclipse.internal.net4j;version="4.6.0"; x-friends:="org.eclipse.net4j.http.server, org.eclipse.net4j.jvm, org.eclipse.net4j.tcp, @@ -20,7 +20,7 @@ Export-Package: org.eclipse.internal.net4j;version="4.5.0"; org.eclipse.net4j.http.tests, org.eclipse.net4j.tests, org.eclipse.net4j.defs", - org.eclipse.internal.net4j.buffer;version="4.5.0"; + org.eclipse.internal.net4j.buffer;version="4.6.0"; x-friends:="org.eclipse.net4j.http.server, org.eclipse.net4j.jvm, org.eclipse.net4j.tcp, @@ -29,17 +29,17 @@ Export-Package: org.eclipse.internal.net4j;version="4.5.0"; org.eclipse.net4j.http.tests, org.eclipse.net4j.tests, org.eclipse.net4j.defs", - org.eclipse.internal.net4j.bundle;version="4.5.0";x-internal:=true, - org.eclipse.net4j;version="4.5.0", - org.eclipse.net4j.acceptor;version="4.5.0", - org.eclipse.net4j.buffer;version="4.5.0", - org.eclipse.net4j.channel;version="4.5.0", - org.eclipse.net4j.connector;version="4.5.0", - org.eclipse.net4j.protocol;version="4.5.0", - org.eclipse.net4j.signal;version="4.5.0", - org.eclipse.net4j.signal.confirmation;version="4.5.0", - org.eclipse.net4j.signal.heartbeat;version="4.5.0", - org.eclipse.net4j.signal.security;version="4.5.0", - org.eclipse.net4j.signal.wrapping;version="4.5.0", - org.eclipse.spi.net4j;version="4.5.0" + org.eclipse.internal.net4j.bundle;version="4.6.0";x-internal:=true, + org.eclipse.net4j;version="4.6.0", + org.eclipse.net4j.acceptor;version="4.6.0", + org.eclipse.net4j.buffer;version="4.6.0", + org.eclipse.net4j.channel;version="4.6.0", + org.eclipse.net4j.connector;version="4.6.0", + org.eclipse.net4j.protocol;version="4.6.0", + org.eclipse.net4j.signal;version="4.6.0", + org.eclipse.net4j.signal.confirmation;version="4.6.0", + org.eclipse.net4j.signal.heartbeat;version="4.6.0", + org.eclipse.net4j.signal.security;version="4.6.0", + org.eclipse.net4j.signal.wrapping;version="4.6.0", + org.eclipse.spi.net4j;version="4.6.0" Eclipse-BuddyPolicy: registered diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java index 7a5f654216..be525cbf09 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java @@ -25,8 +25,11 @@ public final class SignalCounter implements IListener { private HashBag<Class<? extends Signal>> signals = new HashBag<Class<? extends Signal>>(); + private final ISignalProtocol<?> protocol; + public SignalCounter() { + protocol = null; } /** @@ -34,14 +37,11 @@ public final class SignalCounter implements IListener */ public SignalCounter(ISignalProtocol<?> protocol) { - protocol.addListener(this); - } + this.protocol = protocol; - public int getCountFor(Class<? extends Signal> signal) - { - synchronized (signals) + if (protocol != null) { - return signals.getCounterFor(signal); + protocol.addListener(this); } } @@ -58,6 +58,25 @@ public final class SignalCounter implements IListener } } + public int getCountFor(Class<? extends Signal> signal) + { + synchronized (signals) + { + return signals.getCounterFor(signal); + } + } + + /** + * @since 4.6 + */ + public int removeCountFor(Class<? extends Signal> signal) + { + synchronized (signals) + { + return signals.removeCounterFor(signal); + } + } + public void clearCounts() { synchronized (signals) @@ -77,4 +96,15 @@ public final class SignalCounter implements IListener } } } + + /** + * @since 4.6 + */ + public void dispose() + { + if (protocol != null) + { + protocol.removeListener(this); + } + } } |