Add OnDemandSchemaTreeStorageNode
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / namespace / ChildSchemaNodeNamespace.java
index 74a33a86f81f130a7429f3b817d09e046455ae70..b8a7e5172408636857ae38899c699a4016b8aae6 100644 (file)
@@ -28,9 +28,8 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
  */
 @Beta
 public final class ChildSchemaNodeNamespace<D extends DeclaredStatement<QName>, E extends EffectiveStatement<QName, D>>
-    extends NamespaceBehaviour<QName, StmtContext<?, D, E>, ChildSchemaNodeNamespace<D, E>>
-    implements StatementNamespace<QName, D, E> {
-
+        extends NamespaceBehaviour<QName, StmtContext<?, D, E>, ChildSchemaNodeNamespace<D, E>>
+        implements StatementNamespace<QName, D, E> {
     public ChildSchemaNodeNamespace() {
         super((Class) ChildSchemaNodeNamespace.class);
     }
@@ -43,7 +42,19 @@ public final class ChildSchemaNodeNamespace<D extends DeclaredStatement<QName>,
 
     @Override
     public StmtContext<?, D, E> getFrom(final NamespaceStorageNode storage, final QName key) {
-        return globalOrStatementSpecific(storage).getFromLocalStorage(getIdentifier(), key);
+        // Get the backing storage node for the requested storage
+        final NamespaceStorageNode storageNode = globalOrStatementSpecific(storage);
+        // Check try to look up existing node
+        final StmtContext<?, D, E> existing = storageNode.getFromLocalStorage(getIdentifier(), key);
+
+        // An existing node takes precedence, if it does not exist try to request it
+        return existing != null ? existing : requestFrom(storageNode, key);
+    }
+
+    private static <D extends DeclaredStatement<QName>, E extends EffectiveStatement<QName, D>>
+            StmtContext<?, D, E> requestFrom(final NamespaceStorageNode storageNode, final QName key) {
+        return storageNode instanceof OnDemandSchemaTreeStorageNode
+            ? ((OnDemandSchemaTreeStorageNode) storageNode).requestSchemaTreeChild(key) : null;
     }
 
     @Override