diff options
18 files changed, 293 insertions, 108 deletions
diff --git a/features/org.eclipse.emf.cdo-feature/feature.xml b/features/org.eclipse.emf.cdo-feature/feature.xml index 22cc7e029b..d3c63cd8d1 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.16.1.qualifier" + version="4.17.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-feature/pom.xml b/features/org.eclipse.emf.cdo-feature/pom.xml index 6afce1bc6b..2cb6efd0a8 100644 --- a/features/org.eclipse.emf.cdo-feature/pom.xml +++ b/features/org.eclipse.emf.cdo-feature/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo.features</groupId> <artifactId>org.eclipse.emf.cdo</artifactId> - <version>4.16.1-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> <packaging>eclipse-feature</packaging> </project> diff --git a/features/org.eclipse.emf.cdo.all-feature/feature.xml b/features/org.eclipse.emf.cdo.all-feature/feature.xml index 8707829118..d583dbc517 100644 --- a/features/org.eclipse.emf.cdo.all-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.all-feature/feature.xml @@ -13,7 +13,7 @@ <feature id="org.eclipse.emf.cdo.all" label="%featureName" - version="4.16.1.qualifier" + version="4.17.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.all-feature/pom.xml b/features/org.eclipse.emf.cdo.all-feature/pom.xml index a254800c3e..7fbe4f5d45 100644 --- a/features/org.eclipse.emf.cdo.all-feature/pom.xml +++ b/features/org.eclipse.emf.cdo.all-feature/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo.features</groupId> <artifactId>org.eclipse.emf.cdo.all</artifactId> - <version>4.16.1-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> <packaging>eclipse-feature</packaging> </project> diff --git a/features/org.eclipse.emf.cdo.epp-feature/feature.xml b/features/org.eclipse.emf.cdo.epp-feature/feature.xml index 31307648f8..529515fdd7 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.16.1.qualifier" + version="4.17.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/pom.xml b/features/org.eclipse.emf.cdo.epp-feature/pom.xml index d06eaad328..cc9c9234db 100644 --- a/features/org.eclipse.emf.cdo.epp-feature/pom.xml +++ b/features/org.eclipse.emf.cdo.epp-feature/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo.features</groupId> <artifactId>org.eclipse.emf.cdo.epp</artifactId> - <version>4.16.1-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> <packaging>eclipse-feature</packaging> </project> diff --git a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml index 983056c999..1012572cad 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="5.9.1.qualifier" + version="5.10.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.sdk-feature/pom.xml b/features/org.eclipse.emf.cdo.sdk-feature/pom.xml index cf1704387c..340d96b5f5 100644 --- a/features/org.eclipse.emf.cdo.sdk-feature/pom.xml +++ b/features/org.eclipse.emf.cdo.sdk-feature/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo.features</groupId> <artifactId>org.eclipse.emf.cdo.sdk</artifactId> - <version>5.9.1-SNAPSHOT</version> + <version>5.10.0-SNAPSHOT</version> <packaging>eclipse-feature</packaging> </project> diff --git a/features/org.eclipse.emf.cdo.server-feature/feature.xml b/features/org.eclipse.emf.cdo.server-feature/feature.xml index 9626da2a87..0b8b176e50 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.16.1.qualifier" + version="4.17.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/pom.xml b/features/org.eclipse.emf.cdo.server-feature/pom.xml index 97707430ab..9efdbaae8e 100644 --- a/features/org.eclipse.emf.cdo.server-feature/pom.xml +++ b/features/org.eclipse.emf.cdo.server-feature/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo.features</groupId> <artifactId>org.eclipse.emf.cdo.server</artifactId> - <version>4.16.1-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> <packaging>eclipse-feature</packaging> </project> diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml index 791e9e154e..513715f454 100644 --- a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.server.embedded" label="%featureName" - version="4.16.1.qualifier" + version="4.17.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.embedded-feature/pom.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml index ed1b329ec7..cd8fd00c24 100644 --- a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml +++ b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo.features</groupId> <artifactId>org.eclipse.emf.cdo.server.embedded</artifactId> - <version>4.16.1-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> <packaging>eclipse-feature</packaging> </project> 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 65f3969907..be1573a6c8 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 @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.tests; import org.eclipse.emf.cdo.CDOLock; +import org.eclipse.emf.cdo.CDOLock.CDOAcquiredLock; import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.id.CDOID; @@ -1178,6 +1179,29 @@ public class LockingManagerTest extends AbstractLockingTest objects.add(CDOUtil.getCDOObject(category)); } + public void testAcquiredLock() throws Exception + { + CDOSession session1 = openSession(); + CDOTransaction transaction1 = session1.openTransaction(); + transaction1.options().setAutoReleaseLocksEnabled(false); + + CDOResource resource1 = transaction1.createResource(getResourcePath("/res1")); + Company company1 = getModel1Factory().createCompany(); + resource1.getContents().add(company1); + transaction1.commit(); + + CDOObject cdoObject = CDOUtil.getCDOObject(company1); + + try (CDOAcquiredLock lock = cdoObject.cdoWriteLock().acquire(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS, true)) + { + company1.setName("ESC"); + assertWriteLock(true, cdoObject); + transaction1.commit(); + } + + assertWriteLock(false, cdoObject); + } + public void testLockContention() throws Exception { Company company1 = getModel1Factory().createCompany(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_560957_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_560957_Test.java index 7e17f5803c..9a8ed6161f 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_560957_Test.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_560957_Test.java @@ -30,9 +30,9 @@ import java.util.concurrent.CountDownLatch; */ public class Bugzilla_560957_Test extends AbstractCDOTest { - public void testDeadlockOnViewGetBranch10000() throws Exception + public void _testDeadlockOnViewGetBranch10000() throws Exception { - for (int i = 0; i < 100; i++) + for (int i = 0; i < 10000; i++) { System.out.println("Run " + i); run(i); diff --git a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF index 7eb7654d65..85afa6b240 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.15.1.qualifier +Bundle-Version: 4.16.0.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,28 +10,28 @@ Bundle-Activator: org.eclipse.emf.internal.cdo.bundle.Activator$Implementation Bundle-RequiredExecutionEnvironment: JavaSE-1.8 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.15.1", - org.eclipse.emf.cdo.eresource;version="4.15.1", - org.eclipse.emf.cdo.eresource.impl;version="4.15.1", - org.eclipse.emf.cdo.eresource.util;version="4.15.1", - org.eclipse.emf.cdo.eresource.validation;version="4.15.1", - org.eclipse.emf.cdo.etypes;version="4.15.1", - org.eclipse.emf.cdo.etypes.impl;version="4.15.1", - org.eclipse.emf.cdo.etypes.util;version="4.15.1", - org.eclipse.emf.cdo.session;version="4.15.1", - org.eclipse.emf.cdo.session.remote;version="4.15.1", - org.eclipse.emf.cdo.transaction;version="4.15.1", - org.eclipse.emf.cdo.util;version="4.15.1", - org.eclipse.emf.cdo.view;version="4.15.1", - org.eclipse.emf.internal.cdo;version="4.15.1", - org.eclipse.emf.internal.cdo.analyzer;version="4.15.1"; +Export-Package: org.eclipse.emf.cdo;version="4.16.0", + org.eclipse.emf.cdo.eresource;version="4.16.0", + org.eclipse.emf.cdo.eresource.impl;version="4.16.0", + org.eclipse.emf.cdo.eresource.util;version="4.16.0", + org.eclipse.emf.cdo.eresource.validation;version="4.16.0", + org.eclipse.emf.cdo.etypes;version="4.16.0", + org.eclipse.emf.cdo.etypes.impl;version="4.16.0", + org.eclipse.emf.cdo.etypes.util;version="4.16.0", + org.eclipse.emf.cdo.session;version="4.16.0", + org.eclipse.emf.cdo.session.remote;version="4.16.0", + org.eclipse.emf.cdo.transaction;version="4.16.0", + org.eclipse.emf.cdo.util;version="4.16.0", + org.eclipse.emf.cdo.view;version="4.16.0", + org.eclipse.emf.internal.cdo;version="4.16.0", + org.eclipse.emf.internal.cdo.analyzer;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.bundle;version="4.15.1";x-friends:="org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.messages;version="4.15.1";x-internal:=true, - org.eclipse.emf.internal.cdo.object;version="4.15.1"; + org.eclipse.emf.internal.cdo.bundle;version="4.16.0";x-friends:="org.eclipse.emf.cdo.ui", + org.eclipse.emf.internal.cdo.messages;version="4.16.0";x-internal:=true, + org.eclipse.emf.internal.cdo.object;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, @@ -40,12 +40,12 @@ Export-Package: org.eclipse.emf.cdo;version="4.15.1", org.eclipse.emf.cdo.explorer, org.eclipse.emf.cdo.explorer.ui, org.eclipse.emf.cdo.edit", - org.eclipse.emf.internal.cdo.query;version="4.15.1"; + org.eclipse.emf.internal.cdo.query;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.session;version="4.15.1"; + org.eclipse.emf.internal.cdo.session;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, @@ -55,23 +55,23 @@ Export-Package: org.eclipse.emf.cdo;version="4.15.1", 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.15.1"; + org.eclipse.emf.internal.cdo.session.remote;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.transaction;version="4.15.1"; + org.eclipse.emf.internal.cdo.transaction;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.explorer.ui", - org.eclipse.emf.internal.cdo.util;version="4.15.1"; + org.eclipse.emf.internal.cdo.util;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.ui", - org.eclipse.emf.internal.cdo.view;version="4.15.1"; + org.eclipse.emf.internal.cdo.view;version="4.16.0"; x-friends:="org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.tests, @@ -79,6 +79,6 @@ Export-Package: org.eclipse.emf.cdo;version="4.15.1", org.eclipse.emf.cdo.ui.ide, org.eclipse.emf.cdo.explorer, org.eclipse.emf.cdo.explorer.ui", - org.eclipse.emf.spi.cdo;version="4.15.1" + org.eclipse.emf.spi.cdo;version="4.16.0" Bundle-ActivationPolicy: lazy Automatic-Module-Name: org.eclipse.emf.cdo diff --git a/plugins/org.eclipse.emf.cdo/pom.xml b/plugins/org.eclipse.emf.cdo/pom.xml index 5aa641d26b..83e67f2f74 100644 --- a/plugins/org.eclipse.emf.cdo/pom.xml +++ b/plugins/org.eclipse.emf.cdo/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo</groupId> <artifactId>org.eclipse.emf.cdo</artifactId> - <version>4.15.1-SNAPSHOT</version> + <version>4.16.0-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOLock.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOLock.java index 05c5413fbc..18622690a8 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOLock.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOLock.java @@ -32,7 +32,7 @@ import java.util.concurrent.locks.Lock; * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. */ -public interface CDOLock extends Lock +public interface CDOLock extends Lock, AutoCloseable { /** * @since 4.15 @@ -50,11 +50,33 @@ public interface CDOLock extends Lock public LockType getType(); /** + * @since 4.15 + */ + public Set<CDOLockOwner> getOwners(); + + /** + * Returns <code>true</code> if this lock is currently held by the requesting {@link CDOView view}, <code>false</code> + * otherwise. + */ + public boolean isLocked(); + + /** + * Returns <code>true</code> if this lock is currently held by another {@link CDOView view} (i.e. any view different + * from the requesting one), <code>false</code> otherwise. + */ + public boolean isLockedByOthers(); + + /** * @since 4.0 */ public void lock(long time, TimeUnit unit) throws TimeoutException; /** + * @since 4.16 + */ + public void lock(long time, TimeUnit unit, boolean recursive) throws TimeoutException; + + /** * @since 4.0 */ public void lock(long millis) throws TimeoutException; @@ -65,25 +87,56 @@ public interface CDOLock extends Lock public boolean tryLock(long millis) throws InterruptedException; /** - * Returns <code>true</code> if this lock is currently held by the requesting {@link CDOView view}, <code>false</code> - * otherwise. + * @since 4.16 */ - public boolean isLocked(); + public boolean tryLock(long time, TimeUnit unit, boolean recursive) throws InterruptedException; /** - * Returns <code>true</code> if this lock is currently held by another {@link CDOView view} (i.e. any view different - * from the requesting one), <code>false</code> otherwise. + * @since 4.16 */ - public boolean isLockedByOthers(); + public CDOAcquiredLock acquire(long time, TimeUnit unit, boolean recursive) throws TimeoutException; /** - * @since 4.15 + * @since 4.16 */ - public Set<CDOLockOwner> getOwners(); + public void unlock(boolean recursive); + + /** + * @since 4.16 + */ + @Override + default void close() + { + unlock(); + } @Deprecated public static final int WAIT = IRWLockManager.WAIT; @Deprecated public static final int NO_WAIT = IRWLockManager.NO_WAIT; + + /** + * @author Eike Stepper + * @since 4.16 + */ + public interface CDOAcquiredLock extends AutoCloseable + { + public CDOLock getLock(); + + public CDOObject getObject(); + + public LockType getType(); + + public Set<CDOLockOwner> getOwners(); + + public boolean isLocked(); + + public boolean isLockedByOthers(); + + public boolean isRecursive(); + + @Override + public void close(); + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLockImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLockImpl.java index 93015ab3d4..89e72b3854 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLockImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLockImpl.java @@ -63,21 +63,6 @@ public class CDOLockImpl implements CDOLock } @Override - public boolean isLocked() - { - return isLocked(false); - } - - /** - * @see org.eclipse.emf.cdo.CDOLock#isLockedByOthers() - */ - @Override - public boolean isLockedByOthers() - { - return isLocked(true); - } - - @Override public Set<CDOLockOwner> getOwners() { CDOLockState lockState = object.cdoLockState(); @@ -101,25 +86,33 @@ public class CDOLockImpl implements CDOLock } @Override - public void lock() + public boolean isLocked() { - try - { - InternalCDOView view = object.cdoView(); - view.lockObjects(Collections.singletonList(object), type, NO_TIMEOUT); - } - catch (InterruptedException ex) - { - throw WrappedException.wrap(ex); - } + return isLocked(false); } + /** + * @see org.eclipse.emf.cdo.CDOLock#isLockedByOthers() + */ @Override - public void lock(long time, TimeUnit unit) throws TimeoutException + public boolean isLockedByOthers() + { + return isLocked(true); + } + + @Override + public CDOAcquiredLock acquire(long time, TimeUnit unit, boolean recursive) throws TimeoutException + { + lock(time, unit, recursive); + return new CDOAcquiredLockImpl(this, recursive); + } + + @Override + public void lock(long time, TimeUnit unit, boolean recursive) throws TimeoutException { try { - if (!tryLock(time, unit)) + if (!tryLock(time, unit, recursive)) { throw new TimeoutException(); } @@ -131,68 +124,95 @@ public class CDOLockImpl implements CDOLock } @Override - public void lock(long millis) throws TimeoutException + public void lock(long time, TimeUnit unit) throws TimeoutException { - lock(millis, TimeUnit.MILLISECONDS); + lock(time, unit, false); } @Override - public boolean tryLock(long millis) throws InterruptedException + public void lock(long millis) throws TimeoutException { - return tryLock(millis, TimeUnit.MILLISECONDS); + lock(millis, TimeUnit.MILLISECONDS); } @Override - public void lockInterruptibly() throws InterruptedException + public void lock() { - lock(); + try + { + lock(NO_TIMEOUT); + } + catch (TimeoutException ex) + { + // Should not happen. + throw WrappedException.wrap(ex); + } } @Override - public Condition newCondition() + public void lockInterruptibly() throws InterruptedException { - throw new UnsupportedOperationException(); + lock(); } @Override - public boolean tryLock() + public boolean tryLock(long time, TimeUnit unit, boolean recursive) throws InterruptedException { try { InternalCDOView view = object.cdoView(); - view.lockObjects(Collections.singletonList(object), type, 0); + view.lockObjects(Collections.singletonList(object), type, unit.toMillis(time), recursive); return true; } catch (LockTimeoutException ex) { return false; } - catch (InterruptedException ex) - { - throw WrappedException.wrap(ex); - } } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { + return tryLock(time, unit, false); + } + + @Override + public boolean tryLock(long millis) throws InterruptedException + { + return tryLock(millis, TimeUnit.MILLISECONDS); + } + + @Override + public boolean tryLock() + { try { - InternalCDOView view = object.cdoView(); - view.lockObjects(Collections.singletonList(object), type, unit.toMillis(time)); - return true; + return tryLock(NO_TIMEOUT, TimeUnit.MILLISECONDS); } - catch (LockTimeoutException ex) + catch (InterruptedException ex) { - return false; + // Should not happen. + throw WrappedException.wrap(ex); } } @Override - public void unlock() + public void unlock(boolean recursive) { InternalCDOView view = object.cdoView(); - view.unlockObjects(Collections.singletonList(object), type); + view.unlockObjects(Collections.singletonList(object), type, recursive); + } + + @Override + public void unlock() + { + unlock(false); + } + + @Override + public Condition newCondition() + { + throw new UnsupportedOperationException(); } @Override @@ -208,6 +228,70 @@ public class CDOLockImpl implements CDOLock } /** + * @author Eike Stepper + */ + private static final class CDOAcquiredLockImpl implements CDOAcquiredLock + { + private final CDOLock lock; + + private final boolean recursive; + + public CDOAcquiredLockImpl(CDOLock lock, boolean recursive) + { + this.lock = lock; + this.recursive = recursive; + } + + @Override + public CDOLock getLock() + { + return lock; + } + + @Override + public CDOObject getObject() + { + return lock.getObject(); + } + + @Override + public LockType getType() + { + return lock.getType(); + } + + @Override + public Set<CDOLockOwner> getOwners() + { + return lock.getOwners(); + } + + @Override + public boolean isLocked() + { + return lock.isLocked(); + } + + @Override + public boolean isLockedByOthers() + { + return lock.isLockedByOthers(); + } + + @Override + public boolean isRecursive() + { + return recursive; + } + + @Override + public void close() + { + lock.unlock(recursive); + } + } + + /** * @author Simon McDuff */ public static final class NOOPLockImpl implements CDOLock @@ -250,31 +334,49 @@ public class CDOLockImpl implements CDOLock } @Override - public void lock() + public CDOAcquiredLock acquire(long time, TimeUnit unit, boolean recursive) throws TimeoutException { throw new UnsupportedOperationException(); } @Override - public void lockInterruptibly() throws InterruptedException + public void lock(long time, TimeUnit unit, boolean recursive) throws TimeoutException { throw new UnsupportedOperationException(); } @Override - public Condition newCondition() + public void lock(long time, TimeUnit unit) throws TimeoutException { - return null; + throw new UnsupportedOperationException(); } @Override - public void lock(long time, TimeUnit unit) throws TimeoutException + public void lock(long millis) throws TimeoutException { throw new UnsupportedOperationException(); } @Override - public void lock(long millis) throws TimeoutException + public void lock() + { + throw new UnsupportedOperationException(); + } + + @Override + public void lockInterruptibly() throws InterruptedException + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean tryLock(long time, TimeUnit unit, boolean recursive) throws InterruptedException + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { throw new UnsupportedOperationException(); } @@ -282,19 +384,19 @@ public class CDOLockImpl implements CDOLock @Override public boolean tryLock(long millis) throws InterruptedException { - return false; + throw new UnsupportedOperationException(); } @Override public boolean tryLock() { - return false; + throw new UnsupportedOperationException(); } @Override - public boolean tryLock(long time, TimeUnit unit) throws InterruptedException + public void unlock(boolean recursive) { - return false; + throw new UnsupportedOperationException(); } @Override @@ -302,5 +404,11 @@ public class CDOLockImpl implements CDOLock { throw new UnsupportedOperationException(); } + + @Override + public Condition newCondition() + { + throw new UnsupportedOperationException(); + } } } |