package org.jboss.seam.contexts; import static org.jboss.seam.contexts.PassivatedEntity.passivateEntity; /** * Swizzles entities held in the conversation context at * the end of each request. * * @see PassivatedEntity * * @author Gavin King * */ class EntityBean implements Wrapper { private static final long serialVersionUID = -2884601453783925804L; private Object instance; private PassivatedEntity passivatedEntity; private transient boolean initialized; public EntityBean(Object instance) { this.instance = instance; initialized = true; } //TODO: use @Unwrap public Object getInstance() { if ( !initialized && passivatedEntity!=null ) { //non-versioned entities can be lazily unpassivated instance = passivatedEntity.toEntityReference(true); } initialized = true; return instance; } public boolean passivate() { if ( passivatedEntity==null || passivatedEntity.isVersioned() ) //and the version number changed! { if ( PassivatedEntity.isTransactionRolledBackOrMarkedRollback() ) { passivatedEntity = null; } else { passivatedEntity = passivateEntity(instance); //if (passivatedEntity!=null) instance = null; //for performance of serialization } return true; } else { return false; } } public void activate() { //versioned entities must be unpassivated at the beginning //of the request if ( passivatedEntity!=null && passivatedEntity.isVersioned() ) { instance = passivatedEntity.toEntityReference(true); initialized = true; } else { initialized = false; } } }