Disconnect NamespaceBehaviour from Identifiable
[yangtools.git] / parser / yang-parser-spi / src / main / java / org / opendaylight / yangtools / yang / parser / spi / meta / NamespaceBehaviour.java
index 986cdfa67478bc81f268f6a40369f1fb3070057f..a2463f5b3336aad1d3dd5203aa6f6d8cfafb0d0f 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.spi.meta;
 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;
@@ -17,7 +18,6 @@ import java.util.Map.Entry;
 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;
@@ -36,7 +36,7 @@ import org.opendaylight.yangtools.yang.parser.spi.NamespaceBehaviours;
  * @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 {
         /**
@@ -125,21 +125,27 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
             @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);
     }
 
     /**
@@ -147,17 +153,17 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
      * 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);
     }
 
     /**
@@ -165,27 +171,26 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
      * 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);
     }
 
     /**
@@ -250,20 +255,29 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
     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
@@ -284,7 +298,7 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
         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);
         }
@@ -295,28 +309,32 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
         }
     }
 
-    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
@@ -349,20 +367,5 @@ public abstract class NamespaceBehaviour<K, V> extends AbstractSimpleIdentifiabl
         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());
     }
 }