package pt.ist.fenixframework.backend.ogm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; import java.util.UUID; import pt.ist.fenixframework.DomainRoot; import pt.ist.fenixframework.core.exception.MissingObjectException; /** * This class provides the internal representation of an DomainObject's identifier in OGM. */ public class OgmOID implements Comparable<OgmOID>, Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(OgmOID.class); private static final String OID_SEPARATOR = "@"; private static final String EXTERNAL_ID_ERROR = "Could not process externalId: "; public static final String ROOT_PK = "ROOT_OBJECT"; static final OgmOID ROOT_OBJECT_ID = new OgmOID(DomainRoot.class, ROOT_PK); // static final OgmOID ROOT_OBJECT_ID = new OgmOID(DomainRoot.class, 1L); private final Class objClass; private final String primaryKey; // private final Long primaryKey; OgmOID(Class objClass, String primaryKey) { // OgmOID(Class objClass, Long primaryKey) { this.objClass = objClass; this.primaryKey = primaryKey; } OgmOID(String externalId) { String[] tokens = externalId.split(OID_SEPARATOR); try { this.objClass = Class.forName(tokens[0]); this.primaryKey = tokens[1]; // this.primaryKey = Long.valueOf(tokens[1]); } catch (Exception e) { // e.g. index out of bounds, class not found, etc. logger.error(EXTERNAL_ID_ERROR + externalId); throw new MissingObjectException(EXTERNAL_ID_ERROR + externalId, e); } } Class getObjClass() { return this.objClass; } public String getPrimaryKey() { // public Long getPrimaryKey() { return this.primaryKey; } String toExternalId() { return objClass.getName() + OID_SEPARATOR + primaryKey; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o instanceof OgmOID) { OgmOID other = (OgmOID)o; return (this.objClass.equals(other.objClass) && this.primaryKey.equals(other.primaryKey)); } return false; } @Override public int hashCode() { return objClass.hashCode() + primaryKey.hashCode(); } @Override public int compareTo(OgmOID other) { int classes = this.objClass.getName().compareTo(other.objClass.getName()); if (classes != 0) { // having different classes is enough to order them return classes; } return this.primaryKey.compareTo(other.primaryKey); } @Override public String toString() { return toExternalId(); } }