Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2018-04-22 04:29:35 +0000
committerEike Stepper2018-04-22 04:29:35 +0000
commit5f582b20c8a4602fc0cc4f554e5098aa2cc7e8c9 (patch)
tree95144ddf237338d3e57a2458274016a88b19b46f /plugins/org.eclipse.emf.cdo.common/src
parent0b250f569edeb1ea983aa761337b7d57057ac328 (diff)
downloadcdo-5f582b20c8a4602fc0cc4f554e5098aa2cc7e8c9.tar.gz
cdo-5f582b20c8a4602fc0cc4f554e5098aa2cc7e8c9.tar.xz
cdo-5f582b20c8a4602fc0cc4f554e5098aa2cc7e8c9.zip
[533909] Unsettable features that are set to null can't be committed
https://bugs.eclipse.org/bugs/show_bug.cgi?id=533909
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java12
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNilImpl.java110
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java51
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java19
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/delta/CDOSingleValueFeatureDeltaImpl.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/id/AbstractCDOID.java8
7 files changed, 215 insertions, 6 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java
index b41a87f441..5ce24b2bd4 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java
@@ -32,10 +32,20 @@ public interface CDOID extends Comparable<CDOID>, Serializable
{
public static final CDOID NULL = org.eclipse.emf.cdo.internal.common.id.CDOIDNullImpl.INSTANCE;
+ /**
+ * @since 4.6
+ */
+ public static final CDOID NIL = org.eclipse.emf.cdo.internal.common.id.CDOIDNilImpl.INSTANCE;
+
public Type getType();
public boolean isNull();
+ /**
+ * @since 4.6
+ */
+ public boolean isNil();
+
public boolean isObject();
public boolean isTemporary();
@@ -65,7 +75,13 @@ public interface CDOID extends Comparable<CDOID>, Serializable
public enum Type
{
NULL('N'), //
- OBJECT(' '), // Superceded by ObjectType.getID()
+
+ /**
+ * @since 4.6
+ */
+ NIL('I'), //
+
+ OBJECT(' '), // Superseded by ObjectType.getID()
/**
* @since 2.0
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java
index 4263a517bc..75c1d04627 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java
@@ -21,6 +21,7 @@ import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.revision.CDOIDAndBranch;
import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion;
+import org.eclipse.emf.cdo.common.revision.CDORevisionData;
import org.eclipse.emf.cdo.internal.common.bundle.OM;
import org.eclipse.emf.cdo.internal.common.id.CDOIDExternalImpl;
import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl;
@@ -110,6 +111,11 @@ public final class CDOIDUtil
return CDOID.NULL;
}
+ if (object == CDORevisionData.NIL)
+ {
+ return CDOID.NIL;
+ }
+
if (object instanceof CDOID)
{
return (CDOID)object;
@@ -389,6 +395,9 @@ public final class CDOIDUtil
case NULL:
return CDOID.NULL;
+ case NIL:
+ return CDOID.NIL;
+
case TEMP_OBJECT:
return CDOIDTempObjectImpl.create(Integer.valueOf(fragment));
@@ -501,6 +510,9 @@ public final class CDOIDUtil
case NULL:
return CDOID.NULL;
+ case NIL:
+ return CDOID.NIL;
+
case TEMP_OBJECT:
return CDOIDTempObjectImpl.create(in.readXInt());
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNilImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNilImpl.java
new file mode 100644
index 0000000000..7bf0b5b539
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNilImpl.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2018 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.internal.common.id;
+
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDObject;
+import org.eclipse.emf.cdo.common.id.CDOIDTemp;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+import org.eclipse.emf.cdo.spi.common.id.AbstractCDOID;
+
+import java.io.IOException;
+import java.io.ObjectStreamException;
+
+/**
+ * @author Eike Stepper
+ */
+public final class CDOIDNilImpl extends AbstractCDOID implements CDOIDTemp, CDOIDObject
+{
+ private static final long serialVersionUID = 1L;
+
+ public static final CDOIDNilImpl INSTANCE = new CDOIDNilImpl();
+
+ private CDOIDNilImpl()
+ {
+ }
+
+ public int getIntValue()
+ {
+ return 0;
+ }
+
+ public long getLongValue()
+ {
+ return 0L;
+ }
+
+ @Override
+ public void write(CDODataOutput out) throws IOException
+ {
+ // Do nothing
+ }
+
+ public String toURIFragment()
+ {
+ return "NIL"; //$NON-NLS-1$
+ }
+
+ public Type getType()
+ {
+ return Type.NIL;
+ }
+
+ public boolean isExternal()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean isNull()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean isNil()
+ {
+ return true;
+ }
+
+ public boolean isObject()
+ {
+ return false;
+ }
+
+ public boolean isTemporary()
+ {
+ return false;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return 0;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "NULL"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int doCompareTo(CDOID o) throws ClassCastException
+ {
+ return 0; // NULL == NULL
+ }
+
+ private Object readResolve() throws ObjectStreamException
+ {
+ return INSTANCE;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java
index b3c140ed1a..a6d150c0f8 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java
@@ -21,6 +21,9 @@ import org.eclipse.emf.cdo.spi.common.model.InternalCDOClassInfo;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.StubCDORevision;
+import org.eclipse.net4j.util.io.IOUtil;
+import org.eclipse.net4j.util.om.OMPlatform;
+
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
@@ -32,6 +35,9 @@ import org.eclipse.emf.ecore.impl.EClassImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -45,6 +51,8 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int
{
private static final PersistenceFilter[] NO_FILTERS = {};
+ private static final boolean DEBUG = OMPlatform.INSTANCE.isProperty("org.eclipse.emf.cdo.internal.common.model.CDOClassInfoImpl.DEBUG");
+
private final InternalCDORevision revisionWithoutID = new RevisionWithoutID(this);
private EClass eClass;
@@ -65,6 +73,9 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int
private int settingsFeatureCount;
+ /**
+ * The eSettings slots of all many-valued and/or transient features.
+ */
private int[] settingsFeatureIndices;
/**
@@ -370,10 +381,48 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int
return getPersistentFeatureIndex(featureID);
}
+ public String getDump()
+ {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try
+ {
+ dump(new PrintStream(out, true, "UTF-8"));
+ return new String(out.toByteArray(), "UTF-8");
+ }
+ catch (UnsupportedEncodingException ex)
+ {
+ ex.printStackTrace();
+ return ex.getMessage();
+ }
+ }
+
+ public void dump()
+ {
+ dump(IOUtil.OUT());
+ }
+
+ public void dump(PrintStream out)
+ {
+ out.println(eClass.getName());
+
+ out.println("\t\t\tallPersistentFeatures");
+ for (EStructuralFeature feature : getAllPersistentFeatures())
+ {
+ out.println("\t" + eClass.getFeatureID(feature) + "\t" + feature.getName() + "\t" + (feature.isTransient() ? "transient" : "persistent"));
+ }
+
+ out.println("\t\t\tsettingsFeatureIndices\tpersistentFeatureIndices\ttransientFeatureIndices");
+ for (int featureID = 0; featureID < settingsFeatureIndices.length; featureID++)
+ {
+ out.println("\t" + featureID + "\t" + eClass.getEStructuralFeature(featureID).getName() + "\t" + settingsFeatureIndices[featureID] + "\t"
+ + persistentFeatureIndices[featureID] + "\t" + transientFeatureIndices[featureID]);
+ }
+ }
+
@Override
public String toString()
{
- return eClass.toString();
+ return DEBUG ? getDump() : eClass.toString();
}
/**
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 b14ed0f4b6..9b217be917 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
@@ -243,13 +243,26 @@ public abstract class CDOTypeImpl implements CDOType
}
else
{
- out.writeCDOID((CDOID)value);
+ if (value == CDORevisionData.NIL)
+ {
+ out.writeCDOID(CDOID.NIL);
+ }
+ else
+ {
+ out.writeCDOID((CDOID)value);
+ }
}
}
- public CDOID readValue(CDODataInput in) throws IOException
+ public Object readValue(CDODataInput in) throws IOException
{
- return in.readCDOID();
+ CDOID id = in.readCDOID();
+ if (id == CDOID.NIL)
+ {
+ return CDORevisionData.NIL;
+ }
+
+ return id;
}
@Override
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 4820bbf61d..4b2dde2491 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
@@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.internal.common.revision.delta;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+import org.eclipse.emf.cdo.common.revision.CDORevisionData;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.spi.common.revision.CDOReferenceAdjuster;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDOFeatureDelta.WithIndex;
@@ -85,7 +86,7 @@ public abstract class CDOSingleValueFeatureDeltaImpl extends CDOFeatureDeltaImpl
out.writeXInt(featureID);
}
- if (valueToWrite != null && feature instanceof EReference)
+ if (valueToWrite != null && valueToWrite != CDORevisionData.NIL && feature instanceof EReference)
{
valueToWrite = out.getIDProvider().provideCDOID(value);
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/id/AbstractCDOID.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/id/AbstractCDOID.java
index 8887fec521..a17621adb5 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/id/AbstractCDOID.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/id/AbstractCDOID.java
@@ -43,6 +43,14 @@ public abstract class AbstractCDOID implements CDOID
}
/**
+ * @since 4.6
+ */
+ public boolean isNil()
+ {
+ return false;
+ }
+
+ /**
* @since 4.2
*/
@Deprecated

Back to the top