From: Jani Laakso Date: Wed, 6 Feb 2008 12:56:25 +0000 (+0000) Subject: Fixed #1380. X-Git-Tag: 6.7.0.beta1~5101 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d9c0680013aec2dd76d7aba0ef8794478fd66e14;p=vaadin-framework.git Fixed #1380. UIDL VAR_RECORD_SEPARATOR and VAR_FIELD_SEPARATORS now point to single entity definition. Removed obsolete code. Fixed documentation. svn changeset:3716/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java b/src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java index 05b21b70a4..d3c5066d7b 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java @@ -381,6 +381,7 @@ public class ApplicationServlet extends HttpServlet { .startTransaction(application, request); getApplicationManager(application).handleUidlRequest( request, response); + return; } } diff --git a/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java b/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java index 5f84961591..023b884dae 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java @@ -46,6 +46,7 @@ import com.itmill.toolkit.terminal.URIHandler; import com.itmill.toolkit.terminal.UploadStream; import com.itmill.toolkit.terminal.VariableOwner; import com.itmill.toolkit.terminal.Paintable.RepaintRequestEvent; +import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.ui.Component; import com.itmill.toolkit.ui.ComponentContainer; import com.itmill.toolkit.ui.Upload; @@ -70,9 +71,9 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { private static final int VAR_TYPE = 3; private static final int VAR_VALUE = 0; - private static final String VAR_RECORD_SEPARATOR = "\u001e"; + private static final String VAR_RECORD_SEPARATOR = ApplicationConnection.VAR_RECORD_SEPARATOR; - private static final String VAR_FIELD_SEPARATOR = "\u001f"; + private static final String VAR_FIELD_SEPARATOR = ApplicationConnection.VAR_FIELD_SEPARATOR; private final ArrayList dirtyPaintabletSet = new ArrayList(); @@ -84,8 +85,6 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { private final Application application; - private final Set removedWindows = new HashSet(); - private JsonPaintTarget paintTarget; private List locales; @@ -218,9 +217,16 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { window = getApplicationWindow(request, application); // Returns if no window found if (window == null) { + // This should not happen, no windows exists but + // application is still open. + System.err + .println("Warning, could not get window for application with request URI " + + request.getRequestURI()); return; } } else { + // application has been closed + endApplication(request, response, application); return; } @@ -423,8 +429,6 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { e.printStackTrace(new PrintWriter(err)); err.write("\n"); err.close(); - } finally { - } } @@ -437,8 +441,8 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { .get("changes"))[0] : params.get("changes")); params.remove("changes"); - if (changes != null && changes.length() > 0) { + if (changes != null && changes.length() > 0) { // extract variables to two dim string array final String[] tmp = changes.split(VAR_RECORD_SEPARATOR); final String[][] variableRecords = new String[tmp.length][4]; @@ -470,6 +474,7 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { convertVariableValue(variable[VAR_TYPE] .charAt(0), variable[VAR_VALUE])); } + // collect following variable changes for this owner while (nextVariable != null && variable[VAR_PID].equals(nextVariable[VAR_PID])) { diff --git a/src/com/itmill/toolkit/terminal/gwt/server/WebApplicationContext.java b/src/com/itmill/toolkit/terminal/gwt/server/WebApplicationContext.java index ddf1aba8f4..cf3998d732 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/WebApplicationContext.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/WebApplicationContext.java @@ -273,12 +273,22 @@ public class WebApplicationContext implements ApplicationContext, public void valueUnbound(HttpSessionBindingEvent event) { // If we are going to be unbound from the session, the session must be // closing - while (!applications.isEmpty()) { - final Application app = (Application) applications.iterator() - .next(); - app.close(); - ApplicationServlet.applicationToAjaxAppMgrMap.remove(app); - removeApplication(app); + try { + while (!applications.isEmpty()) { + final Application app = (Application) applications.iterator() + .next(); + app.close(); + ApplicationServlet.applicationToAjaxAppMgrMap.remove(app); + removeApplication(app); + } + } catch (Exception e) { + // This should never happen but is possible with rare + // configurations (e.g. robustness tests). If you have one + // thread doing HTTP socket write and another thread trying to + // remove same application here. Possible if you got e.g. session + // lifetime 1 min but socket write may take longer than 1 min. + System.err.println("Could not remove application, leaking memory."); + e.printStackTrace(); } }