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;
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();
private final Application application;
- private final Set removedWindows = new HashSet();
-
private JsonPaintTarget paintTarget;
private List locales;
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;
}
e.printStackTrace(new PrintWriter(err));
err.write("\n</pre></body></html>");
err.close();
- } finally {
-
}
}
.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];
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])) {
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();
}
}