Package org.richfaces.test.staging

Source Code of org.richfaces.test.staging.StagingHttpSession

/**
*
*/
package org.richfaces.test.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;

  }

}
TOP

Related Classes of org.richfaces.test.staging.StagingHttpSession

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.