Separate logic of get root path
[netconf.git] / restconf / restconf-openapi / src / main / java / org / opendaylight / restconf / openapi / model / OperationEntity.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
12 import com.fasterxml.jackson.core.JsonGenerator;
13 import java.io.IOException;
14 import java.util.List;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.eclipse.jdt.annotation.Nullable;
17 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
18
19 /**
20  * Archetype for an Operation.
21  */
22 public abstract sealed class OperationEntity extends OpenApiEntity permits DeleteEntity, GetEntity, PatchEntity,
23         PostEntity, PutEntity {
24     protected static final String SCHEMA = "schema";
25     protected static final String SUMMARY_TEMPLATE = "%s - %s - %s - %s";
26     protected static final String RESPONSES = "responses";
27     protected static final String DESCRIPTION = "description";
28     protected static final String OBJECT = "object";
29     protected static final String CONTENT = "content";
30     protected static final String COMPONENTS_PREFIX = "#/components/schemas/";
31     protected static final String PROPERTIES = "properties";
32     protected static final String TYPE = "type";
33     protected static final String ARRAY = "array";
34     protected static final String ITEMS = "items";
35     protected static final String REF = "$ref";
36     protected static final String PARAMETERS = "parameters";
37     protected static final String SUMMARY = "summary";
38     protected static final String NAME = "name";
39     protected static final String IN = "in";
40     protected static final String REQUIRED = "required";
41     protected static final String REQUEST_BODY = "requestBody";
42
43     private final @Nullable SchemaNode schema;
44     private final @NonNull String deviceName;
45     private final @NonNull String moduleName;
46     private final @Nullable String refPath;
47     private final @Nullable List<ParameterEntity> parameters;
48
49     protected @Nullable SchemaNode schema() {
50         return schema;
51     }
52
53     protected @NonNull String deviceName() {
54         return deviceName;
55     }
56
57     protected @NonNull String moduleName() {
58         return moduleName;
59     }
60
61     protected @Nullable List<ParameterEntity> parameters() {
62         return parameters;
63     }
64
65     protected @Nullable String refPath() {
66         return refPath;
67     }
68
69     public OperationEntity(final @Nullable SchemaNode schema, final @NonNull String deviceName,
70             final @NonNull String moduleName, final @Nullable List<ParameterEntity> parameters,
71             final @Nullable String refPath) {
72         this.schema = schema;
73         this.deviceName = requireNonNull(deviceName);
74         this.moduleName = requireNonNull(moduleName);
75         this.parameters = parameters;
76         this.refPath = refPath;
77     }
78
79     @Override
80     public void generate(@NonNull JsonGenerator generator) throws IOException {
81         generator.writeObjectFieldStart(operation());
82         generateBasics(generator);
83         generateRequestBody(generator);
84         generateResponses(generator);
85         generateTags(generator);
86         generateParams(generator);
87         generator.writeEndObject();
88     }
89
90     public void generateBasics(@NonNull JsonGenerator generator) throws IOException {
91         generator.writeStringField(DESCRIPTION, description());
92         generator.writeStringField(SUMMARY, summary());
93     }
94
95     protected @NonNull abstract String operation();
96
97     @NonNull String description() {
98         return schema == null ? "" : schema.getDescription().orElse("");
99     }
100
101     @Nullable String nodeName() {
102         return schema == null ? null : schema.getQName().getLocalName();
103     }
104
105     @NonNull abstract String summary();
106
107     abstract void generateRequestBody(@NonNull JsonGenerator generator) throws IOException;
108
109     abstract void generateResponses(@NonNull JsonGenerator generator) throws IOException;
110
111     void generateTags(final @NonNull JsonGenerator generator) throws IOException {
112         generator.writeArrayFieldStart("tags");
113         generator.writeString(deviceName + " " + moduleName);
114         generator.writeEndArray();
115     }
116
117     void generateParams(final @NonNull JsonGenerator generator) throws IOException {
118         generator.writeArrayFieldStart(PARAMETERS);
119         final var parametersList = requireNonNull(parameters());
120         if (!parametersList.isEmpty()) {
121             for (final var parameter : parametersList) {
122                 generator.writeStartObject();
123                 generator.writeStringField(NAME, parameter.name());
124                 generator.writeStringField(IN, parameter.in());
125                 generator.writeBooleanField(REQUIRED, parameter.required());
126                 generator.writeObjectFieldStart(SCHEMA);
127                 if (parameter.schema() != null) {
128                     generator.writeStringField(TYPE, parameter.schema().type());
129                 }
130                 generator.writeEndObject(); //end of schema
131                 if (parameter.description() != null) {
132                     generator.writeStringField(DESCRIPTION, parameter.description());
133                 }
134                 generator.writeEndObject(); //end of parameter
135             }
136         }
137         generator.writeEndArray(); //end of params
138     }
139
140     protected static void generateMediaTypeSchemaRef(final @NonNull JsonGenerator generator,
141             final @NonNull String mediaType, final @NonNull String ref) throws IOException {
142         generator.writeObjectFieldStart(mediaType);
143         generator.writeObjectFieldStart(SCHEMA);
144         generator.writeStringField(REF, ref);
145         generator.writeEndObject();
146         generator.writeEndObject();
147     }
148 }