diff options
author | Martin Taal | 2009-07-17 08:58:31 +0000 |
---|---|---|
committer | Martin Taal | 2009-07-17 08:58:31 +0000 |
commit | 24f709f6dfa5a038c13e548b4933b9bc69f3e8e8 (patch) | |
tree | 871d9b73d62719c8cadcf5aba954c0627ae8e4d2 /plugins | |
parent | 1b0491dd1ea62029de44fb6179226fb00e705ced (diff) | |
download | cdo-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')
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); |