Eliminate SchemasStream.EntityType
[netconf.git] / restconf / restconf-openapi / src / main / java / org / opendaylight / restconf / openapi / model / SchemaEntity.java
index 3ca5c39aff210cdd7de0e1052879330665102cc7..bb1c99cf62da3f3ac9136b9922ba06a6fe01812a 100644 (file)
@@ -9,50 +9,41 @@ 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;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.restconf.openapi.impl.DefinitionNames;
-import org.opendaylight.restconf.openapi.impl.SchemasStream;
-import org.opendaylight.yangtools.yang.model.api.ContainerLike;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 /**
  * Archetype for a Schema.
  */
-public final class SchemaEntity extends OpenApiEntity {
+public abstract sealed class SchemaEntity extends OpenApiEntity permits NodeSchemaEntity, RpcSchemaEntity {
     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;
-    private final SchemasStream.EntityType entityType;
     private final @NonNull String parentName;
     private final @NonNull DefinitionNames definitionNames;
 
-    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) {
+    public SchemaEntity(final @NonNull SchemaNode value, final @NonNull String title,
+            final @Nullable String discriminator, final @NonNull String type,
+            final @NonNull SchemaInferenceStack context, final @NonNull String parentName, final boolean isParentConfig,
+            final @NonNull DefinitionNames definitionNames) {
         this.value = requireNonNull(value);
         this.title = requireNonNull(title);
         this.type = requireNonNull(type);
         this.stack = requireNonNull(context.copy());
         this.parentName = requireNonNull(parentName);
         this.isParentConfig = isParentConfig;
-        this.definitionNames = definitionNames;
-        this.entityType = entityType;
+        this.definitionNames = requireNonNull(definitionNames);
         this.discriminator = requireNonNullElse(discriminator, "");
     }
 
@@ -70,6 +61,26 @@ public final class SchemaEntity extends OpenApiEntity {
         generator.writeEndObject();
     }
 
+    protected @NonNull SchemaNode value() {
+        return value;
+    }
+
+    protected @NonNull SchemaInferenceStack stack() {
+        return stack;
+    }
+
+    protected @NonNull DefinitionNames definitionNames() {
+        return definitionNames;
+    }
+
+    protected boolean isParentConfig() {
+        return isParentConfig;
+    }
+
+    protected @NonNull String parentName() {
+        return parentName;
+    }
+
     private @NonNull String title() {
         return title;
     }
@@ -82,7 +93,7 @@ public final class SchemaEntity extends OpenApiEntity {
         return value.getDescription().orElse(null);
     }
 
-    private void generateRequired(final @NonNull JsonGenerator generator, final List<String> required)
+    protected void generateRequired(final @NonNull JsonGenerator generator, final List<String> required)
             throws IOException {
         if (!required.isEmpty()) {
             generator.writeArrayFieldStart("required");
@@ -93,42 +104,18 @@ public final class SchemaEntity extends OpenApiEntity {
         }
     }
 
-    private void generateProperties(final @NonNull JsonGenerator generator) throws IOException {
+    private void generateProperties(@NonNull JsonGenerator generator) throws IOException {
         final var required = new ArrayList<String>();
         generator.writeObjectFieldStart("properties");
-        stack.enterSchemaTree(value.getQName());
-        switch (entityType) {
-            case RPC:
-                for (final var childNode : ((ContainerLike) value).getChildNodes()) {
-                    new PropertyEntity(childNode, generator, stack, required, parentName, isParentConfig,
-                        definitionNames);
-                }
-                break;
-            default:
-                final var childNodes = new HashMap<String, DataSchemaNode>();
-                for (final var childNode : ((DataNodeContainer) value).getChildNodes()) {
-                    childNodes.put(childNode.getQName().getLocalName(), childNode);
-                }
-                for (final var childNode : childNodes.values()) {
-                    if (shouldBeAddedAsProperty(childNode)) {
-                        new PropertyEntity(childNode, generator, stack, required, parentName + "_"
-                            + value.getQName().getLocalName(), ((DataSchemaNode) value).isConfiguration(),
-                            definitionNames);
-                    }
-                }
-        }
-        stack.exit();
+        stack().enterSchemaTree(value().getQName());
+        generateProperties(generator, required);
+        stack().exit();
         generator.writeEndObject();
         generateRequired(generator, required);
     }
 
-    private boolean shouldBeAddedAsProperty(final DataSchemaNode childNode) {
-        if (childNode instanceof ContainerSchemaNode) {
-            return childNode.isConfiguration() || isSchemaNodeMandatory(childNode)
-                || !((DataSchemaNode) value).isConfiguration();
-        }
-        return childNode.isConfiguration() || !((DataSchemaNode) value).isConfiguration();
-    }
+    abstract void generateProperties(@NonNull JsonGenerator generator, @NonNull List<String> required)
+        throws IOException;
 
     private void generateXml(final @NonNull JsonGenerator generator) throws IOException {
         generator.writeObjectFieldStart("xml");