import java.util.Map.Entry;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.GlobalStorageAccess;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceKeyCriterion;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceStorage;
/**
- * A {@link NamespaceAccess} backed by a {@link NamespaceBehaviour}.
- *
+ * A {@link NamespaceAccess} backed by a {@link NamespaceBehaviour}. Also holds reference to {@link BuildGlobalContext}.
*/
-abstract class BehaviourNamespaceAccess<K, V> extends NamespaceAccess<K, V> {
+abstract class BehaviourNamespaceAccess<K, V> extends NamespaceAccess<K, V> implements GlobalStorageAccess {
+ private final @NonNull AbstractNamespaceStorage globalContext;
private final @NonNull NamespaceBehaviour<K, V> behaviour;
- BehaviourNamespaceAccess(final NamespaceBehaviour<K, V> behaviour) {
+ BehaviourNamespaceAccess(final AbstractNamespaceStorage globalContext, final NamespaceBehaviour<K, V> behaviour) {
+ this.globalContext = requireNonNull(globalContext);
this.behaviour = requireNonNull(behaviour);
}
+ @Override
+ public final AbstractNamespaceStorage getGlobalStorage() {
+ return globalContext;
+ }
+
@Override
final V valueFrom(final NamespaceStorage storage, final K key) {
- return behaviour.getFrom(storage, key);
+ return behaviour.getFrom(this, storage, key);
}
@Override
final void valueTo(final NamespaceStorage storage, final K key, final V value) {
- behaviour.addTo(storage, key, value);
+ behaviour.addTo(this, storage, key, value);
onValueTo(storage, key, value);
}
@Override
final Map<K, V> allFrom(final NamespaceStorage storage) {
- return behaviour.getAllFrom(storage);
+ return behaviour.getAllFrom(this, storage);
}
@Override
final Entry<K, V> entryFrom(final NamespaceStorage storage, final NamespaceKeyCriterion<K> criterion) {
- return behaviour.getFrom(storage, criterion);
+ return behaviour.getFrom(this, storage, criterion);
}
@Override
* This method is analogous to {@link SchemaTreeAwareEffectiveStatement#findSchemaTreeNode(QName)}.
*/
@Override
- public StmtContext<QName, D, E> getFrom(final NamespaceStorage storage, final QName key) {
+ public StmtContext<QName, D, E> getFrom(final GlobalStorageAccess globalAccess, final NamespaceStorage storage,
+ final QName key) {
// Get the backing storage node for the requested storage
final NamespaceStorage storageNode = globalOrStatementSpecific(storage);
// Check try to look up existing node
}
@Override
- public Map<QName, StmtContext<QName, D, E>> getAllFrom(final NamespaceStorage storage) {
+ public Map<QName, StmtContext<QName, D, E>> getAllFrom(final GlobalStorageAccess globalAccess,
+ final NamespaceStorage storage) {
// FIXME: 7.0.0: this method needs to be well-defined
return null;
}
@Override
- public void addTo(final NamespaceStorage storage, final QName key, final StmtContext<QName, D, E> value) {
+ public void addTo(final GlobalStorageAccess globalAccess, final NamespaceStorage storage, final QName key,
+ final StmtContext<QName, D, E> value) {
final var prev = globalOrStatementSpecific(storage).putToLocalStorageIfAbsent(namespace(), key, value);
if (prev != null) {
throw new SourceException(value,
* @param <V> Value type
*/
public abstract class NamespaceBehaviour<K, V> {
+ /**
+ * Interface allowing quick access to {@link StorageType#GLOBAL} {@link NamespaceStorage}.
+ */
+ public interface GlobalStorageAccess {
+ /**
+ * Return the {@link StorageType#GLOBAL} {@link NamespaceStorage}.
+ *
+ * @return Global namespace storage
+ */
+ @NonNull NamespaceStorage getGlobalStorage();
+ }
+
private final @NonNull ParserNamespace<K, V> namespace;
protected NamespaceBehaviour(final ParserNamespace<K, V> namespace) {
* @return global namespace behaviour for supplied namespace type.
*/
public static <K, V> @NonNull NamespaceBehaviour<K, V> global(final ParserNamespace<K, V> namespace) {
- return new StorageSpecific<>(namespace, StorageType.GLOBAL);
+ return new Global<>(namespace);
}
/**
/**
* Returns a value from model namespace storage according to key param class.
*
+ * @param globalAccess A {@link GlobalStorageAccess}
* @param storage namespace storage
* @param key type parameter
* @return value from model namespace storage according to key param class
*/
- public abstract V getFrom(NamespaceStorage storage, K key);
+ public abstract V getFrom(GlobalStorageAccess globalAccess, NamespaceStorage storage, K key);
/**
* Returns the key/value mapping best matching specified criterion.
*
+ * @param globalAccess A {@link GlobalStorageAccess}
* @param storage namespace storage
* @param criterion selection criterion
* @return Selected mapping, if available.
*/
- public final @Nullable Entry<K, V> getFrom(final NamespaceStorage storage,
+ public final @Nullable Entry<K, V> getFrom(final GlobalStorageAccess globalAccess, final NamespaceStorage storage,
final NamespaceKeyCriterion<K> criterion) {
- final var mappings = getAllFrom(storage);
+ final var mappings = getAllFrom(globalAccess, storage);
if (mappings == null) {
return null;
}
/**
* Returns all values of a keys of param class from model namespace storage.
*
+ * @param globalAccess A {@link GlobalStorageAccess}
* @param storage namespace storage
* @return all values of keys of param class from model namespace storage
*/
- public abstract Map<K, V> getAllFrom(NamespaceStorage storage);
+ public abstract Map<K, V> getAllFrom(GlobalStorageAccess globalAccess, NamespaceStorage storage);
/**
* Adds a key/value to corresponding namespace storage according to param class.
*
+ * @param globalAccess A {@link GlobalStorageAccess}
* @param storage namespace storage
* @param key type parameter
* @param value type parameter
*/
- public abstract void addTo(NamespaceStorage storage, K key, V value);
+ public abstract void addTo(GlobalStorageAccess globalAccess, NamespaceStorage storage, K key, V value);
protected final V getFromLocalStorage(final NamespaceStorage storage, final K key) {
return storage.getFromLocalStorage(namespace, key);
}
@Override
- public final V getFrom(final NamespaceStorage storage, final K key) {
- return getFromLocalStorage(findStorage(storage), key);
+ public final V getFrom(final GlobalStorageAccess globalAccess, final NamespaceStorage storage, final K key) {
+ return getFromLocalStorage(findStorage(globalAccess, storage), key);
}
@Override
- public final Map<K, V> getAllFrom(final NamespaceStorage storage) {
- return getAllFromLocalStorage(findStorage(storage));
+ public final Map<K, V> getAllFrom(final GlobalStorageAccess globalAccess, final NamespaceStorage storage) {
+ return getAllFromLocalStorage(findStorage(globalAccess, storage));
}
@Override
- public final void addTo(final NamespaceStorage storage, final K key, final V value) {
- addToStorage(findStorage(storage), key, value);
+ public final void addTo(final GlobalStorageAccess globalAccess, final NamespaceStorage storage, final K key,
+ final V value) {
+ addToStorage(findStorage(globalAccess, storage), key, value);
}
- abstract NamespaceStorage findStorage(NamespaceStorage storage);
+ abstract NamespaceStorage findStorage(GlobalStorageAccess globalAccess, NamespaceStorage storage);
}
private static final class StatementLocal<K, V> extends AbstractSpecific<K, V> {
}
@Override
- NamespaceStorage findStorage(final NamespaceStorage storage) {
+ NamespaceStorage findStorage(final GlobalStorageAccess globalAccess, final NamespaceStorage storage) {
return storage;
}
}
+ private static final class Global<K, V> extends AbstractSpecific<K, V> {
+ Global(final ParserNamespace<K, V> namespace) {
+ super(namespace);
+ }
+
+ @Override
+ NamespaceStorage findStorage(final GlobalStorageAccess globalAccess, final NamespaceStorage storage) {
+ return globalAccess.getGlobalStorage();
+ }
+ }
+
private static final class StorageSpecific<K, V> extends AbstractSpecific<K, V> {
private final StorageType type;
}
@Override
- NamespaceStorage findStorage(final NamespaceStorage storage) {
+ NamespaceStorage findStorage(final GlobalStorageAccess globalAccess, final NamespaceStorage storage) {
var current = storage;
while (current != null && current.getStorageType() != type) {
current = current.getParentStorage();
}
@Override
- public V getFrom(final NamespaceStorage storage, final K key) {
+ public V getFrom(final GlobalStorageAccess globalAccess, final NamespaceStorage storage, final K key) {
NamespaceStorage current = storage;
while (current != null) {
final V val = getFromLocalStorage(current, key);
}
@Override
- public Map<K, V> getAllFrom(final NamespaceStorage storage) {
+ public Map<K, V> getAllFrom(final GlobalStorageAccess globalAccess, final NamespaceStorage storage) {
var current = storage;
while (current != null) {
final Map<K, V> val = getAllFromLocalStorage(current);
}
@Override
- public void addTo(final NamespaceStorage storage, final K key, final V value) {
+ public void addTo(final GlobalStorageAccess globalAccess, final NamespaceStorage storage, final K key,
+ final V value) {
addToStorage(storage, key, value);
}
}