diff options
author | Eike Stepper | 2011-01-04 11:53:33 +0000 |
---|---|---|
committer | Eike Stepper | 2011-01-04 11:53:33 +0000 |
commit | ccf1832bdbd4b97ed12e78b0a78de6624affa07e (patch) | |
tree | 6d0f6c3e05f36e94d79522f67b3ef9375ccda106 | |
parent | 8d0e942cadedaa0c44bed06f1eaca27d734a7aef (diff) | |
download | cdo-ccf1832bdbd4b97ed12e78b0a78de6624affa07e.tar.gz cdo-ccf1832bdbd4b97ed12e78b0a78de6624affa07e.tar.xz cdo-ccf1832bdbd4b97ed12e78b0a78de6624affa07e.zip |
[333459] Client gets a duplicate OID error
https://bugs.eclipse.org/bugs/show_bug.cgi?id=333459
4 files changed, 42 insertions, 21 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java index 475af1142d..0ef79217d3 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java @@ -779,18 +779,18 @@ public class CDOResourceImpl extends CDOResourceNodeImpl implements CDOResource, if (!FSMUtil.isTransient(this)) { CDOID id = cdoID(); - if (id == null || !view.isObjectRegistered(id)) + if (id == null) { - try - { - view.registerProxyResource(this); - } - catch (Exception ex) + registerProxy(view); + } + else + { + synchronized (view.getObjectsLock()) { - OM.LOG.error(ex); - setExisting(false); - cdoInternalSetState(CDOState.TRANSIENT); - throw new IOWrappedException(ex); + if (!view.isObjectRegistered(id)) + { + registerProxy(view); + } } } } @@ -854,6 +854,21 @@ public class CDOResourceImpl extends CDOResourceNodeImpl implements CDOResource, } } + private void registerProxy(InternalCDOView view) throws IOWrappedException + { + try + { + view.registerProxyResource(this); + } + catch (Exception ex) + { + OM.LOG.error(ex); + setExisting(false); + cdoInternalSetState(CDOState.TRANSIENT); + throw new IOWrappedException(ex); + } + } + /** * Returns the URI converter. This typically gets the {@link ResourceSet#getURIConverter converter} from the * {@link #getResourceSet containing} resource set, but it calls {@link #getDefaultURIConverter} when there is no diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties index c32252bd6a..34d409fef4 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties @@ -44,11 +44,11 @@ CDOViewImpl.16=Unable to provideCDOID: {0} CDOViewImpl.17=ID not registered: {0} CDOViewImpl.18=CDO view is read-only: {0} CDOViewImpl.2=Can not find {0} -CDOViewImpl.20=Duplicate ID: {0} +CDOViewImpl.20=Object was already registered: {0} CDOViewImpl.26=Invalid view type: {0} CDOViewImpl.27=Object {0} does not belong to this view CDOViewImpl.29=Unknown referenceType -CDOViewImpl.30=Different objects have been registered for {0} +CDOViewImpl.30=Different object was registered for {0} CDOViewImpl.3=name == null CDOViewImpl.4=Expected folder for id = {0} CDOViewImpl.5=Node {0} not found diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java index 5aef66b1ec..c31320753f 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java @@ -301,6 +301,11 @@ public abstract class AbstractCDOView extends Lifecycle implements InternalCDOVi return stateLock; } + public Object getObjectsLock() + { + return objects; + } + public boolean isDirty() { return false; @@ -1074,18 +1079,14 @@ public abstract class AbstractCDOView extends Lifecycle implements InternalCDOVi if (old != null) { - if (CDOUtil.isLegacyObject(object)) + if (old != object) { - if (old != object) - { - throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOViewImpl.30"), object.cdoID())); //$NON-NLS-1$ - } - - OM.LOG.warn("Legacy object has been registered multiple times: " + object); + throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOViewImpl.30"), object.cdoID())); //$NON-NLS-1$ } - else + + if (TRACER.isEnabled()) { - throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOViewImpl.20"), object)); //$NON-NLS-1$ + TRACER.format(Messages.getString("CDOViewImpl.20"), old); //$NON-NLS-1$ } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java index 1b435f0cac..55db92cd4e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java @@ -134,4 +134,9 @@ public interface InternalCDOView extends CDOView, CDOIDProvider, ILifecycle * give them want they need. */ public ReentrantLock getStateLock(); + + /** + * @since 4.0 + */ + public Object getObjectsLock(); } |