X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=topology%2Fprovider-bgp%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fbgpcep%2Ftopology%2Fprovider%2Fbgp%2Fimpl%2FLocRIBListenerSubscriptionTracker.java;fp=topology%2Fprovider-bgp%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fbgpcep%2Ftopology%2Fprovider%2Fbgp%2Fimpl%2FLocRIBListenerSubscriptionTracker.java;h=054b5d6ecf512d49918b0d5018c051e3fe6ff2f7;hb=ad72e7a9b9317233d16044c4eedc2f771ee07a87;hp=0000000000000000000000000000000000000000;hpb=2020269db2484225c6358178a5752c32d6ae535a;p=bgpcep.git diff --git a/topology/provider-bgp/src/main/java/org/opendaylight/bgpcep/topology/provider/bgp/impl/LocRIBListenerSubscriptionTracker.java b/topology/provider-bgp/src/main/java/org/opendaylight/bgpcep/topology/provider/bgp/impl/LocRIBListenerSubscriptionTracker.java new file mode 100644 index 0000000000..054b5d6ecf --- /dev/null +++ b/topology/provider-bgp/src/main/java/org/opendaylight/bgpcep/topology/provider/bgp/impl/LocRIBListenerSubscriptionTracker.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.bgpcep.topology.provider.bgp.impl; + +import org.opendaylight.bgpcep.topology.provider.bgp.LocRIBListener; +import org.opendaylight.bgpcep.topology.provider.bgp.LocRIBListeners; +import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent; +import org.opendaylight.controller.md.sal.common.api.data.DataModification; +import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; +import org.opendaylight.controller.sal.binding.api.data.DataProviderService; +import org.opendaylight.protocol.concepts.ListenerRegistration; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.LocRib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Preconditions; + +final class LocRIBListenerSubscriptionTracker extends ServiceTracker> { + private static final InstanceIdentifier locRIBPath = InstanceIdentifier.builder().node(LocRib.class).toInstance(); + private static final Logger logger = LoggerFactory.getLogger(LocRIBListenerSubscriptionTracker.class); + private final DataProviderService dps; + + LocRIBListenerSubscriptionTracker(final BundleContext context, final DataProviderService dps) { + super(context, LocRIBListeners.Subscribtion.class, null); + this.dps = Preconditions.checkNotNull(dps); + } + + @Override + public ListenerRegistration addingService(final ServiceReference reference) { + final LocRIBListeners.Subscribtion service = context.getService(reference); + if (service == null) { + logger.trace("Service for reference {} disappeared", reference); + return null; + } + + final InstanceIdentifier path = InstanceIdentifier.builder(locRIBPath). + node(Tables.class, new TablesKey(service.getAfi(), service.getSafi())).toInstance(); + final LocRIBListener listener = service.getLocRIBListener(); + + final DataChangeListener dcl = new DataChangeListener() { + + @Override + public void onDataChanged(final DataChangeEvent, DataObject> change) { + final DataModification trans = dps.beginTransaction(); + + try { + listener.onLocRIBChange(trans, change); + } catch (Exception e) { + logger.info("Data change {} was not completely propagated to listener {}", change, listener, e); + } + + // FIXME: abort the transaction if it's not committing + } + }; + + dps.registerChangeListener(path, dcl); + + return new ListenerRegistration(listener) { + @Override + protected void removeRegistration() { + dps.unregisterChangeListener(path, dcl); + } + }; + } + + @Override + public void removedService(final ServiceReference reference, final ListenerRegistration service) { + service.close(); + context.ungetService(reference); + } +}