diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java | 106 |
1 files changed, 92 insertions, 14 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java index a4d17b3855..48f267696c 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java @@ -11,42 +11,58 @@ package org.eclipse.emf.cdo.internal.common.id; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.spi.common.id.AbstractCDOIDLong; +import org.eclipse.emf.cdo.common.protocol.CDODataInput; +import org.eclipse.emf.cdo.common.protocol.CDODataOutput; +import org.eclipse.emf.cdo.spi.common.id.AbstractCDOID; import org.eclipse.emf.cdo.spi.common.id.InternalCDOIDObject; +import org.eclipse.net4j.util.CheckUtil; +import org.eclipse.net4j.util.ObjectUtil; +import org.eclipse.net4j.util.ref.Interner; + +import java.io.IOException; +import java.io.ObjectStreamException; + /** * @author Eike Stepper * @since 2.0 */ -public class CDOIDObjectLongImpl extends AbstractCDOIDLong implements InternalCDOIDObject +public final class CDOIDObjectLongImpl extends AbstractCDOID implements InternalCDOIDObject { private static final long serialVersionUID = 1L; - public CDOIDObjectLongImpl() + private static final LongInterner INTERNER = new LongInterner(); + + private final long value; + + private CDOIDObjectLongImpl(long value) { + CheckUtil.checkArg(value != 0L, "Zero not allowed"); + this.value = value; } - public CDOIDObjectLongImpl(long value) + public long getLongValue() { - super(value); + return value; } - public Type getType() + @Override + public void write(CDODataOutput out) throws IOException { - return Type.OBJECT; + out.writeLong(value); } - public boolean isDangling() + public String toURIFragment() { - return false; + return String.valueOf(value); } - public boolean isExternal() + public Type getType() { - return false; + return Type.OBJECT; } - public boolean isNull() + public boolean isExternal() { return false; } @@ -70,14 +86,76 @@ public class CDOIDObjectLongImpl extends AbstractCDOIDLong implements InternalCD } @Override + public int hashCode() + { + return ObjectUtil.hashCode(value); + } + + @Override public String toString() { - return "OID" + getLongValue(); //$NON-NLS-1$ + return "OID" + value; //$NON-NLS-1$ } @Override protected int doCompareTo(CDOID o) throws ClassCastException { - return new Long(getLongValue()).compareTo(((CDOIDObjectLongImpl)o).getLongValue()); + return new Long(value).compareTo(((CDOIDObjectLongImpl)o).value); + } + + private Object readResolve() throws ObjectStreamException + { + return create(value); + } + + private static int getHashCode(long value) + { + return ObjectUtil.hashCode(value); + } + + public static CDOIDObjectLongImpl create(long value) + { + return INTERNER.intern(value); + } + + public static CDOIDObjectLongImpl create(CDODataInput in) throws IOException + { + long value = in.readLong(); + return create(value); + } + + public static CDOIDObjectLongImpl create(String fragmentPart) + { + long value = Long.parseLong(fragmentPart); + return create(value); + } + + /** + * @author Eike Stepper + */ + private static final class LongInterner extends Interner<CDOIDObjectLongImpl> + { + public synchronized CDOIDObjectLongImpl intern(long value) + { + int hashCode = getHashCode(value); + for (Entry<CDOIDObjectLongImpl> entry = getEntry(hashCode); entry != null; entry = entry.getNextEntry()) + { + CDOIDObjectLongImpl id = entry.get(); + if (id != null && id.value == value) + { + return id; + } + } + + CDOIDObjectLongImpl id = new CDOIDObjectLongImpl(value); + addEntry(createEntry(id, hashCode)); + return id; + } + + @Override + protected int hashCode(CDOIDObjectLongImpl id) + { + return getHashCode(id.value); + } } } |