Propagate @Nonnull and @Nullable annotations
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / NamespaceStorageSupport.java
index f79a062ea11ed7d3dd61cafb98be0b07a9a2c2bc..0fe03bec79a97db2aa2a59bbd6da39dcc8fa292d 100644 (file)
  */
 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
+import com.google.common.collect.ImmutableMap;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceNotAvailableException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils;
 
 abstract class NamespaceStorageSupport implements NamespaceStorageNode {
 
-    private final Map<Class<?>,Map<?,?>> namespaces = new HashMap<>();
-
+    private Map<Class<?>, Map<?,?>> namespaces = ImmutableMap.of();
 
     @Override
     public abstract NamespaceStorageNode getParentNamespaceStorage();
 
     public abstract NamespaceBehaviour.Registry getBehaviourRegistry();
 
-    protected void checkLocalNamespaceAllowed(Class<? extends IdentifierNamespace<?, ?>> type) {
+    protected void checkLocalNamespaceAllowed(final Class<? extends IdentifierNamespace<?, ?>> type) {
         // NOOP
     }
 
-    protected <K, V, N extends IdentifierNamespace<K, V>> void onNamespaceElementAdded(Class<N> type, K key, V value) {
+    protected <K, V, N extends IdentifierNamespace<K, V>> void onNamespaceElementAdded(final Class<N> type, final K key, final V value) {
         // NOOP
     }
 
-    public final <K, VT, V extends VT ,N extends IdentifierNamespace<K, V>> VT getFromNamespace(Class<N> type, K key)
+    @Nonnull
+    public final <K,V, KT extends K, N extends IdentifierNamespace<K, V>> V getFromNamespace(final Class<N> type, final KT key)
             throws NamespaceNotAvailableException {
         return getBehaviourRegistry().getNamespaceBehaviour(type).getFrom(this,key);
     }
 
-    public final <K,V,VT extends V,N extends IdentifierNamespace<K, V>> void addToNs(Class<N> type, K key, VT value)
+    public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromNamespace(final Class<N> type){
+        return getBehaviourRegistry().getNamespaceBehaviour(type).getAllFrom(this);
+    }
+
+    @SuppressWarnings("unchecked")
+    public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromCurrentStmtCtxNamespace(final Class<N> type){
+        return (Map<K, V>) namespaces.get(type);
+    }
+
+    public final <K,V, KT extends K, VT extends V,N extends IdentifierNamespace<K, V>> void addToNs(final Class<N> type, final KT key, final VT value)
             throws NamespaceNotAvailableException {
         getBehaviourRegistry().getNamespaceBehaviour(type).addTo(this,key,value);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    public final <K, N extends StatementNamespace<K, ?,?>> void addContextToNamespace(Class<N> type, K key, StmtContext<?, ?, ?> value)
+    public final <K, N extends StatementNamespace<K, ?,?>> void addContextToNamespace(final Class<N> type, final K key, final StmtContext<?, ?, ?> value)
             throws NamespaceNotAvailableException {
         getBehaviourRegistry().getNamespaceBehaviour((Class)type).addTo(this, key, value);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
-    public <K, V, N extends IdentifierNamespace<K, V>> V getFromLocalStorage(Class<N> type, K key) {
-        @SuppressWarnings("unchecked")
+    public <K, V, N extends IdentifierNamespace<K, V>> V getFromLocalStorage(final Class<N> type, final K key) {
         Map<K, V> localNamespace = (Map<K,V>) namespaces.get(type);
-        if(localNamespace != null) {
-            return localNamespace.get(key);
+
+        V potential = null;
+        if (localNamespace != null) {
+            potential = localNamespace.get(key);
         }
-        return null;
+
+        if (potential == null && Utils.isModuleIdentifierWithoutSpecifiedRevision(key)) {
+            potential = getRegardlessOfRevision((ModuleIdentifier)key,(Map<ModuleIdentifier,V>)localNamespace);
+        }
+
+        return potential;
     }
 
+    private static <K, V, N extends IdentifierNamespace<K, V>> V getRegardlessOfRevision(final ModuleIdentifier key,
+            final Map<ModuleIdentifier, V> localNamespace) {
 
+        if (localNamespace == null) {
+            return null;
+        }
+
+        Set<Entry<ModuleIdentifier, V>> entrySet = localNamespace.entrySet();
+        for (Entry<ModuleIdentifier, V> entry : entrySet) {
+            ModuleIdentifier moduleIdentifierInMap = entry.getKey();
+            if (moduleIdentifierInMap.getName().equals(key.getName())) {
+                return entry.getValue();
+            }
+        }
+
+        return null;
+    }
 
     @Override
-    public <K, V, N extends IdentifierNamespace<K, V>> void addToLocalStorage(Class<N> type, K key, V value) {
+    public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromLocalStorage(final Class<N> type) {
+        @SuppressWarnings("unchecked")
+        Map<K, V> localNamespace = (Map<K, V>) namespaces.get(type);
+        return localNamespace;
+    }
+
+    @Override
+    public <K, V, N extends IdentifierNamespace<K, V>> void addToLocalStorage(final Class<N> type, final K key, final V value) {
         @SuppressWarnings("unchecked")
         Map<K, V> localNamespace = (Map<K,V>) namespaces.get(type);
-        if(localNamespace == null) {
+        if (localNamespace == null) {
             checkLocalNamespaceAllowed(type);
-            localNamespace = new HashMap<>();
+            localNamespace = new HashMap<>(1);
+
+            if (namespaces.isEmpty()) {
+                namespaces = new HashMap<>(1);
+            }
             namespaces.put(type, localNamespace);
         }
         localNamespace.put(key,value);