package scm.hivemind.statefulservice;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.apache.commons.logging.Log;
/**
*
* @author Marcus Schulte
*/
public class ClientStateStorageImpl implements ClientStateStorage {
protected Log myLog;
private HttpSession session = null;
private boolean invalidSession = false;
private Map clientStores = new HashMap();
private Map map = new HashMap();
private class StoredProxy implements HttpSessionBindingListener {
private StateStorageClearanceListener clearanceListener;
public StoredProxy ( StateStorageClearanceListener object ){
clearanceListener = object;
}
public void valueBound( HttpSessionBindingEvent arg0 ) {
// TODO Auto-generated method stub
}
public void valueUnbound( HttpSessionBindingEvent e ) {
invalidSession = true;
clearanceListener.clientStateCleared();
myLog.debug("Session expired or invalidated.");
}
public StateStorageClearanceListener getObject() {
return clearanceListener;
}
}
/* (non-Javadoc)
* @see com.bmw.sample.ClientStateStorage#provideSession(javax.servlet.http.HttpSession)
*/
public void provideSession(HttpSession s ) {
this.session = s;
this.invalidSession = false;
}
public void setLog( Log log ) {
myLog = log;
}
/* (non-Javadoc)
* @see com.bmw.sample.ClientStateStorage#store(java.lang.String, java.lang.Object)
*/
public void store(String key, StateStorageClearanceListener obj) {
if (session==null) {
myLog.debug( "storing key: "+key );
map.put(key,obj);
} else {
if ( ! invalidSession ) {
StoredProxy p = (StoredProxy) session.getAttribute( key );
// avoid unbind-events due to replacing an object with itself...
if ( p!=null && p.getObject()==obj)
return;
session.setAttribute( key, new StoredProxy(obj) );
} else
myLog.debug("skipping store due to invalid Session");
}
}
/* (non-Javadoc)
* @see com.bmw.sample.ClientStateStorage#retrieve(java.lang.String)
*/
public StateStorageClearanceListener retrieve(String key) {
if (session == null) {
myLog.debug( "retrieving key: "+key );
return (StateStorageClearanceListener) map.get(key);
} else {
StoredProxy p = (StoredProxy) session.getAttribute(key);
if ( p != null )
return p.getObject();
else
return null;
}
}
/* (non-Javadoc)
* @see com.bmw.sample.ClientStateStorage#setClientId(java.lang.String)
*/
public void setClientId(String cid) {
Map m = (Map) clientStores.get( cid );
if ( m == null) {
m = new HashMap();
clientStores.put( cid, m );
}
map = m;
}
/* (non-Javadoc)
* @see com.bmw.sample.ClientStateStorage#clear()
*/
public void clear( String clientId ) {
Map store = ( (Map)clientStores.get(clientId) );
for ( Iterator it = store.values().iterator(); it.hasNext(); ) {
StateStorageClearanceListener obj
= (StateStorageClearanceListener) it.next();
obj.clientStateCleared();
}
store.clear();
}
}