*/
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
}
- //<K,V,N extends IdentifierNamespace<K, V>> V
- //public final <K, VT, V extends VT ,N extends IdentifierNamespace<K, V>> VT getFromNamespace(Class<N> type, K key)
- public final <K,V,N extends IdentifierNamespace<K, V>> V 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, N extends IdentifierNamespace<K, V>> Map<?, ?> getAllFromNamespace(Class<N> type){
- return namespaces.get(type);
+ 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,VT extends V,N extends IdentifierNamespace<K, V>> void addToNs(Class<N> type, K key, VT value)
+ 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>> 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(Class<N> type, K key, V value) {
+ 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);