@@ -146,6 +146,8 @@ public abstract class AbstractClientConnector implements ClientConnector { | |||
} | |||
protected SharedState getState() { | |||
assert getSession() == null | |||
|| getSession().getLock().isHeldByCurrentThread() : VaadinSession.SESSION_LOCK_MESSAGE; | |||
if (null == sharedState) { | |||
sharedState = createState(); | |||
} |
@@ -28,7 +28,6 @@ import java.util.LinkedList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import java.util.Map; | |||
import java.util.concurrent.locks.Lock; | |||
import java.util.concurrent.locks.ReentrantLock; | |||
import java.util.logging.Logger; | |||
@@ -71,6 +70,8 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { | |||
*/ | |||
public static final String UI_PARAMETER = "UI"; | |||
public static final String SESSION_LOCK_MESSAGE = "You are accessing UI state without proper synchronization!"; | |||
private static final Method BOOTSTRAP_FRAGMENT_METHOD = ReflectTools | |||
.findMethod(BootstrapListener.class, "modifyBootstrapFragment", | |||
BootstrapFragmentResponse.class); | |||
@@ -78,7 +79,7 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { | |||
.findMethod(BootstrapListener.class, "modifyBootstrapPage", | |||
BootstrapPageResponse.class); | |||
private final Lock lock = new ReentrantLock(); | |||
private final ReentrantLock lock = new ReentrantLock(); | |||
/** | |||
* An event sent to {@link #start(SessionStartEvent)} when a new Application | |||
@@ -206,6 +207,10 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { | |||
private final Map<String, Object> attributes = new HashMap<String, Object>(); | |||
public VaadinSession() { | |||
// TODO Auto-generated constructor stub | |||
} | |||
/** | |||
* @see javax.servlet.http.HttpSessionBindingListener#valueBound(HttpSessionBindingEvent) | |||
*/ | |||
@@ -1304,7 +1309,7 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { | |||
* | |||
* @return the lock that should be used for synchronization | |||
*/ | |||
public Lock getLock() { | |||
public ReentrantLock getLock() { | |||
return lock; | |||
} | |||
@@ -29,6 +29,7 @@ import com.vaadin.server.AbstractClientConnector; | |||
import com.vaadin.server.AbstractCommunicationManager; | |||
import com.vaadin.server.ClientConnector; | |||
import com.vaadin.server.GlobalResourceHandler; | |||
import com.vaadin.server.VaadinSession; | |||
/** | |||
* A class which takes care of book keeping of {@link ClientConnector}s for a | |||
@@ -286,6 +287,8 @@ public class ConnectorTracker implements Serializable { | |||
* The connector that should be marked clean. | |||
*/ | |||
public void markDirty(ClientConnector connector) { | |||
assert uI.getSession() == null | |||
|| uI.getSession().getLock().isHeldByCurrentThread() : VaadinSession.SESSION_LOCK_MESSAGE; | |||
if (isWritingResponse()) { | |||
throw new IllegalStateException( | |||
"A connector should not be marked as dirty while a response is being written."); |
@@ -69,6 +69,7 @@ public class ConverterFactory extends TestCase { | |||
final VaadinSession appWithCustomIntegerConverter = new VaadinSession(); | |||
appWithCustomIntegerConverter | |||
.setConverterFactory(new ConverterFactory42()); | |||
appWithCustomIntegerConverter.getLock().lock(); | |||
TextField tf = new TextField("", "123") { | |||
@Override | |||
@@ -97,6 +98,7 @@ public class ConverterFactory extends TestCase { | |||
public void testApplicationConverterFactoryForDifferentThanCurrentApplication() { | |||
final VaadinSession fieldAppWithCustomIntegerConverter = new VaadinSession(); | |||
fieldAppWithCustomIntegerConverter.getLock().lock(); | |||
fieldAppWithCustomIntegerConverter | |||
.setConverterFactory(new ConverterFactory42()); | |||
VaadinSession.setCurrent(new VaadinSession()); |
@@ -187,6 +187,7 @@ public class AbstractFieldValueConversions extends TestCase { | |||
public void testNumberDoubleConverterChange() { | |||
final VaadinSession a = new VaadinSession(); | |||
a.getLock().lock(); | |||
VaadinSession.setCurrent(a); | |||
TextField tf = new TextField() { | |||
@Override |
@@ -19,10 +19,11 @@ public class RemoveListenersOnDetach { | |||
AbstractField field = new AbstractField() { | |||
final private VaadinSession application = new VaadinSession() { | |||
{ | |||
getLock().lock(); | |||
} | |||
}; | |||
private UI uI = new UI() { | |||
@Override | |||
protected void init(WrappedRequest request) { | |||