X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Freactor%2FNamespaceBehaviourWithListeners.java;h=5f77fd4aaf4c3ec9c60ce4a010728621e24499e7;hb=82af449e4ef07d80490e79484d0402b81009541e;hp=c4bbb76f004a6417f456a791a49001063e14948c;hpb=f6e95705ab22346ccdc6e5b84e5c0b14cd45511f;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceBehaviourWithListeners.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceBehaviourWithListeners.java index c4bbb76f00..5f77fd4aaf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceBehaviourWithListeners.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceBehaviourWithListeners.java @@ -7,76 +7,83 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.reactor; -import com.google.common.base.Optional; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import java.util.Collection; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; -import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; -import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; -final class NamespaceBehaviourWithListeners> extends NamespaceBehaviour { +abstract class NamespaceBehaviourWithListeners> + extends NamespaceBehaviour { - abstract static class ValueAddedListener { + abstract static class ValueAddedListener { private final NamespaceStorageNode ctxNode; + private K key; - public ValueAddedListener(final NamespaceStorageNode contextNode) { + public ValueAddedListener(final NamespaceStorageNode contextNode, K key) { this.ctxNode = contextNode; + this.key = key; + } + + public NamespaceStorageNode getCtxNode() { + return ctxNode; + } + + public K getKey() { + return key; + } + + void trigger(Object value) { + onValueAdded(key, value); } abstract void onValueAdded(Object key, Object value); } - private final NamespaceBehaviour delegate; - private final Multimap listeners = HashMultimap.create(); + protected final NamespaceBehaviour delegate; + private final List> derivedNamespaces = new ArrayList<>(); + protected NamespaceBehaviourWithListeners(final NamespaceBehaviour delegate) { super(delegate.getIdentifier()); this.delegate = delegate; } + protected abstract void addListener(K key, ValueAddedListener listener); + + protected abstract boolean isRequestedValue(ValueAddedListener listener, NamespaceStorageNode storage, V value); + @Override - public void addTo(final NamespaceStorageNode storage, final K key, final V value) { - delegate.addTo(storage, key, value); + public abstract void addTo(final NamespaceStorageNode storage, final K key, final V value); - Iterator keyListeners = listeners.get(key).iterator(); + protected void notifyListeners(final NamespaceStorageNode storage, Iterator> keyListeners, + final V value) { + List> toNotify = new ArrayList<>(); while (keyListeners.hasNext()) { - ValueAddedListener listener = keyListeners.next(); - if (listener.ctxNode == storage || hasIdentiticalValue(listener.ctxNode,key,value)) { + ValueAddedListener listener = keyListeners.next(); + if (isRequestedValue(listener, storage, value)) { keyListeners.remove(); - listener.onValueAdded(key, value); + toNotify.add(listener); } } - - if (key instanceof ModuleIdentifier && !listeners.isEmpty()) { - Collection defaultImportListeners = getDefaultImportListeners((ModuleIdentifier) key); - Iterator defaultImportsIterator = defaultImportListeners.iterator(); - while (defaultImportsIterator.hasNext()) { - ValueAddedListener listener = defaultImportsIterator.next(); - if(listener.ctxNode == storage || hasIdentiticalValue(listener.ctxNode,key,value)) { - defaultImportsIterator.remove(); - listener.onValueAdded(key, value); - } - } + for (ValueAddedListener listener : toNotify) { + listener.trigger(value); } } - private Collection getDefaultImportListeners(final ModuleIdentifier key) { - ModuleIdentifier defaultImportKey = new ModuleIdentifierImpl(key.getName(), - Optional.fromNullable(key.getNamespace()), Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_IMP)); - return listeners.get((K)defaultImportKey); + protected void notifyDerivedNamespaces(final NamespaceStorageNode storage, final K key, final V value) { + for (VirtualNamespaceContext derived : derivedNamespaces) { + derived.addedToSourceNamespace(storage, key, value); + } } - private boolean hasIdentiticalValue(final NamespaceStorageNode ctxNode, final K key, final V value) { - return getFrom(ctxNode, key) == value; + final void addValueListener(final ValueAddedListener listener) { + addListener(listener.key, listener); } - void addValueListener(final K key, final ValueAddedListener listener) { - listeners.put(key, listener); + final void addDerivedNamespace(VirtualNamespaceContext namespace) { + derivedNamespaces.add(namespace); } @Override