/* * This file is part of the Echo Web Application Framework (hereinafter "Echo"). * Copyright (C) 2002-2009 NextApp, Inc. * * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. */ package nextapp.echo2.webrender; import java.io.Serializable; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import javax.servlet.http.HttpSessionEvent; /** * An abstract base class representing a single user-instance of an application * hosted in an application container. */ public abstract class UserInstance implements HttpSessionActivationListener, HttpSessionBindingListener, Serializable { public static final String PROPERTY_CLIENT_CONFIGURATION = "clientConfiguration"; public static final String PROPERTY_SERVER_DELAY_MESSAGE = "serverDelayMessage"; /** * The default character encoding in which responses should be rendered. */ private String characterEncoding = "UTF-8"; /** * <code>ClientConfiguration</code> information containing * application-specific client behavior settings. */ private ClientConfiguration clientConfiguration; /** * The <code>ServerDelayMessage</code> displayed during * client/server-interactions. */ private ServerDelayMessage serverDelayMessage; /** * A <code>ClientProperties</code> object describing the web browser * client. */ private ClientProperties clientProperties; /** * The URI of the servlet. */ private String servletUri; /** * Reference to the <code>HttpSession</code> in which this * <code>UserInstance</code> is stored. */ private transient HttpSession session; /** * Provides information about updated <code>UserInstance</code> properties. */ private UserInstanceUpdateManager updateManager; /** * The current transactionId. Used to ensure incoming ClientMessages reflect * changes made by user against current server-side state of user interface. * This is used to eliminate issues that could be encountered with two * browser windows pointing at the same application instance. */ private long transactionId = 0; /** * Creates a new <code>UserInstance</code>. * * @param conn the client/server <code>Connection</code> for which the * instance is being instantiated */ public UserInstance(Connection conn) { super(); updateManager = new UserInstanceUpdateManager(); conn.initUserInstance(this); } /** * Returns the default character encoding in which responses should be * rendered. * * @return the default character encoding in which responses should be * rendered */ public String getCharacterEncoding() { return characterEncoding; } /**the <code>ServerDelayMessage</code> displayed during * client/server-interactions. * Retrieves the <code>ClientConfiguration</code> information containing * application-specific client behavior settings. * * @return the relevant <code>ClientProperties</code> */ public ClientConfiguration getClientConfiguration() { return clientConfiguration; } /** * Retrieves the <code>ClientProperties</code> object providing * information about the client of this instance. * * @return the relevant <code>ClientProperties</code> */ public ClientProperties getClientProperties() { return clientProperties; } /** * Returns the current transaction id. * * @return the current transaction id */ public long getCurrentTransactionId() { return transactionId; } /** * Increments the current transaction id and returns it. * * @return the current transaction id, after an increment */ public long getNextTransactionId() { ++transactionId; return transactionId; } /** * Retrieves the <code>ServerDelayMessage</code> displayed during * client/server-interactions. * * @return the <code>ServerDelayMessage</code> */ public ServerDelayMessage getServerDelayMessage() { return serverDelayMessage; } /** * Determines the URI to invoke the specified <code>Service</code>. * * @param service the <code>Service</code> * @return the URI */ public String getServiceUri(Service service) { return servletUri + "?serviceId=" + service.getId(); } /** * Determines the URI to invoke the specified <code>Service</code> with * additional request parameters. The additional parameters are provided by * way of the <code>parameterNames</code> and <code>parameterValues</code> * arrays. The value of a parameter at a specific index in the * <code>parameterNames</code> array is provided in the * <code>parameterValues</code> array at the same index. The arrays must * thus be of equal length. Null values are allowed in the * <code>parameterValues</code> array, and in such cases only the parameter * name will be rendered in the returned URI. * * @param service the <code>Service</code> * @param parameterNames the names of the additional URI parameters * @param parameterValues the values of the additional URI parameters * @return the URI */ public String getServiceUri(Service service, String[] parameterNames, String[] parameterValues) { StringBuffer out = new StringBuffer(servletUri); out.append("?serviceId="); out.append(service.getId()); for (int i = 0; i < parameterNames.length; ++i) { out.append("&"); out.append(parameterNames[i]); if (parameterValues[i] != null) { out.append("="); out.append(parameterValues[i]); } } return out.toString(); } /** * Returns the URI of the servlet managing this <code>UserInstance</code>. * * @return the URI */ public String getServletUri() { return servletUri; } /** * Returns the <code>UserInstanceUpdateManager</code> providing information * about updated <code>UserInstance</code> properties. * * @return the <code>UserInstanceUpdateManager</code> */ public UserInstanceUpdateManager getUserInstanceUpdateManager() { return updateManager; } /** * Returns the <code>HttpSession</code> containing this * <code>UserInstance</code>. * * @return the <code>HttpSession</code> */ public HttpSession getSession() { return session; } /** * @see javax.servlet.http.HttpSessionActivationListener#sessionDidActivate(javax.servlet.http.HttpSessionEvent) */ public void sessionDidActivate(HttpSessionEvent e) { session = e.getSession(); } /** * @see javax.servlet.http.HttpSessionActivationListener#sessionWillPassivate(javax.servlet.http.HttpSessionEvent) */ public void sessionWillPassivate(HttpSessionEvent e) { session = null; } /** * Sets the <code>ClientConfiguration</code> information containing * application-specific client behavior settings. * * @param clientConfiguration the new <code>ClientConfiguration</code> */ public void setClientConfiguration(ClientConfiguration clientConfiguration) { this.clientConfiguration = clientConfiguration; updateManager.processPropertyUpdate(PROPERTY_CLIENT_CONFIGURATION); } /** * Stores the <code>ClientProperties</code> object that provides * information about the client of this instance. * * @param clientProperties the relevant <code>ClientProperties</code> */ void setClientProperties(ClientProperties clientProperties) { this.clientProperties = clientProperties; } /** * Sets the <code>ServerDelayMessage</code> displayed during * client/server-interactions. * * @param serverDelayMessage the new <code>ServerDelayMessage</code> */ public void setServerDelayMessage(ServerDelayMessage serverDelayMessage) { this.serverDelayMessage = serverDelayMessage; updateManager.processPropertyUpdate(PROPERTY_SERVER_DELAY_MESSAGE); } /** * Sets the URI of the servlet managing this <code>UserInstance</code>. * * @param servletUri the URI */ void setServletUri(String servletUri) { this.servletUri = servletUri; } /** * Listener implementation of <code>HttpSessionBindingListener</code>. * Stores reference to session when invoked. * * @see javax.servlet.http.HttpSessionBindingListener#valueBound(HttpSessionBindingEvent) */ public void valueBound(HttpSessionBindingEvent e) { session = e.getSession(); } /** * Listener implementation of <code>HttpSessionBindingListener</code>. * Removes reference to session when invoked. * * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent) */ public void valueUnbound(HttpSessionBindingEvent e) { session = null; } }