import java.util.Map;
import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
-public abstract class DerivedNamespaceBehaviour<K, V, N extends IdentifierNamespace<K, V>, T extends IdentifierNamespace<?, ?>>
+public abstract class DerivedNamespaceBehaviour<K, V, DK, N extends IdentifierNamespace<K, V>, DN extends IdentifierNamespace<DK, ?>>
extends NamespaceBehaviour<K, V, N> {
- private Class<T> derivedFrom;
+ private Class<DN> derivedFrom;
- protected DerivedNamespaceBehaviour(Class<N> identifier, Class<T> derivedFrom) {
+ protected DerivedNamespaceBehaviour(Class<N> identifier, Class<DN> derivedFrom) {
super(identifier);
this.derivedFrom = Preconditions.checkNotNull(derivedFrom);
}
- public Class<T> getDerivedFrom() {
+ public Class<DN> getDerivedFrom() {
return derivedFrom;
}
public void addTo(NamespaceStorageNode storage, K key, V value) {
// Intentional noop
}
+
+ public abstract DK getSignificantKey(K key);
}
NamespaceBehaviour<K, V, N> potentialRaw) {
if (potentialRaw instanceof DerivedNamespaceBehaviour) {
VirtualNamespaceContext derivedContext =
- new VirtualNamespaceContext<>(potentialRaw);
+ new VirtualNamespaceContext((DerivedNamespaceBehaviour) potentialRaw);
getNamespaceBehaviour(((DerivedNamespaceBehaviour) potentialRaw).getDerivedFrom())
.addDerivedNamespace(derivedContext);
return derivedContext;
return key;
}
+ void trigger(Object value) {
+ onValueAdded(key, value);
+ }
+
abstract void onValueAdded(Object key, Object value);
}
- private final NamespaceBehaviour<K, V, N> delegate;
- private final List<VirtualNamespaceContext<?, V, ?>> derivedNamespaces = new ArrayList<>();
+ protected final NamespaceBehaviour<K, V, N> delegate;
+ private final List<VirtualNamespaceContext<?, V, ?, K>> derivedNamespaces = new ArrayList<>();
protected NamespaceBehaviourWithListeners(final NamespaceBehaviour<K, V, N> delegate) {
protected abstract void addListener(K key, ValueAddedListener<K> listener);
- protected abstract Iterator<ValueAddedListener<K>> getMutableListeners(K key);
-
protected abstract boolean isRequestedValue(ValueAddedListener<K> 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<ValueAddedListener<K>> keyListeners = getMutableListeners(key);
+ protected void notifyListeners(final NamespaceStorageNode storage, Iterator<ValueAddedListener<K>> keyListeners,
+ final V value) {
List<ValueAddedListener<K>> toNotify = new ArrayList<>();
while (keyListeners.hasNext()) {
ValueAddedListener<K> listener = keyListeners.next();
}
}
for(ValueAddedListener<K> listener : toNotify) {
- listener.onValueAdded(key, value);
+ listener.trigger(value);
}
- for (VirtualNamespaceContext<?, V, ?> derived : derivedNamespaces) {
- derived.addTo(storage, null, value);
+ }
+
+ protected void notifyDerivedNamespaces(final NamespaceStorageNode storage, final K key, final V value) {
+ for (VirtualNamespaceContext<?, V, ?, K> derived : derivedNamespaces) {
+ derived.addedToSourceNamespace(storage, key, value);
}
}
addListener(listener.key, listener);
}
- final void addDerivedNamespace(VirtualNamespaceContext<?, V, ?> namespace) {
+ final void addDerivedNamespace(VirtualNamespaceContext<?, V, ?, K> namespace) {
derivedNamespaces.add(namespace);
}
listeners.add(listener);
}
- @Override
- protected Iterator<NamespaceBehaviourWithListeners.ValueAddedListener<K>> getMutableListeners(K key) {
+ private Iterator<NamespaceBehaviourWithListeners.ValueAddedListener<K>> getMutableListeners(K key) {
return listeners.iterator();
}
+
+ @Override
+ public void addTo(final NamespaceStorageNode storage, final K key, final V value) {
+ delegate.addTo(storage, key, value);
+ notifyListeners(storage, getMutableListeners(key), value);
+ notifyDerivedNamespaces(storage, key, value);
+ }
}
\ No newline at end of file
*/
package org.opendaylight.yangtools.yang.parser.stmt.reactor;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedNamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
-final class VirtualNamespaceContext<K, V, N extends IdentifierNamespace<K, V>>
+final class VirtualNamespaceContext<K, V, N extends IdentifierNamespace<K, V>, DK>
extends NamespaceBehaviourWithListeners<K, V, N> {
- private final List<NamespaceBehaviourWithListeners.ValueAddedListener<K>> listeners = new ArrayList<>(20);
+ private final Multimap<DK, NamespaceBehaviourWithListeners.ValueAddedListener<K>> listeners = HashMultimap.create();
+ private final DerivedNamespaceBehaviour<K, V, DK, N, ?> derivedDelegate;
- public VirtualNamespaceContext(NamespaceBehaviour<K, V, N> delegate) {
+ public VirtualNamespaceContext(DerivedNamespaceBehaviour<K, V, DK, N, ?> delegate) {
super(delegate);
+ this.derivedDelegate = delegate;
}
protected boolean isRequestedValue(NamespaceBehaviourWithListeners.ValueAddedListener<K> listener, NamespaceStorageNode storage, V value) {
@Override
protected void addListener(K key, NamespaceBehaviourWithListeners.ValueAddedListener<K> listener) {
- listeners.add(listener);
+ listeners.put(derivedDelegate.getSignificantKey(key), listener);
+ }
+
+
+ void addedToSourceNamespace(NamespaceBehaviour.NamespaceStorageNode storage, DK key, V value) {
+ notifyListeners(storage, listeners.get(key).iterator(), value);
}
@Override
- protected Iterator<NamespaceBehaviourWithListeners.ValueAddedListener<K>> getMutableListeners(K key) {
- return listeners.iterator();
+ public void addTo(final NamespaceStorageNode storage, final K key, final V value) {
+ delegate.addTo(storage, key, value);
+ notifyListeners(storage, listeners.get(derivedDelegate.getSignificantKey(key)).iterator(), value);
+ notifyDerivedNamespaces(storage, key, value);
}
}
\ No newline at end of file
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
class SchemaNodeIdentifierBuildNamespace extends
- DerivedNamespaceBehaviour<SchemaNodeIdentifier, StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>, SchemaNodeIdentifierBuildNamespace, ChildSchemaNodes<?, ?>>
+ DerivedNamespaceBehaviour<SchemaNodeIdentifier, StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>, QName, SchemaNodeIdentifierBuildNamespace, ChildSchemaNodes<?, ?>>
implements IdentifierNamespace<SchemaNodeIdentifier, StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>> {
@SuppressWarnings({"unchecked", "rawtypes"})
return current;
}
+ @Override
+ public QName getSignificantKey(SchemaNodeIdentifier key) {
+ return key.getLastComponent();
+ }
+
}