Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOTypeImpl.java1886
1 files changed, 943 insertions, 943 deletions
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 909e9c9f77..48ba6aaf38 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
@@ -1,943 +1,943 @@
-/*
- * 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
- * Stefan Winkler - Bug 299194: unsettable features inconsistent between revisions
- * Erdal Karaca - added support for HASHMAP CDO Type
- */
-package org.eclipse.emf.cdo.internal.common.model;
-
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.lob.CDOBlob;
-import org.eclipse.emf.cdo.common.lob.CDOClob;
-import org.eclipse.emf.cdo.common.lob.CDOLobUtil;
-import org.eclipse.emf.cdo.common.model.CDOModelUtil;
-import org.eclipse.emf.cdo.common.model.CDOType;
-import org.eclipse.emf.cdo.common.protocol.CDODataInput;
-import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
-import org.eclipse.emf.cdo.common.revision.CDORevision;
-import org.eclipse.emf.cdo.common.revision.CDORevisionData;
-import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
-import org.eclipse.emf.cdo.internal.common.messages.Messages;
-import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
-import org.eclipse.emf.cdo.spi.common.revision.CDOReferenceAdjuster;
-
-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;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.text.MessageFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * @author Eike Stepper
- */
-public abstract class CDOTypeImpl implements CDOType
-{
- private static CDOTypeImpl[] ids = new CDOTypeImpl[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
-
- private static final byte BOOLEAN_DEFAULT_PRIMITIVE = 0;
-
- private static final char CHARACTER_DEFAULT_PRIMITIVE = 0;
-
- private static final short SHORT_DEFAULT_PRIMITIVE = 0;
-
- public static final Boolean BOOLEAN_DEFAULT = new Boolean(false);
-
- public static final Byte BYTE_DEFAULT = new Byte(BOOLEAN_DEFAULT_PRIMITIVE);
-
- public static final Character CHARACTER_DEFAULT = new Character(CHARACTER_DEFAULT_PRIMITIVE);
-
- public static final Double DOUBLE_DEFAULT = new Double(0.0);
-
- public static final Float FLOAT_DEFAULT = new Float(0.0);
-
- public static final Integer INTEGER_DEFAULT = new Integer(0);
-
- public static final Long LONG_DEFAULT = new Long(0L);
-
- public static final Short SHORT_DEFAULT = new Short(SHORT_DEFAULT_PRIMITIVE);
-
- public static final CDOType BOOLEAN = new CDOTypeImpl("BOOLEAN", EcorePackage.EBOOLEAN, false, BOOLEAN_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- boolean v = (Boolean)(value == null ? getDefaultValue() : value);
- out.writeBoolean(v);
- }
-
- public Boolean readValue(CDODataInput in) throws IOException
- {
- return in.readBoolean();
- }
- };
-
- public static final CDOType BYTE = new CDOTypeImpl("BYTE", EcorePackage.EBYTE, false, BYTE_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeByte((Byte)(value == null ? getDefaultValue() : value));
- }
-
- public Byte readValue(CDODataInput in) throws IOException
- {
- return in.readByte();
- }
- };
-
- public static final CDOType CHAR = new CDOTypeImpl("CHAR", EcorePackage.ECHAR, false, CHARACTER_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeChar(((Character)(value == null ? getDefaultValue() : value)).charValue());
- }
-
- public Character readValue(CDODataInput in) throws IOException
- {
- return in.readChar();
- }
- };
-
- public static final CDOType DOUBLE = new CDOTypeImpl("DOUBLE", EcorePackage.EDOUBLE, false, DOUBLE_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeDouble((Double)(value == null ? getDefaultValue() : value));
- }
-
- public Double readValue(CDODataInput in) throws IOException
- {
- return in.readDouble();
- }
- };
-
- public static final CDOType FLOAT = new CDOTypeImpl("FLOAT", EcorePackage.EFLOAT, false, FLOAT_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeFloat((Float)(value == null ? getDefaultValue() : value));
- }
-
- public Float readValue(CDODataInput in) throws IOException
- {
- return in.readFloat();
- }
- };
-
- public static final CDOType INT = new CDOTypeImpl("INT", EcorePackage.EINT, false, INTEGER_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeInt((Integer)(value == null ? getDefaultValue() : value));
- }
-
- public Integer readValue(CDODataInput in) throws IOException
- {
- return in.readInt();
- }
- };
-
- public static final CDOType LONG = new CDOTypeImpl("LONG", EcorePackage.ELONG, false, LONG_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeLong((Long)(value == null ? getDefaultValue() : value));
- }
-
- public Long readValue(CDODataInput in) throws IOException
- {
- return in.readLong();
- }
- };
-
- public static final CDOType SHORT = new CDOTypeImpl("SHORT", EcorePackage.ESHORT, false, SHORT_DEFAULT) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeShort((Short)(value == null ? getDefaultValue() : value));
- }
-
- public Short readValue(CDODataInput in) throws IOException
- {
- return in.readShort();
- }
- };
-
- public static final CDOType BIG_DECIMAL = new CDOTypeImpl("BIG_DECIMAL", EcorePackage.EBIG_DECIMAL, true) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- if (value == null)
- {
- out.writeByteArray(null);
- }
- else
- {
- BigDecimal bigDecimal = (BigDecimal)value;
- out.writeByteArray(bigDecimal.unscaledValue().toByteArray());
- out.writeInt(bigDecimal.scale());
- }
- }
-
- public BigDecimal readValue(CDODataInput in) throws IOException
- {
- byte[] array = in.readByteArray();
- if (array == null)
- {
- return null;
- }
-
- BigInteger unscaled = new BigInteger(array);
- int scale = in.readInt();
- return new BigDecimal(unscaled, scale);
- }
- };
-
- public static final CDOType BIG_INTEGER = new CDOTypeImpl("BIG_INTEGER", EcorePackage.EBIG_INTEGER, true) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- if (value == null)
- {
- out.writeByteArray(null);
- }
- else
- {
- out.writeByteArray(((BigInteger)value).toByteArray());
- }
- }
-
- public BigInteger readValue(CDODataInput in) throws IOException
- {
- byte[] array = in.readByteArray();
- if (array == null)
- {
- return null;
- }
-
- return new BigInteger(array);
- }
- };
-
- public static final CDOType OBJECT = new CDOTypeImpl("OBJECT", EcorePackage.EOBJECT, true, CDOID.NULL) //$NON-NLS-1$
- {
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- if (value instanceof CDORevision)
- {
- out.writeCDOID(((CDORevision)value).getID());
- }
- else
- {
- out.writeCDOID((CDOID)value);
- }
- }
-
- public CDOID readValue(CDODataInput in) throws IOException
- {
- return in.readCDOID();
- }
-
- @Override
- public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
- {
- return adjuster.adjustReference(value, feature, index);
- }
- };
-
- public static final CDOType BOOLEAN_OBJECT = new ObjectType("BOOLEAN_OBJECT", EcorePackage.EBOOLEAN_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeBoolean((Boolean)value);
- }
-
- @Override
- protected Boolean doReadValue(CDODataInput in) throws IOException
- {
- return in.readBoolean();
- }
- };
-
- public static final CDOType BYTE_OBJECT = new ObjectType("BYTE_OBJECT", EcorePackage.EBYTE_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeByte((Byte)value);
- }
-
- @Override
- protected Byte doReadValue(CDODataInput in) throws IOException
- {
- return in.readByte();
- }
- };
-
- public static final CDOType CHARACTER_OBJECT = new ObjectType("CHARACTER_OBJECT", EcorePackage.ECHARACTER_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeChar((Character)value);
- }
-
- @Override
- protected Character doReadValue(CDODataInput in) throws IOException
- {
- return in.readChar();
- }
- };
-
- public static final CDOType DATE = new ObjectType("DATE", EcorePackage.EDATE) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeLong(((Date)value).getTime());
- }
-
- @Override
- protected Date doReadValue(CDODataInput in) throws IOException
- {
- return new Date(in.readLong());
- }
- };
-
- public static final CDOType DOUBLE_OBJECT = new ObjectType("DOUBLE_OBJECT", EcorePackage.EDOUBLE_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeDouble((Double)value);
- }
-
- @Override
- protected Double doReadValue(CDODataInput in) throws IOException
- {
- return in.readDouble();
- }
- };
-
- public static final CDOType FLOAT_OBJECT = new ObjectType("FLOAT_OBJECT", EcorePackage.EFLOAT_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeFloat((Float)value);
- }
-
- @Override
- protected Float doReadValue(CDODataInput in) throws IOException
- {
- return in.readFloat();
- }
- };
-
- public static final CDOType INTEGER_OBJECT = new ObjectType("INTEGER_OBJECT", EcorePackage.EINTEGER_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeInt((Integer)value);
- }
-
- @Override
- protected Integer doReadValue(CDODataInput in) throws IOException
- {
- return in.readInt();
- }
- };
-
- public static final CDOType LONG_OBJECT = new ObjectType("LONG_OBJECT", EcorePackage.ELONG_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeLong((Long)value);
- }
-
- @Override
- protected Long doReadValue(CDODataInput in) throws IOException
- {
- return in.readLong();
- }
- };
-
- public static final CDOType SHORT_OBJECT = new ObjectType("SHORT_OBJECT", EcorePackage.ESHORT_OBJECT) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeShort((Short)value);
- }
-
- @Override
- protected Short doReadValue(CDODataInput in) throws IOException
- {
- return in.readShort();
- }
- };
-
- public static final CDOType STRING = new CDOTypeImpl("STRING", EcorePackage.ESTRING, true) //$NON-NLS-1$
- {
- @Override
- protected String doCopyValue(Object value)
- {
- return (String)value;
- }
-
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeString((String)value);
- }
-
- public String readValue(CDODataInput in) throws IOException
- {
- return in.readString();
- }
- };
-
- public static final CDOType BYTE_ARRAY = new CDOTypeImpl("BYTE_ARRAY", EcorePackage.EBYTE_ARRAY, true) //$NON-NLS-1$
- {
- @Override
- protected byte[] doCopyValue(Object value)
- {
- byte[] array = (byte[])value;
- byte[] result = new byte[array.length];
- System.arraycopy(value, 0, result, 0, array.length);
- return result;
- }
-
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeByteArray((byte[])value);
- }
-
- public byte[] readValue(CDODataInput in) throws IOException
- {
- return in.readByteArray();
- }
- };
-
- public static final CDOType FEATURE_MAP_ENTRY = new CDOTypeImpl("FEATURE_MAP_ENTRY", EcorePackage.EFEATURE_MAP_ENTRY, //$NON-NLS-1$
- false)
- {
- @Override
- protected FeatureMap.Entry doCopyValue(Object value)
- {
- FeatureMap.Entry entry = (FeatureMap.Entry)value;
- EStructuralFeature innerFeature = entry.getEStructuralFeature();
- Object innerValue = entry.getValue();
- CDOType innerType = CDOModelUtil.getType(innerFeature.getEType());
-
- Object innerCopy = innerType.copyValue(innerValue);
- return CDORevisionUtil.createFeatureMapEntry(innerFeature, innerCopy);
- }
-
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- public FeatureMap.Entry readValue(CDODataInput in) throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- 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, feature, index);
- if (innerCopy != innerValue) // Just an optimization for NOOP adjusters
- {
- value = CDORevisionUtil.createFeatureMapEntry(innerFeature, innerCopy);
- }
-
- return value;
- }
- };
-
- public static final CDOType CUSTOM = new CDOTypeImpl("CUSTOM", 0, true) //$NON-NLS-1$
- {
- @Override
- protected String doCopyValue(Object value)
- {
- return (String)value;
- }
-
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeString((String)value);
- }
-
- public String readValue(CDODataInput in) throws IOException
- {
- return in.readString();
- }
-
- @Override
- public Object convertToEMF(EClassifier eType, Object value)
- {
- return EcoreUtil.createFromString((EDataType)eType, (String)value);
- }
-
- @Override
- public Object convertToCDO(EClassifier eType, Object value)
- {
- return EcoreUtil.convertToString((EDataType)eType, value);
- }
- };
-
- /**
- * TODO Transfer integers!
- */
- public static final CDOType ENUM_ORDINAL = new ObjectType("ENUM_ORDINAL", -1) //$NON-NLS-1$
- {
- @Override
- protected Integer doCopyValue(Object value)
- {
- return (Integer)value;
- }
-
- @Override
- public void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- out.writeInt((Integer)value);
- }
-
- @Override
- public Integer doReadValue(CDODataInput in) throws IOException
- {
- return in.readInt();
- }
-
- @Override
- public Object convertToCDO(EClassifier type, Object value)
- {
- for (EEnumLiteral literal : ((EEnum)type).getELiterals())
- {
- if (literal == value || literal.getInstance() == value)
- {
- return literal.getValue();
- }
- }
-
- throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOTypeImpl.23"), value)); //$NON-NLS-1$
- }
-
- @Override
- public Object convertToEMF(EClassifier type, Object value)
- {
- return ((EEnum)type).getEEnumLiteral((Integer)value).getInstance();
- }
- };
-
- public static final CDOType ENUM_LITERAL = new ObjectType("ENUM_LITERAL", -2) //$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((InternalCDOPackageRegistry)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(InternalCDOPackageRegistry 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 BLOB = new CDOTypeImpl("BLOB", -3, true) //$NON-NLS-1$
- {
- public CDOBlob readValue(CDODataInput in) throws IOException
- {
- if (in.readBoolean())
- {
- return CDOLobUtil.readBlob(in);
- }
-
- return null;
- }
-
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- if (value != null)
- {
- out.writeBoolean(true);
- CDOLobUtil.write(out, (CDOBlob)value);
- }
- else
- {
- out.writeBoolean(false);
- }
- }
- };
-
- public static final CDOType CLOB = new CDOTypeImpl("CLOB", -4, true) //$NON-NLS-1$
- {
- public CDOClob readValue(CDODataInput in) throws IOException
- {
- if (in.readBoolean())
- {
- return CDOLobUtil.readClob(in);
- }
-
- return null;
- }
-
- public void writeValue(CDODataOutput out, Object value) throws IOException
- {
- if (value != null)
- {
- out.writeBoolean(true);
- CDOLobUtil.write(out, (CDOClob)value);
- }
- else
- {
- out.writeBoolean(false);
- }
- }
- };
-
- public static final CDOType OBJECT_ARRAY = new ObjectType("OBJECT_ARRAY", -5) //$NON-NLS-1$
- {
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- Object[] objects = (Object[])value;
- out.writeInt(objects.length);
- for (Object object : objects)
- {
- writeTypeAndValue(out, object);
- }
- }
-
- @Override
- protected Object[] doReadValue(CDODataInput in) throws IOException
- {
- int size = in.readInt();
- Object[] objects = new Object[size];
- for (int i = 0; i < size; i++)
- {
- objects[i] = readTypeAndValue(in);
- }
-
- return objects;
- }
-
- @Override
- public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
- {
- Object[] objects = (Object[])value;
- int i = 0;
- for (Object object : objects)
- {
- if (object instanceof CDOID)
- {
- objects[i] = adjuster.adjustReference(object, feature, i);
- }
- else
- {
- objects[i] = object;
- }
-
- ++i;
- }
-
- return objects;
- }
- };
-
- public static final CDOType MAP = new ObjectType("MAP", -6) //$NON-NLS-1$
- {
- @SuppressWarnings("unchecked")
- @Override
- protected void doWriteValue(CDODataOutput out, Object value) throws IOException
- {
- Map<Object, Object> map = (Map<Object, Object>)value;
- out.writeInt(map.size());
-
- for (Entry<Object, Object> entry : map.entrySet())
- {
- writeTypeAndValue(out, entry.getKey());
- writeTypeAndValue(out, entry.getValue());
- }
- }
-
- @Override
- protected Map<Object, Object> doReadValue(CDODataInput in) throws IOException
- {
- Map<Object, Object> result = new HashMap<Object, Object>();
- int size = in.readInt();
- for (int i = 0; i < size; i++)
- {
- Object key = readTypeAndValue(in);
- Object value = readTypeAndValue(in);
- result.put(key, value == CDOID.NULL ? null : value);
- }
-
- return result;
- }
- };
-
- private String name;
-
- private byte typeID;
-
- private boolean canBeNull;
-
- private Object defaultValue;
-
- private CDOTypeImpl(String name, int typeID, boolean canBeNull, Object defaultValue)
- {
- ids[typeID - Byte.MIN_VALUE] = this;
-
- this.name = name;
- this.typeID = (byte)typeID;
- this.canBeNull = canBeNull;
- this.defaultValue = defaultValue;
- }
-
- private CDOTypeImpl(String name, int typeID, boolean canBeNull)
- {
- this(name, typeID, canBeNull, null);
- }
-
- public String getName()
- {
- return name;
- }
-
- public byte getTypeID()
- {
- return typeID;
- }
-
- public boolean canBeNull()
- {
- return canBeNull;
- }
-
- public Object getDefaultValue()
- {
- return defaultValue;
- }
-
- @Override
- public String toString()
- {
- return name;
- }
-
- public final Object copyValue(Object value)
- {
- if (value == null || value == CDORevisionData.NIL)
- {
- return value;
- }
-
- return doCopyValue(value);
- }
-
- protected Object doCopyValue(Object value)
- {
- return value;
- }
-
- public void write(CDODataOutput out) throws IOException
- {
- out.writeByte(typeID);
- }
-
- final public Object adjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature,
- int index)
- {
- return value == null ? null : doAdjustReferences(adjuster, value, feature, index);
- }
-
- protected Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature,
- int indexs)
- {
- return value;
- }
-
- /**
- * @since 2.0
- */
- public Object convertToEMF(EClassifier feature, Object value)
- {
- return value;
- }
-
- /**
- * @since 2.0
- */
- public Object convertToCDO(EClassifier feature, Object value)
- {
- return value;
- }
-
- protected void writeTypeAndValue(CDODataOutput out, Object object) throws IOException
- {
- CDOType cdoType = CDOModelUtil.getTypeOfObject(object);
- out.writeByte(cdoType.getTypeID());
- cdoType.writeValue(out, object);
- }
-
- protected Object readTypeAndValue(CDODataInput in) throws IOException
- {
- byte typeID = in.readByte();
- CDOType cdoType = CDOModelUtil.getType(typeID);
- return cdoType.readValue(in);
- }
-
- public static CDOType getType(byte typeID)
- {
- CDOTypeImpl type = ids[typeID - Byte.MIN_VALUE];
- if (type == null)
- {
- throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOModelUtil.6"), typeID));
- }
-
- return type;
- }
-
- /**
- * @author Eike Stepper
- */
- private static abstract class ObjectType extends CDOTypeImpl
- {
- public ObjectType(String name, int typeID)
- {
- super(name, typeID, true);
- }
-
- public final void writeValue(CDODataOutput out, Object value) throws IOException
- {
- if (value == null)
- {
- out.writeBoolean(false);
- }
- else
- {
- out.writeBoolean(true);
- doWriteValue(out, value);
- }
- }
-
- protected abstract void doWriteValue(CDODataOutput out, Object value) throws IOException;
-
- public final Object readValue(CDODataInput in) throws IOException
- {
- boolean notNull = in.readBoolean();
- if (notNull)
- {
- return doReadValue(in);
- }
-
- return null;
- }
-
- protected abstract Object doReadValue(CDODataInput in) throws IOException;
- }
-}
+/*
+ * Copyright (c) 2004 - 2012 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
+ * Stefan Winkler - Bug 299194: unsettable features inconsistent between revisions
+ * Erdal Karaca - added support for HASHMAP CDO Type
+ */
+package org.eclipse.emf.cdo.internal.common.model;
+
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.lob.CDOBlob;
+import org.eclipse.emf.cdo.common.lob.CDOClob;
+import org.eclipse.emf.cdo.common.lob.CDOLobUtil;
+import org.eclipse.emf.cdo.common.model.CDOModelUtil;
+import org.eclipse.emf.cdo.common.model.CDOType;
+import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionData;
+import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
+import org.eclipse.emf.cdo.internal.common.messages.Messages;
+import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
+import org.eclipse.emf.cdo.spi.common.revision.CDOReferenceAdjuster;
+
+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;
+import org.eclipse.emf.ecore.util.FeatureMap;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class CDOTypeImpl implements CDOType
+{
+ private static CDOTypeImpl[] ids = new CDOTypeImpl[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
+
+ private static final byte BOOLEAN_DEFAULT_PRIMITIVE = 0;
+
+ private static final char CHARACTER_DEFAULT_PRIMITIVE = 0;
+
+ private static final short SHORT_DEFAULT_PRIMITIVE = 0;
+
+ public static final Boolean BOOLEAN_DEFAULT = new Boolean(false);
+
+ public static final Byte BYTE_DEFAULT = new Byte(BOOLEAN_DEFAULT_PRIMITIVE);
+
+ public static final Character CHARACTER_DEFAULT = new Character(CHARACTER_DEFAULT_PRIMITIVE);
+
+ public static final Double DOUBLE_DEFAULT = new Double(0.0);
+
+ public static final Float FLOAT_DEFAULT = new Float(0.0);
+
+ public static final Integer INTEGER_DEFAULT = new Integer(0);
+
+ public static final Long LONG_DEFAULT = new Long(0L);
+
+ public static final Short SHORT_DEFAULT = new Short(SHORT_DEFAULT_PRIMITIVE);
+
+ public static final CDOType BOOLEAN = new CDOTypeImpl("BOOLEAN", EcorePackage.EBOOLEAN, false, BOOLEAN_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ boolean v = (Boolean)(value == null ? getDefaultValue() : value);
+ out.writeBoolean(v);
+ }
+
+ public Boolean readValue(CDODataInput in) throws IOException
+ {
+ return in.readBoolean();
+ }
+ };
+
+ public static final CDOType BYTE = new CDOTypeImpl("BYTE", EcorePackage.EBYTE, false, BYTE_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeByte((Byte)(value == null ? getDefaultValue() : value));
+ }
+
+ public Byte readValue(CDODataInput in) throws IOException
+ {
+ return in.readByte();
+ }
+ };
+
+ public static final CDOType CHAR = new CDOTypeImpl("CHAR", EcorePackage.ECHAR, false, CHARACTER_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeChar(((Character)(value == null ? getDefaultValue() : value)).charValue());
+ }
+
+ public Character readValue(CDODataInput in) throws IOException
+ {
+ return in.readChar();
+ }
+ };
+
+ public static final CDOType DOUBLE = new CDOTypeImpl("DOUBLE", EcorePackage.EDOUBLE, false, DOUBLE_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeDouble((Double)(value == null ? getDefaultValue() : value));
+ }
+
+ public Double readValue(CDODataInput in) throws IOException
+ {
+ return in.readDouble();
+ }
+ };
+
+ public static final CDOType FLOAT = new CDOTypeImpl("FLOAT", EcorePackage.EFLOAT, false, FLOAT_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeFloat((Float)(value == null ? getDefaultValue() : value));
+ }
+
+ public Float readValue(CDODataInput in) throws IOException
+ {
+ return in.readFloat();
+ }
+ };
+
+ public static final CDOType INT = new CDOTypeImpl("INT", EcorePackage.EINT, false, INTEGER_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeInt((Integer)(value == null ? getDefaultValue() : value));
+ }
+
+ public Integer readValue(CDODataInput in) throws IOException
+ {
+ return in.readInt();
+ }
+ };
+
+ public static final CDOType LONG = new CDOTypeImpl("LONG", EcorePackage.ELONG, false, LONG_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeLong((Long)(value == null ? getDefaultValue() : value));
+ }
+
+ public Long readValue(CDODataInput in) throws IOException
+ {
+ return in.readLong();
+ }
+ };
+
+ public static final CDOType SHORT = new CDOTypeImpl("SHORT", EcorePackage.ESHORT, false, SHORT_DEFAULT) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeShort((Short)(value == null ? getDefaultValue() : value));
+ }
+
+ public Short readValue(CDODataInput in) throws IOException
+ {
+ return in.readShort();
+ }
+ };
+
+ public static final CDOType BIG_DECIMAL = new CDOTypeImpl("BIG_DECIMAL", EcorePackage.EBIG_DECIMAL, true) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ if (value == null)
+ {
+ out.writeByteArray(null);
+ }
+ else
+ {
+ BigDecimal bigDecimal = (BigDecimal)value;
+ out.writeByteArray(bigDecimal.unscaledValue().toByteArray());
+ out.writeInt(bigDecimal.scale());
+ }
+ }
+
+ public BigDecimal readValue(CDODataInput in) throws IOException
+ {
+ byte[] array = in.readByteArray();
+ if (array == null)
+ {
+ return null;
+ }
+
+ BigInteger unscaled = new BigInteger(array);
+ int scale = in.readInt();
+ return new BigDecimal(unscaled, scale);
+ }
+ };
+
+ public static final CDOType BIG_INTEGER = new CDOTypeImpl("BIG_INTEGER", EcorePackage.EBIG_INTEGER, true) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ if (value == null)
+ {
+ out.writeByteArray(null);
+ }
+ else
+ {
+ out.writeByteArray(((BigInteger)value).toByteArray());
+ }
+ }
+
+ public BigInteger readValue(CDODataInput in) throws IOException
+ {
+ byte[] array = in.readByteArray();
+ if (array == null)
+ {
+ return null;
+ }
+
+ return new BigInteger(array);
+ }
+ };
+
+ public static final CDOType OBJECT = new CDOTypeImpl("OBJECT", EcorePackage.EOBJECT, true, CDOID.NULL) //$NON-NLS-1$
+ {
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ if (value instanceof CDORevision)
+ {
+ out.writeCDOID(((CDORevision)value).getID());
+ }
+ else
+ {
+ out.writeCDOID((CDOID)value);
+ }
+ }
+
+ public CDOID readValue(CDODataInput in) throws IOException
+ {
+ return in.readCDOID();
+ }
+
+ @Override
+ public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
+ {
+ return adjuster.adjustReference(value, feature, index);
+ }
+ };
+
+ public static final CDOType BOOLEAN_OBJECT = new ObjectType("BOOLEAN_OBJECT", EcorePackage.EBOOLEAN_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeBoolean((Boolean)value);
+ }
+
+ @Override
+ protected Boolean doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readBoolean();
+ }
+ };
+
+ public static final CDOType BYTE_OBJECT = new ObjectType("BYTE_OBJECT", EcorePackage.EBYTE_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeByte((Byte)value);
+ }
+
+ @Override
+ protected Byte doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readByte();
+ }
+ };
+
+ public static final CDOType CHARACTER_OBJECT = new ObjectType("CHARACTER_OBJECT", EcorePackage.ECHARACTER_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeChar((Character)value);
+ }
+
+ @Override
+ protected Character doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readChar();
+ }
+ };
+
+ public static final CDOType DATE = new ObjectType("DATE", EcorePackage.EDATE) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeLong(((Date)value).getTime());
+ }
+
+ @Override
+ protected Date doReadValue(CDODataInput in) throws IOException
+ {
+ return new Date(in.readLong());
+ }
+ };
+
+ public static final CDOType DOUBLE_OBJECT = new ObjectType("DOUBLE_OBJECT", EcorePackage.EDOUBLE_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeDouble((Double)value);
+ }
+
+ @Override
+ protected Double doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readDouble();
+ }
+ };
+
+ public static final CDOType FLOAT_OBJECT = new ObjectType("FLOAT_OBJECT", EcorePackage.EFLOAT_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeFloat((Float)value);
+ }
+
+ @Override
+ protected Float doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readFloat();
+ }
+ };
+
+ public static final CDOType INTEGER_OBJECT = new ObjectType("INTEGER_OBJECT", EcorePackage.EINTEGER_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeInt((Integer)value);
+ }
+
+ @Override
+ protected Integer doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readInt();
+ }
+ };
+
+ public static final CDOType LONG_OBJECT = new ObjectType("LONG_OBJECT", EcorePackage.ELONG_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeLong((Long)value);
+ }
+
+ @Override
+ protected Long doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readLong();
+ }
+ };
+
+ public static final CDOType SHORT_OBJECT = new ObjectType("SHORT_OBJECT", EcorePackage.ESHORT_OBJECT) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeShort((Short)value);
+ }
+
+ @Override
+ protected Short doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readShort();
+ }
+ };
+
+ public static final CDOType STRING = new CDOTypeImpl("STRING", EcorePackage.ESTRING, true) //$NON-NLS-1$
+ {
+ @Override
+ protected String doCopyValue(Object value)
+ {
+ return (String)value;
+ }
+
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeString((String)value);
+ }
+
+ public String readValue(CDODataInput in) throws IOException
+ {
+ return in.readString();
+ }
+ };
+
+ public static final CDOType BYTE_ARRAY = new CDOTypeImpl("BYTE_ARRAY", EcorePackage.EBYTE_ARRAY, true) //$NON-NLS-1$
+ {
+ @Override
+ protected byte[] doCopyValue(Object value)
+ {
+ byte[] array = (byte[])value;
+ byte[] result = new byte[array.length];
+ System.arraycopy(value, 0, result, 0, array.length);
+ return result;
+ }
+
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeByteArray((byte[])value);
+ }
+
+ public byte[] readValue(CDODataInput in) throws IOException
+ {
+ return in.readByteArray();
+ }
+ };
+
+ public static final CDOType FEATURE_MAP_ENTRY = new CDOTypeImpl("FEATURE_MAP_ENTRY", EcorePackage.EFEATURE_MAP_ENTRY, //$NON-NLS-1$
+ false)
+ {
+ @Override
+ protected FeatureMap.Entry doCopyValue(Object value)
+ {
+ FeatureMap.Entry entry = (FeatureMap.Entry)value;
+ EStructuralFeature innerFeature = entry.getEStructuralFeature();
+ Object innerValue = entry.getValue();
+ CDOType innerType = CDOModelUtil.getType(innerFeature.getEType());
+
+ Object innerCopy = innerType.copyValue(innerValue);
+ return CDORevisionUtil.createFeatureMapEntry(innerFeature, innerCopy);
+ }
+
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public FeatureMap.Entry readValue(CDODataInput in) throws IOException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ 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, feature, index);
+ if (innerCopy != innerValue) // Just an optimization for NOOP adjusters
+ {
+ value = CDORevisionUtil.createFeatureMapEntry(innerFeature, innerCopy);
+ }
+
+ return value;
+ }
+ };
+
+ public static final CDOType CUSTOM = new CDOTypeImpl("CUSTOM", 0, true) //$NON-NLS-1$
+ {
+ @Override
+ protected String doCopyValue(Object value)
+ {
+ return (String)value;
+ }
+
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeString((String)value);
+ }
+
+ public String readValue(CDODataInput in) throws IOException
+ {
+ return in.readString();
+ }
+
+ @Override
+ public Object convertToEMF(EClassifier eType, Object value)
+ {
+ return EcoreUtil.createFromString((EDataType)eType, (String)value);
+ }
+
+ @Override
+ public Object convertToCDO(EClassifier eType, Object value)
+ {
+ return EcoreUtil.convertToString((EDataType)eType, value);
+ }
+ };
+
+ /**
+ * TODO Transfer integers!
+ */
+ public static final CDOType ENUM_ORDINAL = new ObjectType("ENUM_ORDINAL", -1) //$NON-NLS-1$
+ {
+ @Override
+ protected Integer doCopyValue(Object value)
+ {
+ return (Integer)value;
+ }
+
+ @Override
+ public void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ out.writeInt((Integer)value);
+ }
+
+ @Override
+ public Integer doReadValue(CDODataInput in) throws IOException
+ {
+ return in.readInt();
+ }
+
+ @Override
+ public Object convertToCDO(EClassifier type, Object value)
+ {
+ for (EEnumLiteral literal : ((EEnum)type).getELiterals())
+ {
+ if (literal == value || literal.getInstance() == value)
+ {
+ return literal.getValue();
+ }
+ }
+
+ throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOTypeImpl.23"), value)); //$NON-NLS-1$
+ }
+
+ @Override
+ public Object convertToEMF(EClassifier type, Object value)
+ {
+ return ((EEnum)type).getEEnumLiteral((Integer)value).getInstance();
+ }
+ };
+
+ public static final CDOType ENUM_LITERAL = new ObjectType("ENUM_LITERAL", -2) //$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((InternalCDOPackageRegistry)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(InternalCDOPackageRegistry 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 BLOB = new CDOTypeImpl("BLOB", -3, true) //$NON-NLS-1$
+ {
+ public CDOBlob readValue(CDODataInput in) throws IOException
+ {
+ if (in.readBoolean())
+ {
+ return CDOLobUtil.readBlob(in);
+ }
+
+ return null;
+ }
+
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ if (value != null)
+ {
+ out.writeBoolean(true);
+ CDOLobUtil.write(out, (CDOBlob)value);
+ }
+ else
+ {
+ out.writeBoolean(false);
+ }
+ }
+ };
+
+ public static final CDOType CLOB = new CDOTypeImpl("CLOB", -4, true) //$NON-NLS-1$
+ {
+ public CDOClob readValue(CDODataInput in) throws IOException
+ {
+ if (in.readBoolean())
+ {
+ return CDOLobUtil.readClob(in);
+ }
+
+ return null;
+ }
+
+ public void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ if (value != null)
+ {
+ out.writeBoolean(true);
+ CDOLobUtil.write(out, (CDOClob)value);
+ }
+ else
+ {
+ out.writeBoolean(false);
+ }
+ }
+ };
+
+ public static final CDOType OBJECT_ARRAY = new ObjectType("OBJECT_ARRAY", -5) //$NON-NLS-1$
+ {
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ Object[] objects = (Object[])value;
+ out.writeInt(objects.length);
+ for (Object object : objects)
+ {
+ writeTypeAndValue(out, object);
+ }
+ }
+
+ @Override
+ protected Object[] doReadValue(CDODataInput in) throws IOException
+ {
+ int size = in.readInt();
+ Object[] objects = new Object[size];
+ for (int i = 0; i < size; i++)
+ {
+ objects[i] = readTypeAndValue(in);
+ }
+
+ return objects;
+ }
+
+ @Override
+ public Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature, int index)
+ {
+ Object[] objects = (Object[])value;
+ int i = 0;
+ for (Object object : objects)
+ {
+ if (object instanceof CDOID)
+ {
+ objects[i] = adjuster.adjustReference(object, feature, i);
+ }
+ else
+ {
+ objects[i] = object;
+ }
+
+ ++i;
+ }
+
+ return objects;
+ }
+ };
+
+ public static final CDOType MAP = new ObjectType("MAP", -6) //$NON-NLS-1$
+ {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void doWriteValue(CDODataOutput out, Object value) throws IOException
+ {
+ Map<Object, Object> map = (Map<Object, Object>)value;
+ out.writeInt(map.size());
+
+ for (Entry<Object, Object> entry : map.entrySet())
+ {
+ writeTypeAndValue(out, entry.getKey());
+ writeTypeAndValue(out, entry.getValue());
+ }
+ }
+
+ @Override
+ protected Map<Object, Object> doReadValue(CDODataInput in) throws IOException
+ {
+ Map<Object, Object> result = new HashMap<Object, Object>();
+ int size = in.readInt();
+ for (int i = 0; i < size; i++)
+ {
+ Object key = readTypeAndValue(in);
+ Object value = readTypeAndValue(in);
+ result.put(key, value == CDOID.NULL ? null : value);
+ }
+
+ return result;
+ }
+ };
+
+ private String name;
+
+ private byte typeID;
+
+ private boolean canBeNull;
+
+ private Object defaultValue;
+
+ private CDOTypeImpl(String name, int typeID, boolean canBeNull, Object defaultValue)
+ {
+ ids[typeID - Byte.MIN_VALUE] = this;
+
+ this.name = name;
+ this.typeID = (byte)typeID;
+ this.canBeNull = canBeNull;
+ this.defaultValue = defaultValue;
+ }
+
+ private CDOTypeImpl(String name, int typeID, boolean canBeNull)
+ {
+ this(name, typeID, canBeNull, null);
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public byte getTypeID()
+ {
+ return typeID;
+ }
+
+ public boolean canBeNull()
+ {
+ return canBeNull;
+ }
+
+ public Object getDefaultValue()
+ {
+ return defaultValue;
+ }
+
+ @Override
+ public String toString()
+ {
+ return name;
+ }
+
+ public final Object copyValue(Object value)
+ {
+ if (value == null || value == CDORevisionData.NIL)
+ {
+ return value;
+ }
+
+ return doCopyValue(value);
+ }
+
+ protected Object doCopyValue(Object value)
+ {
+ return value;
+ }
+
+ public void write(CDODataOutput out) throws IOException
+ {
+ out.writeByte(typeID);
+ }
+
+ final public Object adjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature,
+ int index)
+ {
+ return value == null ? null : doAdjustReferences(adjuster, value, feature, index);
+ }
+
+ protected Object doAdjustReferences(CDOReferenceAdjuster adjuster, Object value, EStructuralFeature feature,
+ int indexs)
+ {
+ return value;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public Object convertToEMF(EClassifier feature, Object value)
+ {
+ return value;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public Object convertToCDO(EClassifier feature, Object value)
+ {
+ return value;
+ }
+
+ protected void writeTypeAndValue(CDODataOutput out, Object object) throws IOException
+ {
+ CDOType cdoType = CDOModelUtil.getTypeOfObject(object);
+ out.writeByte(cdoType.getTypeID());
+ cdoType.writeValue(out, object);
+ }
+
+ protected Object readTypeAndValue(CDODataInput in) throws IOException
+ {
+ byte typeID = in.readByte();
+ CDOType cdoType = CDOModelUtil.getType(typeID);
+ return cdoType.readValue(in);
+ }
+
+ public static CDOType getType(byte typeID)
+ {
+ CDOTypeImpl type = ids[typeID - Byte.MIN_VALUE];
+ if (type == null)
+ {
+ throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOModelUtil.6"), typeID));
+ }
+
+ return type;
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static abstract class ObjectType extends CDOTypeImpl
+ {
+ public ObjectType(String name, int typeID)
+ {
+ super(name, typeID, true);
+ }
+
+ public final void writeValue(CDODataOutput out, Object value) throws IOException
+ {
+ if (value == null)
+ {
+ out.writeBoolean(false);
+ }
+ else
+ {
+ out.writeBoolean(true);
+ doWriteValue(out, value);
+ }
+ }
+
+ protected abstract void doWriteValue(CDODataOutput out, Object value) throws IOException;
+
+ public final Object readValue(CDODataInput in) throws IOException
+ {
+ boolean notNull = in.readBoolean();
+ if (notNull)
+ {
+ return doReadValue(in);
+ }
+
+ return null;
+ }
+
+ protected abstract Object doReadValue(CDODataInput in) throws IOException;
+ }
+}

Back to the top