d6b662753448440a4f1811d173ec21aba22480a5
[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 final class GetEntity extends OperationEntity {
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 generateResponses(final @NonNull JsonGenerator generator) throws IOException {
45         final var ref = COMPONENTS_PREFIX + moduleName() + "_" + refPath();
46         generator.writeObjectFieldStart(RESPONSES);
47         generator.writeObjectFieldStart(String.valueOf(OK.getStatusCode()));
48         generator.writeStringField(DESCRIPTION, String.valueOf(OK.getStatusCode()));
49         generator.writeObjectFieldStart(CONTENT);
50         generateMediaTypeSchemaRef(generator, MediaType.APPLICATION_XML, ref);
51         generator.writeObjectFieldStart(MediaType.APPLICATION_JSON);
52         generator.writeObjectFieldStart(SCHEMA);
53         generator.writeObjectFieldStart(PROPERTIES);
54         generator.writeObjectFieldStart(nodeName());
55         if (schema() instanceof ListSchemaNode) {
56             generator.writeStringField(TYPE, ARRAY);
57             generator.writeObjectFieldStart(ITEMS);
58             generator.writeStringField(REF, ref);
59             generator.writeStringField(TYPE, OBJECT);
60             generator.writeEndObject(); //end of items
61         } else {
62             generator.writeStringField(REF, ref);
63             generator.writeStringField(TYPE, OBJECT);
64         }
65         generator.writeEndObject(); //end of nodeName
66         generator.writeEndObject(); //end of props
67         generator.writeEndObject(); //end of schema
68         generator.writeEndObject(); //end of json
69         generator.writeEndObject(); //end of content
70         generator.writeEndObject(); //end of 200
71         generator.writeEndObject(); //end of responses
72     }
73
74     @Override
75     void generateParams(@NonNull JsonGenerator generator) throws IOException {
76         final var contentParam = new ParameterEntity(CONTENT, "query", !isConfig,
77             new ParameterSchemaEntity("string", List.of("config", "nonconfig", "all")), null);
78         final var parameters = requireNonNull(parameters());
79         parameters.add(contentParam);
80         generator.writeArrayFieldStart(PARAMETERS);
81         for (final var parameter : parameters) {
82             final var parameterSchema = requireNonNull(parameter.schema());
83             generator.writeStartObject();
84             generator.writeStringField(NAME, parameter.name());
85             generator.writeStringField(IN, parameter.in());
86             generator.writeBooleanField(REQUIRED, parameter.required());
87             generator.writeObjectFieldStart(SCHEMA);
88             final var schemaEnum = parameter.schema().schemaEnum();
89             if (schemaEnum != null) {
90                 generator.writeArrayFieldStart("enum");
91                 for (final var enumCase : schemaEnum) {
92                     generator.writeString(enumCase);
93                 }
94                 generator.writeEndArray(); //end of enum
95             }
96             generator.writeStringField(TYPE, parameterSchema.type());
97             generator.writeEndObject(); //end of schema
98             if (parameter.description() != null) {
99                 generator.writeStringField(DESCRIPTION, parameter.description());
100             }
101             generator.writeEndObject(); //end of parameter
102         }
103         generator.writeEndArray(); //end of params
104         parameters.remove(contentParam);
105     }
106 }