Re-implement components/schemas for actions 29/109029/11
authorYaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
Mon, 20 Nov 2023 13:36:50 +0000 (15:36 +0200)
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 actions
with new input streams approach.

JIRA: NETCONF-938
Change-Id: I90a769a81fbf5d6199fbd51db73de981eda9acd6
Signed-off-by: Yaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/SchemasStream.java

index 370e6a6e8429f1c19e5fd1b87821cb54118fc502..15203e91a05e72345d53626faf60acecc812df28 100644 (file)
@@ -20,7 +20,10 @@ import java.util.Deque;
 import java.util.Iterator;
 import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
 import org.opendaylight.restconf.openapi.model.SchemaEntity;
+import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
@@ -97,9 +100,9 @@ public final class SchemasStream extends InputStream {
         final var result = new ArrayDeque<SchemaEntity>();
         final var definitionNames = new DefinitionNames();
         final var stack = SchemaInferenceStack.of(context);
+        final var moduleName = module.getName();
         for (final var rpc : module.getRpcs()) {
             stack.enterSchemaTree(rpc.getQName());
-            final var moduleName = module.getName();
             final var rpcName = rpc.getQName().getLocalName();
             final var rpcInput = rpc.getInput();
             if (!rpcInput.getChildNodes().isEmpty()) {
@@ -116,7 +119,29 @@ public final class SchemasStream extends InputStream {
             stack.exit();
         }
 
-        // actions
+        for (final var childNode : module.getChildNodes()) {
+            stack.enterSchemaTree(childNode.getQName());
+            if (childNode instanceof ContainerSchemaNode || childNode instanceof ListSchemaNode) {
+                for (final var actionDef : ((ActionNodeContainer) childNode).getActions()) {
+                    stack.enterSchemaTree(actionDef.getQName());
+                    final var actionName = actionDef.getQName().getLocalName();
+                    final var actionInput = actionDef.getInput();
+                    if (!actionInput.getChildNodes().isEmpty()) {
+                        final var input = new SchemaEntity(actionInput, moduleName + "_" + actionName + "_input",
+                            "object", stack, moduleName, false, definitionNames);
+                        result.add(input);
+                    }
+                    final var actionOutput = actionDef.getInput();
+                    if (!actionOutput.getChildNodes().isEmpty()) {
+                        final var output = new SchemaEntity(actionOutput, moduleName + "_" + actionName + "_output",
+                            "object", stack, moduleName, false, definitionNames);
+                        result.add(output);
+                    }
+                    stack.exit();
+                }
+            }
+            stack.exit();
+        }
         // child nodes
         // etc.
         return result;