sessionimpl.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,394 行 · 第 1/3 页

JAVA
1,394
字号
  }  /**   * Flush changes before the headers.   */  public final void saveBeforeHeaders()  {    if (_manager == null || ! _manager.isSaveBeforeHeaders())      return;    save();  }  /**   * Flush changes after a request completes.   */  public final void saveAfterRequest()  {    if (_manager == null || ! _manager.isSaveAfterRequest())      return;    save();  }  /**   * Saves changes to the session.   */  public final void save()  {    if (! isValid())      return;        try {      ClusterObject clusterObject = _clusterObject;      if (clusterObject != null) {	clusterObject.objectStore(this);      }    } catch (Throwable e) {      log.log(Level.WARNING, this + ": can't serialize session", e);    }  }  /**   * Store on shutdown.   */  void saveOnShutdown()  {    try {      ClusterObject clusterObject = _clusterObject;      if (clusterObject != null) {	clusterObject.objectModified();	clusterObject.objectStore(this);      }    } catch (Throwable e) {      log.log(Level.WARNING, this + ": can't serialize session", e);    }  }  /**   * Returns true if the session is empty.   */  public boolean isEmpty()  {    return _values == null || _values.size() == 0;  }  /**   * Loads the object from the input stream.   */  public void load(Hessian2Input in)    throws IOException  {    HttpSessionEvent event = null;    ArrayList<HttpSessionActivationListener> listeners = null;    synchronized (this) {      synchronized (_values) {	// server/017u	_values.clear();	// unbind();	try {	  int size = in.readInt();	  //System.out.println("LOAD: " + size + " " + this + " " + _clusterObject + System.identityHashCode(this));	  for (int i = 0; i < size; i++) {	    String key = in.readString();	    Object value = in.readObject();	    if (value != null) {	      _values.put(key, value);	      	      if (value instanceof HttpSessionActivationListener) {		HttpSessionActivationListener listener		  = (HttpSessionActivationListener) value;		if (event == null)		  event = new HttpSessionEvent(this);		if (listeners == null)		  listeners = new ArrayList<HttpSessionActivationListener>();		listeners.add(listener);	      }	    }	  }	} catch (Exception e) {	  throw IOExceptionWrapper.create(e);	}      }    }    for (int i = 0; listeners != null && i < listeners.size(); i++) {      HttpSessionActivationListener listener = listeners.get(i);      if (event == null)	event = new HttpSessionEvent(this);	      listener.sessionDidActivate(event);    }    listeners = _manager.getActivationListeners();    for (int i = 0; listeners != null && i < listeners.size(); i++) {      HttpSessionActivationListener listener = listeners.get(i);      if (event == null)	event = new HttpSessionEvent(this);	      listener.sessionDidActivate(event);    }  }  /**   * Saves the object to the input stream.   */  public void store(Hessian2Output out)    throws IOException  {    Set<Map.Entry<String,Object>> set = null;        HttpSessionEvent event = null;    ArrayList<HttpSessionActivationListener> listeners;        synchronized (_values) {      set = getEntrySet();      int size = set == null ? 0 : set.size();      if (size == 0) {	out.writeInt(0);	return;      }      listeners = new ArrayList<HttpSessionActivationListener>();      if (_manager.getActivationListeners() != null)	listeners.addAll(_manager.getActivationListeners());      for (Map.Entry entry : set) {	Object value = entry.getValue();	      	if (value instanceof HttpSessionActivationListener) {	  HttpSessionActivationListener listener	    = (HttpSessionActivationListener) value;	  if (event == null)	    event = new HttpSessionEvent(this);	  listeners.add(listener);	}      }    }    if (listeners != null && listeners.size() > 0) {      if (event == null)	event = new HttpSessionEvent(this);      for (HttpSessionActivationListener listener : listeners) {	listener.sessionWillPassivate(event);      }    }    synchronized (this) {      synchronized (_values) {	set = getEntrySet();	int size = set == null ? 0 : set.size();	out.writeInt(size);	if (size == 0)	  return;	boolean ignoreNonSerializable =	  getManager().getIgnoreSerializationErrors();	Map.Entry []entries = new Map.Entry[set.size()];      	Iterator iter = set.iterator();	int i = 0;	while (iter.hasNext()) {	  entries[i++] = (Map.Entry) iter.next();	}	Arrays.sort(entries, KEY_COMPARATOR);	for (i = 0; i < entries.length; i++) {	  Map.Entry entry = entries[i];	  Object value = entry.getValue();	  out.writeString((String) entry.getKey());	  if (ignoreNonSerializable && ! (value instanceof Serializable)) {	    out.writeObject(null);	    continue;	  }	  try {	    out.writeObject(value);	  } catch (NotSerializableException e) {	    log.warning(L.l("{0}: failed storing persistent session attribute '{1}'.  Persistent session values must extend java.io.Serializable.\n{2}", 			    this, entry.getKey(), String.valueOf(e)));	    throw e;	  }	}      }    }  }  /**   * Loads the object from the input stream.   */  public void load(ObjectInput in)    throws IOException  {    HttpSessionEvent event = null;    ArrayList<HttpSessionActivationListener> listeners = null;    synchronized (this) {      synchronized (_values) {	// server/017u, #1820 - loadImpl does not trigger callbacks	_values.clear();	try {	  int size = in.readInt();	  //System.out.println("LOAD: " + size + " " + this + " " + _clusterObject + System.identityHashCode(this));	  for (int i = 0; i < size; i++) {	    String key = in.readUTF();	    Object value = in.readObject();	    if (value != null) {	      _values.put(key, value);	      	      if (value instanceof HttpSessionActivationListener) {		if (listeners == null)		  listeners = new ArrayList<HttpSessionActivationListener>();		HttpSessionActivationListener listener		  = (HttpSessionActivationListener) value;				listeners.add(listener);	      }	    }	  }	} catch (Exception e) {	  throw IOExceptionWrapper.create(e);	}      }    }    for (int i = 0; listeners != null && i < listeners.size(); i++) {      HttpSessionActivationListener listener = listeners.get(i);      if (event == null)	event = new HttpSessionEvent(this);	      listener.sessionDidActivate(event);    }    listeners = _manager.getActivationListeners();    for (int i = 0; listeners != null && i < listeners.size(); i++) {      HttpSessionActivationListener listener = listeners.get(i);      if (event == null)	event = new HttpSessionEvent(this);	      listener.sessionDidActivate(event);    }  }  /**   * Saves the object to the input stream.   */  public void store(ObjectOutput out)    throws IOException  {    Set<Map.Entry<String,Object>> set = null;        HttpSessionEvent event = null;    ArrayList<HttpSessionActivationListener> listeners;        synchronized (_values) {      set = getEntrySet();      int size = set == null ? 0 : set.size();      if (size == 0) {	out.writeInt(0);	return;      }      listeners = new ArrayList<HttpSessionActivationListener>();      if (_manager.getActivationListeners() != null)	listeners.addAll(_manager.getActivationListeners());      for (Map.Entry entry : set) {	Object value = entry.getValue();	      	if (value instanceof HttpSessionActivationListener) {	  HttpSessionActivationListener listener	    = (HttpSessionActivationListener) value;	  if (event == null)	    event = new HttpSessionEvent(this);	  listeners.add(listener);	}      }    }    if (listeners != null && listeners.size() > 0) {      if (event == null)	event = new HttpSessionEvent(this);      for (HttpSessionActivationListener listener : listeners) {	listener.sessionWillPassivate(event);      }    }    synchronized (this) {      synchronized (_values) {	set = getEntrySet();	int size = set == null ? 0 : set.size();	out.writeInt(size);	if (size == 0)	  return;	boolean ignoreNonSerializable =	  getManager().getIgnoreSerializationErrors();	Map.Entry []entries = new Map.Entry[set.size()];      	Iterator iter = set.iterator();	int i = 0;	while (iter.hasNext()) {	  entries[i++] = (Map.Entry) iter.next();	}	Arrays.sort(entries, KEY_COMPARATOR);	for (i = 0; i < entries.length; i++) {	  Map.Entry entry = entries[i];	  Object value = entry.getValue();	  out.writeUTF((String) entry.getKey());	  if (ignoreNonSerializable && ! (value instanceof Serializable)) {	    out.writeObject(null);	    continue;	  }	  try {	    out.writeObject(value);	  } catch (NotSerializableException e) {	    log.warning(L.l("{0}: failed storing persistent session attribute '{1}'.  Persistent session values must extend java.io.Serializable.\n{2}", 			    this, entry.getKey(), String.valueOf(e)));	    throw e;	  }	}      }    }  }  /**   * Returns the set of values in the session   */  Set<Map.Entry<String,Object>> getEntrySet()  {    synchronized (_values) {      if (! _isValid)	throw new IllegalStateException(L.l("{0}: can't call getEntrySet() when session is no longer valid.", this));      return _values.entrySet();    }  }  public boolean canLog()  {    return log.isLoggable(Level.FINE);  }  public void log(String value)  {    log.fine(value);  }  @Override  public String toString()  {    String contextPath = "";        SessionManager manager = _manager;    if (manager != null) {      WebApp webApp = manager.getWebApp();      if (webApp != null)	contextPath = "," + webApp.getContextPath();    }        return "SessionImpl[" + getId() + contextPath + "]";  }  enum Logout {    INVALIDATE,    LRU,    TIMEOUT  };  static class LoginPrincipal implements java.io.Serializable {    private transient Principal _user;    LoginPrincipal(Principal user)    {      _user = user;    }    public Principal getUser()    {      return _user;    }  }  private static Comparator KEY_COMPARATOR = new Comparator() {      public int compare(Object aObj, Object bObj)      {	Map.Entry a = (Map.Entry) aObj;	Map.Entry b = (Map.Entry) bObj;	String aStr = (String) a.getKey();	String bStr = (String) b.getKey();	return aStr.compareTo(bStr);      }    };}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?