X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fdom%2Fbroker%2Fimpl%2FSchemaAwareRpcBroker.java;h=598361c3ae3cbf7e41eed5a69ea9cf0d74727702;hb=c5df7a9911ba2d77349ec1c7733a9086d99791f6;hp=22319abb17df7d1dec301105a59c50fad2cb1164;hpb=5b16b5aa030d26cbf2c6dc17b3f7a530fbdb987f;p=controller.git diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java index 22319abb17..598361c3ae 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java @@ -43,6 +43,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, RoutedRpcDefaultImplementation { @@ -53,7 +55,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro "2013-07-09", "context-reference"); private final ListenerRegistry rpcRegistrationListeners = new ListenerRegistry<>(); private final ListenerRegistry> routeChangeListeners = new ListenerRegistry<>(); - + private final String identifier; private final ConcurrentMap implementations = new ConcurrentHashMap<>(); @@ -280,24 +282,26 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro } } - private static class RoutedRpcSelector implements RpcImplementation, AutoCloseable, Identifiable { + private static class RoutedRpcSelector implements RpcImplementation, AutoCloseable, Identifiable { private final RoutedRpcStrategy strategy; private final Set supportedRpcs; + private final RpcRoutingContext identifier; private RpcImplementation defaultDelegate; private final ConcurrentMap implementations = new ConcurrentHashMap<>(); - private SchemaAwareRpcBroker router; + private final SchemaAwareRpcBroker router; public RoutedRpcSelector(RoutedRpcStrategy strategy, SchemaAwareRpcBroker router) { super(); this.strategy = strategy; supportedRpcs = ImmutableSet.of(strategy.getIdentifier()); + identifier = RpcRoutingContext.create(strategy.context, strategy.getIdentifier()); this.router = router; } @Override - public QName getIdentifier() { - return strategy.getIdentifier(); + public RpcRoutingContext getIdentifier() { + return identifier; } @Override @@ -382,7 +386,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro RoutedRpcRegistration { private final QName type; - private RoutedRpcSelector router; + private final RoutedRpcSelector router; public RoutedRpcRegImpl(QName rpcType, RpcImplementation implementation, RoutedRpcSelector routedRpcSelector) { super(implementation); @@ -424,13 +428,13 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro routeListener.getInstance().onRouteChange(change); } catch (Exception e) { LOG.error("Unhandled exception during invoking onRouteChange for {}",routeListener.getInstance(),e); - + } } - + } - + private void notifyPathWithdrawal(QName context,QName identifier, InstanceIdentifier path) { RpcRoutingContext contextWrapped = RpcRoutingContext.create(context, identifier); @@ -443,10 +447,31 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable, Ro } } } - + @Override public > ListenerRegistration registerRouteChangeListener( L listener) { - return routeChangeListeners.registerWithType(listener); + ListenerRegistration reg = routeChangeListeners.registerWithType(listener); + RouteChange initial = createInitialRouteChange(); + try { + listener.onRouteChange(initial); + } catch (Exception e) { + LOG.error("Unhandled exception during sending initial route change event {} to {}",initial,listener); + } + return reg; + } + + private RouteChange createInitialRouteChange() { + FluentIterable rpcSelectors = FluentIterable.from(implementations.values()).filter(RoutedRpcSelector.class); + + + ImmutableMap.Builder> announcements = ImmutableMap.builder(); + ImmutableMap.Builder> removals = ImmutableMap.builder(); + for (RoutedRpcSelector routedRpcSelector : rpcSelectors) { + final RpcRoutingContext context = routedRpcSelector.getIdentifier(); + final Set paths = ImmutableSet.copyOf(routedRpcSelector.implementations.keySet()); + announcements.put(context, paths); + } + return RoutingUtils.change(announcements.build(), removals.build()); } }