package pt.ist.fenixframework.backend.infinispan;
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 Infinispan.
*/
public class OID implements Comparable<OID>, Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(OID.class);
private static final String OID_SEPARATOR = "@";
private static final String EXTERNAL_ID_ERROR = "Could not process externalId: ";
static final OID ROOT_OBJECT_ID = new OID(DomainRoot.class, "ROOT_OBJECT");
private final Class objClass;
private final String fullId; // includes class name to avoid repetitive computation
OID(Class objClass, String objId) {
this.objClass = objClass;
this.fullId = objClass.getName() + OID_SEPARATOR + objId;
}
public /* smf: tirar o public */ OID(String externalId) {
String[] tokens = externalId.split(OID_SEPARATOR);
try {
this.objClass = Class.forName(tokens[0]);
this.fullId = tokens[0] + OID_SEPARATOR + 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 getFullId() {
return this.fullId;
}
String toExternalId() {
return fullId;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof OID) {
OID other = (OID)o;
// return (this.objClass.equals(other.objClass)
// && this.fullId.equals(other.fullId));
return (this.fullId.equals(other.fullId));
}
return false;
}
@Override
public int hashCode() {
// return objClass.hashCode() + fullId.hashCode();
return fullId.hashCode();
}
@Override
public int compareTo(OID 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.objId.compareTo(other.objId);
// now that we have the fullId it's simpler
return this.fullId.compareTo(other.fullId);
}
@Override
public String toString() {
return getFullId();
}
}