diff options
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.java | 125 |
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()); } } |