/* SessionAgent.java
History:
Fri, Apr 06, 2012 9:06:37 PM, Created by tomyeh
Copyright (C) 2012 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.zk.ui.http;
import javax.portlet.PortletSession;
import javax.servlet.http.HttpSession;
import org.zkoss.lang.Classes;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.sys.Attributes;
/**
* Used to handle the session's attribute that works
* with both portlet and servlet.
*
* @author tomyeh
* @since 5.0.12
*/
/*package*/ class SessionAgent {
/** Puts a ZK session to the cache.
* You can retrieve the native session by {@link Session#getNativeSession}.
* @param sess the ZK session.
*/
public void put(Session sess) {
((HttpSession) sess.getNativeSession()).setAttribute(Attributes.ZK_SESSION, sess);
}
/** Retrieves a ZK session from the cache, or null if the ZK session
* is not stored.
*/
public Session get(Object navsess) {
return (Session) ((HttpSession) navsess).getAttribute(Attributes.ZK_SESSION);
}
/** Removes the ZK session from the cache.
*/
public void remove(Session sess) {
((HttpSession) sess.getNativeSession()).removeAttribute(Attributes.ZK_SESSION);
}
/*package*/ static final SessionAgent agent;
static {
SessionAgent sa;
try {
Classes.forNameByThread("javax.portlet.PortletSession");
sa = new SessionAgent() {
public void put(Session sess) {
//ZK-1029: WebSphere portal's PortletSession also implements HttpSession,
//so we have to check PortletSession first
final Object navsess = sess.getNativeSession();
if (navsess instanceof PortletSession)
((PortletSession) navsess).setAttribute(Attributes.ZK_SESSION, sess,
PortletSession.APPLICATION_SCOPE);
else
((HttpSession) navsess).setAttribute(Attributes.ZK_SESSION, sess);
}
public Session get(Object navsess) {
return (Session) (navsess instanceof PortletSession
? ((PortletSession) navsess).getAttribute(Attributes.ZK_SESSION,
PortletSession.APPLICATION_SCOPE)
: ((HttpSession) navsess).getAttribute(Attributes.ZK_SESSION));
}
public void remove(Session sess) {
final Object navsess = sess.getNativeSession();
if (navsess instanceof PortletSession)
((PortletSession) navsess).removeAttribute(Attributes.ZK_SESSION,
PortletSession.APPLICATION_SCOPE);
else
((HttpSession) navsess).removeAttribute(Attributes.ZK_SESSION);
}
};
} catch (Throwable t) {
sa = new SessionAgent();
}
agent = sa;
}
}