/**
*
*/
package org.jboss.test.faces.staging;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionContext;
/**
* @author asmirnov
*
*/
@SuppressWarnings("deprecation")
abstract class StagingHttpSession implements HttpSession {
private static final int DEFAULT_INACTIVE_TIME = 30;
public static final String SESSION_ID = "1234567890";
private final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
private final long creationTime;
private volatile int inactiveTime = DEFAULT_INACTIVE_TIME;
private boolean valid;
public StagingHttpSession() {
this.creationTime = System.currentTimeMillis();
this.valid = true;
}
/**
*
*/
void destroy() {
// Destroy all session attributes.
unboundAttributes();
}
private void unboundAttributes() {
for (String name : getValueNames()) {
removeAttribute(name);
}
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getAttribute(java.lang.String)
*/
public Object getAttribute(String name) {
checkValid();
return attributes.get(name);
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getAttributeNames()
*/
@SuppressWarnings("unchecked")
public Enumeration getAttributeNames() {
checkValid();
return Collections.enumeration(attributes.keySet());
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getCreationTime()
*/
public long getCreationTime() {
checkValid();
return creationTime;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getId()
*/
public String getId() {
return SESSION_ID;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getLastAccessedTime()
*/
public long getLastAccessedTime() {
checkValid();
// TODO fix accessing time
return 0;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getMaxInactiveInterval()
*/
public int getMaxInactiveInterval() {
return inactiveTime;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getSessionContext()
*/
public HttpSessionContext getSessionContext() {
throw new NotImplementedException("Session context is not implemented");
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getValue(java.lang.String)
*/
public Object getValue(String name) {
return getAttribute(name);
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#getValueNames()
*/
public String[] getValueNames() {
checkValid();
ArrayList<String> names = new ArrayList<String>(attributes.keySet());
return names.toArray(new String[names.size()]);
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#invalidate()
*/
public void invalidate() {
checkValid();
destroy();
this.valid=false;
}
protected void checkValid(){
if(!valid){
throw new IllegalStateException("Session have been invalidated");
}
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#isNew()
*/
public boolean isNew() {
checkValid();
return false;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#putValue(java.lang.String,
* java.lang.Object)
*/
public void putValue(String name, Object value) {
setAttribute(name, value);
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#removeAttribute(java.lang.String)
*/
public void removeAttribute(String name) {
checkValid();
Object removed = this.attributes.remove(name);
if (null != removed) {
removedFromSession(name, removed);
}
}
protected void removedFromSession(String name, Object removed) {
HttpSessionBindingEvent sessionBindingEvent = new HttpSessionBindingEvent(
this, name, removed);
if (removed instanceof HttpSessionBindingListener) {
HttpSessionBindingListener listener = (HttpSessionBindingListener) removed;
listener.valueUnbound(sessionBindingEvent);
}
valueUnbound(sessionBindingEvent);
}
protected abstract void valueUnbound(
HttpSessionBindingEvent sessionBindingEvent);
protected void boundToSession(String name, Object value) {
HttpSessionBindingEvent sessionBindingEvent = new HttpSessionBindingEvent(
this, name, value);
if (value instanceof HttpSessionBindingListener) {
HttpSessionBindingListener listener = (HttpSessionBindingListener) value;
listener.valueBound(sessionBindingEvent);
}
valueBound(sessionBindingEvent);
}
protected abstract void valueBound(
HttpSessionBindingEvent sessionBindingEvent);
protected void replacedInSession(String name, Object oldValue, Object value) {
HttpSessionBindingEvent sessionBindingEvent = new HttpSessionBindingEvent(
this, name, value);
if (oldValue instanceof HttpSessionBindingListener) {
HttpSessionBindingListener listener = (HttpSessionBindingListener) oldValue;
listener.valueUnbound(sessionBindingEvent);
}
if (value instanceof HttpSessionBindingListener) {
HttpSessionBindingListener listener = (HttpSessionBindingListener) value;
listener.valueBound(sessionBindingEvent);
}
valueReplaced(sessionBindingEvent);
}
protected abstract void valueReplaced(
HttpSessionBindingEvent sessionBindingEvent);
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#removeValue(java.lang.String)
*/
public void removeValue(String name) {
removeAttribute(name);
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#setAttribute(java.lang.String,
* java.lang.Object)
*/
public void setAttribute(String name, Object value) {
checkValid();
if (null == value) {
removeAttribute(name);
} else {
Object oldValue = attributes.put(name, value);
if (null != oldValue) {
replacedInSession(name, oldValue, value);
} else {
boundToSession(name, value);
}
}
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpSession#setMaxInactiveInterval(int)
*/
public void setMaxInactiveInterval(int interval) {
this.inactiveTime = interval;
}
}