Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Taal2009-07-17 08:58:31 +0000
committerMartin Taal2009-07-17 08:58:31 +0000
commit24f709f6dfa5a038c13e548b4933b9bc69f3e8e8 (patch)
tree871d9b73d62719c8cadcf5aba954c0627ae8e4d2 /plugins
parent1b0491dd1ea62029de44fb6179226fb00e705ced (diff)
downloadcdo-24f709f6dfa5a038c13e548b4933b9bc69f3e8e8.tar.gz
cdo-24f709f6dfa5a038c13e548b4933b9bc69f3e8e8.tar.xz
cdo-24f709f6dfa5a038c13e548b4933b9bc69f3e8e8.zip
[282610] CDOQuery.setParameters should support Enum types
[283117] CDOQuery should return Enum values and not integers
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/io/CDODataOutput.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageRegistry.java14
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOType.java14
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java55
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java29
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java41
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java244
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java19
9 files changed, 391 insertions, 36 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/io/CDODataOutput.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/io/CDODataOutput.java
index 7acdbe66c8..aa391edec4 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/io/CDODataOutput.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/io/CDODataOutput.java
@@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.common.id.CDOIDMetaRange;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
+import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.model.CDOType;
import org.eclipse.emf.cdo.common.revision.CDOList;
@@ -39,6 +40,11 @@ import java.io.IOException;
*/
public interface CDODataOutput extends ExtendedDataOutput
{
+ /**
+ * @since 3.0
+ */
+ public CDOPackageRegistry getPackageRegistry();
+
public CDOIDProvider getIDProvider();
// /////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageRegistry.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageRegistry.java
index 78abd3710b..eadb9b6940 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageRegistry.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageRegistry.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:
* Eike Stepper - initial API and implementation
*/
@@ -12,6 +12,8 @@ package org.eclipse.emf.cdo.common.model;
import org.eclipse.emf.ecore.EPackage;
+import java.util.Set;
+
/**
* @author Eike Stepper
* @since 2.0
@@ -38,4 +40,14 @@ public interface CDOPackageRegistry extends EPackage.Registry
* Returns all package infos that are registered in this package registry.
*/
public CDOPackageInfo[] getPackageInfos();
+
+ /**
+ * @since 3.0
+ */
+ public Set<String> getAllKeys();
+
+ /**
+ * @since 3.0
+ */
+ public Object getWithDelegation(String nsURI, boolean resolve);
}
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 4a5f34fb49..8addda55ec 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
@@ -66,6 +66,11 @@ public interface CDOType
public static final CDOType BYTE_ARRAY = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.BYTE_ARRAY;
/**
+ * @since 3.0
+ */
+ public static final CDOType OBJECT_ARRAY = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.OBJECT_ARRAY;
+
+ /**
* @since 2.0
*/
public static final CDOType BIG_DECIMAL = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.BIG_DECIMAL;
@@ -76,9 +81,14 @@ public interface CDOType
public static final CDOType BIG_INTEGER = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.BIG_INTEGER;
/**
- * @since 2.0
+ * @since 3.0
+ */
+ public static final CDOType ENUM_ORDINAL = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.ENUM_ORDINAL;
+
+ /**
+ * @since 3.0
*/
- public static final CDOType ENUM = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.ENUM;
+ public static final CDOType ENUM_LITERAL = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.ENUM_LITERAL;
public static final CDOType CUSTOM = org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl.CUSTOM;
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java
index ecbba6ad28..54dc117082 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java
@@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.internal.common.io;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.id.CDOIDMetaRange;
+import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.id.CDOID.Type;
import org.eclipse.emf.cdo.common.io.CDODataInput;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
@@ -36,6 +37,7 @@ import org.eclipse.emf.cdo.internal.common.id.CDOIDExternalImpl;
import org.eclipse.emf.cdo.internal.common.id.CDOIDExternalTempImpl;
import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaImpl;
import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaRangeImpl;
+import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl;
import org.eclipse.emf.cdo.internal.common.id.CDOIDTempMetaImpl;
import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectImpl;
import org.eclipse.emf.cdo.internal.common.messages.Messages;
@@ -49,7 +51,7 @@ import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl;
import org.eclipse.emf.cdo.internal.common.revision.delta.CDOSetFeatureDeltaImpl;
import org.eclipse.emf.cdo.internal.common.revision.delta.CDOUnsetFeatureDeltaImpl;
import org.eclipse.emf.cdo.spi.common.id.AbstractCDOID;
-import org.eclipse.emf.cdo.spi.common.id.CDOIDLongImpl;
+import org.eclipse.emf.cdo.spi.common.id.InternalCDOIDObject;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
@@ -57,7 +59,6 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager;
-import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
import org.eclipse.net4j.util.io.ExtendedDataInput;
import org.eclipse.net4j.util.io.StringIO;
@@ -131,8 +132,14 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl
public EClassifier readCDOClassifierRefAndResolve() throws IOException
{
- CDOClassifierRef classRef = readCDOClassifierRef();
- return classRef.resolve(getPackageRegistry());
+ CDOClassifierRef classifierRef = readCDOClassifierRef();
+ EClassifier classifier = classifierRef.resolve(getPackageRegistry());
+ if (classifier == null)
+ {
+ throw new IOException("Unable to resolve " + classifierRef);
+ }
+
+ return classifier;
}
public CDOType readCDOType() throws IOException
@@ -145,6 +152,15 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl
public CDOID readCDOID() throws IOException
{
byte ordinal = readByte();
+
+ // A subtype of OBJECT
+ if (ordinal < 0)
+ {
+ // The ordinal value is negated in the stream to distinguish from the main type.
+ // Note: Added 1 because ordinal start at 0, so correct by minus 1.
+ return readCDOIDObject(-ordinal - 1);
+ }
+
if (TRACER.isEnabled())
{
String type;
@@ -183,14 +199,41 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl
case OBJECT:
{
- AbstractCDOID id = new CDOIDLongImpl();
+ // should normally not occur is handled by
+ // readCDOIDObject, code remains here
+ // for backward compatibility
+ AbstractCDOID id = new CDOIDObjectLongImpl();
id.read(this);
return id;
}
default:
- throw new ImplementationError();
+ throw new IOException("Illegal type: " + type);
+ }
+ }
+
+ private CDOID readCDOIDObject(int subTypeOrdinal) throws IOException
+ {
+ if (TRACER.isEnabled())
+ {
+ String subType;
+
+ try
+ {
+ subType = InternalCDOIDObject.SubType.values()[subTypeOrdinal].toString();
+ }
+ catch (RuntimeException ex)
+ {
+ subType = ex.getMessage();
+ }
+
+ TRACER.format("Reading CDOIDObject of sub type {0} ({1})", subTypeOrdinal, subType); //$NON-NLS-1$
}
+
+ InternalCDOIDObject.SubType subType = InternalCDOIDObject.SubType.values()[subTypeOrdinal];
+ AbstractCDOID id = CDOIDUtil.createCDOIDObject(subType);
+ id.read(this);
+ return id;
}
public CDOIDAndVersion readCDOIDAndVersion() throws IOException
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java
index 99c1096795..2dc0850202 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java
@@ -14,7 +14,6 @@ import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDAndVersion;
import org.eclipse.emf.cdo.common.id.CDOIDMetaRange;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
-import org.eclipse.emf.cdo.common.id.CDOID.Type;
import org.eclipse.emf.cdo.common.io.CDODataOutput;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
@@ -33,6 +32,7 @@ import org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl;
import org.eclipse.emf.cdo.internal.common.revision.delta.CDOFeatureDeltaImpl;
import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl;
import org.eclipse.emf.cdo.spi.common.id.AbstractCDOID;
+import org.eclipse.emf.cdo.spi.common.id.InternalCDOIDObject;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
@@ -122,14 +122,31 @@ public abstract class CDODataOutputImpl extends ExtendedDataOutput.Delegating im
id = CDOID.NULL;
}
- Type type = id.getType();
- int ordinal = type.ordinal();
- if (TRACER.isEnabled())
+ if (id instanceof InternalCDOIDObject)
+ {
+ InternalCDOIDObject.SubType subType = ((InternalCDOIDObject)id).getSubType();
+ int ordinal = subType.ordinal();
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing CDOIDObject of subtype {0} ({1})", ordinal, subType); //$NON-NLS-1$
+ }
+
+ // Negated to distinguish between the subtypes and the maintypes.
+ // Note: Added 1 because ordinal start at 0
+ writeByte(-ordinal - 1);
+ }
+ else
{
- TRACER.format("Writing CDOID of type {0} ({1})", ordinal, type); //$NON-NLS-1$
+ CDOID.Type type = id.getType();
+ int ordinal = type.ordinal();
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing CDOID of type {0} ({1})", ordinal, type); //$NON-NLS-1$
+ }
+
+ writeByte(ordinal);
}
- writeByte(ordinal);
((AbstractCDOID)id).write(this);
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java
index 423bf65d0b..466533e0f7 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java
@@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.common.id.CDOIDTempMeta;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
+import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.internal.common.bundle.OM;
@@ -131,6 +132,46 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte
return super.get(key);
}
+ public Set<String> getAllKeys()
+ {
+ Set<String> result = new HashSet<String>();
+ result.addAll(keySet());
+ if (delegateRegistry != null)
+ {
+ if (delegateRegistry instanceof CDOPackageRegistry)
+ {
+ result.addAll(((CDOPackageRegistry)delegateRegistry).getAllKeys());
+ }
+ else
+ {
+ result.addAll(delegateRegistry.keySet());
+ }
+ }
+
+ return result;
+ }
+
+ public Object getWithDelegation(String nsURI, boolean resolve)
+ {
+ Object result = getFrom(this, nsURI, resolve);
+ if (result == null && delegateRegistry != null)
+ {
+ result = getFrom(delegateRegistry, nsURI, resolve);
+ }
+
+ return result;
+ }
+
+ private static Object getFrom(EPackage.Registry registry, String nsURI, boolean resolve)
+ {
+ if (resolve)
+ {
+ return registry.getEPackage(nsURI);
+ }
+
+ return registry.get(nsURI);
+ }
+
public Object basicPut(String nsURI, Object value)
{
LifecycleUtil.checkActive(this);
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 88d5cbb883..22788ff584 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
@@ -14,15 +14,19 @@ import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.io.CDODataInput;
import org.eclipse.emf.cdo.common.io.CDODataOutput;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
+import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.common.model.CDOType;
import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.internal.common.messages.Messages;
+import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EEnumLiteral;
+import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -35,6 +39,7 @@ import java.text.MessageFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
/**
* @author Eike Stepper
@@ -231,7 +236,14 @@ public abstract class CDOTypeImpl implements CDOType
{
public void writeValue(CDODataOutput out, Object value) throws IOException
{
- out.writeCDOID((CDOID)value);
+ if (value instanceof CDORevision)
+ {
+ out.writeCDOID(((CDORevision)value).getID());
+ }
+ else
+ {
+ out.writeCDOID((CDOID)value);
+ }
}
public Object readValue(CDODataInput in) throws IOException
@@ -431,7 +443,7 @@ public abstract class CDOTypeImpl implements CDOType
/**
* TODO Transfer integers!
*/
- public static final CDOType ENUM = new ObjectType("ENUM", 998) //$NON-NLS-1$
+ public static final CDOType ENUM_ORDINAL = new ObjectType("ENUM_ORDINAL", 998) //$NON-NLS-1$
{
@SuppressWarnings("cast")
@Override
@@ -463,17 +475,6 @@ public abstract class CDOTypeImpl implements CDOType
}
}
- // EEnumLiteral[] literals = ((EEnum)type).getELiterals().toArray(
- // new EEnumLiteral[((EEnum)type).getELiterals().size()]);
- // for (EEnumLiteral literal : literals)
- // {
- // Enumerator instance = literal.getInstance();
- // if (instance == value)
- // {
- // return literal.getValue();
- // }
- // }
-
throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOTypeImpl.23"), value)); //$NON-NLS-1$
}
@@ -484,6 +485,95 @@ public abstract class CDOTypeImpl implements CDOType
}
};
+ public static final CDOType ENUM_LITERAL = new ObjectType("ENUM_LITERAL", 1001) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ EEnum eEnum;
+ if (value instanceof EEnumLiteral)
+ {
+ eEnum = ((EEnumLiteral)value).getEEnum();
+ }
+ else
+ {
+ eEnum = findEnum(out.getPackageRegistry(), value);
+ }
+
+ out.writeCDOClassifierRef(eEnum);
+ out.writeInt(((Enumerator)value).getValue());
+ }
+
+ @Override
+ protected Object doReadValue(CDODataInput in) throws IOException
+ {
+ EEnum eEnum = (EEnum)in.readCDOClassifierRefAndResolve();
+ int ordinal = in.readInt();
+
+ EEnumLiteral literal = eEnum.getEEnumLiteral(ordinal);
+ if (literal == null)
+ {
+ throw new IllegalArgumentException("Enum literal " + ordinal + " not found in " + eEnum);
+ }
+
+ return literal.getInstance();
+ }
+
+ private EEnum findEnum(CDOPackageRegistry registry, Object value)
+ {
+ Set<String> keys = registry.getAllKeys();
+
+ // First try all the packages that are already resolved
+ for (String nsURI : keys)
+ {
+ Object possiblePackage = registry.getWithDelegation(nsURI, false);
+ if (possiblePackage instanceof EPackage)
+ {
+ EPackage ePackage = (EPackage)possiblePackage;
+ EEnum eEnum = findEnum(ePackage, value);
+ if (eEnum != null)
+ {
+ return eEnum;
+ }
+ }
+ }
+
+ // Then try all the package descriptors
+ for (String nsURI : keys)
+ {
+ Object possiblePackage = registry.getWithDelegation(nsURI, false);
+ if (possiblePackage instanceof EPackage.Descriptor)
+ {
+ EPackage ePackage = registry.getEPackage(nsURI);
+ EEnum eEnum = findEnum(ePackage, value);
+ if (eEnum != null)
+ {
+ return eEnum;
+ }
+ }
+ }
+
+ throw new IllegalArgumentException("EENum instance " + value.getClass().getName() + " not supported");
+ }
+
+ private EEnum findEnum(EPackage ePackage, Object value)
+ {
+ for (EClassifier eClassifier : ePackage.getEClassifiers())
+ {
+ if (eClassifier instanceof EEnum)
+ {
+ EEnum eEnum = (EEnum)eClassifier;
+ if (eEnum.getInstanceClass() != null && eEnum.getInstanceClass() == value.getClass())
+ {
+ return eEnum;
+ }
+ }
+ }
+
+ return null;
+ }
+ };
+
public static final CDOType CUSTOM = new CDOTypeImpl("CUSTOM", 999, true) //$NON-NLS-1$
{
@SuppressWarnings("cast")
@@ -559,6 +649,132 @@ public abstract class CDOTypeImpl implements CDOType
}
};
+ public static final CDOType OBJECT_ARRAY = new ObjectType("OBJECT_ARRAY", 1000) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ final Object[] objects = (Object[])value;
+ out.writeInt(objects.length);
+ for (Object object : objects)
+ {
+ final CDOType cdoType;
+ if (object instanceof BigDecimal)
+ {
+ cdoType = CDOType.BIG_DECIMAL;
+ }
+ else if (object instanceof BigInteger)
+ {
+ cdoType = CDOType.BIG_INTEGER;
+ }
+ else if (object instanceof Boolean)
+ {
+ cdoType = CDOType.BOOLEAN_OBJECT;
+ }
+ else if (object instanceof Byte)
+ {
+ cdoType = CDOType.BYTE_OBJECT;
+ }
+ else if (object instanceof byte[])
+ {
+ cdoType = CDOType.BYTE_ARRAY;
+ }
+ else if (object instanceof Character)
+ {
+ cdoType = CDOType.CHARACTER_OBJECT;
+ }
+ else if (object instanceof Date)
+ {
+ cdoType = CDOType.DATE;
+ }
+ else if (object instanceof Double)
+ {
+ cdoType = CDOType.DOUBLE_OBJECT;
+ }
+ else if (object instanceof EEnumLiteral)
+ {
+ cdoType = CDOType.ENUM_LITERAL;
+ }
+ else if (object instanceof FeatureMap.Entry)
+ {
+ cdoType = CDOType.FEATURE_MAP_ENTRY;
+ }
+ else if (object instanceof Float)
+ {
+ cdoType = CDOType.FLOAT_OBJECT;
+ }
+ else if (object instanceof Integer)
+ {
+ cdoType = CDOType.INTEGER_OBJECT;
+ }
+ else if (object instanceof Long)
+ {
+ cdoType = CDOType.LONG_OBJECT;
+ }
+ else if (object instanceof Short)
+ {
+ cdoType = CDOType.SHORT_OBJECT;
+ }
+ else if (object instanceof String)
+ {
+ cdoType = CDOType.STRING;
+ }
+ else if (object instanceof CDOID || object instanceof CDORevision)
+ {
+ cdoType = CDOType.OBJECT;
+ }
+ else if (object == null)
+ {
+ cdoType = CDOType.OBJECT;
+ }
+ else
+ {
+ throw new IllegalArgumentException("Object type " + object.getClass().getName() + " is not supported.");
+ }
+
+ out.writeInt(cdoType.getTypeID());
+ cdoType.writeValue(out, object);
+ }
+ }
+
+ @Override
+ protected Object doReadValue(CDODataInput in) throws IOException
+ {
+ int size = in.readInt();
+ final Object[] objects = new Object[size];
+ for (int i = 0; i < size; i++)
+ {
+ int typeID = in.readInt();
+ CDOType cdoType = CDOModelUtil.getType(typeID);
+ objects[i] = cdoType.readValue(in);
+ }
+
+ return objects;
+ }
+
+ @Override
+ public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value)
+ {
+ // CHECK: should the same object array be returned with updated values
+ // or a new object array?
+ final Object[] objects = (Object[])value;
+ int i = 0;
+ for (Object object : objects)
+ {
+ if (object instanceof CDOID)
+ {
+ objects[i++] = adjuster.adjustReference(object);
+ }
+ else
+ {
+ objects[i++] = object;
+ }
+ }
+
+ return objects;
+ }
+ };
+
private String name;
private int typeID;
@@ -649,7 +865,7 @@ public abstract class CDOTypeImpl implements CDOType
CDOTypeImpl type = ids.get(typeID);
if (type == null)
{
- throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOModelUtil.6"), typeID)); //$NON-NLS-1$
+ throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOModelUtil.6"), typeID));
}
return type;
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java
index 830dd288a0..c4a66bc2a7 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java
@@ -57,6 +57,11 @@ public abstract class CDOClientRequest<RESULT> extends RequestWithConfirmation<R
{
requesting(new CDODataOutputImpl(out)
{
+ public CDOPackageRegistry getPackageRegistry()
+ {
+ return getSession().getPackageRegistry();
+ }
+
public CDOIDProvider getIDProvider()
{
throw new UnsupportedOperationException();
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 d2c191fa78..23625a58a5 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
@@ -100,16 +100,21 @@ public class CommitTransactionRequest extends RequestWithMonitoring<CommitTransa
{
requesting(new CDODataOutputImpl(out)
{
- @Override
- protected StringIO getPackageURICompressor()
+ public CDOPackageRegistry getPackageRegistry()
{
- return getProtocol().getPackageURICompressor();
+ return getSession().getPackageRegistry();
}
public CDOIDProvider getIDProvider()
{
return CommitTransactionRequest.this.getIDProvider();
}
+
+ @Override
+ protected StringIO getPackageURICompressor()
+ {
+ return getProtocol().getPackageURICompressor();
+ }
}, monitor);
}
@@ -182,19 +187,19 @@ public class CommitTransactionRequest extends RequestWithMonitoring<CommitTransa
{
return getProtocol().getPackageURICompressor();
}
-
+
@Override
protected CDOPackageRegistry getPackageRegistry()
{
return getSession().getPackageRegistry();
}
-
+
@Override
protected CDORevisionManager getRevisionManager()
{
return getSession().getRevisionManager();
}
-
+
@Override
protected CDOListFactory getListFactory()
{
@@ -210,7 +215,7 @@ public class CommitTransactionRequest extends RequestWithMonitoring<CommitTransa
{
return result;
}
-
+
result = confirmingTransactionResult(in);
confirmingNewPackage(in, result);
confirmingIDMappings(in, result);

Back to the top