package org.swellrt.api;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Cookies;
/**
* Shared logic to manage session data in the browser side.
*
* See {@link SessionManagerImpl} and {@link WindowIdFilter} classes for
* server side related logic.
*
* @author pablojan@gmail.com (Pablo Ojanguren)
*
*/
public class BrowserSession {
/** A property in localStorage to count each new tab/window */
private final static String PROP_BROWSER_WINDOW_COUNTER = "wc";
/** A window's property storing the current window id */
private final static String PROP_SESSION_WINDOW_ID = "wid";
/** A HTTP header to send window id */
public final static String HTTP_HEADER_WINDOW_ID = "X-window-id";
/** Name of session cookie */
private final static String SESSION_COOKIE_NAME = "WSESSIONID";
/** URL parameter name for session id */
private final static String SESSION_PATH_PARAM = "sid";
/** URL parameter for window id */
private final static String WINDOWID_PATH_PARAM = "wid";
public static native void init() /*-{
var PROP_BROWSER_WINDOW_COUNTER = @org.swellrt.api.BrowserSession::PROP_BROWSER_WINDOW_COUNTER;
var PROP_SESSION_WINDOW_ID = @org.swellrt.api.BrowserSession::PROP_SESSION_WINDOW_ID;
try {
if (!$wnd.localStorage) return;
// Generate a browser window/tab id
if (!$wnd[PROP_SESSION_WINDOW_ID]) {
if (!$wnd.localStorage.getItem(PROP_BROWSER_WINDOW_COUNTER)) {
$wnd.localStorage.setItem(PROP_BROWSER_WINDOW_COUNTER, 0);
}
var windowCount = $wnd.localStorage.getItem(PROP_BROWSER_WINDOW_COUNTER);
$wnd[PROP_SESSION_WINDOW_ID] = windowCount++;
$wnd.localStorage.setItem(PROP_BROWSER_WINDOW_COUNTER, windowCount);
}
} catch (e) {
console.log("Error generating session window id: "+e);
}
}-*/;
public static native String getToken() /*-{
var PROP_BROWSER_WINDOW_COUNTER = @org.swellrt.api.BrowserSession::PROP_BROWSER_WINDOW_COUNTER;
var PROP_SESSION_WINDOW_ID = @org.swellrt.api.BrowserSession::PROP_SESSION_WINDOW_ID;
var token = $wnd.__session['sessionid'];
try {
if ($wnd[PROP_SESSION_WINDOW_ID] != null) {
token+=":"+$wnd[PROP_SESSION_WINDOW_ID];
}
} catch(e) {
console.log("Error getting session token: "+e);
return null;
}
return token;
}-*/;
public static String getWindowSessionId() {
return getToken();
}
public static native String getSessionId() /*-{
if ($wnd.__session && $wnd.__session['sessionid'] != null)
return $wnd.__session['sessionid'];
return null;
}-*/;
protected static native boolean isCookieEnabled() /*-{
return ($wnd.__session && $wnd.__session['cookieEnabled'] && $wnd.__session['cookieEnabled'] == true);
}-*/;
public static native String getWindowId() /*-{
var PROP_SESSION_WINDOW_ID = @org.swellrt.api.BrowserSession::PROP_SESSION_WINDOW_ID;
if ($wnd[PROP_SESSION_WINDOW_ID] != null)
return $wnd[PROP_SESSION_WINDOW_ID].toString();
return null;
}-*/;
public static native String getUserAddress() /*-{
if ($wnd.__session && $wnd.__session['address'] != null)
return $wnd.__session['address'];
return null;
}-*/;
/**
* Define session data in a window object.
*
* This is the old way from Wave to share session data
* in the client code.
*
* @param localDomain
* @param userAddress
* @param sessionId
* @param isCookieEnabled true if the browser sends session cookie to server
*/
public static native JavaScriptObject setUserData(String localDomain, String userAddress, String seed,
String sessionId, String windowId, boolean isCookieEnabled) /*-{
$wnd.__session = new Object();
$wnd.__session['domain'] = localDomain;
$wnd.__session['address'] = userAddress;
$wnd.__session['id'] = seed; // 'id' is used in Session.java/ClientIdGenerator to get the seed
$wnd.__session['sessionid'] = sessionId; //
$wnd.__session['windowid'] = windowId; //
$wnd.__session['cookieEnabled'] = isCookieEnabled;
return $wnd.__session;
}-*/;
protected static native void clearSessionObject() /*-{
$wnd.__session = null;
}-*/;
public static void clearUserData() {
Cookies.removeCookie(SESSION_COOKIE_NAME);
clearSessionObject();
}
public static String getSessionURLparameter() {
if (!isCookieEnabled()) {
return ";" + SESSION_PATH_PARAM + "=" + getSessionId();
}
return "";
}
public static String getWindowURLparameter() {
return (getWindowId() != null ? "&"+WINDOWID_PATH_PARAM+"=" + getWindowId() : "");
}
/**
* Add an extra path token for session id (;sid=) at the end of the URL path
* if session cookie is not available. This is specific for the Jetty
* server.
*
* @param url
* The url where to add the session id
* @return
*/
public static String addSessionToUrl(String url) {
if (!isCookieEnabled() && getSessionId() != null) {
url += ";" + SESSION_PATH_PARAM + "=" + getSessionId();
}
return url;
}
}