X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2FAbstractForwardedDataBroker.java;h=6982a72969f37a7ac3abc675ca8617a24338f337;hp=8a32b0b3026f1d028dbab77a00e6c54be22d07ad;hb=69d25be6296c54b98deaabb7671a66b9ba5e3f12;hpb=743b4bf3f8b1b8ff1ffffbd8151cbd4c1842330d diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java index 8a32b0b302..6982a72969 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java @@ -7,13 +7,13 @@ */ package org.opendaylight.controller.md.sal.binding.impl; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.eclipse.xtext.xbase.lib.Exceptions; import org.opendaylight.controller.md.sal.binding.api.BindingDataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; @@ -36,7 +36,11 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractForwardedDataBroker implements Delegator, DomForwardedBroker, SchemaContextListener { +import com.google.common.base.Objects; +import com.google.common.base.Optional; + +public abstract class AbstractForwardedDataBroker implements Delegator, DomForwardedBroker, + SchemaContextListener { private static final Logger LOG = LoggerFactory.getLogger(AbstractForwardedDataBroker.class); // The Broker to whom we do all forwarding @@ -81,11 +85,12 @@ public abstract class AbstractForwardedDataBroker implements Delegator domRegistration = domDataBroker.registerDataChangeListener(store, domPath, domDataChangeListener, triggeringScope); + ListenerRegistration domRegistration = domDataBroker.registerDataChangeListener(store, + domPath, domDataChangeListener, triggeringScope); return new ListenerRegistrationImpl(listener, domRegistration); } - protected Map, DataObject> fromDOMToData( + protected Map, DataObject> toBinding( final Map> normalized) { Map, DataObject> newMap = new HashMap<>(); for (Map.Entry> entry : normalized @@ -94,12 +99,38 @@ public abstract class AbstractForwardedDataBroker implements Delegator, DataObject> binding = getCodec().toBinding(entry); newMap.put(binding.getKey(), binding.getValue()); } catch (DeserializationException e) { - LOG.debug("Ommiting {}",entry,e); + LOG.debug("Omitting {}", entry, e); } } return newMap; } + protected Set> toBinding( + final Set normalized) { + Set> hashSet = new HashSet<>(); + for (org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalizedPath : normalized) { + try { + InstanceIdentifier binding = getCodec().toBinding(normalizedPath); + hashSet.add(binding); + } catch (DeserializationException e) { + LOG.debug("Omitting {}", normalizedPath, e); + } + } + return hashSet; + } + + protected Optional toBindingData(final InstanceIdentifier path, final NormalizedNode data) { + if(path.isWildcarded()) { + return Optional.absent(); + } + + try { + return Optional.fromNullable(getCodec().toBinding(path, data)); + } catch (DeserializationException e) { + return Optional.absent(); + } + } + private class TranslatingDataChangeInvoker implements DOMDataChangeListener { private final BindingDataChangeListener bindingDataChangeListener; private final LogicalDatastoreType store; @@ -117,18 +148,20 @@ public abstract class AbstractForwardedDataBroker implements Delegator> change) { - bindingDataChangeListener.onDataChanged(new TranslatedDataChangeEvent(change,path)); + bindingDataChangeListener.onDataChanged(new TranslatedDataChangeEvent(change, path)); } } private class TranslatedDataChangeEvent implements AsyncDataChangeEvent, DataObject> { private final AsyncDataChangeEvent> domEvent; - private InstanceIdentifier path; + private final InstanceIdentifier path; - public TranslatedDataChangeEvent( - final AsyncDataChangeEvent> change) { - this.domEvent = change; - } + private Map, DataObject> createdCache; + private Map, DataObject> updatedCache; + private Map, ? extends DataObject> originalCache; + private Set> removedCache; + private Optional originalDataCache; + private Optional updatedDataCache; public TranslatedDataChangeEvent( final AsyncDataChangeEvent> change, @@ -139,52 +172,70 @@ public abstract class AbstractForwardedDataBroker implements Delegator, DataObject> getCreatedData() { - return fromDOMToData(domEvent.getCreatedData()); + if (createdCache == null) { + createdCache = Collections.unmodifiableMap(toBinding(domEvent.getCreatedData())); + } + return createdCache; } @Override public Map, DataObject> getUpdatedData() { - return fromDOMToData(domEvent.getUpdatedData()); + if (updatedCache == null) { + updatedCache = Collections.unmodifiableMap(toBinding(domEvent.getUpdatedData())); + } + return updatedCache; } @Override public Set> getRemovedPaths() { - final Set removedPaths = domEvent - .getRemovedPaths(); - final Set> output = new HashSet<>(); - for (org.opendaylight.yangtools.yang.data.api.InstanceIdentifier instanceIdentifier : removedPaths) { - try { - output.add(mappingService.fromDataDom(instanceIdentifier)); - } catch (DeserializationException e) { - Exceptions.sneakyThrow(e); - } + if (removedCache == null) { + removedCache = Collections.unmodifiableSet(toBinding(domEvent.getRemovedPaths())); } - - return output; + return removedCache; } @Override public Map, ? extends DataObject> getOriginalData() { - return fromDOMToData(domEvent.getOriginalData()); + if (originalCache == null) { + originalCache = Collections.unmodifiableMap(toBinding(domEvent.getOriginalData())); + } + return originalCache; } @Override public DataObject getOriginalSubtree() { - - return toBindingData(path,domEvent.getOriginalSubtree()); + if (originalDataCache == null) { + if(domEvent.getOriginalSubtree() != null) { + originalDataCache = toBindingData(path, domEvent.getOriginalSubtree()); + } else { + originalDataCache = Optional.absent(); + } + } + return originalDataCache.orNull(); } @Override public DataObject getUpdatedSubtree() { - - return toBindingData(path,domEvent.getUpdatedSubtree()); + if (updatedDataCache == null) { + if(domEvent.getUpdatedSubtree() != null) { + updatedDataCache = toBindingData(path, domEvent.getUpdatedSubtree()); + } else { + updatedDataCache = Optional.absent(); + } + } + return updatedDataCache.orNull(); } @Override public String toString() { - return "TranslatedDataChangeEvent [domEvent=" + domEvent + "]"; + return Objects.toStringHelper(TranslatedDataChangeEvent.class) // + .add("created", getCreatedData()) // + .add("updated", getUpdatedData()) // + .add("removed", getRemovedPaths()) // + .add("dom", domEvent) // + .toString(); } } @@ -203,15 +254,6 @@ public abstract class AbstractForwardedDataBroker implements Delegator path, final NormalizedNode data) { - try { - return getCodec().toBinding(path, data); - } catch (DeserializationException e) { - return null; - } - } - - @Override public BindingIndependentConnector getConnector() { return this.connector; @@ -229,7 +271,7 @@ public abstract class AbstractForwardedDataBroker implements Delegator