/**
  * Returns a collection of those {@link #getDirtyConnectors() dirty connectors} that are actually
  * visible to the client.
  *
  * @return A list of dirty and visible connectors.
  */
 public ArrayList<ClientConnector> getDirtyVisibleConnectors() {
   ArrayList<ClientConnector> dirtyConnectors = new ArrayList<ClientConnector>();
   for (ClientConnector c : getDirtyConnectors()) {
     if (LegacyCommunicationManager.isConnectorVisibleToClient(c)) {
       dirtyConnectors.add(c);
     }
   }
   return dirtyConnectors;
 }
  /**
   * Cleans the connector map from all connectors that are no longer attached to the application.
   * This should only be called by the framework.
   */
  public void cleanConnectorMap() {
    if (!unregisteredConnectors.isEmpty()) {
      removeUnregisteredConnectors();
    }

    // Do this expensive check only with assertions enabled
    assert isHierarchyComplete()
        : "The connector hierarchy is corrupted. "
            + "Check for missing calls to super.setParent(), super.attach() and super.detach() "
            + "and that all custom component containers call child.setParent(this) when a child is added and child.setParent(null) when the child is no longer used. "
            + "See previous log messages for details.";

    // remove detached components from paintableIdMap so they
    // can be GC'ed
    Iterator<ClientConnector> iterator = connectorIdToConnector.values().iterator();
    GlobalResourceHandler globalResourceHandler = uI.getSession().getGlobalResourceHandler(false);
    while (iterator.hasNext()) {
      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
        // registerConnector(connector)

        // This code should never be called as cleanup should take place
        // in detach()

        getLogger()
            .log(
                Level.WARNING,
                "cleanConnectorMap unregistered connector {0}. This should have been done when the connector was detached.",
                getConnectorAndParentInfo(connector));

        if (globalResourceHandler != null) {
          globalResourceHandler.unregisterConnector(connector);
        }
        uninitializedConnectors.remove(connector);
        diffStates.remove(connector);
        iterator.remove();
      } else if (!uninitializedConnectors.contains(connector)
          && !LegacyCommunicationManager.isConnectorVisibleToClient(connector)) {
        uninitializedConnectors.add(connector);
        diffStates.remove(connector);
        if (getLogger().isLoggable(Level.FINE)) {
          getLogger()
              .log(
                  Level.FINE,
                  "cleanConnectorMap removed state for {0} as it is not visible",
                  getConnectorAndParentInfo(connector));
        }
      }
    }

    cleanStreamVariables();
  }