Add DataSchemaContext.SimpleValue.type() 21/107021/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 24 Jul 2023 17:38:14 +0000 (19:38 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 24 Jul 2023 18:08:43 +0000 (20:08 +0200)
SimpleValues have an underlying TypeDefinition. Expose it so users
of DataSchemaContext can use that instead of going through the
underlying dataSchemaNode().

JIRA: YANGTOOLS-1529
Change-Id: I04bbb8e64913d140a29d96380ddc6ce4b5536fd8
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContext.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/impl/context/AbstractContext.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/impl/context/AbstractValueContext.java [new file with mode: 0644]
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/impl/context/LeafContext.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/impl/context/LeafListItemContext.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeDefinition.java

index d911710a496a475e53d684fec0c7401ebaa874da..19ad531d46c0f6498646fa837d865e899cea4b1c 100644 (file)
@@ -16,23 +16,26 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ValueNode;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContext.Composite;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContext.SimpleValue;
 import org.opendaylight.yangtools.yang.data.util.impl.context.AbstractCompositeContext;
 import org.opendaylight.yangtools.yang.data.util.impl.context.AbstractContext;
 import org.opendaylight.yangtools.yang.data.util.impl.context.AbstractPathMixinContext;
-import org.opendaylight.yangtools.yang.data.util.impl.context.LeafContext;
-import org.opendaylight.yangtools.yang.data.util.impl.context.LeafListItemContext;
+import org.opendaylight.yangtools.yang.data.util.impl.context.AbstractValueContext;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 /**
@@ -147,10 +150,24 @@ public sealed interface DataSchemaContext permits AbstractContext, Composite, Si
     }
 
     /**
-     * Marker interface for contexts which boil down to a simple, not-structured value. The
+     * Marker interface for contexts which boil down to a simple, not-structured {@link ValueNode}. This can be one of
+     * <ul>
+    *   <li>{@link LeafNode} backed by a {@link LeafSchemaNode}, or</li>
+    *   <li>{@link LeafSetNode} backed by a {@link LeafListSchemaNode}</li>
+     * </ul>
+     *
+     * <p>
+     * This trait interface is exposed for determining that the corresponding {@link TypeDefinition} of the normalized
+     * body.
      */
-    sealed interface SimpleValue extends DataSchemaContext permits LeafContext, LeafListItemContext {
-        // Marker interface
+    sealed interface SimpleValue extends DataSchemaContext permits AbstractValueContext {
+        /**
+         * Return the {@link TypeDefinition} of the type backing this context.
+         *
+         * @return A {@link TypeDefinition}
+         */
+        // FIXME: YANGTOOLS-1528: return yang.data.api.type.NormalizedType
+        @NonNull TypeDefinition<?> type();
     }
 
     /**
index 952a95dc68ed5283028f34940db82805110b3ea7..f5f0418e8d3a7c807d26ee7d04815128130454a3 100644 (file)
@@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
  * since the mapping is not one-to-one.
  */
 public abstract sealed class AbstractContext implements DataSchemaContext
-        permits AbstractPathMixinContext, AbstractCompositeContext, LeafContext, LeafListItemContext, OpaqueContext {
+        permits AbstractPathMixinContext, AbstractCompositeContext, AbstractValueContext, OpaqueContext {
     private final NodeIdentifier pathStep;
 
     final @NonNull DataSchemaNode dataSchemaNode;
diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/impl/context/AbstractValueContext.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/impl/context/AbstractValueContext.java
new file mode 100644 (file)
index 0000000..2d227ad
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.util.impl.context;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContext.SimpleValue;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
+
+public abstract sealed class AbstractValueContext extends AbstractContext implements SimpleValue
+        permits LeafContext, LeafListItemContext {
+    AbstractValueContext(final NodeIdentifier pathStep, final TypedDataSchemaNode dataSchemaNode) {
+        super(pathStep, dataSchemaNode);
+    }
+
+    @Override
+    public final TypeDefinition<?> type() {
+        return ((TypedDataSchemaNode) dataSchemaNode()).getType();
+    }
+}
index a0b4debfd0be3eadb84bfbcf8296a0de1b2d8682..901f7cc46a9ab05bd7cb841a42d393ec91eb5a01 100644 (file)
@@ -8,10 +8,9 @@
 package org.opendaylight.yangtools.yang.data.util.impl.context;
 
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContext.SimpleValue;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 
-public final class LeafContext extends AbstractContext implements SimpleValue {
+public final class LeafContext extends AbstractValueContext {
     LeafContext(final LeafSchemaNode schema) {
         super(NodeIdentifier.create(schema.getQName()), schema);
     }
index f56076a1f1ed24787bcb6ff5eba757580ba3aca2..b3023ff46301e9341e657995845c275169170d82 100644 (file)
@@ -7,11 +7,10 @@
  */
 package org.opendaylight.yangtools.yang.data.util.impl.context;
 
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContext.SimpleValue;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
-public final class LeafListItemContext extends AbstractContext implements SimpleValue {
+public final class LeafListItemContext extends AbstractValueContext {
     LeafListItemContext(final LeafListSchemaNode schema) {
         super(null, schema);
     }
index a972c423b41946f79f5cba9513330955bfcf544b..d33894cf1a626b823fbe795ae18a7532c0ecfde9 100644 (file)
@@ -27,9 +27,8 @@ import java.util.Optional;
  *            type of the base type (YANG <code>type</code> substatement) which
  *            is included in the instance of this type
  */
-// FIXME: 8.0.0: it seems this construct is mostly used in yang-data-api/codec view of the world. Introduce a dead
-//               ringer interface at that layer, which will not have a SchemaNode implication but (perhaps) is backed
-//               by a TypedefEffectiveStatement (or TypeEffectiveStatement?)
+// FIXME: YANGTOOLS-1528: this construct is mostly used in yang-data-api/codec view of the world. Introduce a dead
+//                         ringer interface, yang.data.api.type.NormalizedType and use it in yang-data-* components.
 public interface TypeDefinition<T extends TypeDefinition<?>> extends SchemaNode {
     /**
      * Returns the base type from which this type is derived. If this is yang built-in type, returns null.