package org.ripla.rap; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import javax.servlet.http.HttpSessionContext; /** * <p> * <strong>IMPORTANT:</strong> This class is <em>not</em> part the public RAP * API. It may change or disappear without further notice. Use this class at * your own risk. * </p> */ @SuppressWarnings("deprecation") public class TestSession implements HttpSession { private final Map<String, Object> attributes; private String id; private ServletContext servletContext; private boolean isInvalidated; private boolean newSession; private int maxInactiveInterval; public TestSession() { attributes = new HashMap<String, Object>(); servletContext = new TestServletContext(); id = String.valueOf(hashCode()); } @Override public long getCreationTime() { return 0; } public void setId(final String id) { this.id = id; } @Override public String getId() { if (isInvalidated) { final String text = "Unable to obtain session id. Session already invalidated."; throw new IllegalStateException(text); } return id; } @Override public long getLastAccessedTime() { return 0; } @Override public ServletContext getServletContext() { return servletContext; } public void setServletContext(final ServletContext servletContext) { this.servletContext = servletContext; } @Override public void setMaxInactiveInterval(final int maxInactiveInterval) { this.maxInactiveInterval = maxInactiveInterval; } @Override public int getMaxInactiveInterval() { return maxInactiveInterval; } /** * @deprecated */ @Deprecated @Override public HttpSessionContext getSessionContext() { return null; } @Override public Object getAttribute(final String arg0) { return attributes.get(arg0); } @Override public Object getValue(final String arg0) { return null; } @Override public Enumeration<String> getAttributeNames() { final Iterator iterator = attributes.keySet().iterator(); return new Enumeration<String>() { @Override public boolean hasMoreElements() { return iterator.hasNext(); } @Override public String nextElement() { return (String) iterator.next(); } }; } @Override public String[] getValueNames() { return null; } @Override public void setAttribute(final String arg0, final Object arg1) { if (arg1 instanceof HttpSessionBindingListener) { final HttpSessionBindingListener listener = (HttpSessionBindingListener) arg1; listener.valueBound(new HttpSessionBindingEvent(this, arg0, arg1)); } attributes.put(arg0, arg1); } @Override public void putValue(final String arg0, final Object arg1) { } @Override public void removeAttribute(final String arg0) { final Object removed = attributes.remove(arg0); if (removed instanceof HttpSessionBindingListener) { final HttpSessionBindingListener listener = (HttpSessionBindingListener) removed; final HttpSessionBindingEvent evt = new HttpSessionBindingEvent( this, arg0, removed); listener.valueUnbound(evt); } } @Override public void removeValue(final String arg0) { } @Override public void invalidate() { final Object[] keys = attributes.keySet().toArray(); for (int i = 0; i < keys.length; i++) { final String key = (String) keys[i]; final Object value = attributes.get(key); if (value instanceof HttpSessionBindingListener) { final HttpSessionBindingListener listener = (HttpSessionBindingListener) value; listener.valueUnbound(new HttpSessionBindingEvent(this, key, value)); } } attributes.clear(); isInvalidated = true; } public boolean isInvalidated() { return isInvalidated; } @Override public boolean isNew() { return newSession; } public void setNew(final boolean newSession) { this.newSession = newSession; } }