2 * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.restconf.openapi.model;
10 import static java.util.Objects.requireNonNull;
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;
20 * Archetype for an Operation.
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";
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;
49 protected @Nullable SchemaNode schema() {
53 protected @NonNull String deviceName() {
57 protected @NonNull String moduleName() {
61 protected @Nullable List<ParameterEntity> parameters() {
65 protected @Nullable String refPath() {
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) {
73 this.deviceName = requireNonNull(deviceName);
74 this.moduleName = requireNonNull(moduleName);
75 this.parameters = parameters;
76 this.refPath = refPath;
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();
90 public void generateBasics(@NonNull JsonGenerator generator) throws IOException {
91 generator.writeStringField(DESCRIPTION, description());
92 generator.writeStringField(SUMMARY, summary());
95 protected @NonNull abstract String operation();
97 @NonNull String description() {
98 return schema == null ? "" : schema.getDescription().orElse("");
101 @Nullable String nodeName() {
102 return schema == null ? null : schema.getQName().getLocalName();
105 @NonNull abstract String summary();
107 abstract void generateRequestBody(@NonNull JsonGenerator generator) throws IOException;
109 abstract void generateResponses(@NonNull JsonGenerator generator) throws IOException;
111 void generateTags(final @NonNull JsonGenerator generator) throws IOException {
112 generator.writeArrayFieldStart("tags");
113 generator.writeString(deviceName + " " + moduleName);
114 generator.writeEndArray();
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());
130 generator.writeEndObject(); //end of schema
131 if (parameter.description() != null) {
132 generator.writeStringField(DESCRIPTION, parameter.description());
134 generator.writeEndObject(); //end of parameter
137 generator.writeEndArray(); //end of params
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();