diff options
-rw-r--r-- | server/src/com/vaadin/server/LegacyCommunicationManager.java | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/server/src/com/vaadin/server/LegacyCommunicationManager.java b/server/src/com/vaadin/server/LegacyCommunicationManager.java index 485084b515..fda5ad444f 100644 --- a/server/src/com/vaadin/server/LegacyCommunicationManager.java +++ b/server/src/com/vaadin/server/LegacyCommunicationManager.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -81,6 +82,8 @@ public class LegacyCommunicationManager implements Serializable { return session; } + private static final ConcurrentHashMap<Class<? extends SharedState>, JsonValue> referenceDiffStates = new ConcurrentHashMap<Class<? extends SharedState>, JsonValue>(); + /** * @deprecated As of 7.1. See #11411. */ @@ -96,17 +99,10 @@ public class LegacyCommunicationManager implements Serializable { if (diffState == null && supportsDiffState) { // Use an empty state object as reference for full // repaints - - try { - SharedState referenceState = stateType.newInstance(); - EncodeResult encodeResult = JsonCodec.encode(referenceState, - null, stateType, uI.getConnectorTracker()); - diffState = encodeResult.getEncodedValue(); - } catch (Exception e) { - getLogger() - .log(Level.WARNING, - "Error creating reference object for state of type {0}", - stateType.getName()); + diffState = referenceDiffStates.get(stateType); + if (diffState == null) { + diffState = createReferenceDiffStateState(stateType); + referenceDiffStates.put(stateType, diffState); } } EncodeResult encodeResult = JsonCodec.encode(state, diffState, @@ -118,6 +114,21 @@ public class LegacyCommunicationManager implements Serializable { return (JsonObject) encodeResult.getDiff(); } + private static JsonValue createReferenceDiffStateState( + Class<? extends SharedState> stateType) { + try { + SharedState referenceState = stateType.newInstance(); + EncodeResult encodeResult = JsonCodec.encode(referenceState, null, + stateType, null); + return encodeResult.getEncodedValue(); + } catch (Exception e) { + getLogger().log(Level.WARNING, + "Error creating reference object for state of type {0}", + stateType.getName()); + return null; + } + } + /** * Resolves a dependency URI, registering the URI with this * {@code LegacyCommunicationManager} if needed and returns a fully |