Simplify getParent()
[yangtools.git] / data / yang-data-util / src / main / java / org / opendaylight / yangtools / yang / data / util / NormalizedNodeStreamWriterStack.java
index 081cf686da39e128be082a23612614514ddb5daa..bf37255ed7719674e6b6fce0ff5810cca2a49a93 100644 (file)
@@ -13,16 +13,12 @@ import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.Iterables;
 import java.io.IOException;
 import java.util.ArrayDeque;
 import java.util.Deque;
-import java.util.Set;
-import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
@@ -31,8 +27,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
-import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
@@ -53,7 +47,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
-import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema;
 import org.opendaylight.yangtools.yang.model.util.LeafrefResolver;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
@@ -79,10 +72,12 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
     private NormalizedNodeStreamWriterStack(final SchemaInferenceStack dataTree) {
         this.dataTree = requireNonNull(dataTree);
         if (!dataTree.isEmpty()) {
-            final EffectiveStatement<?, ?> current = dataTree.currentStatement();
-            checkArgument(current instanceof DataNodeContainer, "Cannot instantiate on %s", current);
-
-            root = (DataNodeContainer) current;
+            final var current = dataTree.currentStatement();
+            if (current instanceof DataNodeContainer container) {
+                root = container;
+            } else {
+                throw new IllegalArgumentException("Cannot instantiate on " + current);
+            }
         } else {
             root = dataTree.getEffectiveModelContext();
         }
@@ -179,7 +174,7 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
     }
 
     public Object getParent() {
-        final WithStatus schema = schemaStack.peek();
+        final var schema = schemaStack.peek();
         return schema == null ? root : schema;
     }
 
@@ -189,8 +184,8 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
         verify(stmt instanceof SchemaNode, "Unexpected result %s", stmt);
         final SchemaNode ret = (SchemaNode) stmt;
         final Object parent = getParent();
-        if (parent instanceof ChoiceSchemaNode) {
-            final DataSchemaNode check = ((ChoiceSchemaNode) parent).findDataSchemaChild(qname).orElse(null);
+        if (parent instanceof ChoiceSchemaNode choice) {
+            final DataSchemaNode check = choice.findDataSchemaChild(qname).orElse(null);
             verify(check == ret, "Data tree result %s does not match choice result %s", ret, check);
         }
         return ret;
@@ -223,8 +218,8 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
 
     public LeafListSchemaNode leafSetEntryNode(final QName qname) {
         final Object parent = getParent();
-        if (parent instanceof LeafListSchemaNode) {
-            return (LeafListSchemaNode) parent;
+        if (parent instanceof LeafListSchemaNode leafList) {
+            return leafList;
         }
         checkArgument(parent instanceof DataNodeContainer, "Cannot lookup %s in parent %s", qname, parent);
         final DataSchemaNode child = ((DataNodeContainer) parent).dataChildByName(qname);
@@ -250,12 +245,12 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
         LOG.debug("Enter container {}", name);
 
         final SchemaNode schema;
-        if (schemaStack.isEmpty() && root instanceof NotificationDefinition) {
+        if (schemaStack.isEmpty() && root instanceof NotificationDefinition notification) {
             // Special case for stacks initialized at notification. We pretend the first container is contained within
             // itself.
             // FIXME: 8.0.0: factor this special case out to something more reasonable, like being initialized at the
             //               Notification's parent and knowing to enterSchemaTree() instead of enterDataTree().
-            schema = (NotificationDefinition) root;
+            schema = notification;
         } else {
             schema = enterDataTree(name);
             checkArgument(schema instanceof ContainerLike, "Node %s is not a container", schema);
@@ -286,47 +281,4 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
         }
         return ret;
     }
-
-    public AugmentationSchemaNode startAugmentationNode(final AugmentationIdentifier identifier) {
-        LOG.debug("Enter augmentation {}", identifier);
-        Object parent = getParent();
-
-        checkArgument(parent instanceof AugmentationTarget, "Augmentation not allowed under %s", parent);
-        if (parent instanceof ChoiceSchemaNode) {
-            final QName name = Iterables.get(identifier.getPossibleChildNames(), 0);
-            parent = findCaseByChild((ChoiceSchemaNode) parent, name);
-        }
-        checkArgument(parent instanceof DataNodeContainer, "Augmentation allowed only in DataNodeContainer", parent);
-        final AugmentationSchemaNode schema = findSchemaForAugment((AugmentationTarget) parent,
-            identifier.getPossibleChildNames());
-        final AugmentationSchemaNode resolvedSchema = new EffectiveAugmentationSchema(schema,
-            (DataNodeContainer) parent);
-        schemaStack.push(resolvedSchema);
-        return resolvedSchema;
-    }
-
-    // FIXME: 7.0.0: can we get rid of this?
-    private static @NonNull AugmentationSchemaNode findSchemaForAugment(final AugmentationTarget schema,
-            final Set<QName> qnames) {
-        for (final AugmentationSchemaNode augment : schema.getAvailableAugmentations()) {
-            if (qnames.equals(augment.getChildNodes().stream()
-                .map(DataSchemaNode::getQName)
-                .collect(Collectors.toUnmodifiableSet()))) {
-                return augment;
-            }
-        }
-
-        throw new IllegalStateException(
-            "Unknown augmentation node detected, identified by: " + qnames + ", in: " + schema);
-    }
-
-    // FIXME: 7.0.0: can we get rid of this?
-    private static SchemaNode findCaseByChild(final ChoiceSchemaNode parent, final QName qname) {
-        for (final CaseSchemaNode caze : parent.getCases()) {
-            if (caze.dataChildByName(qname) != null) {
-                return caze;
-            }
-        }
-        return null;
-    }
 }