diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2014-05-19 16:28:09 +0300 |
---|---|---|
committer | Artur Signell <artur@vaadin.com> | 2014-05-26 13:18:00 +0000 |
commit | dca9abccdddb5c1b39e9ae65b9cb53ad6fcab5cb (patch) | |
tree | 2ab384cecd52571388d7f2c4f113824093397f0b /server/src | |
parent | 17b5b7bf508586626da48e21b9c72694f03c7ff2 (diff) | |
download | vaadin-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')
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; } - } |