import static java.util.Objects.requireNonNull;
import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Verify;
import java.util.Map;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
* @param <K> Key type
* @param <V> Value type
*/
-public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiable<ParserNamespace<K, V>> {
+public abstract class NamespaceBehaviour<K, V> {
public enum StorageNodeType {
/**
@Nullable StmtContext<QName, D, E> requestSchemaTreeChild(QName qname);
}
- protected NamespaceBehaviour(final ParserNamespace<K, V> identifier) {
- super(identifier);
+ private final @NonNull ParserNamespace<K, V> namespace;
+
+ protected NamespaceBehaviour(final ParserNamespace<K, V> namespace) {
+ this.namespace = requireNonNull(namespace);
+ }
+
+ public final @NonNull ParserNamespace<K, V> namespace() {
+ return namespace;
}
/**
* Creates a global namespace behaviour for supplied namespace type. Global behaviour stores and loads all values
* from root {@link NamespaceStorageNode} with type of {@link StorageNodeType#GLOBAL}.
*
- * @param identifier Namespace identifier.
- * @param <K> type parameter
- * @param <V> type parameter
+ * @param <K> Namespace key type
+ * @param <V> Namespace value type
+ * @param namespace Namespace identifier
* @return global namespace behaviour for supplied namespace type.
*/
- public static <K, V> @NonNull NamespaceBehaviour<K, V> global(final ParserNamespace<K, V> identifier) {
- return new StorageSpecific<>(identifier, StorageNodeType.GLOBAL);
+ public static <K, V> @NonNull NamespaceBehaviour<K, V> global(final ParserNamespace<K, V> namespace) {
+ return new StorageSpecific<>(namespace, StorageNodeType.GLOBAL);
}
/**
* and loads all values from closest {@link NamespaceStorageNode} ancestor with type
* of {@link StorageNodeType#SOURCE_LOCAL_SPECIAL}.
*
- * @param identifier Namespace identifier.
- * @param <K> type parameter
- * @param <V> type parameter
+ * @param <K> Namespace key type
+ * @param <V> Namespace value type
+ * @param namespace Namespace identifier
* @return source-local namespace behaviour for supplied namespace type.
*/
- public static <K, V> @NonNull NamespaceBehaviour<K, V> sourceLocal(final ParserNamespace<K, V> identifier) {
- return new StorageSpecific<>(identifier, StorageNodeType.SOURCE_LOCAL_SPECIAL);
+ public static <K, V> @NonNull NamespaceBehaviour<K, V> sourceLocal(final ParserNamespace<K, V> namespace) {
+ return new StorageSpecific<>(namespace, StorageNodeType.SOURCE_LOCAL_SPECIAL);
}
- public static <K, V> @NonNull NamespaceBehaviour<K, V> statementLocal(final ParserNamespace<K, V> identifier) {
- return new StatementLocal<>(identifier);
+ public static <K, V> @NonNull NamespaceBehaviour<K, V> statementLocal(final ParserNamespace<K, V> namespace) {
+ return new StatementLocal<>(namespace);
}
/**
* behaviour stores and loads all values from closest {@link NamespaceStorageNode} ancestor with type
* of {@link StorageNodeType#ROOT_STATEMENT_LOCAL}.
*
- * @param identifier Namespace identifier.
- * @param <K> type parameter
- * @param <V> type parameter
+ * @param <K> Namespace key type
+ * @param <V> Namespace value type
+ * @param namespace Namespace identifier
* @return root-statement-local namespace behaviour for supplied namespace type.
*/
- public static <K, V> @NonNull NamespaceBehaviour<K, V> rootStatementLocal(final ParserNamespace<K, V> identifier) {
- return new StorageSpecific<>(identifier, StorageNodeType.ROOT_STATEMENT_LOCAL);
+ public static <K, V> @NonNull NamespaceBehaviour<K, V> rootStatementLocal(final ParserNamespace<K, V> namespace) {
+ return new StorageSpecific<>(namespace, StorageNodeType.ROOT_STATEMENT_LOCAL);
}
/**
* Creates tree-scoped namespace behaviour for supplied namespace type. Tree-scoped namespace behaviour searches
* for value in all storage nodes up to the root and stores values in supplied node.
*
- * @param identifier
- * Namespace identifier.
- * @param <K> type parameter
- * @param <V> type parameter
+ * @param <K> Namespace key type
+ * @param <V> Namespace value type
+ * @param namespace Namespace identifier
* @return tree-scoped namespace behaviour for supplied namespace type.
*/
- public static <K, V> @NonNull NamespaceBehaviour<K, V> treeScoped(final ParserNamespace<K, V> identifier) {
- return new TreeScoped<>(identifier);
+ public static <K, V> @NonNull NamespaceBehaviour<K, V> treeScoped(final ParserNamespace<K, V> namespace) {
+ return new TreeScoped<>(namespace);
}
/**
public abstract void addTo(NamespaceStorageNode storage, K key, V value);
protected final V getFromLocalStorage(final NamespaceStorageNode storage, final K key) {
- return storage.getFromLocalStorage(getIdentifier(), key);
+ return storage.getFromLocalStorage(namespace, key);
}
protected final Map<K, V> getAllFromLocalStorage(final NamespaceStorageNode storage) {
- return storage.getAllFromLocalStorage(getIdentifier());
+ return storage.getAllFromLocalStorage(namespace);
}
protected final void addToStorage(final NamespaceStorageNode storage, final K key, final V value) {
- storage.putToLocalStorage(getIdentifier(), key, value);
+ storage.putToLocalStorage(namespace, key, value);
}
- abstract static class AbstractSpecific<K, V> extends NamespaceBehaviour<K, V> {
- AbstractSpecific(final ParserNamespace<K, V> identifier) {
- super(identifier);
+ @Override
+ public final String toString() {
+ return addToStringAttributes(MoreObjects.toStringHelper(this)).toString();
+ }
+
+ protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+ return toStringHelper.add("namespace", namespace);
+ }
+
+ private abstract static class AbstractSpecific<K, V> extends NamespaceBehaviour<K, V> {
+ AbstractSpecific(final ParserNamespace<K, V> namespace) {
+ super(namespace);
}
@Override
abstract NamespaceStorageNode findStorageNode(NamespaceStorageNode storage);
}
- static final class StatementLocal<K, V> extends AbstractSpecific<K, V> {
+ private static final class StatementLocal<K, V> extends AbstractSpecific<K, V> {
StatementLocal(final ParserNamespace<K, V> identifier) {
super(identifier);
}
}
}
- static final class StorageSpecific<K, V> extends AbstractSpecific<K, V> {
- private final StorageNodeType storageType;
+ private static final class StorageSpecific<K, V> extends AbstractSpecific<K, V> {
+ private final StorageNodeType type;
- StorageSpecific(final ParserNamespace<K, V> identifier, final StorageNodeType type) {
- super(identifier);
- storageType = requireNonNull(type);
+ StorageSpecific(final ParserNamespace<K, V> namespace, final StorageNodeType type) {
+ super(namespace);
+ this.type = requireNonNull(type);
}
@Override
NamespaceStorageNode findStorageNode(final NamespaceStorageNode storage) {
- return findClosestTowardsRoot(storage, storageType);
+ var current = storage;
+ while (current != null && current.getStorageNodeType() != type) {
+ current = current.getParentNamespaceStorage();
+ }
+ return current;
}
@Override
protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
- return super.addToStringAttributes(helper.add("type", storageType));
+ return super.addToStringAttributes(helper.add("type", type));
}
}
- static final class TreeScoped<K, V> extends NamespaceBehaviour<K, V> {
- TreeScoped(final ParserNamespace<K, V> identifier) {
- super(identifier);
+ private static final class TreeScoped<K, V> extends NamespaceBehaviour<K, V> {
+ TreeScoped(final ParserNamespace<K, V> namespace) {
+ super(namespace);
}
@Override
public void addTo(final NamespaceStorageNode storage, final K key, final V value) {
addToStorage(storage, key, value);
}
-
- }
-
- protected static NamespaceStorageNode findClosestTowardsRoot(final NamespaceStorageNode storage,
- final StorageNodeType type) {
- NamespaceStorageNode current = storage;
- while (current != null && current.getStorageNodeType() != type) {
- current = current.getParentNamespaceStorage();
- }
- return current;
- }
-
- @Override
- protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
- return helper.add("identifier", getIdentifier());
}
}