aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java1
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java19
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/server/WebApplicationContext.java22
3 files changed, 29 insertions, 13 deletions
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</pre></body></html>");
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();
}
}