Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2011-01-06 16:10:15 +0000
committerEike Stepper2011-01-06 16:10:15 +0000
commit46b3ceb3a47a9054de0719886c723a71a808ff91 (patch)
tree99958f837ee5cbf4c1378e52f7c22052995e34b3 /plugins
parent56132fe81debf29f34621ddd51de2bf52721eefb (diff)
downloadcdo-46b3ceb3a47a9054de0719886c723a71a808ff91.tar.gz
cdo-46b3ceb3a47a9054de0719886c723a71a808ff91.tar.xz
cdo-46b3ceb3a47a9054de0719886c723a71a808ff91.zip
[333663] Provide a ReferentialIntegrityException with full XRef infos
https://bugs.eclipse.org/bugs/show_bug.cgi?id=333663
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDReference.java102
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOReference.java38
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOType.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDOReferenceAdjuster.java8
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOContainerFeatureDelta.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOFeatureDelta.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java30
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDOListImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOContainerFeatureDeltaImpl.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOFeatureDeltaImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOSingleValueFeatureDeltaImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java10
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDOIDMapper.java7
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java30
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/QueryRequest.java12
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java20
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionCancelIndication.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase1Indication.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase2Indication.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/QueryIndication.java17
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java54
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java37
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java16
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316434_Test.java10
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObjectReference.java11
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ReferentialIntegrityException.java37
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java2
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOObjectReferenceImpl.java59
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSingleTransactionStrategyImpl.java9
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java5
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java23
39 files changed, 450 insertions, 176 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDReference.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDReference.java
new file mode 100644
index 0000000000..401126c960
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDReference.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2004 - 2011 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.common.id;
+
+import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import java.io.IOException;
+
+/**
+ * @author Eike Stepper
+ * @since 4.0
+ */
+public class CDOIDReference implements CDOReference<CDOID>
+{
+ private CDOID targetID;
+
+ private CDOID sourceID;
+
+ private EStructuralFeature sourceFeature;
+
+ private int sourceIndex;
+
+ public CDOIDReference(CDOID targetID, CDOID sourceID, EStructuralFeature sourceFeature, int sourceIndex)
+ {
+ this.targetID = targetID;
+ this.sourceID = sourceID;
+ this.sourceFeature = sourceFeature;
+ this.sourceIndex = sourceIndex;
+ }
+
+ public CDOIDReference(CDODataInput in) throws IOException
+ {
+ targetID = in.readCDOID();
+ sourceID = in.readCDOID();
+
+ EClass eClass = (EClass)in.readCDOClassifierRefAndResolve();
+ String featureName = in.readString();
+ sourceFeature = eClass.getEStructuralFeature(featureName);
+
+ sourceIndex = in.readInt();
+ }
+
+ public void write(CDODataOutput out) throws IOException
+ {
+ out.writeCDOID(targetID);
+ out.writeCDOID(sourceID);
+ out.writeCDOClassifierRef(sourceFeature.getEContainingClass());
+ out.writeString(sourceFeature.getName());
+ out.writeInt(sourceIndex);
+ }
+
+ public CDOID getTargetObject()
+ {
+ return targetID;
+ }
+
+ public CDOID getSourceObject()
+ {
+ return sourceID;
+ }
+
+ public EStructuralFeature getSourceFeature()
+ {
+ return sourceFeature;
+ }
+
+ public int getSourceIndex()
+ {
+ return sourceIndex;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append(sourceID);
+ builder.append(".");
+ builder.append(sourceFeature.getName());
+ if (sourceIndex != NO_INDEX)
+ {
+ builder.append("[");
+ builder.append(sourceIndex);
+ builder.append("]");
+ }
+
+ builder.append(" --> ");
+ builder.append(targetID);
+ return builder.toString();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOReference.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOReference.java
new file mode 100644
index 0000000000..9991b28de6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOReference.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2004 - 2011 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.common.id;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.FeatureMap;
+
+/**
+ * @author Eike Stepper
+ * @since 4.0
+ */
+public interface CDOReference<OBJECT>
+{
+ public static final int NO_INDEX = Notification.NO_INDEX;
+
+ public OBJECT getTargetObject();
+
+ public OBJECT getSourceObject();
+
+ /**
+ * Returns the source {@link EReference} or the source {@link EAttribute} if the source feature is a
+ * {@link FeatureMap}.
+ */
+ public EStructuralFeature getSourceFeature();
+
+ public int getSourceIndex();
+}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOType.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOType.java
index 6d08ecf30a..ae27fa4ddd 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOType.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOType.java
@@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster;
import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EStructuralFeature;
import java.io.IOException;
@@ -118,9 +119,9 @@ public interface CDOType
public Object copyValue(Object value);
/**
- * @since 2.0
+ * @since 4.0
*/
- public Object adjustReferences(CDOReferenceAdjuster adjuster, Object value);
+ public Object adjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index);
/**
* @since 3.0
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java
index 9ea08cb81e..2366b474ef 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java
@@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.common.commit.CDOChangeSetData;
import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
@@ -85,6 +86,11 @@ public interface CDODataInput extends ExtendedDataInput
/**
* @since 4.0
*/
+ public CDOIDReference readCDOIDReference() throws IOException;
+
+ /**
+ * @since 4.0
+ */
public CDOIDAndVersion readCDOIDAndVersion() throws IOException;
/**
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java
index 8fe6bae7b9..341a4b2c14 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java
@@ -19,6 +19,7 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
@@ -90,6 +91,11 @@ public interface CDODataOutput extends ExtendedDataOutput
/**
* @since 4.0
*/
+ public void writeCDOIDReference(CDOIDReference idReference) throws IOException;
+
+ /**
+ * @since 4.0
+ */
public void writeCDOIDAndVersion(CDOIDAndVersion idAndVersion) throws IOException;
/**
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDOReferenceAdjuster.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDOReferenceAdjuster.java
index 6543b46ffc..ba80ec3174 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDOReferenceAdjuster.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDOReferenceAdjuster.java
@@ -4,7 +4,7 @@
* 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:
* Simon McDuff - initial API and implementation
* Eike Stepper - maintenance
@@ -14,6 +14,8 @@ package org.eclipse.emf.cdo.common.revision;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDTemp;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
/**
* @author Simon McDuff
* @since 2.0
@@ -25,6 +27,8 @@ public interface CDOReferenceAdjuster
* transaction. {@link CDORevision} must replace {@link CDOIDTemp} for non-temporary {@link CDOID} with a mapped ID.
* Only the internal structure knows how to do these modifications. This is important to consider using different
* implementation of {@link CDOList}.
+ *
+ * @since 4.0
*/
- public Object adjustReference(Object id);
+ public Object adjustReference(Object id, EStructuralFeature feature, int index);
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOContainerFeatureDelta.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOContainerFeatureDelta.java
index 50d8e1a59a..92e8d90cb8 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOContainerFeatureDelta.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOContainerFeatureDelta.java
@@ -4,7 +4,7 @@
* 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:
* Simon McDuff - initial API and implementation
* Eike Stepper - maintenance
@@ -14,7 +14,7 @@ package org.eclipse.emf.cdo.common.revision.delta;
import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EReference;
/**
* @author Simon McDuff
@@ -25,7 +25,7 @@ public interface CDOContainerFeatureDelta extends CDOFeatureDelta
/**
* @since 2.0
*/
- public static final EStructuralFeature CONTAINER_FEATURE = new org.eclipse.emf.cdo.internal.common.revision.delta.CDOContainerFeatureDeltaImpl.ContainerFeature();
+ public static final EReference CONTAINER_FEATURE = new org.eclipse.emf.cdo.internal.common.revision.delta.CDOContainerFeatureDeltaImpl.ContainerFeature();
/**
* @since 2.0
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOFeatureDelta.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOFeatureDelta.java
index 52238c7759..43f2e9a8f6 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOFeatureDelta.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/delta/CDOFeatureDelta.java
@@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.common.revision.delta;
import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EStructuralFeature;
/**
@@ -22,6 +23,11 @@ import org.eclipse.emf.ecore.EStructuralFeature;
public interface CDOFeatureDelta
{
/**
+ * @since 4.0
+ */
+ public static final int NO_INDEX = Notification.NO_INDEX;
+
+ /**
* @since 3.0
*/
public static final Object UNKNOWN_VALUE = new Object()
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java
index fec0d89af9..8acff1e645 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java
@@ -256,9 +256,9 @@ public abstract class CDOTypeImpl implements CDOType
}
@Override
- public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value)
+ public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
{
- return adjuster.adjustReference(value);
+ return adjuster.adjustReference(value, feature, index);
}
};
@@ -680,15 +680,15 @@ public abstract class CDOTypeImpl implements CDOType
}
@Override
- public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value)
+ public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
{
FeatureMap.Entry entry = (FeatureMap.Entry)value;
EStructuralFeature innerFeature = entry.getEStructuralFeature();
Object innerValue = entry.getValue();
CDOType innerType = CDOModelUtil.getType(innerFeature.getEType());
- Object innerCopy = innerType.adjustReferences(adjuster, innerValue);
- if (innerCopy != innerValue)
+ Object innerCopy = innerType.adjustReferences(adjuster, innerValue, feature, index);
+ if (innerCopy != innerValue) // Just an optimization for NOOP adjusters
{
value = CDORevisionUtil.createFeatureMapEntry(innerFeature, innerCopy);
}
@@ -801,22 +801,22 @@ public abstract class CDOTypeImpl implements CDOType
}
@Override
- public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value)
+ public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
{
- // CHECK: should the same object array be returned with updated values
- // or a new object array?
- final Object[] objects = (Object[])value;
+ Object[] objects = (Object[])value;
int i = 0;
for (Object object : objects)
{
if (object instanceof CDOID)
{
- objects[i++] = adjuster.adjustReference(object);
+ objects[i] = adjuster.adjustReference(object, feature, i);
}
else
{
- objects[i++] = object;
+ objects[i] = object;
}
+
+ ++i;
}
return objects;
@@ -892,12 +892,14 @@ public abstract class CDOTypeImpl implements CDOType
out.writeInt(typeID);
}
- final public Object adjustReferences(CDOReferenceAdjuster adjuster, Object value)
+ final public Object adjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature,
+ int index)
{
- return value == null ? null : doAdjustReferences(adjuster, value);
+ return value == null ? null : doAdjustReferences(adjuster, value, feature, index);
}
- protected Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value)
+ protected Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature,
+ int indexs)
{
return value;
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java
index ef7f8bed75..7d12743f54 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java
@@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfoManager;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.id.CDOID.Type;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
@@ -328,6 +329,11 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl
return id;
}
+ public CDOIDReference readCDOIDReference() throws IOException
+ {
+ return new CDOIDReference(this);
+ }
+
public CDOIDAndVersion readCDOIDAndVersion() throws IOException
{
CDOID id = readCDOID();
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java
index dc2ac45493..0a014a39e2 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java
@@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
@@ -240,6 +241,11 @@ public abstract class CDODataOutputImpl extends ExtendedDataOutput.Delegating im
((AbstractCDOID)id).write(this);
}
+ public void writeCDOIDReference(CDOIDReference idReference) throws IOException
+ {
+ idReference.write(this);
+ }
+
public void writeCDOIDAndVersion(CDOIDAndVersion idAndVersion) throws IOException
{
writeCDOID(idAndVersion.getID());
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDOListImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDOListImpl.java
index f7275fb78c..4d0b6ae343 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDOListImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDOListImpl.java
@@ -78,7 +78,7 @@ public class CDOListImpl extends MoveableArrayList<Object> implements InternalCD
{
Object element = super.get(i);
handleAdjustReference(i, element);
- Object newID = type.adjustReferences(revisionAdjuster, element);
+ Object newID = type.adjustReferences(revisionAdjuster, element, feature, i);
if (newID != element) // Just an optimization for NOOP adjusters
{
super.set(i, newID);
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOContainerFeatureDeltaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOContainerFeatureDeltaImpl.java
index 1f8610dd8d..596304651c 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOContainerFeatureDeltaImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOContainerFeatureDeltaImpl.java
@@ -26,7 +26,7 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.EStructuralFeatureImpl;
+import org.eclipse.emf.ecore.impl.EReferenceImpl;
import java.io.IOException;
import java.text.MessageFormat;
@@ -95,14 +95,14 @@ public class CDOContainerFeatureDeltaImpl extends CDOFeatureDeltaImpl implements
{
boolean changed = false;
- CDOID id1 = (CDOID)referenceAdjuster.adjustReference(newResourceID);
+ CDOID id1 = (CDOID)referenceAdjuster.adjustReference(newResourceID, CONTAINER_FEATURE, NO_INDEX);
if (id1 != newResourceID)
{
newResourceID = id1;
changed = true;
}
- Object id2 = referenceAdjuster.adjustReference(newContainerID);
+ Object id2 = referenceAdjuster.adjustReference(newContainerID, CONTAINER_FEATURE, NO_INDEX);
if (id2 != newContainerID)
{
newContainerID = id2;
@@ -150,16 +150,24 @@ public class CDOContainerFeatureDeltaImpl extends CDOFeatureDeltaImpl implements
/**
* @author Simon McDuff
*/
- public static final class ContainerFeature extends EStructuralFeatureImpl
+ public static final class ContainerFeature extends EReferenceImpl
{
+ public static final String NAME = "eContainer";
+
public ContainerFeature()
{
}
@Override
+ public String getName()
+ {
+ return null;
+ }
+
+ @Override
public String toString()
{
- return "CONTAINER_FEATURE"; //$NON-NLS-1$
+ return NAME;
}
}
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOFeatureDeltaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOFeatureDeltaImpl.java
index 562cabcd6e..5b08b9feb4 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOFeatureDeltaImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOFeatureDeltaImpl.java
@@ -30,8 +30,6 @@ import java.text.MessageFormat;
*/
public abstract class CDOFeatureDeltaImpl implements InternalCDOFeatureDelta
{
- public static final int NO_INDEX = -1;
-
private EStructuralFeature feature;
protected CDOFeatureDeltaImpl(EStructuralFeature feature)
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOSingleValueFeatureDeltaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOSingleValueFeatureDeltaImpl.java
index 18f1106125..50e5a69685 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOSingleValueFeatureDeltaImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOSingleValueFeatureDeltaImpl.java
@@ -149,7 +149,7 @@ public abstract class CDOSingleValueFeatureDeltaImpl extends CDOFeatureDeltaImpl
{
if (value != UNKNOWN_VALUE)
{
- Object adjustedValue = referenceAdjuster.adjustReference(value);
+ Object adjustedValue = referenceAdjuster.adjustReference(value, getFeature(), NO_INDEX);
if (adjustedValue != value)
{
value = adjustedValue;
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java
index 69021fece2..a3e62e3765 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java
@@ -30,6 +30,8 @@ import org.eclipse.emf.cdo.common.revision.CDOListFactory;
import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionData;
+import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta;
+import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
import org.eclipse.emf.cdo.internal.common.bundle.OM;
@@ -504,14 +506,16 @@ public abstract class BaseCDORevision extends AbstractCDORevision
boolean changed = false;
- CDOID id1 = (CDOID)referenceAdjuster.adjustReference(resourceID);
+ CDOID id1 = (CDOID)referenceAdjuster.adjustReference(resourceID, CDOContainerFeatureDelta.CONTAINER_FEATURE,
+ CDOFeatureDelta.NO_INDEX);
if (id1 != resourceID)
{
resourceID = id1;
changed = true;
}
- Object id2 = referenceAdjuster.adjustReference(containerID);
+ Object id2 = referenceAdjuster.adjustReference(containerID, CDOContainerFeatureDelta.CONTAINER_FEATURE,
+ CDOFeatureDelta.NO_INDEX);
if (id2 != containerID)
{
containerID = id2;
@@ -536,7 +540,7 @@ public abstract class BaseCDORevision extends AbstractCDORevision
{
CDOType type = CDOModelUtil.getType(feature);
Object oldValue = getValue(i);
- Object newValue = type.adjustReferences(referenceAdjuster, oldValue);
+ Object newValue = type.adjustReferences(referenceAdjuster, oldValue, feature, CDOFeatureDelta.NO_INDEX);
if (oldValue != newValue) // Just an optimization for NOOP adjusters
{
setValue(i, newValue);
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDOIDMapper.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDOIDMapper.java
index 5db49df724..2c12876822 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDOIDMapper.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDOIDMapper.java
@@ -14,6 +14,8 @@ import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
import java.util.Map;
/**
@@ -52,7 +54,10 @@ public class CDOIDMapper implements CDOReferenceAdjuster
this.allowUnmappedTempIDs = allowUnmappedTempIDs;
}
- public Object adjustReference(Object value)
+ /**
+ * @since 4.0
+ */
+ public Object adjustReference(Object value, EStructuralFeature feature, int index)
{
return CDORevisionUtil.remapID(value, idMappings, allowUnmappedTempIDs);
}
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 43d0058565..034f6725b9 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
@@ -15,10 +15,12 @@
package org.eclipse.emf.cdo.internal.net4j.protocol;
import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.CDOObjectReference;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.id.CDOIDTemp;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
@@ -35,6 +37,8 @@ import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.internal.net4j.bundle.OM;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.internal.cdo.object.CDOObjectReferenceImpl;
+
import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.om.monitor.OMMonitor;
@@ -45,6 +49,7 @@ import org.eclipse.emf.spi.cdo.CDOSessionProtocol.CommitTransactionResult;
import java.io.IOException;
import java.io.OutputStreamWriter;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -57,8 +62,6 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com
private CDOIDProvider idProvider; // CDOTransaction
- private int transactionID;
-
private String comment;
private boolean releaseLocks;
@@ -67,6 +70,8 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com
private Collection<CDOLob<?>> lobs;
+ private CDOTransaction transaction;
+
public CommitTransactionRequest(CDOClientProtocol protocol, int transactionID, String comment, boolean releaseLocks,
CDOIDProvider idProvider, CDOCommitData commitData, Collection<CDOLob<?>> lobs)
{
@@ -78,7 +83,8 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com
boolean releaseLocks, CDOIDProvider idProvider, CDOCommitData commitData, Collection<CDOLob<?>> lobs)
{
super(protocol, signalID);
- this.transactionID = transactionID;
+
+ transaction = (CDOTransaction)getSession().getView(transactionID);
this.comment = comment;
this.releaseLocks = releaseLocks;
this.idProvider = idProvider;
@@ -108,7 +114,7 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com
protected void requestingTransactionInfo(CDODataOutput out) throws IOException
{
- out.writeInt(transactionID);
+ out.writeInt(transaction.getViewID());
}
protected void requestingCommit(CDODataOutput out) throws IOException
@@ -200,7 +206,6 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com
protected EClass getObjectType(CDOID id)
{
- CDOTransaction transaction = (CDOTransaction)getSession().getView(transactionID);
CDOObject object = transaction.getObject(id);
return object.eClass();
}
@@ -226,7 +231,20 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com
{
String rollbackMessage = in.readString();
OM.LOG.error(rollbackMessage);
- return new CommitTransactionResult(idProvider, rollbackMessage);
+
+ List<CDOObjectReference> xRefs = null;
+ int size = in.readInt();
+ if (size != 0)
+ {
+ xRefs = new ArrayList<CDOObjectReference>(size);
+ for (int i = 0; i < size; i++)
+ {
+ CDOIDReference idReference = in.readCDOIDReference();
+ xRefs.add(new CDOObjectReferenceImpl(transaction, idReference));
+ }
+ }
+
+ return new CommitTransactionResult(idProvider, rollbackMessage, xRefs);
}
return null;
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/QueryRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/QueryRequest.java
index c6f2eeb5bd..bcb09e4a28 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/QueryRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/QueryRequest.java
@@ -11,9 +11,8 @@
**************************************************************************/
package org.eclipse.emf.cdo.internal.net4j.protocol;
-import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
-import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
@@ -79,13 +78,8 @@ public class QueryRequest extends CDOClientRequest<Boolean>
Object element;
if (xrefs)
{
- CDOID targetID = in.readCDOID();
- CDOID sourceID = in.readCDOID();
- CDOClassifierRef classifierRef = in.readCDOClassifierRef();
- String featureName = in.readString();
- int sourceIndex = in.readInt();
-
- element = new CDOObjectReferenceImpl(view, targetID, sourceID, classifierRef, featureName, sourceIndex);
+ CDOIDReference delegate = in.readCDOIDReference();
+ element = new CDOObjectReferenceImpl(view, delegate);
}
else
{
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java
index 7caafe42f5..a116448916 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java
@@ -112,8 +112,8 @@ public class WrappedHibernateList implements InternalCDOList
for (int i = 0; i < size; i++)
{
Object element = get(i);
- Object newID = type.adjustReferences(adjuster, element);
- if (newID != element)
+ Object newID = type.adjustReferences(adjuster, element, feature, i);
+ if (newID != element) // Just an optimization for NOOP adjusters
{
set(i, newID);
changed = true;
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 b1acaa02b2..cb5cd36a78 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
@@ -14,6 +14,7 @@
package org.eclipse.emf.cdo.server.internal.net4j.protocol;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
@@ -40,6 +41,7 @@ import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import java.io.IOException;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -238,7 +240,7 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
try
{
- success = respondingException(out, commitContext.getRollbackMessage());
+ success = respondingException(out, commitContext.getRollbackMessage(), commitContext.getXRefs());
if (success)
{
respondingResult(out);
@@ -251,13 +253,27 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
}
}
- protected boolean respondingException(CDODataOutput out, String rollbackMessage) throws Exception
+ protected boolean respondingException(CDODataOutput out, String rollbackMessage, List<CDOIDReference> xRefs)
+ throws Exception
{
boolean success = rollbackMessage == null;
out.writeBoolean(success);
if (!success)
{
out.writeString(rollbackMessage);
+
+ if (xRefs != null)
+ {
+ out.writeInt(xRefs.size());
+ for (CDOIDReference xRef : xRefs)
+ {
+ out.writeCDOIDReference(xRef);
+ }
+ }
+ else
+ {
+ out.writeInt(0);
+ }
}
return success;
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionCancelIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionCancelIndication.java
index 4089b360ec..5a14bbe488 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionCancelIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionCancelIndication.java
@@ -4,7 +4,7 @@
* 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:
* Simon McDuff - initial API and implementation
* Eike Stepper - maintenance
@@ -54,7 +54,7 @@ public class CommitXATransactionCancelIndication extends CommitTransactionIndica
exceptionMessage = commitContext.getRollbackMessage();
}
- respondingException(out, exceptionMessage);
+ respondingException(out, exceptionMessage, null);
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase1Indication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase1Indication.java
index 1acbf04f44..b5c100173c 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase1Indication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase1Indication.java
@@ -61,7 +61,7 @@ public class CommitXATransactionPhase1Indication extends CommitTransactionIndica
exceptionMessage = commitContext.getRollbackMessage();
}
- boolean success = respondingException(out, exceptionMessage);
+ boolean success = respondingException(out, exceptionMessage, null);
if (success)
{
respondingResult(out);
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase2Indication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase2Indication.java
index 094d54faed..d3d36e3650 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase2Indication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase2Indication.java
@@ -86,7 +86,7 @@ public class CommitXATransactionPhase2Indication extends CommitTransactionIndica
exceptionMessage = commitContext.getRollbackMessage();
}
- respondingException(out, exceptionMessage);
+ respondingException(out, exceptionMessage, null);
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java
index 7c16f35a9f..2b9d73c0e4 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java
@@ -37,7 +37,7 @@ public class CommitXATransactionPhase3Indication extends CommitTransactionIndica
protected void responding(CDODataOutput out, OMMonitor monitor) throws Exception
{
commitContext.commit(monitor);
- boolean success = respondingException(out, commitContext.getRollbackMessage());
+ boolean success = respondingException(out, commitContext.getRollbackMessage(), null);
commitContext.postCommit(success);
}
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/QueryIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/QueryIndication.java
index a14f717341..5e2db4ad7e 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/QueryIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/QueryIndication.java
@@ -11,7 +11,7 @@
*/
package org.eclipse.emf.cdo.server.internal.net4j.protocol;
-import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
@@ -24,8 +24,6 @@ import org.eclipse.emf.cdo.spi.server.InternalView;
import org.eclipse.net4j.util.om.trace.ContextTracer;
-import org.eclipse.emf.ecore.EReference;
-
import java.io.IOException;
/**
@@ -75,17 +73,8 @@ public class QueryIndication extends CDOReadIndication
if (xrefs)
{
- Object[] values = (Object[])object;
- CDOID targetID = (CDOID)values[0];
- CDOID sourceID = (CDOID)values[1];
- EReference sourceReference = (EReference)values[2];
- int sourceIndex = (Integer)values[3];
-
- out.writeCDOID(targetID);
- out.writeCDOID(sourceID);
- out.writeCDOClassifierRef(sourceReference.getEContainingClass());
- out.writeString(sourceReference.getName());
- out.writeInt(sourceIndex);
+ CDOIDReference idReference = (CDOIDReference)object;
+ out.writeCDOIDReference(idReference);
}
else
{
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 2a12dd0fea..04adf9e1b5 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
@@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDObject;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
@@ -27,6 +28,7 @@ import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta;
+import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDeltaVisitor;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
@@ -130,6 +132,8 @@ public class TransactionCommitContext implements InternalCommitContext
private String rollbackMessage;
+ private List<CDOIDReference> xRefs;
+
private boolean ensuringReferentialIntegrity;
private boolean autoReleaseLocksEnabled;
@@ -177,6 +181,11 @@ public class TransactionCommitContext implements InternalCommitContext
return rollbackMessage;
}
+ public List<CDOIDReference> getXRefs()
+ {
+ return xRefs;
+ }
+
public InternalCDOPackageRegistry getPackageRegistry()
{
return packageRegistry;
@@ -382,6 +391,10 @@ public class TransactionCommitContext implements InternalCommitContext
checkXRefs();
monitor.worked();
+ if (rollbackMessage != null)
+ {
+ return;
+ }
detachObjects(monitor.fork());
@@ -625,7 +638,7 @@ public class TransactionCommitContext implements InternalCommitContext
CDOReferenceAdjuster revisionTargetLocker = new CDOReferenceAdjuster()
{
- public Object adjustReference(Object value)
+ public Object adjustReference(Object value, EStructuralFeature feature, int index)
{
lockTarget(value, newIDs, supportingBranches);
return value;
@@ -807,17 +820,14 @@ public class TransactionCommitContext implements InternalCommitContext
protected void checkXRefs()
{
- if (!ensuringReferentialIntegrity || detachedObjectTypes == null)
+ if (ensuringReferentialIntegrity && detachedObjectTypes != null)
{
- return;
- }
-
- XRefContext context = new XRefContext();
- Set<CDOID> xRefs = context.getXRefs(accessor);
- if (!xRefs.isEmpty())
- {
- throw new IllegalStateException(
- "The following objects are still pointing to one or more of the objects to be detached: " + xRefs);
+ XRefContext context = new XRefContext();
+ xRefs = context.getXRefs(accessor);
+ if (!xRefs.isEmpty())
+ {
+ rollbackMessage = "Referential integrity violated";
+ }
}
}
@@ -1173,7 +1183,7 @@ public class TransactionCommitContext implements InternalCommitContext
private Set<CDOID> dirtyIDs = new HashSet<CDOID>();
- private Set<CDOID> xRefs = new HashSet<CDOID>();
+ private List<CDOIDReference> result = new ArrayList<CDOIDReference>();
public XRefContext()
{
@@ -1190,13 +1200,11 @@ public class TransactionCommitContext implements InternalCommitContext
}
}
- public Set<CDOID> getXRefs(IStoreAccessor accessor)
+ public List<CDOIDReference> getXRefs(IStoreAccessor accessor)
{
accessor.queryXRefs(this);
-
checkDirtyObjects();
-
- return xRefs;
+ return result;
}
private void checkDirtyObjects()
@@ -1204,11 +1212,15 @@ public class TransactionCommitContext implements InternalCommitContext
final CDOID[] dirtyID = { null };
CDOReferenceAdjuster dirtyObjectChecker = new CDOReferenceAdjuster()
{
- public Object adjustReference(Object targetID)
+ public Object adjustReference(Object targetID, EStructuralFeature feature, int index)
{
- if (detachedIDs.contains(targetID))
+ if (feature != CDOContainerFeatureDelta.CONTAINER_FEATURE)
{
- xRefs.add(dirtyID[0]);
+ if (detachedIDs.contains(targetID))
+ {
+ result.add(new CDOIDReference((CDOID)targetID, dirtyID[0], feature, index));
+ }
+
}
return targetID;
@@ -1261,7 +1273,7 @@ public class TransactionCommitContext implements InternalCommitContext
{
if (CDOIDUtil.isNull(targetID))
{
- // Compensate issues with the XRef implementation in the store accessor.
+ // Compensate potential issues with the XRef implementation in the store accessor.
return true;
}
@@ -1277,7 +1289,7 @@ public class TransactionCommitContext implements InternalCommitContext
return true;
}
- xRefs.add(sourceID);
+ result.add(new CDOIDReference(targetID, sourceID, sourceReference, sourceIndex));
return true;
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java
index 85a53144c3..da7e3732db 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java
@@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.internal.server;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
@@ -330,8 +331,7 @@ public class XRefsQueryHandler implements IQueryHandler
return true;
}
- Object[] result = { targetID, sourceID, sourceReference, sourceIndex };
- return context.addResult(result);
+ return context.addResult(new CDOIDReference(targetID, sourceID, sourceReference, sourceIndex));
}
public int compareTo(CDOBranchPoint o)
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 5934f19182..ddde27a5e6 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
@@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.model.lob.CDOBlob;
import org.eclipse.emf.cdo.common.model.lob.CDOClob;
@@ -385,6 +386,11 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com
* @since 3.0
*/
public String getRollbackMessage();
+
+ /**
+ * @since 4.0
+ */
+ public List<CDOIDReference> getXRefs();
}
/**
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java
index a3d60d5016..a8f7e2d048 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java
@@ -1161,36 +1161,21 @@ public class PartialCommitTest extends AbstractCDOTest
}
else
{
- try
+ // We always make company99 dirty if it's present
+ // (This is just a control object to verify that some stuff does NOT get
+ // committed.)
+ if (company99 != null)
{
- // We always make company99 dirty if it's present
- // (This is just a control object to verify that some stuff does NOT get
- // committed.)
- if (company99 != null)
- {
- company99.setName("000");
- }
+ company99.setName("000");
+ }
- tx.commit();
+ tx.commit();
- // And we verify that it didn't get included in the commit
- if (company99 != null)
- {
- assertDirty(company99, tx);
- assertTrue("Transaction should still have been dirty", tx.isDirty());
- }
- }
- catch (CommitException e)
+ // And we verify that it didn't get included in the commit
+ if (company99 != null)
{
- Throwable cause = e.getCause().getCause();
- if (cause instanceof CommitIntegrityException)
- {
- fail("---> Should not have failed with: " + e.getCause().getMessage());
- }
- else
- {
- throw e;
- }
+ assertDirty(company99, tx);
+ assertTrue("Transaction should still have been dirty", tx.isDirty());
}
}
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java
index da583b7ca9..16dc3de657 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java
@@ -204,7 +204,7 @@ public class XRefTest extends AbstractCDOTest
{
CDOObjectReference result = results.get(0);
assertEquals(1, result.getSourceIndex());
- assertEquals(ref.getName(), result.getSourceReference().getName());
+ assertEquals(ref.getName(), result.getSourceFeature().getName());
CDOObject sourceObject = results.get(0).getSourceObject();
assertEquals(1, sourceObject.eGet(sourceObject.eClass().getEStructuralFeature("id")));
}
@@ -218,7 +218,7 @@ public class XRefTest extends AbstractCDOTest
for (CDOObjectReference result : results)
{
- assertEquals(ref.getName(), results.get(0).getSourceReference().getName());
+ assertEquals(ref.getName(), results.get(0).getSourceFeature().getName());
CDOObject sourceObject = result.getSourceObject();
Integer id = (Integer)sourceObject.eGet(sourceObject.eClass().getEStructuralFeature("id"));
@@ -313,7 +313,7 @@ public class XRefTest extends AbstractCDOTest
CDOObjectReference result = results.get(0);
assertEquals(0, result.getSourceIndex());
- assertEquals(ref.getName(), result.getSourceReference().getName());
+ assertEquals(ref.getName(), result.getSourceFeature().getName());
CDOObject sourceObject = results.get(0).getSourceObject();
assertEquals(3, sourceObject.eGet(sourceObject.eClass().getEStructuralFeature("id")));
}
@@ -326,7 +326,7 @@ public class XRefTest extends AbstractCDOTest
for (CDOObjectReference result : results)
{
- assertEquals(ref.getName(), results.get(0).getSourceReference().getName());
+ assertEquals(ref.getName(), results.get(0).getSourceFeature().getName());
CDOObject sourceObject = result.getSourceObject();
Integer id = (Integer)sourceObject.eGet(sourceObject.eClass().getEStructuralFeature("id"));
@@ -417,12 +417,12 @@ public class XRefTest extends AbstractCDOTest
assertEquals(2, results.size());
assertEquals(0, results.get(0).getSourceIndex());
- assertEquals(ab5, results.get(0).getSourceReference());
+ assertEquals(ab5, results.get(0).getSourceFeature());
assertEquals(a1, results.get(0).getSourceObject());
assertEquals(b1, results.get(0).getTargetObject());
assertEquals(0, results.get(1).getSourceIndex());
- assertEquals(ab6, results.get(1).getSourceReference());
+ assertEquals(ab6, results.get(1).getSourceFeature());
assertEquals(a1, results.get(1).getSourceObject());
assertEquals(b1, results.get(1).getTargetObject());
}
@@ -495,7 +495,7 @@ public class XRefTest extends AbstractCDOTest
assertEquals(1, results.size());
assertEquals(0, results.get(0).getSourceIndex());
- assertEquals(ab5, results.get(0).getSourceReference());
+ assertEquals(ab5, results.get(0).getSourceFeature());
assertEquals(a1, results.get(0).getSourceObject());
assertEquals(b1, results.get(0).getTargetObject());
}
@@ -568,7 +568,7 @@ public class XRefTest extends AbstractCDOTest
assertEquals(1, results.size());
assertEquals(0, results.get(0).getSourceIndex());
- assertEquals(ab6, results.get(0).getSourceReference());
+ assertEquals(ab6, results.get(0).getSourceFeature());
assertEquals(a1, results.get(0).getSourceObject());
assertEquals(b1, results.get(0).getTargetObject());
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316434_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316434_Test.java
index a8dcf1e305..d9ebc17b71 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316434_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316434_Test.java
@@ -10,6 +10,7 @@
*/
package org.eclipse.emf.cdo.tests.bugzilla;
+import org.eclipse.emf.cdo.CDOObjectReference;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.session.CDOSession;
@@ -17,8 +18,9 @@ import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model4.ContainedElementNoOpposite;
import org.eclipse.emf.cdo.tests.model4.RefSingleNonContainedNPL;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CommitException;
+import org.eclipse.emf.cdo.util.ReferentialIntegrityException;
+import java.util.List;
import java.util.Map;
/**
@@ -61,10 +63,12 @@ public class Bugzilla_316434_Test extends AbstractCDOTest
try
{
transaction.commit();
- fail("CommitException expected");
+ fail("ReferentialIntegrityException expected");
}
- catch (CommitException expected)
+ catch (ReferentialIntegrityException expected)
{
+ List<CDOObjectReference> xRefs = expected.getXRefs();
+ assertEquals(1, xRefs.size());
// SUCCESS
}
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObjectReference.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObjectReference.java
index 36d9c6669b..0a689c2219 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObjectReference.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObjectReference.java
@@ -10,7 +10,7 @@
*/
package org.eclipse.emf.cdo;
-import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.cdo.common.id.CDOReference;
/**
* @author Eike Stepper
@@ -18,13 +18,6 @@ import org.eclipse.emf.ecore.EReference;
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
*/
-public interface CDOObjectReference
+public interface CDOObjectReference extends CDOReference<CDOObject>
{
- public CDOObject getTargetObject();
-
- public CDOObject getSourceObject();
-
- public EReference getSourceReference();
-
- public int getSourceIndex();
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ReferentialIntegrityException.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ReferentialIntegrityException.java
new file mode 100644
index 0000000000..b56df9194b
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ReferentialIntegrityException.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2004 - 2011 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.util;
+
+import org.eclipse.emf.cdo.CDOObjectReference;
+
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ * @since 4.0
+ */
+public class ReferentialIntegrityException extends CommitException
+{
+ private static final long serialVersionUID = 1L;
+
+ private List<CDOObjectReference> xRefs;
+
+ public ReferentialIntegrityException(String msg, List<CDOObjectReference> xRefs)
+ {
+ super(msg);
+ this.xRefs = xRefs;
+ }
+
+ public List<CDOObjectReference> getXRefs()
+ {
+ return xRefs;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java
index 11bd49a9af..cb597b5695 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java
@@ -321,7 +321,7 @@ public abstract class CDOLegacyWrapper extends CDOObjectWrapper
@Override
public String toString()
{
- return "CDOLegacyWrapper[" + id + ", " + instance.getClass().getName() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ return "CDOLegacyWrapper[" + instance.getClass().getSimpleName() + "@" + id + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
/**
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOObjectReferenceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOObjectReferenceImpl.java
index 5d551d49b8..89b9c27b1d 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOObjectReferenceImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOObjectReferenceImpl.java
@@ -12,13 +12,10 @@ package org.eclipse.emf.internal.cdo.object;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.CDOObjectReference;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
-import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.view.CDOView;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
/**
* @author Eike Stepper
@@ -28,46 +25,52 @@ public class CDOObjectReferenceImpl implements CDOObjectReference
{
private CDOView view;
- private CDOID targetID;
+ private CDOIDReference delegate;
- private CDOID sourceID;
-
- private CDOClassifierRef classifierRef;
-
- private String featureName;
-
- private int sourceIndex;
-
- public CDOObjectReferenceImpl(CDOView view, CDOID targetID, CDOID sourceID, CDOClassifierRef classifierRef,
- String featureName, int sourceIndex)
+ public CDOObjectReferenceImpl(CDOView view, CDOIDReference delegate)
{
this.view = view;
- this.targetID = targetID;
- this.sourceID = sourceID;
- this.classifierRef = classifierRef;
- this.featureName = featureName;
- this.sourceIndex = sourceIndex;
+ this.delegate = delegate;
}
public CDOObject getTargetObject()
{
- return view.getObject(targetID);
+ return view.getObject(delegate.getTargetObject());
}
public CDOObject getSourceObject()
{
- return view.getObject(sourceID);
+ return view.getObject(delegate.getSourceObject());
}
- public EReference getSourceReference()
+ public EStructuralFeature getSourceFeature()
{
- CDOPackageRegistry packageRegistry = view.getSession().getPackageRegistry();
- EClass eClass = (EClass)classifierRef.resolve(packageRegistry);
- return (EReference)eClass.getEStructuralFeature(featureName);
+ return delegate.getSourceFeature();
}
public int getSourceIndex()
{
- return sourceIndex;
+ return delegate.getSourceIndex();
}
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append(getSourceObject());
+ builder.append(".");
+ builder.append(getSourceFeature().getName());
+ int sourceIndex = getSourceIndex();
+ if (sourceIndex != NO_INDEX)
+ {
+ builder.append("[");
+ builder.append(sourceIndex);
+ builder.append("]");
+ }
+
+ builder.append(" --> ");
+ builder.append(getTargetObject());
+ return builder.toString();
+ }
+
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSingleTransactionStrategyImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSingleTransactionStrategyImpl.java
index 3abbdc77af..2fb7762dca 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSingleTransactionStrategyImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSingleTransactionStrategyImpl.java
@@ -10,12 +10,14 @@
**************************************************************************/
package org.eclipse.emf.internal.cdo.transaction;
+import org.eclipse.emf.cdo.CDOObjectReference;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.commit.CDOCommitData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.model.lob.CDOLob;
import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
import org.eclipse.emf.cdo.util.CommitException;
+import org.eclipse.emf.cdo.util.ReferentialIntegrityException;
import org.eclipse.emf.internal.cdo.bundle.OM;
@@ -35,6 +37,7 @@ import org.eclipse.emf.spi.cdo.InternalCDOUserSavepoint;
import org.eclipse.core.runtime.IProgressMonitor;
import java.util.Collection;
+import java.util.List;
/**
* @author Simon McDuff
@@ -79,6 +82,12 @@ public class CDOSingleTransactionStrategyImpl implements CDOTransactionStrategy
String rollbackMessage = result.getRollbackMessage();
if (rollbackMessage != null)
{
+ List<CDOObjectReference> xRefs = result.getXRefs();
+ if (xRefs != null)
+ {
+ throw new ReferentialIntegrityException(rollbackMessage, xRefs);
+ }
+
throw new CommitException(rollbackMessage);
}
}
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 ba86844936..ec8abc72df 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
@@ -24,6 +24,7 @@ import org.eclipse.emf.internal.cdo.messages.Messages;
import org.eclipse.net4j.util.ImplementationError;
+import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.spi.cdo.CDOSessionProtocol.CommitTransactionResult;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
@@ -190,7 +191,7 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext
final CDOReferenceAdjuster defaultReferenceAdjuster = result.getReferenceAdjuster();
result.setReferenceAdjuster(new CDOReferenceAdjuster()
{
- public Object adjustReference(Object id)
+ public Object adjustReference(Object id, EStructuralFeature feature, int index)
{
CDOIDTempObjectExternalImpl externalID = objectToID.get(id);
if (externalID != null)
@@ -198,7 +199,7 @@ public class CDOXACommitContextImpl implements InternalCDOXACommitContext
id = externalID;
}
- return defaultReferenceAdjuster.adjustReference(id);
+ return defaultReferenceAdjuster.adjustReference(id, feature, index);
}
});
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java
index 67891fe498..b60ddec813 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java
@@ -11,6 +11,7 @@
package org.eclipse.emf.spi.cdo;
import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.CDOObjectReference;
import org.eclipse.emf.cdo.common.CDOCommonRepository;
import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
@@ -571,6 +572,8 @@ public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLo
private String rollbackMessage;
+ private List<CDOObjectReference> xRefs;
+
private CDOBranchPoint branchPoint;
private long previousTimeStamp;
@@ -580,12 +583,13 @@ public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLo
private CDOReferenceAdjuster referenceAdjuster;
/**
- * @since 3.0
+ * @since 4.0
*/
- public CommitTransactionResult(CDOIDProvider idProvider, String rollbackMessage)
+ public CommitTransactionResult(CDOIDProvider idProvider, String rollbackMessage, List<CDOObjectReference> xRefs)
{
this.idProvider = idProvider;
this.rollbackMessage = rollbackMessage;
+ this.xRefs = xRefs;
}
/**
@@ -619,6 +623,14 @@ public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLo
}
/**
+ * @since 4.0
+ */
+ public List<CDOObjectReference> getXRefs()
+ {
+ return xRefs;
+ }
+
+ /**
* @since 3.0
*/
public CDOBranch getBranch()
@@ -680,7 +692,10 @@ public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLo
this.idMapper = idMapper;
}
- public Object adjustReference(Object id)
+ /**
+ * @since 4.0
+ */
+ public Object adjustReference(Object id, EStructuralFeature feature, int index)
{
if (id == null || id == CDOID.NULL)
{
@@ -692,7 +707,7 @@ public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLo
id = idProvider.provideCDOID(id);
}
- return idMapper.adjustReference(id);
+ return idMapper.adjustReference(id, feature, index);
}
}
}

Back to the top