Separate logic of get root path
[netconf.git] / restconf / restconf-openapi / src / main / java / org / opendaylight / restconf / openapi / model / GetEntity.java
1 /*
2  * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.restconf.openapi.model;
9
10 import static java.util.Objects.requireNonNull;
11 import static javax.ws.rs.core.Response.Status.OK;
12
13 import com.fasterxml.jackson.core.JsonGenerator;
14 import java.io.IOException;
15 import java.util.List;
16 import javax.ws.rs.HttpMethod;
17 import javax.ws.rs.core.MediaType;
18 import org.eclipse.jdt.annotation.NonNull;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
22
23 public sealed class GetEntity extends OperationEntity permits GetRootEntity {
24     private final boolean isConfig;
25
26     public GetEntity(final @Nullable SchemaNode schema, final @NonNull String deviceName,
27             final @NonNull String moduleName, final @Nullable List<ParameterEntity> parameters,
28             final @Nullable String refPath, final boolean isConfig) {
29         super(schema, deviceName, moduleName, parameters, refPath);
30         this.isConfig = isConfig;
31     }
32
33     @Override
34     protected @NonNull String operation() {
35         return "get";
36     }
37
38     @Override
39     @NonNull String summary() {
40         return SUMMARY_TEMPLATE.formatted(HttpMethod.GET, deviceName(), moduleName(), nodeName());
41     }
42
43     @Override
44     void generateRequestBody(@NonNull JsonGenerator generator) throws IOException {
45         // no-op
46     }
47
48     @Override
49     void generateResponses(final @NonNull JsonGenerator generator) throws IOException {
50         final var ref = COMPONENTS_PREFIX + moduleName() + "_" + refPath();
51         generator.writeObjectFieldStart(RESPONSES);
52         generator.writeObjectFieldStart(String.valueOf(OK.getStatusCode()));
53         generator.writeStringField(DESCRIPTION, String.valueOf(OK.getStatusCode()));
54         generator.writeObjectFieldStart(CONTENT);
55         generateMediaTypeSchemaRef(generator, MediaType.APPLICATION_XML, ref);
56         generator.writeObjectFieldStart(MediaType.APPLICATION_JSON);
57         generator.writeObjectFieldStart(SCHEMA);
58         generator.writeObjectFieldStart(PROPERTIES);
59         generator.writeObjectFieldStart(nodeName());
60         if (schema() instanceof ListSchemaNode) {
61             generator.writeStringField(TYPE, ARRAY);
62             generator.writeObjectFieldStart(ITEMS);
63             generator.writeStringField(REF, ref);
64             generator.writeStringField(TYPE, OBJECT);
65             generator.writeEndObject(); //end of items
66         } else {
67             generator.writeStringField(REF, ref);
68             generator.writeStringField(TYPE, OBJECT);
69         }
70         generator.writeEndObject(); //end of nodeName
71         generator.writeEndObject(); //end of props
72         generator.writeEndObject(); //end of schema
73         generator.writeEndObject(); //end of json
74         generator.writeEndObject(); //end of content
75         generator.writeEndObject(); //end of 200
76         generator.writeEndObject(); //end of responses
77     }
78
79     @Override
80     void generateParams(@NonNull JsonGenerator generator) throws IOException {
81         final var contentParam = new ParameterEntity(CONTENT, "query", !isConfig,
82             new ParameterSchemaEntity("string", List.of("config", "nonconfig", "all")), null);
83         final var parameters = requireNonNull(parameters());
84         parameters.add(contentParam);
85         generator.writeArrayFieldStart(PARAMETERS);
86         for (final var parameter : parameters) {
87             final var parameterSchema = requireNonNull(parameter.schema());
88             generator.writeStartObject();
89             generator.writeStringField(NAME, parameter.name());
90             generator.writeStringField(IN, parameter.in());
91             generator.writeBooleanField(REQUIRED, parameter.required());
92             generator.writeObjectFieldStart(SCHEMA);
93             final var schemaEnum = parameter.schema().schemaEnum();
94             if (schemaEnum != null) {
95                 generator.writeArrayFieldStart("enum");
96                 for (final var enumCase : schemaEnum) {
97                     generator.writeString(enumCase);
98                 }
99                 generator.writeEndArray(); //end of enum
100             }
101             generator.writeStringField(TYPE, parameterSchema.type());
102             generator.writeEndObject(); //end of schema
103             if (parameter.description() != null) {
104                 generator.writeStringField(DESCRIPTION, parameter.description());
105             }
106             generator.writeEndObject(); //end of parameter
107         }
108         generator.writeEndArray(); //end of params
109         parameters.remove(contentParam);
110     }
111 }