Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java106
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);
+ }
}
}

Back to the top