import java.util.Iterator;
import java.util.List;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
+import org.opendaylight.restconf.openapi.model.NodeSchemaEntity;
+import org.opendaylight.restconf.openapi.model.RpcSchemaEntity;
import org.opendaylight.restconf.openapi.model.SchemaEntity;
import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
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, null,
- OBJECT_TYPE, stack, moduleName, false, definitionNames, EntityType.RPC);
+ final var input = new RpcSchemaEntity(rpcInput, moduleName + "_" + rpcName + INPUT_SUFFIX, null,
+ OBJECT_TYPE, stack, moduleName, false, definitionNames);
result.add(input);
stack.enterSchemaTree(rpcInput.getQName());
for (final var child : rpcInput.getChildNodes()) {
}
final var rpcOutput = rpc.getOutput();
if (!rpcOutput.getChildNodes().isEmpty()) {
- final var output = new SchemaEntity(rpcOutput, moduleName + "_" + rpcName + OUTPUT_SUFFIX, null,
- OBJECT_TYPE, stack, moduleName, false, definitionNames, EntityType.RPC);
+ final var output = new RpcSchemaEntity(rpcOutput, moduleName + "_" + rpcName + OUTPUT_SUFFIX, null,
+ OBJECT_TYPE, stack, moduleName, false, definitionNames);
result.add(output);
stack.enterSchemaTree(rpcOutput.getQName());
for (final var child : rpcOutput.getChildNodes()) {
} else {
discriminator = definitionNames.getDiscriminator(node);
}
- final var child = new SchemaEntity(node, newTitle, discriminator, OBJECT_TYPE, stack, parentName,
- isParentConfig, definitionNames, EntityType.NODE);
+ final var child = new NodeSchemaEntity(node, newTitle, discriminator, OBJECT_TYPE, stack, parentName,
+ isParentConfig, definitionNames);
final var isConfig = node.isConfiguration() && isParentConfig;
result.add(child);
stack.enterSchemaTree(node.getQName());
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, null,
- OBJECT_TYPE, stack, parentName, false, definitionNames, EntityType.RPC);
+ final var input = new RpcSchemaEntity(actionInput, title + "_" + actionName + INPUT_SUFFIX, null,
+ OBJECT_TYPE, stack, parentName, false, definitionNames);
result.add(input);
}
final var actionOutput = actionDef.getOutput();
if (!actionOutput.getChildNodes().isEmpty()) {
- final var output = new SchemaEntity(actionOutput, title + "_" + actionName + OUTPUT_SUFFIX, null,
- OBJECT_TYPE, stack, parentName, false, definitionNames, EntityType.RPC);
+ final var output = new RpcSchemaEntity(actionOutput, title + "_" + actionName + OUTPUT_SUFFIX, null,
+ OBJECT_TYPE, stack, parentName, false, definitionNames);
result.add(output);
}
stack.exit();
}
}
-
- public enum EntityType {
- NODE,
- RPC
- }
}
--- /dev/null
+/*
+ * Copyright (c) 2024 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.restconf.openapi.model;
+
+import static org.opendaylight.restconf.openapi.model.PropertyEntity.isSchemaNodeMandatory;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import java.io.IOException;
+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.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;
+
+public final class NodeSchemaEntity extends SchemaEntity {
+
+ public NodeSchemaEntity(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) {
+ super(value, title, discriminator, type, context, parentName, isParentConfig, definitionNames);
+ }
+
+ @Override
+ void generateProperties(final @NonNull JsonGenerator generator, final @NonNull List<String> required)
+ throws IOException {
+ final var childNodes = new HashMap<String, DataSchemaNode>();
+ for (final var childNode : ((DataNodeContainer) value()).getChildNodes()) {
+ childNodes.put(childNode.getQName().getLocalName(), childNode);
+ }
+ final boolean isValueConfig = ((DataSchemaNode) value()).isConfiguration();
+ for (final var childNode : childNodes.values()) {
+ if (shouldBeAddedAsProperty(childNode, isValueConfig)) {
+ new PropertyEntity(childNode, generator, stack(), required, parentName() + "_"
+ + value().getQName().getLocalName(), isValueConfig, definitionNames());
+ }
+ }
+ }
+
+ private static boolean shouldBeAddedAsProperty(final DataSchemaNode childNode, final boolean isValueConfig) {
+ final boolean isChildNodeConfig = childNode.isConfiguration();
+ if (childNode instanceof ContainerSchemaNode) {
+ return isChildNodeConfig || isSchemaNodeMandatory(childNode) || !isValueConfig;
+ }
+ return isChildNodeConfig || !isValueConfig;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 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.restconf.openapi.model;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import java.io.IOException;
+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.yangtools.yang.model.api.ContainerLike;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
+
+public final class RpcSchemaEntity extends SchemaEntity {
+
+ public RpcSchemaEntity(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) {
+ super(value, title, discriminator, type, context, parentName, isParentConfig, definitionNames);
+ }
+
+ @Override
+ void generateProperties(final @NonNull JsonGenerator generator, final @NonNull List<String> required)
+ throws IOException {
+ for (final var childNode : ((ContainerLike) value()).getChildNodes()) {
+ new PropertyEntity(childNode, generator, stack(), required, parentName(), isParentConfig(),
+ definitionNames());
+ }
+ }
+}
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, "");
}
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;
}
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");
}
}
- 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");