summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/com/vaadin/server/AbstractClientConnector.java10
1 files changed, 9 insertions, 1 deletions
diff --git a/server/src/com/vaadin/server/AbstractClientConnector.java b/server/src/com/vaadin/server/AbstractClientConnector.java
index 0655b482ed..b6bcebd167 100644
--- a/server/src/com/vaadin/server/AbstractClientConnector.java
+++ b/server/src/com/vaadin/server/AbstractClientConnector.java
@@ -30,6 +30,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import com.vaadin.event.EventRouter;
@@ -91,6 +92,8 @@ public abstract class AbstractClientConnector implements ClientConnector,
private ErrorHandler errorHandler = null;
+ private static final ConcurrentHashMap<Class<? extends AbstractClientConnector>, Class<? extends SharedState>> stateTypeCache = new ConcurrentHashMap<Class<? extends AbstractClientConnector>, Class<? extends SharedState>>();
+
@Override
public void addAttachListener(AttachListener listener) {
addListener(AttachEvent.ATTACH_EVENT_IDENTIFIER, AttachEvent.class,
@@ -296,7 +299,12 @@ public abstract class AbstractClientConnector implements ClientConnector,
// Lazy load because finding type can be expensive because of the
// exceptions flying around
if (stateType == null) {
- stateType = findStateType();
+ // Cache because we don't need to do this once per instance
+ stateType = stateTypeCache.get(this.getClass());
+ if (stateType == null) {
+ stateType = findStateType();
+ stateTypeCache.put(this.getClass(), stateType);
+ }
}
return stateType;