// Query parameter
private static final String PAGE_NUM = "pageNum";
- public enum OAversion { V2_0, V3_0 }
-
private final MountPointSwagger mountPointSwaggerRFC8040;
private final ApiDocGeneratorRFC8040 apiDocGeneratorRFC8040;
@Override
public synchronized Response getAllModulesDoc(final UriInfo uriInfo) {
- final OAversion oaversion = identifyOpenApiVersion(uriInfo);
final DefinitionNames definitionNames = new DefinitionNames();
- final SwaggerObject doc = apiDocGeneratorRFC8040.getAllModulesDoc(uriInfo, definitionNames, oaversion);
+ final SwaggerObject doc = apiDocGeneratorRFC8040.getAllModulesDoc(uriInfo, definitionNames);
- return Response.ok(BaseYangSwaggerGenerator.getAppropriateDoc(doc, oaversion)).build();
+ return Response.ok(BaseYangSwaggerGenerator.convertToOpenApi(doc)).build();
}
/**
@Override
public synchronized Response getDocByModule(final String module, final String revision, final UriInfo uriInfo) {
return Response.ok(
- apiDocGeneratorRFC8040.getApiDeclaration(module, revision, uriInfo, identifyOpenApiVersion(uriInfo)))
+ apiDocGeneratorRFC8040.getApiDeclaration(module, revision, uriInfo))
.build();
}
@Override
public synchronized Response getMountDocByModule(final String instanceNum, final String module,
final String revision, final UriInfo uriInfo) {
- final OAversion oaversion = identifyOpenApiVersion(uriInfo);
final CommonApiObject api = mountPointSwaggerRFC8040.getMountPointApi(uriInfo, Long.parseLong(instanceNum),
- module, revision, oaversion);
+ module, revision);
return Response.ok(api).build();
}
@Override
public synchronized Response getMountDoc(final String instanceNum, final UriInfo uriInfo) {
final CommonApiObject api;
- final OAversion oaversion = identifyOpenApiVersion(uriInfo);
final String stringPageNum = uriInfo.getQueryParameters().getFirst(PAGE_NUM);
final Optional<Integer> pageNum = stringPageNum != null ? Optional.of(Integer.valueOf(stringPageNum))
: Optional.empty();
- api = mountPointSwaggerRFC8040.getMountPointApi(uriInfo, Long.parseLong(instanceNum), pageNum, oaversion);
+ api = mountPointSwaggerRFC8040.getMountPointApi(uriInfo, Long.parseLong(instanceNum), pageNum);
return Response.ok(api).build();
}
-
- private static OAversion identifyOpenApiVersion(final UriInfo uriInfo) {
- if (uriInfo.getBaseUri().toString().contains("/swagger2/")) {
- return OAversion.V2_0;
- }
- return OAversion.V3_0;
- }
}
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
import org.opendaylight.netconf.sal.rest.doc.swagger.CommonApiObject;
import org.opendaylight.netconf.sal.rest.doc.swagger.Components;
import org.opendaylight.netconf.sal.rest.doc.swagger.Info;
this.schemaService = schemaService.orElse(null);
}
- public SwaggerObject getAllModulesDoc(final UriInfo uriInfo, final DefinitionNames definitionNames,
- final OAversion oaversion) {
+ public SwaggerObject getAllModulesDoc(final UriInfo uriInfo, final DefinitionNames definitionNames) {
final EffectiveModelContext schemaContext = schemaService.getGlobalContext();
Preconditions.checkState(schemaContext != null);
- return getAllModulesDoc(uriInfo, Optional.empty(), schemaContext, Optional.empty(), "", definitionNames,
- oaversion);
+ return getAllModulesDoc(uriInfo, Optional.empty(), schemaContext, Optional.empty(), "", definitionNames);
}
public SwaggerObject getAllModulesDoc(final UriInfo uriInfo, final Optional<Range<Integer>> range,
final EffectiveModelContext schemaContext, final Optional<String> deviceName, final String context,
- final DefinitionNames definitionNames, final OAversion oaversion) {
+ final DefinitionNames definitionNames) {
final String schema = createSchemaFromUriInfo(uriInfo);
final String host = createHostFromUriInfo(uriInfo);
String name = "Controller";
doc.setDefinitions(JsonNodeFactory.instance.objectNode());
doc.setPaths(JsonNodeFactory.instance.objectNode());
- fillDoc(doc, range, schemaContext, context, deviceName, oaversion, definitionNames);
+ fillDoc(doc, range, schemaContext, context, deviceName, definitionNames);
return doc;
}
public void fillDoc(final SwaggerObject doc, final Optional<Range<Integer>> range,
- final EffectiveModelContext schemaContext, final String context, final Optional<String> deviceName,
- final OAversion oaversion, final DefinitionNames definitionNames) {
+ final EffectiveModelContext schemaContext, final String context, final Optional<String> deviceName,
+ final DefinitionNames definitionNames) {
final SortedSet<Module> modules = getSortedModules(schemaContext);
final Set<Module> filteredModules;
if (range.isPresent()) {
LOG.debug("Working on [{},{}]...", module.getName(), revisionString);
- getSwaggerDocSpec(module, context, deviceName, schemaContext, oaversion, definitionNames, doc, false);
+ getSwaggerDocSpec(module, context, deviceName, schemaContext, definitionNames, doc, false);
}
}
}
}
- public CommonApiObject getApiDeclaration(final String module, final String revision, final UriInfo uriInfo,
- final OAversion oaversion) {
+ public CommonApiObject getApiDeclaration(final String module, final String revision, final UriInfo uriInfo) {
final EffectiveModelContext schemaContext = schemaService.getGlobalContext();
Preconditions.checkState(schemaContext != null);
- final SwaggerObject doc = getApiDeclaration(module, revision, uriInfo, schemaContext, "", oaversion);
- return getAppropriateDoc(doc, oaversion);
+ final SwaggerObject doc = getApiDeclaration(module, revision, uriInfo, schemaContext, "");
+ return convertToOpenApi(doc);
}
public SwaggerObject getApiDeclaration(final String moduleName, final String revision, final UriInfo uriInfo,
- final EffectiveModelContext schemaContext, final String context, final OAversion oaversion) {
+ final EffectiveModelContext schemaContext, final String context) {
final Optional<Revision> rev;
try {
Preconditions.checkArgument(module != null,
"Could not find module by name,revision: " + moduleName + "," + revision);
- return getApiDeclaration(module, uriInfo, context, schemaContext, oaversion);
+ return getApiDeclaration(module, uriInfo, context, schemaContext);
}
public SwaggerObject getApiDeclaration(final Module module, final UriInfo uriInfo, final String context,
- final EffectiveModelContext schemaContext, final OAversion oaversion) {
+ final EffectiveModelContext schemaContext) {
final String schema = createSchemaFromUriInfo(uriInfo);
final String host = createHostFromUriInfo(uriInfo);
- return getSwaggerDocSpec(module, schema, host, BASE_PATH, context, schemaContext, oaversion);
+ return getSwaggerDocSpec(module, schema, host, BASE_PATH, context, schemaContext);
}
public String createHostFromUriInfo(final UriInfo uriInfo) {
}
public SwaggerObject getSwaggerDocSpec(final Module module, final String schema, final String host,
- final String basePath, final String context, final EffectiveModelContext schemaContext,
- final OAversion oaversion) {
+ final String basePath, final String context, final EffectiveModelContext schemaContext) {
final SwaggerObject doc = createSwaggerObject(schema, host, basePath, module.getName());
final DefinitionNames definitionNames = new DefinitionNames();
- return getSwaggerDocSpec(module, context, Optional.empty(), schemaContext, oaversion, definitionNames, doc,
- true);
+ return getSwaggerDocSpec(module, context, Optional.empty(), schemaContext, definitionNames, doc, true);
}
public SwaggerObject getSwaggerDocSpec(final Module module, final String context, final Optional<String> deviceName,
- final EffectiveModelContext schemaContext, final OAversion oaversion, final DefinitionNames definitionNames,
- final SwaggerObject doc, final boolean isForSingleModule) {
+ final EffectiveModelContext schemaContext, final DefinitionNames definitionNames, final SwaggerObject doc,
+ final boolean isForSingleModule) {
final ObjectNode definitions;
try {
if (isForSingleModule) {
- definitions = jsonConverter.convertToJsonSchema(module, schemaContext, definitionNames, oaversion,
- true);
+ definitions = jsonConverter.convertToJsonSchema(module, schemaContext, definitionNames, true);
doc.setDefinitions(definitions);
} else {
- definitions = jsonConverter.convertToJsonSchema(module, schemaContext, definitionNames, oaversion,
- false);
+ definitions = jsonConverter.convertToJsonSchema(module, schemaContext, definitionNames, false);
addFields(doc.getDefinitions(), definitions.fields());
}
if (LOG.isDebugEnabled()) {
*/
if (isForSingleModule && !hasAddRootPostLink) {
LOG.debug("Has added root post link for module {}", module.getName());
- addRootPostLink(module, deviceName, pathParams, resourcePath, paths, oaversion);
+ addRootPostLink(module, deviceName, pathParams, resourcePath, paths);
hasAddRootPostLink = true;
}
- final String resolvedPath = resourcePath + "/" + createPath(node, pathParams, oaversion, localName);
+ final String resolvedPath = resourcePath + "/" + createPath(node, pathParams, localName);
addPaths(node, deviceName, moduleName, paths, pathParams, schemaContext, true, module.getName(),
- definitionNames, oaversion, resolvedPath);
+ definitionNames, resolvedPath);
}
pathParams = JsonNodeFactory.instance.arrayNode();
resourcePath = getResourcePath("operational", context);
if (!node.isConfiguration()) {
- final String resolvedPath = resourcePath + "/" + createPath(node, pathParams, oaversion, localName);
+ final String resolvedPath = resourcePath + "/" + createPath(node, pathParams, localName);
addPaths(node, deviceName, moduleName, paths, pathParams, schemaContext, false, moduleName,
- definitionNames, oaversion, resolvedPath);
+ definitionNames, resolvedPath);
}
}
}
for (final RpcDefinition rpcDefinition : module.getRpcs()) {
final String resolvedPath = getResourcePath("operations", context) + "/" + moduleName + ":"
+ rpcDefinition.getQName().getLocalName();
- addOperations(rpcDefinition, moduleName, deviceName, paths, module.getName(), definitionNames, oaversion,
- resolvedPath);
+ addOperations(rpcDefinition, moduleName, deviceName, paths, module.getName(), definitionNames,
+ resolvedPath);
}
LOG.debug("Number of Paths found [{}]", paths.size());
}
private static void addRootPostLink(final Module module, final Optional<String> deviceName,
- final ArrayNode pathParams, final String resourcePath, final ObjectNode paths, final OAversion oaversion) {
+ final ArrayNode pathParams, final String resourcePath, final ObjectNode paths) {
if (containsListOrContainer(module.getChildNodes())) {
final ObjectNode post = JsonNodeFactory.instance.objectNode();
final String moduleName = module.getName();
final String name = moduleName + MODULE_NAME_SUFFIX;
post.set("post", buildPost("", name, "", moduleName, deviceName,
- module.getDescription().orElse(""), pathParams, oaversion));
+ module.getDescription().orElse(""), pathParams));
paths.set(resourcePath, post);
}
}
return doc;
}
- public static CommonApiObject getAppropriateDoc(final SwaggerObject swaggerObject, final OAversion oaversion) {
- if (oaversion.equals(OAversion.V3_0)) {
- return convertToOpenApi(swaggerObject);
- }
- return swaggerObject;
- }
-
- private static OpenApiObject convertToOpenApi(final SwaggerObject swaggerObject) {
+ public static OpenApiObject convertToOpenApi(final SwaggerObject swaggerObject) {
final OpenApiObject doc = new OpenApiObject();
doc.setOpenapi(OPEN_API_VERSION);
doc.setInfo(swaggerObject.getInfo());
private void addPaths(final DataSchemaNode node, final Optional<String> deviceName, final String moduleName,
final ObjectNode paths, final ArrayNode parentPathParams, final EffectiveModelContext schemaContext,
final boolean isConfig, final String parentName, final DefinitionNames definitionNames,
- final OAversion oaversion, final String resourcePath) {
+ final String resourcePath) {
LOG.debug("Adding path: [{}]", resourcePath);
final ArrayNode pathParams = JsonUtil.copy(parentPathParams);
}
final ObjectNode path = JsonNodeFactory.instance.objectNode();
- path.setAll(operations(node, moduleName, deviceName, pathParams, isConfig, parentName, definitionNames,
- oaversion));
+ path.setAll(operations(node, moduleName, deviceName, pathParams, isConfig, parentName, definitionNames));
paths.set(resourcePath, path);
if (node instanceof ActionNodeContainer) {
((ActionNodeContainer) node).getActions().forEach(actionDef -> {
final String resolvedPath = "rests/operations" + resourcePath.substring(11)
+ "/" + resolvePathArgumentsName(actionDef.getQName(), node.getQName(), schemaContext);
- addOperations(actionDef, moduleName, deviceName, paths, parentName, definitionNames, oaversion,
- resolvedPath);
+ addOperations(actionDef, moduleName, deviceName, paths, parentName, definitionNames, resolvedPath);
});
}
if (childNode instanceof ListSchemaNode || childNode instanceof ContainerSchemaNode) {
final String newParent = parentName + "_" + node.getQName().getLocalName();
final String localName = resolvePathArgumentsName(childNode.getQName(), node.getQName(), schemaContext);
- final String newResourcePath = resourcePath + "/" + createPath(childNode, pathParams, oaversion,
- localName);
+ final String newResourcePath = resourcePath + "/" + createPath(childNode, pathParams, localName);
final boolean newIsConfig = isConfig && childNode.isConfiguration();
addPaths(childNode, deviceName, moduleName, paths, pathParams, schemaContext,
- newIsConfig, newParent, definitionNames, oaversion, newResourcePath);
+ newIsConfig, newParent, definitionNames, newResourcePath);
}
}
}
private static Map<String, ObjectNode> operations(final DataSchemaNode node, final String moduleName,
final Optional<String> deviceName, final ArrayNode pathParams, final boolean isConfig,
- final String parentName, final DefinitionNames definitionNames, final OAversion oaversion) {
+ final String parentName, final DefinitionNames definitionNames) {
final Map<String, ObjectNode> operations = new HashMap<>();
final String discriminator = definitionNames.getDiscriminator(node);
final String nodeName = node.getQName().getLocalName();
final String defName = parentName + "_" + nodeName + TOP + discriminator;
- final ObjectNode get = buildGet(node, moduleName, deviceName, pathParams, defName, isConfig, oaversion);
+ final ObjectNode get = buildGet(node, moduleName, deviceName, pathParams, defName, isConfig);
operations.put("get", get);
if (isConfig) {
final ObjectNode put = buildPut(parentName, nodeName, discriminator, moduleName, deviceName,
- node.getDescription().orElse(""), pathParams, oaversion);
+ node.getDescription().orElse(""), pathParams);
operations.put("put", put);
final ObjectNode patch = buildPatch(parentName, nodeName, moduleName, deviceName,
- node.getDescription().orElse(""), pathParams, oaversion);
+ node.getDescription().orElse(""), pathParams);
operations.put("patch", patch);
- final ObjectNode delete = buildDelete(node, moduleName, deviceName, pathParams, oaversion);
+ final ObjectNode delete = buildDelete(node, moduleName, deviceName, pathParams);
operations.put("delete", delete);
operations.put("post", buildPost(parentName, nodeName, discriminator, moduleName, deviceName,
- node.getDescription().orElse(""), pathParams, oaversion));
+ node.getDescription().orElse(""), pathParams));
}
return operations;
}
protected abstract ListPathBuilder newListPathBuilder();
- private String createPath(final DataSchemaNode schemaNode, final ArrayNode pathParams,
- final OAversion oaversion, final String localName) {
+ private String createPath(final DataSchemaNode schemaNode, final ArrayNode pathParams, final String localName) {
final StringBuilder path = new StringBuilder();
path.append(localName);
((DataNodeContainer) schemaNode).findDataChildByName(listKey).flatMap(DataSchemaNode::getDescription)
.ifPresent(desc -> pathParam.put("description", desc));
- final ObjectNode typeParent = getTypeParentNode(pathParam, oaversion);
+ final ObjectNode typeParent = getTypeParentNode(pathParam);
typeParent.put("type", "string");
pathParam.put("in", "path");
private static void addOperations(final OperationDefinition operDef, final String moduleName,
final Optional<String> deviceName, final ObjectNode paths, final String parentName,
- final DefinitionNames definitionNames, final OAversion oaversion, final String resourcePath) {
+ final DefinitionNames definitionNames, final String resourcePath) {
final ObjectNode operations = JsonNodeFactory.instance.objectNode();
- operations.set("post", buildPostOperation(operDef, moduleName, deviceName, parentName, definitionNames,
- oaversion));
+ operations.set("post", buildPostOperation(operDef, moduleName, deviceName, parentName, definitionNames));
paths.set(resourcePath, operations);
}
package org.opendaylight.netconf.sal.rest.doc.impl;
import static org.opendaylight.netconf.sal.rest.doc.impl.BaseYangSwaggerGenerator.MODULE_NAME_SUFFIX;
+import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.COMPONENTS_PREFIX;
import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.CONFIG;
import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.NAME_KEY;
import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.POST_SUFFIX;
import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.TOP;
import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.XML_KEY;
import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.XML_SUFFIX;
-import static org.opendaylight.netconf.sal.rest.doc.model.builder.OperationBuilder.getAppropriateModelPrefix;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
import org.opendaylight.yangtools.yang.common.Decimal64;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
public ObjectNode convertToJsonSchema(final Module module, final EffectiveModelContext schemaContext,
- final ObjectNode definitions, final DefinitionNames definitionNames, final OAversion oaversion,
- final boolean isForSingleModule) throws IOException {
+ final ObjectNode definitions, final DefinitionNames definitionNames, final boolean isForSingleModule)
+ throws IOException {
topLevelModule = module;
processIdentities(module, definitions, definitionNames, schemaContext);
- processContainersAndLists(module, definitions, definitionNames, schemaContext, oaversion);
- processRPCs(module, definitions, definitionNames, schemaContext, oaversion);
+ processContainersAndLists(module, definitions, definitionNames, schemaContext);
+ processRPCs(module, definitions, definitionNames, schemaContext);
if (isForSingleModule) {
- processModule(module, definitions, definitionNames, schemaContext, oaversion);
+ processModule(module, definitions, definitionNames, schemaContext);
}
return definitions;
}
public ObjectNode convertToJsonSchema(final Module module, final EffectiveModelContext schemaContext,
- final DefinitionNames definitionNames, final OAversion oaversion, final boolean isForSingleModule)
+ final DefinitionNames definitionNames, final boolean isForSingleModule)
throws IOException {
final ObjectNode definitions = JsonNodeFactory.instance.objectNode();
if (isForSingleModule) {
definitionNames.addUnlinkedName(module.getName() + MODULE_NAME_SUFFIX);
}
- return convertToJsonSchema(module, schemaContext, definitions, definitionNames, oaversion, isForSingleModule);
+ return convertToJsonSchema(module, schemaContext, definitions, definitionNames, isForSingleModule);
}
private void processModule(final Module module, final ObjectNode definitions, final DefinitionNames definitionNames,
- final EffectiveModelContext schemaContext, final OAversion oaversion) {
+ final EffectiveModelContext schemaContext) {
final ObjectNode definition = JsonNodeFactory.instance.objectNode();
final ObjectNode properties = JsonNodeFactory.instance.objectNode();
final ArrayNode required = JsonNodeFactory.instance.arrayNode();
for (final DataSchemaNode childNode : ((DataNodeContainer) node).getChildNodes()) {
final ObjectNode childNodeProperties = JsonNodeFactory.instance.objectNode();
- final String ref = getAppropriateModelPrefix(oaversion)
+ final String ref = COMPONENTS_PREFIX
+ moduleName + CONFIG
+ "_" + localName
+ definitionNames.getDiscriminator(node);
of processLeafNode).
*/
processLeafNode((LeafSchemaNode) node, localName, properties, required, stack,
- definitions, definitionNames, oaversion);
+ definitions, definitionNames);
}
}
stack.exit();
}
private void processContainersAndLists(final Module module, final ObjectNode definitions,
- final DefinitionNames definitionNames, final EffectiveModelContext schemaContext,
- final OAversion oaversion) throws IOException {
+ final DefinitionNames definitionNames, final EffectiveModelContext schemaContext) throws IOException {
final String moduleName = module.getName();
final SchemaInferenceStack stack = SchemaInferenceStack.of(schemaContext);
for (final DataSchemaNode childNode : module.getChildNodes()) {
if (childNode instanceof ContainerSchemaNode || childNode instanceof ListSchemaNode) {
if (childNode.isConfiguration()) {
processDataNodeContainer((DataNodeContainer) childNode, moduleName, definitions, definitionNames,
- true, stack, oaversion);
+ true, stack);
}
processDataNodeContainer((DataNodeContainer) childNode, moduleName, definitions, definitionNames,
- false, stack, oaversion);
- processActionNodeContainer(childNode, moduleName, definitions, definitionNames, stack, oaversion);
+ false, stack);
+ processActionNodeContainer(childNode, moduleName, definitions, definitionNames, stack);
}
stack.exit();
}
}
private void processActionNodeContainer(final DataSchemaNode childNode, final String moduleName,
- final ObjectNode definitions, final DefinitionNames definitionNames, final SchemaInferenceStack stack,
- final OAversion oaversion) throws IOException {
+ final ObjectNode definitions, final DefinitionNames definitionNames, final SchemaInferenceStack stack)
+ throws IOException {
for (final ActionDefinition actionDef : ((ActionNodeContainer) childNode).getActions()) {
stack.enterSchemaTree(actionDef.getQName());
- processOperations(actionDef, moduleName, definitions, definitionNames, stack, oaversion);
+ processOperations(actionDef, moduleName, definitions, definitionNames, stack);
stack.exit();
}
}
private void processRPCs(final Module module, final ObjectNode definitions, final DefinitionNames definitionNames,
- final EffectiveModelContext schemaContext, final OAversion oaversion) throws IOException {
+ final EffectiveModelContext schemaContext) throws IOException {
final String moduleName = module.getName();
final SchemaInferenceStack stack = SchemaInferenceStack.of(schemaContext);
for (final RpcDefinition rpcDefinition : module.getRpcs()) {
stack.enterSchemaTree(rpcDefinition.getQName());
- processOperations(rpcDefinition, moduleName, definitions, definitionNames, stack, oaversion);
+ processOperations(rpcDefinition, moduleName, definitions, definitionNames, stack);
stack.exit();
}
}
private void processOperations(final OperationDefinition operationDef, final String parentName,
- final ObjectNode definitions, final DefinitionNames definitionNames,
- final SchemaInferenceStack stack, final OAversion oaversion) throws IOException {
+ final ObjectNode definitions, final DefinitionNames definitionNames, final SchemaInferenceStack stack)
+ throws IOException {
final String operationName = operationDef.getQName().getLocalName();
processOperationInputOutput(operationDef.getInput(), operationName, parentName, true, definitions,
- definitionNames, stack, oaversion);
+ definitionNames, stack);
processOperationInputOutput(operationDef.getOutput(), operationName, parentName, false, definitions,
- definitionNames, stack, oaversion);
+ definitionNames, stack);
}
private void processOperationInputOutput(final ContainerLike container, final String operationName,
final String parentName, final boolean isInput, final ObjectNode definitions,
- final DefinitionNames definitionNames, final SchemaInferenceStack stack, final OAversion oaversion)
+ final DefinitionNames definitionNames, final SchemaInferenceStack stack)
throws IOException {
stack.enterSchemaTree(container.getQName());
if (!container.getChildNodes().isEmpty()) {
final String filename = parentName + "_" + operationName + (isInput ? INPUT_SUFFIX : OUTPUT_SUFFIX);
final ObjectNode childSchema = JsonNodeFactory.instance.objectNode();
processChildren(childSchema, container.getChildNodes(), parentName, definitions, definitionNames,
- false, stack, oaversion);
+ false, stack);
childSchema.put(TYPE_KEY, OBJECT_TYPE);
final ObjectNode xml = JsonNodeFactory.instance.objectNode();
definitionNames.pickDiscriminator(container, List.of(filename, filename + TOP));
definitions.set(filename + discriminator, childSchema);
- processTopData(filename, discriminator, definitions, container, oaversion);
+ processTopData(filename, discriminator, definitions, container);
}
stack.exit();
}
private static ObjectNode processTopData(final String filename, final String discriminator,
- final ObjectNode definitions, final SchemaNode schemaNode, final OAversion oaversion) {
+ final ObjectNode definitions, final SchemaNode schemaNode) {
final ObjectNode dataNodeProperties = JsonNodeFactory.instance.objectNode();
final String name = filename + discriminator;
- final String ref = getAppropriateModelPrefix(oaversion) + name;
+ final String ref = COMPONENTS_PREFIX + name;
final String topName = filename + TOP;
if (schemaNode instanceof ListSchemaNode) {
private ObjectNode processDataNodeContainer(final DataNodeContainer dataNode, final String parentName,
final ObjectNode definitions, final DefinitionNames definitionNames, final boolean isConfig,
- final SchemaInferenceStack stack, final OAversion oaversion) throws IOException {
+ final SchemaInferenceStack stack) throws IOException {
if (dataNode instanceof ListSchemaNode || dataNode instanceof ContainerSchemaNode) {
final Collection<? extends DataSchemaNode> containerChildren = dataNode.getChildNodes();
final SchemaNode schemaNode = (SchemaNode) dataNode;
final String nameAsParent = parentName + "_" + localName;
final ObjectNode properties =
processChildren(childSchema, containerChildren, parentName + "_" + localName, definitions,
- definitionNames, isConfig, stack, oaversion);
+ definitionNames, isConfig, stack);
final String nodeName = parentName + (isConfig ? CONFIG : "") + "_" + localName;
final String postNodeName = parentName + CONFIG + "_" + localName + POST_SUFFIX;
definitions.set(truePostNodeName, postSchema);
final ObjectNode postXmlSchema = JsonNodeFactory.instance.objectNode();
- postXmlSchema.put(REF_KEY, getAppropriateModelPrefix(oaversion) + truePostNodeName);
+ postXmlSchema.put(REF_KEY, COMPONENTS_PREFIX + truePostNodeName);
definitions.set(postXmlNodeName + discriminator, postXmlSchema);
}
childSchema.set(XML_KEY, buildXmlParameter(schemaNode));
definitions.set(defName, childSchema);
- return processTopData(nodeName, discriminator, definitions, schemaNode, oaversion);
+ return processTopData(nodeName, discriminator, definitions, schemaNode);
}
return null;
}
*/
private ObjectNode processChildren(final ObjectNode parentNode, final Collection<? extends DataSchemaNode> nodes,
final String parentName, final ObjectNode definitions, final DefinitionNames definitionNames,
- final boolean isConfig, final SchemaInferenceStack stack, final OAversion oaversion) throws IOException {
+ final boolean isConfig, final SchemaInferenceStack stack) throws IOException {
final ObjectNode properties = JsonNodeFactory.instance.objectNode();
final ArrayNode required = JsonNodeFactory.instance.arrayNode();
for (final DataSchemaNode node : nodes) {
if (!isConfig || node.isConfiguration()) {
- processChildNode(node, parentName, definitions, definitionNames, isConfig, stack, properties,
- oaversion);
+ processChildNode(node, parentName, definitions, definitionNames, isConfig, stack, properties);
}
}
parentNode.set(PROPERTIES_KEY, properties);
private void processChildNode(final DataSchemaNode node, final String parentName, final ObjectNode definitions,
final DefinitionNames definitionNames, final boolean isConfig, final SchemaInferenceStack stack,
- final ObjectNode properties, final OAversion oaversion) throws IOException {
+ final ObjectNode properties) throws IOException {
stack.enterSchemaTree(node.getQName());
if (node instanceof LeafSchemaNode leaf) {
processLeafNode(leaf, name, properties, JsonNodeFactory.instance.arrayNode(), stack, definitions,
- definitionNames, oaversion);
+ definitionNames);
} else if (node instanceof AnyxmlSchemaNode anyxml) {
processAnyXMLNode(anyxml, name, properties, JsonNodeFactory.instance.arrayNode());
final ObjectNode property;
if (node instanceof ListSchemaNode || node instanceof ContainerSchemaNode) {
property = processDataNodeContainer((DataNodeContainer) node, parentName, definitions,
- definitionNames, isConfig, stack, oaversion);
+ definitionNames, isConfig, stack);
if (!isConfig) {
- processActionNodeContainer(node, parentName, definitions, definitionNames, stack, oaversion);
+ processActionNodeContainer(node, parentName, definitions, definitionNames, stack);
}
} else if (node instanceof LeafListSchemaNode leafList) {
- property = processLeafListNode(leafList, stack, definitions, definitionNames, oaversion);
+ property = processLeafListNode(leafList, stack, definitions, definitionNames);
} else if (node instanceof ChoiceSchemaNode choice) {
if (!choice.getCases().isEmpty()) {
stack.enterSchemaTree(caseSchemaNode.getQName());
for (final DataSchemaNode childNode : caseSchemaNode.getChildNodes()) {
processChildNode(childNode, parentName, definitions, definitionNames, isConfig, stack,
- properties, oaversion);
+ properties);
}
stack.exit();
}
}
private ObjectNode processLeafListNode(final LeafListSchemaNode listNode, final SchemaInferenceStack stack,
- final ObjectNode definitions, final DefinitionNames definitionNames, final OAversion oaversion) {
+ final ObjectNode definitions, final DefinitionNames definitionNames) {
final ObjectNode props = JsonNodeFactory.instance.objectNode();
props.put(TYPE_KEY, ARRAY_TYPE);
final Optional<ElementCountConstraint> optConstraint = listNode.getElementCountConstraint();
processElementCount(optConstraint, props);
- processTypeDef(listNode.getType(), listNode, itemsVal, stack, definitions, definitionNames, oaversion);
+ processTypeDef(listNode.getType(), listNode, itemsVal, stack, definitions, definitionNames);
props.set(ITEMS_KEY, itemsVal);
props.put(DESCRIPTION_KEY, listNode.getDescription().orElse(""));
private ObjectNode processLeafNode(final LeafSchemaNode leafNode, final String jsonLeafName,
final ObjectNode properties, final ArrayNode required, final SchemaInferenceStack stack,
- final ObjectNode definitions, final DefinitionNames definitionNames, final OAversion oaversion) {
+ final ObjectNode definitions, final DefinitionNames definitionNames) {
final ObjectNode property = JsonNodeFactory.instance.objectNode();
final String leafDescription = leafNode.getDescription().orElse("");
property.put(DESCRIPTION_KEY, leafDescription);
}
- processTypeDef(leafNode.getType(), leafNode, property, stack, definitions, definitionNames, oaversion);
+ processTypeDef(leafNode.getType(), leafNode, property, stack, definitions, definitionNames);
properties.set(jsonLeafName, property);
property.set(XML_KEY, buildXmlParameter(leafNode));
processMandatory(leafNode, jsonLeafName, required);
private String processTypeDef(final TypeDefinition<?> leafTypeDef, final DataSchemaNode node,
final ObjectNode property, final SchemaInferenceStack stack, final ObjectNode definitions,
- final DefinitionNames definitionNames, final OAversion oaversion) {
+ final DefinitionNames definitionNames) {
final String jsonType;
if (leafTypeDef instanceof BinaryTypeDefinition) {
jsonType = processBinaryType(property);
} else if (leafTypeDef instanceof IdentityrefTypeDefinition) {
jsonType = processIdentityRefType((IdentityrefTypeDefinition) leafTypeDef, property, definitions,
- definitionNames, oaversion, stack.getEffectiveModelContext());
+ definitionNames, stack.getEffectiveModelContext());
} else if (leafTypeDef instanceof StringTypeDefinition) {
jsonType = processStringType(leafTypeDef, property, node.getQName().getLocalName());
jsonType = OBJECT_TYPE;
} else if (leafTypeDef instanceof LeafrefTypeDefinition) {
return processTypeDef(stack.resolveLeafref((LeafrefTypeDefinition) leafTypeDef), node, property,
- stack, definitions, definitionNames, oaversion);
+ stack, definitions, definitionNames);
} else if (leafTypeDef instanceof BooleanTypeDefinition) {
jsonType = BOOLEAN_TYPE;
setDefaultValue(property, true);
return STRING_TYPE;
}
- private static String processEnumType(final EnumTypeDefinition enumLeafType,
- final ObjectNode property) {
+ private static String processEnumType(final EnumTypeDefinition enumLeafType, final ObjectNode property) {
final List<EnumPair> enumPairs = enumLeafType.getValues();
final ArrayNode enumNames = new ArrayNode(JsonNodeFactory.instance);
for (final EnumPair enumPair : enumPairs) {
}
private String processIdentityRefType(final IdentityrefTypeDefinition leafTypeDef, final ObjectNode property,
- final ObjectNode definitions, final DefinitionNames definitionNames, final OAversion oaversion,
+ final ObjectNode definitions, final DefinitionNames definitionNames,
final EffectiveModelContext schemaContext) {
final String definitionName;
if (isImported(leafTypeDef)) {
final SchemaNode node = leafTypeDef.getIdentities().iterator().next();
definitionName = node.getQName().getLocalName() + definitionNames.getDiscriminator(node);
}
- property.put(REF_KEY, getAppropriateModelPrefix(oaversion) + definitionName);
+ property.put(REF_KEY, COMPONENTS_PREFIX + definitionName);
return STRING_TYPE;
}
.supportsSessions(true)
.addServlet(ServletDetails.builder()
.servlet(servletSupport.createHttpServletBuilder(new ApiDocApplication(apiDocService)).build())
- .addUrlPattern("/swagger2/apis/*")
.addUrlPattern("/openapi3/apis/*")
.build())
.addResource(ResourceDetails.builder().name("/explorer").build());
- webContextSecurer.requireAuthentication(webContextBuilder, "/swagger2/*", "/openapi3/*");
+ webContextSecurer.requireAuthentication(webContextBuilder, "/openapi3/*");
registration = webServer.registerWebContext(webContextBuilder.build());
}
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
import org.opendaylight.netconf.sal.rest.doc.impl.DefinitionNames;
import org.opendaylight.netconf.sal.rest.doc.util.JsonUtil;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
public final class OperationBuilder {
- public static final String BODY = "body";
public static final String CONFIG = "_config";
public static final String CONFIG_QUERY_PARAM = "config";
- public static final String CONSUMES_KEY = "consumes";
public static final String CONTENT_KEY = "content";
public static final String COMPONENTS_PREFIX = "#/components/schemas/";
- public static final String DEFINITIONS_PREFIX = "#/definitions/";
public static final String DESCRIPTION_KEY = "description";
public static final String IN_KEY = "in";
public static final String INPUT_KEY = "input";
public static ObjectNode buildPost(final String parentName, final String nodeName, final String discriminator,
final String moduleName, final Optional<String> deviceName, final String description,
- final ArrayNode pathParams, final OAversion oaversion) {
+ final ArrayNode pathParams) {
final ObjectNode value = JsonNodeFactory.instance.objectNode();
value.put(DESCRIPTION_KEY, description);
value.put(SUMMARY_KEY, buildSummaryValue(HttpMethod.POST, moduleName, deviceName, nodeName));
final String cleanDefName = parentName + CONFIG + "_" + nodeName + POST_SUFFIX;
final String defName = cleanDefName + discriminator;
final String xmlDefName = cleanDefName + XML_SUFFIX + discriminator;
- ref.put(REF_KEY, getAppropriateModelPrefix(oaversion) + defName);
- insertRequestBodyParameter(parameters, value, defName, xmlDefName, nodeName + CONFIG, oaversion);
+ ref.put(REF_KEY, COMPONENTS_PREFIX + defName);
+ insertRequestBodyParameter(value, defName, xmlDefName, nodeName + CONFIG);
value.set(PARAMETERS_KEY, parameters);
final ObjectNode responses = JsonNodeFactory.instance.objectNode();
responses.set(String.valueOf(Response.Status.CREATED.getStatusCode()),
- buildResponse(Response.Status.CREATED.getReasonPhrase(), Optional.empty(), oaversion));
+ buildResponse(Response.Status.CREATED.getReasonPhrase(), Optional.empty()));
value.set(RESPONSES_KEY, responses);
- setConsumesIfNeeded(value, oaversion);
return value;
}
public static ObjectNode buildGet(final DataSchemaNode node, final String moduleName,
final Optional<String> deviceName, final ArrayNode pathParams, final String defName,
- final boolean isConfig, final OAversion oaversion) {
+ final boolean isConfig) {
final ObjectNode value = JsonNodeFactory.instance.objectNode();
value.put(DESCRIPTION_KEY, node.getDescription().orElse(""));
value.put(SUMMARY_KEY, buildSummaryValue(HttpMethod.GET, moduleName, deviceName,
value.set(TAGS_KEY, buildTagsValue(deviceName, moduleName));
final ArrayNode parameters = JsonUtil.copy(pathParams);
- addQueryParameters(parameters, isConfig, oaversion);
+ addQueryParameters(parameters, isConfig);
value.set(PARAMETERS_KEY, parameters);
final ObjectNode responses = JsonNodeFactory.instance.objectNode();
final ObjectNode schema = JsonNodeFactory.instance.objectNode();
- schema.put(REF_KEY, getAppropriateModelPrefix(oaversion) + defName);
+ schema.put(REF_KEY, COMPONENTS_PREFIX + defName);
responses.set(String.valueOf(Response.Status.OK.getStatusCode()),
- buildResponse(Response.Status.OK.getReasonPhrase(), Optional.of(schema), oaversion));
+ buildResponse(Response.Status.OK.getReasonPhrase(), Optional.of(schema)));
value.set(RESPONSES_KEY, responses);
return value;
}
- private static void addQueryParameters(final ArrayNode parameters, final boolean isConfig,
- final OAversion oaversion) {
+ private static void addQueryParameters(final ArrayNode parameters, final boolean isConfig) {
final ObjectNode contentParam = JsonNodeFactory.instance.objectNode();
final ArrayNode cases = JsonNodeFactory.instance.arrayNode();
cases.add(NONCONFIG_QUERY_PARAM);
contentParam.put(IN_KEY, QUERY);
contentParam.put(NAME_KEY, CONTENT);
- final ObjectNode typeParent = getTypeParentNode(contentParam, oaversion);
+ final ObjectNode typeParent = getTypeParentNode(contentParam);
typeParent.put(TYPE_KEY, STRING);
typeParent.set(ENUM_KEY, cases);
public static ObjectNode buildPut(final String parentName, final String nodeName, final String discriminator,
final String moduleName, final Optional<String> deviceName, final String description,
- final ArrayNode pathParams, final OAversion oaversion) {
+ final ArrayNode pathParams) {
final ObjectNode value = JsonNodeFactory.instance.objectNode();
value.put(DESCRIPTION_KEY, description);
value.put(SUMMARY_KEY, buildSummaryValue(HttpMethod.PUT, moduleName, deviceName, nodeName));
final ArrayNode parameters = JsonUtil.copy(pathParams);
final String defName = parentName + CONFIG + "_" + nodeName + TOP;
final String xmlDefName = parentName + CONFIG + "_" + nodeName;
- insertRequestBodyParameter(parameters, value, defName, xmlDefName, nodeName + CONFIG, oaversion);
+ insertRequestBodyParameter(value, defName, xmlDefName, nodeName + CONFIG);
value.set(PARAMETERS_KEY, parameters);
final ObjectNode responses = JsonNodeFactory.instance.objectNode();
responses.set(String.valueOf(Response.Status.CREATED.getStatusCode()),
- buildResponse(Response.Status.CREATED.getReasonPhrase(), Optional.empty(), oaversion));
+ buildResponse(Response.Status.CREATED.getReasonPhrase(), Optional.empty()));
responses.set(String.valueOf(Response.Status.NO_CONTENT.getStatusCode()),
- buildResponse("Updated", Optional.empty(), oaversion));
+ buildResponse("Updated", Optional.empty()));
value.set(RESPONSES_KEY, responses);
- setConsumesIfNeeded(value, oaversion);
return value;
}
public static ObjectNode buildPatch(final String parentName, final String nodeName, final String moduleName,
- final Optional<String> deviceName, final String description, final ArrayNode pathParams,
- final OAversion oaversion) {
+ final Optional<String> deviceName, final String description, final ArrayNode pathParams) {
final ObjectNode value = JsonNodeFactory.instance.objectNode();
value.put(DESCRIPTION_KEY, description);
value.put(SUMMARY_KEY, buildSummaryValue(HttpMethod.PATCH, moduleName, deviceName, nodeName));
final ArrayNode parameters = JsonUtil.copy(pathParams);
final String defName = parentName + CONFIG + "_" + nodeName + TOP;
final String xmlDefName = parentName + CONFIG + "_" + nodeName;
- insertRequestBodyParameter(parameters, value, defName, xmlDefName, nodeName + CONFIG, oaversion);
+ insertRequestBodyParameter(value, defName, xmlDefName, nodeName + CONFIG);
value.set(PARAMETERS_KEY, parameters);
final ObjectNode responses = JsonNodeFactory.instance.objectNode();
responses.set(String.valueOf(Response.Status.OK.getStatusCode()),
- buildResponse(Response.Status.OK.getReasonPhrase(), Optional.empty(), oaversion));
+ buildResponse(Response.Status.OK.getReasonPhrase(), Optional.empty()));
responses.set(String.valueOf(Response.Status.NO_CONTENT.getStatusCode()),
- buildResponse("Updated", Optional.empty(), oaversion));
+ buildResponse("Updated", Optional.empty()));
value.set(RESPONSES_KEY, responses);
- setConsumesIfNeeded(value, oaversion);
return value;
}
public static ObjectNode buildDelete(final DataSchemaNode node, final String moduleName,
- final Optional<String> deviceName, final ArrayNode pathParams, final OAversion oaversion) {
+ final Optional<String> deviceName, final ArrayNode pathParams) {
final ObjectNode value = JsonNodeFactory.instance.objectNode();
value.put(SUMMARY_KEY, buildSummaryValue(HttpMethod.DELETE, moduleName, deviceName,
node.getQName().getLocalName()));
final ObjectNode responses = JsonNodeFactory.instance.objectNode();
responses.set(String.valueOf(Response.Status.NO_CONTENT.getStatusCode()),
- buildResponse("Deleted", Optional.empty(), oaversion));
+ buildResponse("Deleted", Optional.empty()));
value.set(RESPONSES_KEY, responses);
return value;
}
public static ObjectNode buildPostOperation(final OperationDefinition operDef, final String moduleName,
- final Optional<String> deviceName, final String parentName, final DefinitionNames definitionNames,
- final OAversion oaversion) {
+ final Optional<String> deviceName, final String parentName, final DefinitionNames definitionNames) {
final ObjectNode postOperation = JsonNodeFactory.instance.objectNode();
final ArrayNode parameters = JsonNodeFactory.instance.arrayNode();
final String operName = operDef.getQName().getLocalName();
final String clearDefName = parentName + "_" + operName + INPUT_SUFFIX;
final String defName = clearDefName + discriminator;
final String defTopName = clearDefName + TOP + discriminator;
- insertRequestBodyParameter(parameters, postOperation, defTopName, defName, inputName, oaversion);
+ insertRequestBodyParameter(postOperation, defTopName, defName, inputName);
} else {
final ObjectNode payload = JsonNodeFactory.instance.objectNode();
final ObjectNode jsonSchema = JsonNodeFactory.instance.objectNode();
properties.set(INPUT_KEY, inputSchema);
jsonSchema.put(TYPE_KEY, OBJECT);
jsonSchema.set(PROPERTIES_KEY, properties);
- if (oaversion.equals(OAversion.V3_0)) {
- final ObjectNode content = JsonNodeFactory.instance.objectNode();
- final ObjectNode jsonTypeValue = JsonNodeFactory.instance.objectNode();
- jsonTypeValue.set(SCHEMA_KEY, jsonSchema);
- content.set(MediaType.APPLICATION_JSON, jsonTypeValue);
-
- final ObjectNode xmlSchema = JsonNodeFactory.instance.objectNode();
- xmlSchema.put(TYPE_KEY, OBJECT);
- final ObjectNode xml = JsonNodeFactory.instance.objectNode();
- xml.put(NAME_KEY, INPUT);
- xmlSchema.set(XML_KEY, xml);
- final ObjectNode xmlTypeValue = JsonNodeFactory.instance.objectNode();
- xmlTypeValue.set(SCHEMA_KEY, xmlSchema);
- content.set(MediaType.APPLICATION_XML, xmlTypeValue);
-
- payload.set(CONTENT_KEY, content);
- payload.put(DESCRIPTION_KEY, inputName);
- postOperation.set(REQUEST_BODY_KEY, payload);
- } else {
- payload.put(IN_KEY, BODY);
- payload.put(NAME_KEY, inputName);
- payload.set(SCHEMA_KEY, jsonSchema);
- parameters.add(payload);
- }
+ final ObjectNode content = JsonNodeFactory.instance.objectNode();
+ final ObjectNode jsonTypeValue = JsonNodeFactory.instance.objectNode();
+ jsonTypeValue.set(SCHEMA_KEY, jsonSchema);
+ content.set(MediaType.APPLICATION_JSON, jsonTypeValue);
+
+ final ObjectNode xmlSchema = JsonNodeFactory.instance.objectNode();
+ xmlSchema.put(TYPE_KEY, OBJECT);
+ final ObjectNode xml = JsonNodeFactory.instance.objectNode();
+ xml.put(NAME_KEY, INPUT);
+ xmlSchema.set(XML_KEY, xml);
+ final ObjectNode xmlTypeValue = JsonNodeFactory.instance.objectNode();
+ xmlTypeValue.set(SCHEMA_KEY, xmlSchema);
+ content.set(MediaType.APPLICATION_XML, xmlTypeValue);
+ payload.set(CONTENT_KEY, content);
+ payload.put(DESCRIPTION_KEY, inputName);
+ postOperation.set(REQUEST_BODY_KEY, payload);
}
- setConsumesIfNeeded(postOperation, oaversion);
postOperation.set(PARAMETERS_KEY, parameters);
final ObjectNode responses = JsonNodeFactory.instance.objectNode();
final String description = String.format("RPC %s success", operName);
final ObjectNode schema = JsonNodeFactory.instance.objectNode();
final String defName = parentName + "_" + operName + OUTPUT_SUFFIX + TOP
+ definitionNames.getDiscriminator(output);
- schema.put(REF_KEY, getAppropriateModelPrefix(oaversion) + defName);
+ schema.put(REF_KEY, COMPONENTS_PREFIX + defName);
responses.set(String.valueOf(Response.Status.OK.getStatusCode()), buildResponse(description,
- Optional.of(schema), oaversion));
+ Optional.of(schema)));
} else {
responses.set(String.valueOf(Response.Status.NO_CONTENT.getStatusCode()), buildResponse(description,
- Optional.empty(), oaversion));
+ Optional.empty()));
}
postOperation.set(RESPONSES_KEY, responses);
postOperation.put(DESCRIPTION_KEY, operDef.getDescription().orElse(""));
return postOperation;
}
- private static void insertRequestBodyParameter(final ArrayNode parameters, final ObjectNode operation,
- final String defName, final String xmlDefName, final String name, final OAversion oaversion) {
+ private static void insertRequestBodyParameter(final ObjectNode operation, final String defName,
+ final String xmlDefName, final String name) {
final ObjectNode payload = JsonNodeFactory.instance.objectNode();
- if (oaversion.equals(OAversion.V3_0)) {
- final ObjectNode content = JsonNodeFactory.instance.objectNode();
- final JsonNode node = operation.get(SUMMARY_KEY);
- if (node != null && node.asText().contains(HttpMethod.PATCH)) {
- content.set("application/yang-data+json", buildMimeTypeValue(defName));
- content.set("application/yang-data+xml", buildMimeTypeValue(xmlDefName));
- } else {
- content.set(MediaType.APPLICATION_JSON, buildMimeTypeValue(defName));
- content.set(MediaType.APPLICATION_XML, buildMimeTypeValue(xmlDefName));
- }
- payload.set(CONTENT_KEY, content);
- payload.put(DESCRIPTION_KEY, name);
- operation.set(REQUEST_BODY_KEY, payload);
+ final ObjectNode content = JsonNodeFactory.instance.objectNode();
+ final JsonNode node = operation.get(SUMMARY_KEY);
+ if (node != null && node.asText().contains(HttpMethod.PATCH)) {
+ content.set("application/yang-data+json", buildMimeTypeValue(defName));
+ content.set("application/yang-data+xml", buildMimeTypeValue(xmlDefName));
} else {
- payload.put(IN_KEY, BODY);
- payload.put(NAME_KEY, name);
- payload.set(SCHEMA_KEY, buildRefSchema(defName, OAversion.V2_0));
- parameters.add(payload);
+ content.set(MediaType.APPLICATION_JSON, buildMimeTypeValue(defName));
+ content.set(MediaType.APPLICATION_XML, buildMimeTypeValue(xmlDefName));
}
+ payload.set(CONTENT_KEY, content);
+ payload.put(DESCRIPTION_KEY, name);
+ operation.set(REQUEST_BODY_KEY, payload);
}
- private static ObjectNode buildRefSchema(final String defName, final OAversion oaversion) {
+ private static ObjectNode buildRefSchema(final String defName) {
final ObjectNode schema = JsonNodeFactory.instance.objectNode();
- schema.put(REF_KEY, getAppropriateModelPrefix(oaversion) + defName);
+ schema.put(REF_KEY, COMPONENTS_PREFIX + defName);
return schema;
}
private static ObjectNode buildMimeTypeValue(final String defName) {
final ObjectNode mimeTypeValue = JsonNodeFactory.instance.objectNode();
- mimeTypeValue.set(SCHEMA_KEY, buildRefSchema(defName, OAversion.V3_0));
+ mimeTypeValue.set(SCHEMA_KEY, buildRefSchema(defName));
return mimeTypeValue;
}
- public static ObjectNode buildResponse(final String description, final Optional<ObjectNode> schema,
- final OAversion oaversion) {
+ public static ObjectNode buildResponse(final String description, final Optional<ObjectNode> schema) {
final ObjectNode response = JsonNodeFactory.instance.objectNode();
if (schema.isPresent()) {
final ObjectNode schemaValue = schema.get();
- if (oaversion.equals(OAversion.V3_0)) {
- final ObjectNode content = JsonNodeFactory.instance.objectNode();
- final ObjectNode body = JsonNodeFactory.instance.objectNode();
- for (final String mimeType : MIME_TYPES) {
- content.set(mimeType, body);
- }
- body.set(SCHEMA_KEY, schemaValue);
- response.set(CONTENT_KEY, content);
- } else {
- response.set(SCHEMA_KEY, schemaValue);
+ final ObjectNode content = JsonNodeFactory.instance.objectNode();
+ final ObjectNode body = JsonNodeFactory.instance.objectNode();
+ for (final String mimeType : MIME_TYPES) {
+ content.set(mimeType, body);
}
+ body.set(SCHEMA_KEY, schemaValue);
+ response.set(CONTENT_KEY, content);
}
response.put(DESCRIPTION_KEY, description);
return response;
}
- private static void setConsumesIfNeeded(final ObjectNode operation, final OAversion oaversion) {
- if (oaversion.equals(OAversion.V2_0)) {
- operation.set(CONSUMES_KEY, CONSUMES_PUT_POST);
- }
- }
-
private static String buildSummaryValue(final String httpMethod, final String moduleName,
final Optional<String> deviceName, final String nodeName) {
return httpMethod + SUMMARY_SEPARATOR + deviceName.map(s -> s + SUMMARY_SEPARATOR).orElse("")
return tagsValue;
}
- public static String getAppropriateModelPrefix(final OAversion oaversion) {
- if (oaversion.equals(OAversion.V3_0)) {
- return COMPONENTS_PREFIX;
- }
- return DEFINITIONS_PREFIX;
- }
-
- public static ObjectNode getTypeParentNode(final ObjectNode parameter, final OAversion oaversion) {
- if (oaversion.equals(OAversion.V3_0)) {
- final ObjectNode schema = JsonNodeFactory.instance.objectNode();
- parameter.set(SCHEMA_KEY, schema);
- return schema;
- }
- return parameter;
+ public static ObjectNode getTypeParentNode(final ObjectNode parameter) {
+ final ObjectNode schema = JsonNodeFactory.instance.objectNode();
+ parameter.set(SCHEMA_KEY, schema);
+ return schema;
}
}
import org.opendaylight.mdsal.dom.api.DOMMountPointListener;
import org.opendaylight.mdsal.dom.api.DOMMountPointService;
import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
import org.opendaylight.netconf.sal.rest.doc.impl.BaseYangSwaggerGenerator;
import org.opendaylight.netconf.sal.rest.doc.impl.DefinitionNames;
import org.opendaylight.netconf.sal.rest.doc.swagger.CommonApiObject;
}
public CommonApiObject getMountPointApi(final UriInfo uriInfo, final Long id, final String module,
- final String revision, final OAversion oaversion) {
+ final String revision) {
final YangInstanceIdentifier iid = getInstanceId(id);
final EffectiveModelContext context = getSchemaContext(iid);
final String urlPrefix = getYangMountUrl(iid);
return generateDataStoreApiDoc(uriInfo, urlPrefix, deviceName);
}
final SwaggerObject swaggerObject = swaggerGenerator.getApiDeclaration(module, revision, uriInfo, context,
- urlPrefix, oaversion);
- return BaseYangSwaggerGenerator.getAppropriateDoc(swaggerObject, oaversion);
+ urlPrefix);
+ return BaseYangSwaggerGenerator.convertToOpenApi(swaggerObject);
}
- public CommonApiObject getMountPointApi(final UriInfo uriInfo, final Long id, final Optional<Integer> pageNum,
- final OAversion oaversion) {
+ public CommonApiObject getMountPointApi(final UriInfo uriInfo, final Long id, final Optional<Integer> pageNum) {
final YangInstanceIdentifier iid = getInstanceId(id);
final EffectiveModelContext context = getSchemaContext(iid);
final String urlPrefix = getYangMountUrl(iid);
final SwaggerObject doc;
final SwaggerObject swaggerObject = swaggerGenerator.getAllModulesDoc(uriInfo, range, context,
- Optional.of(deviceName), urlPrefix, definitionNames, oaversion);
+ Optional.of(deviceName), urlPrefix, definitionNames);
if (includeDataStore) {
doc = generateDataStoreApiDoc(uriInfo, urlPrefix, deviceName);
doc = swaggerObject;
}
- return BaseYangSwaggerGenerator.getAppropriateDoc(doc, oaversion);
+ return BaseYangSwaggerGenerator.convertToOpenApi(doc);
}
private static String extractDeviceName(final YangInstanceIdentifier iid) {
@Test
public void testPaths() {
final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
- final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
- ApiDocServiceImpl.OAversion.V2_0);
+ final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT);
assertEquals(List.of("/rests/data",
"/rests/data/toaster2:toaster",
"/rests/data/toaster2:lst/lst1={key1},{key2}");
final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
- final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
- ApiDocServiceImpl.OAversion.V2_0);
+ final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT);
for (final String path : configPaths) {
final JsonNode node = doc.getPaths().get(path);
@Test
public void testDefinitions() {
final var module = CONTEXT.findModule(NAME, Revision.of(REVISION_DATE)).orElseThrow();
- final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
- ApiDocServiceImpl.OAversion.V2_0);
+ final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT);
final ObjectNode definitions = doc.getDefinitions();
assertNotNull(definitions);
final JsonNode configLstTop = definitions.get("toaster2_config_lst_TOP");
assertNotNull(configLstTop);
- DocGenTestHelper.containsReferences(configLstTop, "lst", "#/definitions/toaster2_config_lst");
+ DocGenTestHelper.containsReferences(configLstTop, "lst", "#/components/schemas/toaster2_config_lst");
final JsonNode configLst = definitions.get("toaster2_config_lst");
assertNotNull(configLst);
- DocGenTestHelper.containsReferences(configLst, "lst1", "#/definitions/toaster2_lst_config_lst1");
- DocGenTestHelper.containsReferences(configLst, "cont1", "#/definitions/toaster2_lst_config_cont1");
+ DocGenTestHelper.containsReferences(configLst, "lst1", "#/components/schemas/toaster2_lst_config_lst1");
+ DocGenTestHelper.containsReferences(configLst, "cont1", "#/components/schemas/toaster2_lst_config_cont1");
final JsonNode configLst1Top = definitions.get("toaster2_lst_config_lst1_TOP");
assertNotNull(configLst1Top);
- DocGenTestHelper.containsReferences(configLst1Top, "lst1", "#/definitions/toaster2_lst_config_lst1");
+ DocGenTestHelper.containsReferences(configLst1Top, "lst1", "#/components/schemas/toaster2_lst_config_lst1");
final JsonNode configLst1 = definitions.get("toaster2_lst_config_lst1");
assertNotNull(configLst1);
final JsonNode configCont1Top = definitions.get("toaster2_lst_config_cont1_TOP");
assertNotNull(configCont1Top);
- DocGenTestHelper.containsReferences(configCont1Top, "cont1", "#/definitions/toaster2_lst_config_cont1");
+ DocGenTestHelper.containsReferences(configCont1Top, "cont1", "#/components/schemas/toaster2_lst_config_cont1");
final JsonNode configCont1 = definitions.get("toaster2_lst_config_cont1");
assertNotNull(configCont1);
- DocGenTestHelper.containsReferences(configCont1, "cont11", "#/definitions/toaster2_lst_cont1_config_cont11");
- DocGenTestHelper.containsReferences(configCont1, "lst11", "#/definitions/toaster2_lst_cont1_config_lst11");
+ DocGenTestHelper.containsReferences(configCont1, "cont11",
+ "#/components/schemas/toaster2_lst_cont1_config_cont11");
+ DocGenTestHelper.containsReferences(configCont1, "lst11",
+ "#/components/schemas/toaster2_lst_cont1_config_lst11");
final JsonNode configCont11Top = definitions.get("toaster2_lst_cont1_config_cont11_TOP");
assertNotNull(configCont11Top);
DocGenTestHelper.containsReferences(configCont11Top,
- "cont11", "#/definitions/toaster2_lst_cont1_config_cont11");
+ "cont11", "#/components/schemas/toaster2_lst_cont1_config_cont11");
final JsonNode configCont11 = definitions.get("toaster2_lst_cont1_config_cont11");
assertNotNull(configCont11);
final JsonNode configLst11Top = definitions.get("toaster2_lst_cont1_config_lst11_TOP");
assertNotNull(configLst11Top);
- DocGenTestHelper.containsReferences(configLst11Top, "lst11", "#/definitions/toaster2_lst_cont1_config_lst11");
+ DocGenTestHelper.containsReferences(configLst11Top, "lst11",
+ "#/components/schemas/toaster2_lst_cont1_config_lst11");
final JsonNode configLst11 = definitions.get("toaster2_lst_cont1_config_lst11");
assertNotNull(configLst11);
@Test
public void testRPC() {
final var module = CONTEXT.findModule(NAME_2, Revision.of(REVISION_DATE_2)).orElseThrow();
- final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
- ApiDocServiceImpl.OAversion.V2_0);
+ final SwaggerObject doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT);
assertNotNull(doc);
final ObjectNode definitions = doc.getDefinitions();
final JsonNode inputTop = definitions.get("toaster_make-toast_input_TOP");
assertNotNull(inputTop);
- final String testString = "{\"input\":{\"$ref\":\"#/definitions/toaster_make-toast_input\"}}";
+ final String testString = "{\"input\":{\"$ref\":\"#/components/schemas/toaster_make-toast_input\"}}";
assertEquals(testString, inputTop.get("properties").toString());
final JsonNode input = definitions.get("toaster_make-toast_input");
final JsonNode properties = input.get("properties");
@Test
public void testChoice() {
final var module = CONTEXT.findModule(CHOICE_TEST_MODULE).orElseThrow();
- final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT,
- ApiDocServiceImpl.OAversion.V2_0);
+ final var doc = generator.getSwaggerDocSpec(module, "http", "localhost:8181", "/", "", CONTEXT);
assertNotNull(doc);
final var definitions = doc.getDefinitions();
import org.opendaylight.mdsal.dom.api.DOMMountPoint;
import org.opendaylight.mdsal.dom.api.DOMMountPointService;
import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
import org.opendaylight.netconf.sal.rest.doc.mountpoints.MountPointSwagger;
import org.opendaylight.netconf.sal.rest.doc.swagger.SwaggerObject;
import org.opendaylight.yangtools.yang.common.QName;
final UriInfo mockInfo = DocGenTestHelper.createMockUriInfo(HTTP_URL);
swagger.onMountPointCreated(INSTANCE_ID); // add this ID into the list of mount points
- final SwaggerObject mountPointApi = (SwaggerObject) swagger.getMountPointApi(mockInfo, 1L, "Datastores", "-",
- OAversion.V2_0);
+ final SwaggerObject mountPointApi = (SwaggerObject) swagger.getMountPointApi(mockInfo, 1L, "Datastores", "-");
assertNotNull("failed to find Datastore API", mountPointApi);
final ObjectNode pathsObject = mountPointApi.getPaths();
public void testConvertToJsonSchema() throws IOException {
final var module = CONTEXT.findModule("opflex", Revision.of("2014-05-28")).orElseThrow();
final DefinitionGenerator generator = new DefinitionGenerator();
- final ObjectNode jsonObject = generator.convertToJsonSchema(module, CONTEXT, new DefinitionNames(),
- ApiDocServiceImpl.OAversion.V2_0, true);
+ final ObjectNode jsonObject = generator.convertToJsonSchema(module, CONTEXT, new DefinitionNames(), true);
assertNotNull(jsonObject);
}
public void testActionTypes() throws IOException {
final var module = CONTEXT.findModule("action-types").orElseThrow();
final DefinitionGenerator generator = new DefinitionGenerator();
- final ObjectNode jsonObject = generator.convertToJsonSchema(module, CONTEXT, new DefinitionNames(),
- ApiDocServiceImpl.OAversion.V2_0, true);
+ final ObjectNode jsonObject = generator.convertToJsonSchema(module, CONTEXT, new DefinitionNames(), true);
assertNotNull(jsonObject);
}
public void testStringTypes() throws IOException {
final var module = CONTEXT.findModule("string-types").orElseThrow();
final DefinitionGenerator generator = new DefinitionGenerator();
- final ObjectNode jsonObject = generator.convertToJsonSchema(module, CONTEXT, new DefinitionNames(),
- ApiDocServiceImpl.OAversion.V2_0, true);
+ final ObjectNode jsonObject = generator.convertToJsonSchema(module, CONTEXT, new DefinitionNames(), true);
assertNotNull(jsonObject);
}
}