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;
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;
@Override
public boolean isConnected() {
+ assert state != null;
assert (state == State.CONNECTED) ^ (resource == null);
return state == State.CONNECTED;
}
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());
}
-
}
package com.vaadin.server.communication;
+import java.io.Serializable;
+
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
private Navigator navigator;
- private transient PushConnection pushConnection = null;
+ private PushConnection pushConnection = null;
private LocaleService localeService = new LocaleService(this,
getState(false).localeServiceState);
public String getEmbedId() {
return embedId;
}
-
}
--- /dev/null
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.server.communication;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.atmosphere.cpr.AtmosphereResource;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.server.communication.AtmospherePushConnection.State;
+import com.vaadin.ui.UI;
+
+/**
+ * @author Vaadin Ltd
+ */
+public class AtmospherePushConnectionTest {
+ @Test
+ public void testSerialization() throws Exception {
+
+ UI ui = EasyMock.createNiceMock(UI.class);
+ AtmosphereResource resource = EasyMock
+ .createNiceMock(AtmosphereResource.class);
+
+ AtmospherePushConnection connection = new AtmospherePushConnection(ui);
+ connection.connect(resource);
+
+ Assert.assertEquals(State.CONNECTED, connection.getState());
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ new ObjectOutputStream(baos).writeObject(connection);
+
+ connection = (AtmospherePushConnection) new ObjectInputStream(
+ new ByteArrayInputStream(baos.toByteArray())).readObject();
+
+ Assert.assertEquals(State.DISCONNECTED, connection.getState());
+ }
+}