package org.concord.otrunk.datamodel; import org.concord.framework.otrunk.OTID; public class OTTransientMapID implements OTID { public static final String TRANSIENT_ID_PREFIX = "transient:"; OTID mappedId; Object mapToken; int hashCode; public OTTransientMapID(OTID mapToken, OTID mappedId) { this.mappedId = mappedId; this.mapToken = mapToken; hashCode = mapToken.hashCode() + mappedId.hashCode(); } protected String internalToString() { return TRANSIENT_ID_PREFIX + mapToken.toString().replaceFirst("%", "") + "!" + mappedId.toExternalForm(); } /** * This returns a unique string for this id. This is not the actual id.<p> * * The actual id is not returned because using the toString method on an OTID * cannot always return the correct thing. The method OTObjectService.getExternalID * should be used instead. * * @see java.lang.Object#toString() */ public String toString() { return "%" + internalToString(); } public OTID getMappedId() { return mappedId; } public Object getMapToken() { return mapToken; } public int hashCode() { return hashCode; } public boolean equals(Object obj) { if(!(obj instanceof OTTransientMapID)){ return false; } OTTransientMapID other = (OTTransientMapID) obj; if(! mapToken.equals(other.getMapToken())){ return false; } return mappedId.equals(other.getMappedId()); } public String toExternalForm() { throw new RuntimeException("Transient IDs do not have a direct external form, " + "OTObjectService.getExternalID should used instead.\n" + " problem id: " + toInternalForm()); } /* * Transient IDs should never be persisted! This method is for temporary runtime use only! */ public String toInternalForm() { return internalToString().replaceFirst("%", ""); } }