]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed #1380.
authorJani Laakso <jani.laakso@itmill.com>
Wed, 6 Feb 2008 12:56:25 +0000 (12:56 +0000)
committerJani Laakso <jani.laakso@itmill.com>
Wed, 6 Feb 2008 12:56:25 +0000 (12:56 +0000)
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

src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java
src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java
src/com/itmill/toolkit/terminal/gwt/server/WebApplicationContext.java

index 05b21b70a4f8897adb212cf7d1ede4ff7fd83971..d3c5066d7b208cd22aa861a1c0e9d177ba5dc1bb 100644 (file)
@@ -381,6 +381,7 @@ public class ApplicationServlet extends HttpServlet {
                             .startTransaction(application, request);
                     getApplicationManager(application).handleUidlRequest(
                             request, response);
+
                     return;
                 }
             }
index 5f84961591efff013ff476a30b3e4e59dedc7553..023b884dae0ab2d41c57b0184a088f4ad787b219 100644 (file)
@@ -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])) {
index ddf1aba8f404354b7e15dea98e9f18f90497728b..cf3998d732429dfe4cb39b3c07d10c71c83be3ee 100644 (file)
@@ -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();
         }
     }