ClusteredHTTPSessionBeanImpl.java |
/* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.ha.httpsession.beanimpl.ejb; import java.rmi.RemoteException; import javax.ejb.EJBException; import org.jboss.ha.httpsession.interfaces.SerializableHttpSession; import org.jboss.invocation.MarshalledValue; /** * Core implementation of methods for the bean. * * @see org.jboss.ha.httpsession.beanimpl.interfaces.ClusteredHTTPSession * @see org.jboss.ha.httpsession.beanimpl.ejb.ClusteredHTTPSessionBeanAbstract * * @author <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>. * @version $Revision: 1.4 $ */ public abstract class ClusteredHTTPSessionBeanImpl extends ClusteredHTTPSessionBeanAbstract { // Constants ----------------------------------------------------- // Attributes ---------------------------------------------------- protected SerializableHttpSession tmpSession = null; protected boolean isModified = false; // Static -------------------------------------------------------- // Constructors -------------------------------------------------- // Public -------------------------------------------------------- // ClusteredHTTPSessionBeanAbstract overrides --------------------------------------------------- public void ejbStore () throws EJBException, RemoteException { if (tmpSession != null) { // the tmpSession has been assigned. Furthermore, if ejbStore is called // it means that isModified==true => we need to rebuild a serialized representation // serializeSession(); } } public void ejbLoad () throws EJBException, RemoteException { // the tmp value is no more valid: a new serialized representation is just loaded. // it will be transformed only if explicitly asked. // tmpSession = null; isModified = false; } public SerializableHttpSession getSession () { if (tmpSession == null) { // this is the first access to the object representation. // we use a lazy scheme => we unserialize now unserializeSession (); } return this.tmpSession; } public void setSession (SerializableHttpSession session) { if (tmpSession == null) isModified = true; else isModified = session.areAttributesModified (tmpSession); // in any case, we update the "time" attributes // this.setCreationTime (session.getContentCreationTime ()); this.setLastAccessedTime (session.getContentLastAccessTime ()); // in any cases, we assign the new session: this is because the session // may have internal data that is not used for the isModified comparison // (such as last access time). Consequently, if we use a load-balancer with // sticky sessions, the values will be kept in cache correctly whereas if we // don't have sticky session, these values will only be clustered-saved if // an attributed is modified! // this.tmpSession = session; } // Optimisation: called by the CMP engine // public boolean isModified () { return this.isModified; } // Package protected --------------------------------------------- // Protected ----------------------------------------------------- protected void serializeSession() throws EJBException { try { this.setSerializedSession (new MarshalledValue (this.tmpSession)); } catch (Exception e) { throw new EJBException (e.toString ()); } } protected void unserializeSession() throws EJBException { try { MarshalledValue mo = (MarshalledValue)this.getSerializedSession (); if (mo != null) this.tmpSession = (SerializableHttpSession)(mo.get ()); } catch (Exception e) { throw new EJBException (e.toString ()); } } // Private ------------------------------------------------------- // Inner classes ------------------------------------------------- }
ClusteredHTTPSessionBeanImpl.java |