diff options
author | Fabian Lange <lange.fabian@gmail.com> | 2014-05-21 14:18:41 +0200 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-05-22 12:48:33 +0000 |
commit | 40d35f2bc97ba6516ee5d6cbb7954607c357a698 (patch) | |
tree | d4f854eb989b4651165707f2ea93d9d0de7bac13 /server/src/com/vaadin/ui/ConnectorTracker.java | |
parent | 8491ea68d32a275bb70998db5f66759265d367b8 (diff) | |
download | vaadin-framework-40d35f2bc97ba6516ee5d6cbb7954607c357a698.tar.gz vaadin-framework-40d35f2bc97ba6516ee5d6cbb7954607c357a698.zip |
Optimizes ConnectorTracker.cleanConnectorMap (#13803)
cleanConnectorMap is a hot method.
This change improves multiple code paths:
1) The global resource handler is no longer get()ed from the session for
each connector (was in two loops).
2) The ConnectorTracker is no longer get()ed from the UI for each
connector (was in one loop).
3) values() iterator for ClientConnectors replaces
keySet() iterator + get(key) call
4) use getUI() from ClientConnector instead manual method.
5) moved removeUnregisteredConnectors to ease inlining and readability.
Change-Id: I25ff5bc32d27d30ecd8d354922ec6e4a02b05921
Diffstat (limited to 'server/src/com/vaadin/ui/ConnectorTracker.java')
-rw-r--r-- | server/src/com/vaadin/ui/ConnectorTracker.java | 77 |
1 files changed, 32 insertions, 45 deletions
diff --git a/server/src/com/vaadin/ui/ConnectorTracker.java b/server/src/com/vaadin/ui/ConnectorTracker.java index ce8c452c2c..f7eae0013a 100644 --- a/server/src/com/vaadin/ui/ConnectorTracker.java +++ b/server/src/com/vaadin/ui/ConnectorTracker.java @@ -209,15 +209,6 @@ public class ConnectorTracker implements Serializable { } } - private void removeFromGlobalResourceHandler(ClientConnector connector) { - GlobalResourceHandler globalResourceHandler = uI.getSession() - .getGlobalResourceHandler(false); - // Nothing to do if there is no handler - if (globalResourceHandler != null) { - globalResourceHandler.unregisterConnector(connector); - } - } - /** * Checks whether the given connector has already been initialized in the * browser. The given connector should be registered with this connector @@ -289,17 +280,9 @@ public class ConnectorTracker implements Serializable { * to the application. This should only be called by the framework. */ public void cleanConnectorMap() { - // Remove connectors that have been unregistered - for (ClientConnector connector : unregisteredConnectors) { - ClientConnector removedConnector = connectorIdToConnector - .remove(connector.getConnectorId()); - assert removedConnector == connector; - - removeFromGlobalResourceHandler(connector); - uninitializedConnectors.remove(connector); - diffStates.remove(connector); + if (!unregisteredConnectors.isEmpty()) { + removeUnregisteredConnectors(); } - unregisteredConnectors.clear(); // Do this expensive check only with assertions enabled assert isHierarchyComplete() : "The connector hierarchy is corrupted. " @@ -309,12 +292,14 @@ public class ConnectorTracker implements Serializable { // remove detached components from paintableIdMap so they // can be GC'ed - Iterator<String> iterator = connectorIdToConnector.keySet().iterator(); - + Iterator<ClientConnector> iterator = connectorIdToConnector.values() + .iterator(); + GlobalResourceHandler globalResourceHandler = uI.getSession() + .getGlobalResourceHandler(false); while (iterator.hasNext()) { - String connectorId = iterator.next(); - ClientConnector connector = connectorIdToConnector.get(connectorId); - if (getUIForConnector(connector) != uI) { + ClientConnector connector = iterator.next(); + assert connector != null; + if (connector.getUI() != uI) { // If connector is no longer part of this uI, // remove it from the map. If it is re-attached to the // application at some point it will be re-added through @@ -328,7 +313,9 @@ public class ConnectorTracker implements Serializable { "cleanConnectorMap unregistered connector {0}. This should have been done when the connector was detached.", getConnectorAndParentInfo(connector)); - removeFromGlobalResourceHandler(connector); + if (globalResourceHandler != null) { + globalResourceHandler.unregisterConnector(connector); + } uninitializedConnectors.remove(connector); diffStates.remove(connector); iterator.remove(); @@ -349,6 +336,24 @@ public class ConnectorTracker implements Serializable { cleanStreamVariables(); } + private void removeUnregisteredConnectors() { + GlobalResourceHandler globalResourceHandler = uI.getSession() + .getGlobalResourceHandler(false); + + for (ClientConnector connector : unregisteredConnectors) { + ClientConnector removedConnector = connectorIdToConnector + .remove(connector.getConnectorId()); + assert removedConnector == connector; + + if (globalResourceHandler != null) { + globalResourceHandler.unregisterConnector(connector); + } + uninitializedConnectors.remove(connector); + diffStates.remove(connector); + } + unregisteredConnectors.clear(); + } + private boolean isHierarchyComplete() { boolean noErrors = true; @@ -393,25 +398,6 @@ public class ConnectorTracker implements Serializable { } /** - * Finds the uI that the connector is attached to. - * - * @param connector - * The connector to lookup - * @return The uI the connector is attached to or null if it is not attached - * to any uI. - */ - private UI getUIForConnector(ClientConnector connector) { - if (connector == null) { - return null; - } - if (connector instanceof Component) { - return ((Component) connector).getUI(); - } - - return getUIForConnector(connector.getParent()); - } - - /** * Mark the connector as dirty. This should not be done while the response * is being written. * @@ -727,11 +713,12 @@ public class ConnectorTracker implements Serializable { */ private void cleanStreamVariables() { if (pidToNameToStreamVariable != null) { + ConnectorTracker connectorTracker = uI.getConnectorTracker(); Iterator<String> iterator = pidToNameToStreamVariable.keySet() .iterator(); while (iterator.hasNext()) { String connectorId = iterator.next(); - if (uI.getConnectorTracker().getConnector(connectorId) == null) { + if (connectorTracker.getConnector(connectorId) == null) { // Owner is no longer attached to the session Map<String, StreamVariable> removed = pidToNameToStreamVariable .get(connectorId); |