summaryrefslogtreecommitdiffstats
path: root/server/src
diff options
context:
space:
mode:
authorJohannes Dahlström <johannesd@vaadin.com>2014-05-19 16:28:09 +0300
committerArtur Signell <artur@vaadin.com>2014-05-26 13:18:00 +0000
commitdca9abccdddb5c1b39e9ae65b9cb53ad6fcab5cb (patch)
tree2ab384cecd52571388d7f2c4f113824093397f0b /server/src
parent17b5b7bf508586626da48e21b9c72694f03c7ff2 (diff)
downloadvaadin-framework-dca9abccdddb5c1b39e9ae65b9cb53ad6fcab5cb.tar.gz
vaadin-framework-dca9abccdddb5c1b39e9ae65b9cb53ad6fcab5cb.zip
Properly deserialize push connection (#12235)
The UI.pushConnection field is transient no longer; instead PushConnection implementations must take care of serialization internally. When a session is serialized, the client should notice that push was disconnected and try to reconnect. A deserialized PushConnection should be in a "disconnected" state so the eventual client reconnection works correctly. Change-Id: I38cfc5a5cdbd3643311f830f8d580458dcd85c56
Diffstat (limited to 'server/src')
-rw-r--r--server/src/com/vaadin/server/communication/AtmospherePushConnection.java29
-rw-r--r--server/src/com/vaadin/server/communication/PushConnection.java4
-rw-r--r--server/src/com/vaadin/ui/UI.java3
3 files changed, 28 insertions, 8 deletions
diff --git a/server/src/com/vaadin/server/communication/AtmospherePushConnection.java b/server/src/com/vaadin/server/communication/AtmospherePushConnection.java
index 3eae848adc..f8ef360eda 100644
--- a/server/src/com/vaadin/server/communication/AtmospherePushConnection.java
+++ b/server/src/com/vaadin/server/communication/AtmospherePushConnection.java
@@ -17,6 +17,7 @@
package com.vaadin.server.communication;
import java.io.IOException;
+import java.io.ObjectInputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
@@ -117,11 +118,11 @@ public class AtmospherePushConnection implements PushConnection {
CONNECTED;
}
- private State state = State.DISCONNECTED;
private UI ui;
- private AtmosphereResource resource;
- private FragmentedMessage incomingMessage;
- private Future<Object> outgoingMessage;
+ private transient State state = State.DISCONNECTED;
+ private transient AtmosphereResource resource;
+ private transient FragmentedMessage incomingMessage;
+ private transient Future<Object> outgoingMessage;
public AtmospherePushConnection(UI ui) {
this.ui = ui;
@@ -209,6 +210,7 @@ public class AtmospherePushConnection implements PushConnection {
@Override
public boolean isConnected() {
+ assert state != null;
assert (state == State.CONNECTED) ^ (resource == null);
return state == State.CONNECTED;
}
@@ -297,8 +299,25 @@ public class AtmospherePushConnection implements PushConnection {
state = State.DISCONNECTED;
}
+ /**
+ * Returns the state of this connection.
+ */
+ protected State getState() {
+ return state;
+ }
+
+ /**
+ * Reinitializes this PushConnection after deserialization. The connection
+ * is initially in disconnected state; the client will handle the
+ * reconnecting.
+ */
+ private void readObject(ObjectInputStream stream) throws IOException,
+ ClassNotFoundException {
+ stream.defaultReadObject();
+ state = State.DISCONNECTED;
+ }
+
private static Logger getLogger() {
return Logger.getLogger(AtmospherePushConnection.class.getName());
}
-
}
diff --git a/server/src/com/vaadin/server/communication/PushConnection.java b/server/src/com/vaadin/server/communication/PushConnection.java
index 52efcfcd89..d5a0d6e9bc 100644
--- a/server/src/com/vaadin/server/communication/PushConnection.java
+++ b/server/src/com/vaadin/server/communication/PushConnection.java
@@ -16,6 +16,8 @@
package com.vaadin.server.communication;
+import java.io.Serializable;
+
import com.vaadin.ui.UI;
/**
@@ -30,7 +32,7 @@ import com.vaadin.ui.UI;
* @author Vaadin Ltd
* @since 7.1
*/
-public interface PushConnection {
+public interface PushConnection extends Serializable {
/**
* Pushes pending state changes and client RPC calls to the client. Can be
diff --git a/server/src/com/vaadin/ui/UI.java b/server/src/com/vaadin/ui/UI.java
index 7a71083e85..562b30f81d 100644
--- a/server/src/com/vaadin/ui/UI.java
+++ b/server/src/com/vaadin/ui/UI.java
@@ -553,7 +553,7 @@ public abstract class UI extends AbstractSingleComponentContainer implements
private Navigator navigator;
- private transient PushConnection pushConnection = null;
+ private PushConnection pushConnection = null;
private LocaleService localeService = new LocaleService(this,
getState(false).localeServiceState);
@@ -1626,5 +1626,4 @@ public abstract class UI extends AbstractSingleComponentContainer implements
public String getEmbedId() {
return embedId;
}
-
}