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/CDOIDExternalImpl.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java125
1 files changed, 73 insertions, 52 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java
index f3491c1e5c..8717d8ed7e 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java
@@ -6,53 +6,70 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * Simon McDuff - initial API and implementation
- * Eike Stepper - maintenance
+ * Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.internal.common.id;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDExternal;
+import org.eclipse.emf.cdo.common.id.CDOIDString;
+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.net4j.util.ObjectUtil;
-import org.eclipse.net4j.util.io.ExtendedDataInput;
-import org.eclipse.net4j.util.io.ExtendedDataOutput;
+import org.eclipse.net4j.util.CheckUtil;
+import org.eclipse.net4j.util.ref.Interner;
import java.io.IOException;
+import java.io.ObjectStreamException;
/**
- * @author Simon McDuff
+ * @author Eike Stepper
+ * @since 2.0
*/
-public class CDOIDExternalImpl extends AbstractCDOID implements CDOIDExternal
+public final class CDOIDExternalImpl extends AbstractCDOID implements CDOIDExternal, CDOIDString
{
private static final long serialVersionUID = 1L;
- private String uri;
+ private static final StringInterner INTERNER = new StringInterner();
- public CDOIDExternalImpl(String uri)
+ private final String uri;
+
+ private CDOIDExternalImpl(String uri)
{
+ CheckUtil.checkArg(uri, "Null not allowed");
this.uri = uri;
}
- public Type getType()
+ @Override
+ public void write(CDODataOutput out) throws IOException
{
- return Type.EXTERNAL_OBJECT;
+ out.writeString(uri);
}
- public boolean isDangling()
+ public String toURIFragment()
{
- return false;
+ return uri;
}
- public boolean isExternal()
+ public String getURI()
{
- return true;
+ return uri;
}
- public boolean isNull()
+ public String getStringValue()
{
- return false;
+ return uri;
+ }
+
+ public Type getType()
+ {
+ return Type.EXTERNAL_OBJECT;
+ }
+
+ public boolean isExternal()
+ {
+ return true;
}
public boolean isObject()
@@ -65,67 +82,71 @@ public class CDOIDExternalImpl extends AbstractCDOID implements CDOIDExternal
return false;
}
- public String getURI()
+ @Override
+ public int hashCode()
{
- return uri;
+ return uri.hashCode();
}
@Override
public String toString()
{
- return "oid:" + toURIFragment(); //$NON-NLS-1$
+ return "oid:" + uri; //$NON-NLS-1$
}
@Override
- public void read(String fragmentPart)
+ protected int doCompareTo(CDOID o) throws ClassCastException
{
- uri = fragmentPart;
+ return uri.compareTo(((CDOIDExternalImpl)o).uri);
}
- @Override
- public void read(ExtendedDataInput in) throws IOException
+ private Object readResolve() throws ObjectStreamException
{
- uri = in.readString();
+ return create(uri);
}
- @Override
- public void write(ExtendedDataOutput out) throws IOException
+ private static int getHashCode(String uri)
{
- out.writeString(uri);
+ return uri.hashCode();
}
- public String toURIFragment()
+ public static CDOIDExternalImpl create(String uri)
{
- return uri;
+ return INTERNER.intern(uri);
}
- @Override
- public boolean equals(Object obj)
+ public static CDOIDExternalImpl create(CDODataInput in) throws IOException
+ {
+ String uri = in.readString();
+ return create(uri);
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class StringInterner extends Interner<CDOIDExternalImpl>
{
- if (obj == this)
+ public synchronized CDOIDExternalImpl intern(String uri)
{
- return true;
+ int hashCode = getHashCode(uri);
+ for (Entry<CDOIDExternalImpl> entry = getEntry(hashCode); entry != null; entry = entry.getNextEntry())
+ {
+ CDOIDExternalImpl id = entry.get();
+ if (id != null && id.uri.equals(uri))
+ {
+ return id;
+ }
+ }
+
+ CDOIDExternalImpl id = new CDOIDExternalImpl(uri);
+ addEntry(createEntry(id, hashCode));
+ return id;
}
- // Could CDOIDTempObjectExternalImpl and CDOIDExternalImpl have the same uri. We don't want to mixed them.
- if (obj != null && obj.getClass() == getClass())
+ @Override
+ protected int hashCode(CDOIDExternalImpl id)
{
- CDOIDExternal that = (CDOIDExternal)obj;
- return ObjectUtil.equals(getURI(), that.getURI());
+ return getHashCode(id.uri);
}
-
- return false;
- }
-
- @Override
- public int hashCode()
- {
- return getClass().hashCode() ^ uri.hashCode();
- }
-
- @Override
- protected int doCompareTo(CDOID o) throws ClassCastException
- {
- return getURI().compareTo(((CDOIDExternalImpl)o).getURI());
}
}

Back to the top