package nextapp.echo.webcontainer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
import javax.servlet.http.HttpSession;
import nextapp.echo.app.ApplicationInstance;
import nextapp.echo.app.Component;
import nextapp.echo.app.TaskQueueHandle;
import nextapp.echo.app.update.ServerComponentUpdate;
import nextapp.echo.app.update.UpdateManager;
import nextapp.echo.webcontainer.util.IdTable;
private static final long serialVersionUID = 20070101L;
private static final int DEFAULT_CALLBACK_INTERVAL = 500;
public static final String PROPERTY_CLIENT_CONFIGURATION = "clientConfiguration";
private UserInstanceContainer container;
private String id;
private String clientWindowId;
private ApplicationInstance applicationInstance;
private ClientConfiguration clientConfiguration;
private ClientProperties clientProperties;
private Map componentToRenderStateMap = new HashMap();
private PropertyChangeListener applicationPropertyChangeListener = new SerializablePropertyChangeListener() {
if (ApplicationInstance.STYLE_SHEET_CHANGED_PROPERTY.equals(e.getPropertyName())) {
updatedPropertyNames.add(ApplicationInstance.STYLE_SHEET_CHANGED_PROPERTY);
}
}
};
private transient IdTable idTable;
private boolean initialized = false;
private boolean applicationInitialized = false;
private Map initialRequestParameterMap = new HashMap();
private Set updatedPropertyNames = new HashSet();
private transient Map taskQueueToCallbackIntervalMap;
private int transactionId = 0;
public UserInstance(UserInstanceContainer container, String id, String clientWindowId, Map initialRequestParameterMap) {
super();
this.container = container;
this.id = id;
this.clientWindowId = clientWindowId;
this.initialRequestParameterMap = initialRequestParameterMap;
}
componentToRenderStateMap.clear();
}
return applicationInstance;
}
if (taskQueueToCallbackIntervalMap == null || taskQueueToCallbackIntervalMap.size() == 0) {
return DEFAULT_CALLBACK_INTERVAL;
}
Iterator it = taskQueueToCallbackIntervalMap.values().iterator();
int returnInterval = Integer.MAX_VALUE;
while (it.hasNext()) {
int interval = ((Integer) it.next()).intValue();
if (interval < returnInterval) {
returnInterval = interval;
}
}
return returnInterval;
}
return container.getCharacterEncoding();
}
return clientConfiguration;
}
return clientProperties;
}
return "C." + component.getRenderId();
}
try {
return applicationInstance.getComponentByRenderId(clientRenderId.substring(2));
} catch (IndexOutOfBoundsException ex) {
throw new IllegalArgumentException("Invalid component element id: " + clientRenderId);
}
}
return transactionId;
}
return id;
}
return clientWindowId;
}
if (idTable == null) {
idTable = new IdTable();
}
return idTable;
}
return initialRequestParameterMap;
}
++transactionId;
return transactionId;
}
return (RenderState) componentToRenderStateMap.get(component);
}
return container.getRootHtmlElementId();
}
return container.getServiceUri(service, id);
}
public String
getServiceUri(Service service, String[] parameterNames, String[] parameterValues) {
return container.getServiceUri(service, id, parameterNames, parameterValues);
}
return container.getServletUri();
}
return container.getSession();
}
if (updatedPropertyNames.size() == 0) {
return Collections.EMPTY_SET.iterator();
} else {
Set updatedPropertyNames = this.updatedPropertyNames;
this.updatedPropertyNames = new HashSet();
return updatedPropertyNames.iterator();
}
}
return applicationInstance.getUpdateManager();
}
if (applicationInstance != null) {
try {
ApplicationInstance.setActive(applicationInstance);
applicationInstance.removePropertyChangeListener(applicationPropertyChangeListener);
applicationInstance.dispose();
} finally {
ApplicationInstance.setActive(null);
}
}
}
public void init(Connection conn) {
if (initialized) {
throw new IllegalStateException("Attempt to invoke UserInstance.init() on initialized instance.");
}
WebContainerServlet servlet = (WebContainerServlet) conn.getServlet();
applicationInstance = servlet.newApplicationInstance();
applicationInstance.addPropertyChangeListener(applicationPropertyChangeListener);
ContainerContext containerContext = new ContainerContextImpl(this);
applicationInstance.setContextProperty(ContainerContext.CONTEXT_PROPERTY_NAME, containerContext);
initialized = true;
}
return initialized;
}
if (!applicationInitialized) {
try {
applicationInstance.doInit();
} finally {
applicationInitialized = true;
}
}
}
ServerComponentUpdate[] updates = getUpdateManager().getServerUpdateManager().getComponentUpdates();
Iterator it = componentToRenderStateMap.keySet().iterator();
while (it.hasNext()) {
Component component = (Component) it.next();
if (!component.isRegistered() || !component.isRenderVisible()) {
it.remove();
continue;
}
for (int i = 0; i < updates.length; ++i) {
if (updates[i].hasRemovedDescendant(component)) {
it.remove();
continue;
}
}
}
}
componentToRenderStateMap.remove(component);
}
if (active) {
ApplicationInstance.setActive(applicationInstance);
} else {
ApplicationInstance.setActive(null);
}
}
this.clientConfiguration = clientConfiguration;
this.updatedPropertyNames.add(PROPERTY_CLIENT_CONFIGURATION);
}
this.clientProperties = clientProperties;
}
public void setRenderState(Component component, RenderState renderState) {
componentToRenderStateMap.put(component, renderState);
}
if (taskQueueToCallbackIntervalMap == null) {
taskQueueToCallbackIntervalMap = new WeakHashMap();
}
taskQueueToCallbackIntervalMap.put(taskQueue, new Integer(ms));
}
return "UserInstance id=" + id + ", Application="
+ (applicationInstance == null ? null : applicationInstance.getClass().getName());
}
}