Speed-up look up of namespace listeners. 68/27968/1
authorTony Tkacik <ttkacik@cisco.com>
Tue, 6 Oct 2015 13:55:25 +0000 (15:55 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Tue, 6 Oct 2015 13:55:25 +0000 (15:55 +0200)
Change-Id: Ie704318ddabc94cf87ee7902c0185812e721da43
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/DerivedNamespaceBehaviour.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceBehaviourWithListeners.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SimpleNamespaceContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/VirtualNamespaceContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SchemaNodeIdentifierBuildNamespace.java

index 03dbfa85657f94787b04824f118983987b314fac..2407aa9ccf1988b660c590dc18bc8ae07236cb3a 100644 (file)
@@ -11,17 +11,17 @@ import com.google.common.base.Preconditions;
 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;
     }
 
@@ -37,4 +37,6 @@ public abstract class DerivedNamespaceBehaviour<K, V, N extends IdentifierNamesp
     public void addTo(NamespaceStorageNode storage, K key, V value) {
         // Intentional noop
     }
+
+    public abstract DK getSignificantKey(K key);
 }
index f6d935e6145ab46b7ceaaf241d874db77ee7e927..86307f2c821f9ced07d1a7bb2f4512127f6389d7 100644 (file)
@@ -128,7 +128,7 @@ class BuildGlobalContext extends NamespaceStorageSupport implements NamespaceBeh
             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;
index 1f10c18a96bcc33a7d1e00d3f5e49836af7b9bb8..b62401b78d6dc97c5eb47f885552763110582283 100644 (file)
@@ -34,11 +34,15 @@ abstract class NamespaceBehaviourWithListeners<K, V, N extends IdentifierNamespa
             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) {
@@ -48,15 +52,13 @@ abstract class NamespaceBehaviourWithListeners<K, V, N extends IdentifierNamespa
 
     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();
@@ -66,10 +68,13 @@ abstract class NamespaceBehaviourWithListeners<K, V, N extends IdentifierNamespa
             }
         }
         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);
         }
     }
 
@@ -77,7 +82,7 @@ abstract class NamespaceBehaviourWithListeners<K, V, N extends IdentifierNamespa
         addListener(listener.key, listener);
     }
 
-    final void addDerivedNamespace(VirtualNamespaceContext<?, V, ?> namespace) {
+    final void addDerivedNamespace(VirtualNamespaceContext<?, V, ?, K> namespace) {
         derivedNamespaces.add(namespace);
     }
 
index 01e499f37c70bbdf9052664fd00f76821af94af6..2e4822d6234cb580f3e296bec811950516232663 100644 (file)
@@ -33,8 +33,14 @@ final class SimpleNamespaceContext<K, V, N extends IdentifierNamespace<K, V>>
         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
index 75c4b5e50ff2b964a692bea74ae72157157df60a..51762b6ef6c5b203939edcd0ca6b9894a6e0724d 100644 (file)
@@ -7,19 +7,21 @@
  */
 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) {
@@ -28,11 +30,18 @@ final class VirtualNamespaceContext<K, V, N extends IdentifierNamespace<K, V>>
 
     @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
index bee80c9ba0ba67d012d3289c22c89470ef1664ff..93069256e59bc049c71c3cbf1b1cfd0faab5e6e7 100644 (file)
@@ -18,7 +18,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
 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"})
@@ -56,4 +56,9 @@ class SchemaNodeIdentifierBuildNamespace extends
         return current;
     }
 
+    @Override
+    public QName getSignificantKey(SchemaNodeIdentifier key) {
+        return key.getLastComponent();
+    }
+
 }