/** * Adds a number of nodes to be tracked. For each node in the passed in * collection, a tracked node entry is created unless already one exists. * * @param selectors a collection with the {@code NodeSelector} objects * @param nodes a collection with the nodes to be tracked * @return the updated instance */ public NodeTracker trackNodes(final Collection<NodeSelector> selectors, final Collection<ImmutableNode> nodes) { final Map<NodeSelector, TrackedNodeData> newState = new HashMap<>(trackedNodes); final Iterator<ImmutableNode> itNodes = nodes.iterator(); for (final NodeSelector selector : selectors) { final ImmutableNode node = itNodes.next(); TrackedNodeData trackData = newState.get(selector); if (trackData == null) { trackData = new TrackedNodeData(node); } else { trackData = trackData.observerAdded(); } newState.put(selector, trackData); } return new NodeTracker(newState); }
/** * Creates a {@code TrackedNodeData} object for a newly added observer for * the specified node selector. * * @param root the root node * @param selector the {@code NodeSelector} * @param resolver the {@code NodeKeyResolver} * @param handler the {@code NodeHandler} * @param trackData the current data for this selector * @return the updated {@code TrackedNodeData} * @throws ConfigurationRuntimeException if the selector does not select a * single node */ private static TrackedNodeData trackDataForAddedObserver( final ImmutableNode root, final NodeSelector selector, final NodeKeyResolver<ImmutableNode> resolver, final NodeHandler<ImmutableNode> handler, final TrackedNodeData trackData) { if (trackData != null) { return trackData.observerAdded(); } final ImmutableNode target = selector.select(root, resolver, handler); if (target == null) { throw new ConfigurationRuntimeException( "Selector does not select unique node: " + selector); } return new TrackedNodeData(target); }