+ updateProducers();
+ }
+
+ private void updateProducers() {
+ for (InMemoryDOMDataTreeShardProducer p : producers) {
+ p.setModificationFactory(createModificationFactory(p.getPrefixes()));
+ }
+ }
+
+ @VisibleForTesting
+ ShardDataModificationFactory createModificationFactory(final Collection<DOMDataTreeIdentifier> prefixes) {
+ final Map<DOMDataTreeIdentifier, SubshardProducerSpecification> affected = new HashMap<>();
+ for (final DOMDataTreeIdentifier producerPrefix : prefixes) {
+ for (final ChildShardContext child : childShards.values()) {
+ final DOMDataTreeIdentifier bindPath;
+ if (producerPrefix.contains(child.getPrefix())) {
+ bindPath = child.getPrefix();
+ } else if (child.getPrefix().contains(producerPrefix)) {
+ // Bound path is inside subshard
+ bindPath = producerPrefix;
+ } else {
+ continue;
+ }
+
+ SubshardProducerSpecification spec = affected.get(child.getPrefix());
+ if (spec == null) {
+ spec = new SubshardProducerSpecification(child);
+ affected.put(child.getPrefix(), spec);
+ }
+ spec.addPrefix(bindPath);
+ }
+ }
+
+ final ShardDataModificationFactoryBuilder builder = new ShardDataModificationFactoryBuilder(prefix);
+ for (final SubshardProducerSpecification spec : affected.values()) {
+ final ForeignShardModificationContext foreignContext =
+ new ForeignShardModificationContext(spec.getPrefix(), spec.createProducer());
+ builder.addSubshard(foreignContext);
+ builder.addSubshard(spec.getPrefix(), foreignContext);
+ }
+
+ return builder.build();