package pt.ist.fenixframework.backend.infinispan; import java.io.ObjectStreamException; import java.io.Serializable; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // import pt.ist.fenixframework.DomainObject; // import pt.ist.fenixframework.FenixFramework; import pt.ist.fenixframework.core.AbstractDomainObjectAdapter; import pt.ist.fenixframework.core.DomainObjectAllocator; import pt.ist.fenixframework.core.IdentityMap; public class InfinispanDomainObject extends AbstractDomainObjectAdapter { private static final Logger logger = LoggerFactory.getLogger(InfinispanDomainObject.class); // this should be final, but the ensureOid and restoreOid methods prevent it private OID oid; // We need to have the default constructor, because we've added the allocate-instance constructor protected InfinispanDomainObject() { super(); } protected InfinispanDomainObject(DomainObjectAllocator.OID oid) { super(oid); this.oid = (OID)oid.oid; } @Override protected void ensureOid() { Class objClass = this.getClass(); IdentityMap idMap = InfinispanBackEnd.getInstance().getIdentityMap(); while (true) { // assign new OID String uuid = UUID.randomUUID().toString(); this.oid = new OID(objClass, uuid); // cache this instance Object shouldBeSame = idMap.cache(this); if (shouldBeSame == this) { return; } else { logger.warn("Another object was already cached with the same key as this new object: " + oid); } } } // dealing with domain object identifiers @Override public OID getOid() { return this.oid; } @Override public final String getExternalId() { return oid.toExternalId(); } }