Re-implement components/schemas for RPC's childs 24/109124/17
authorMatej Sramcik <matej.sramcik@pantheon.tech>
Thu, 30 Nov 2023 08:08:35 +0000 (09:08 +0100)
committerIvan Hrasko <ivan.hrasko@pantheon.tech>
Fri, 8 Dec 2023 13:52:11 +0000 (13:52 +0000)
Re-implement logic for generating components/schemas for child
nodes of RPCs with new input streams approach.

JIRA: NETCONF-938
Change-Id: I9725d2772130d673ad0e6114df41dae568981c2e
Signed-off-by: Matej Sramcik <matej.sramcik@pantheon.tech>
Signed-off-by: lubos-cicut <lubos.cicut@pantheon.tech>
Signed-off-by: Yaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/SchemasStream.java
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/SchemaEntity.java

index 561d57310cd97a2932c81d7effbffdd448f9c538..ff3eaf1efd9dc3f568c9cc50c7daf88b7722238d 100644 (file)
@@ -16,8 +16,10 @@ import java.io.InputStreamReader;
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Deque;
 import java.util.Iterator;
+import java.util.List;
 import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
 import org.opendaylight.restconf.openapi.model.SchemaEntity;
 import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
@@ -108,20 +110,37 @@ public final class SchemasStream extends InputStream {
         final var definitionNames = new DefinitionNames();
         final var stack = SchemaInferenceStack.of(context);
         final var moduleName = module.getName();
+        final var children = new ArrayList<DataSchemaNode>();
         for (final var rpc : module.getRpcs()) {
             stack.enterSchemaTree(rpc.getQName());
             final var rpcName = rpc.getQName().getLocalName();
             final var rpcInput = rpc.getInput();
             if (!rpcInput.getChildNodes().isEmpty()) {
-                final var input = new SchemaEntity(rpcInput, moduleName + "_" + rpcName + INPUT_SUFFIX, OBJECT_TYPE,
-                    stack, moduleName, false, definitionNames, EntityType.RPC);
+                final var input = new SchemaEntity(rpcInput, moduleName + "_" + rpcName + INPUT_SUFFIX, null,
+                    OBJECT_TYPE, stack, moduleName, false, definitionNames, EntityType.RPC);
                 result.add(input);
+                stack.enterSchemaTree(rpcInput.getQName());
+                for (final var child : rpcInput.getChildNodes()) {
+                    if (!children.contains(child)) {
+                        children.add(child);
+                        processDataAndActionNodes(child, moduleName, stack, definitionNames, result, moduleName, false);
+                    }
+                }
+                stack.exit();
             }
             final var rpcOutput = rpc.getOutput();
             if (!rpcOutput.getChildNodes().isEmpty()) {
-                final var output = new SchemaEntity(rpcOutput, moduleName + "_" + rpcName + OUTPUT_SUFFIX, OBJECT_TYPE,
-                    stack, moduleName, false, definitionNames, EntityType.RPC);
+                final var output = new SchemaEntity(rpcOutput, moduleName + "_" + rpcName + OUTPUT_SUFFIX, null,
+                    OBJECT_TYPE, stack, moduleName, false, definitionNames, EntityType.RPC);
                 result.add(output);
+                stack.enterSchemaTree(rpcOutput.getQName());
+                for (final var child : rpcOutput.getChildNodes()) {
+                    if (!children.contains(child)) {
+                        children.add(child);
+                        processDataAndActionNodes(child, moduleName, stack, definitionNames, result, moduleName, false);
+                    }
+                }
+                stack.exit();
             }
             stack.exit();
         }
@@ -138,8 +157,16 @@ public final class SchemasStream extends InputStream {
             final ArrayDeque<SchemaEntity> result, final String parentName, final boolean isParentConfig) {
         if (node instanceof ContainerSchemaNode || node instanceof ListSchemaNode) {
             final var newTitle = title + "_" + node.getQName().getLocalName();
-            final var child = new SchemaEntity(node, newTitle, OBJECT_TYPE, stack, parentName, isParentConfig,
-                definitionNames, EntityType.NODE);
+            final String discriminator;
+            if (!definitionNames.isListedNode(node)) {
+                final var parentNameConfigLocalName = parentName + "_" + node.getQName().getLocalName();
+                final var names = List.of(parentNameConfigLocalName);
+                discriminator = definitionNames.pickDiscriminator(node, names);
+            } else {
+                discriminator = definitionNames.getDiscriminator(node);
+            }
+            final var child = new SchemaEntity(node, newTitle, discriminator, OBJECT_TYPE, stack, parentName,
+                isParentConfig, definitionNames, EntityType.NODE);
             final var isConfig = node.isConfiguration() && isParentConfig;
             result.add(child);
             stack.enterSchemaTree(node.getQName());
@@ -170,13 +197,13 @@ public final class SchemasStream extends InputStream {
             final var actionName = actionDef.getQName().getLocalName();
             final var actionInput = actionDef.getInput();
             if (!actionInput.getChildNodes().isEmpty()) {
-                final var input = new SchemaEntity(actionInput, title + "_" + actionName + INPUT_SUFFIX,
+                final var input = new SchemaEntity(actionInput, title + "_" + actionName + INPUT_SUFFIX, null,
                     OBJECT_TYPE, stack, parentName, false, definitionNames, EntityType.RPC);
                 result.add(input);
             }
             final var actionOutput = actionDef.getOutput();
             if (!actionOutput.getChildNodes().isEmpty()) {
-                final var output = new SchemaEntity(actionOutput, title + "_" + actionName + OUTPUT_SUFFIX,
+                final var output = new SchemaEntity(actionOutput, title + "_" + actionName + OUTPUT_SUFFIX, null,
                     OBJECT_TYPE, stack, parentName, false, definitionNames, EntityType.RPC);
                 result.add(output);
             }
index 6ed2b9724a3414cce5aded75f6915d602fa3cd76..d651560773035c4b4d12c5b21934154b9b08e7b3 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.restconf.openapi.model;
 
 import static java.util.Objects.requireNonNull;
+import static java.util.Objects.requireNonNullElse;
 import static org.opendaylight.restconf.openapi.model.PropertyEntity.isSchemaNodeMandatory;
 
 import com.fasterxml.jackson.core.JsonGenerator;
@@ -34,6 +35,7 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 public final class SchemaEntity extends OpenApiEntity {
     private final @NonNull SchemaNode value;
     private final @NonNull String title;
+    private final @NonNull String discriminator;
     private final @NonNull String type;
     private final @NonNull SchemaInferenceStack stack;
     private final boolean isParentConfig;
@@ -41,9 +43,10 @@ public final class SchemaEntity extends OpenApiEntity {
     private final @NonNull String parentName;
     private final @NonNull DefinitionNames definitionNames;
 
-    public SchemaEntity(final @NonNull SchemaNode value, final @NonNull String title, @NonNull final String type,
-            @NonNull final SchemaInferenceStack context, final String parentName, final boolean isParentConfig,
-            @NonNull final DefinitionNames definitionNames, final SchemasStream.EntityType entityType) {
+    public SchemaEntity(final @NonNull SchemaNode value, final @NonNull String title, final String discriminator,
+            @NonNull final String type, @NonNull final SchemaInferenceStack context, final String parentName,
+            final boolean isParentConfig, @NonNull final DefinitionNames definitionNames,
+            final SchemasStream.EntityType entityType) {
         this.value = requireNonNull(value);
         this.title = requireNonNull(title);
         this.type = requireNonNull(type);
@@ -52,11 +55,12 @@ public final class SchemaEntity extends OpenApiEntity {
         this.isParentConfig = isParentConfig;
         this.definitionNames = definitionNames;
         this.entityType = entityType;
+        this.discriminator = requireNonNullElse(discriminator, "");
     }
 
     @Override
     public void generate(final @NonNull JsonGenerator generator) throws IOException {
-        generator.writeObjectFieldStart(title());
+        generator.writeObjectFieldStart(title() + discriminator);
         generator.writeStringField("title", title());
         generator.writeStringField("type", type());
         final var description = description();