Skip to content

Commit db4d461

Browse files
committed
[WIP] MicroProfile OpenAPI 4.2 updates
Signed-off-by: Michael Edgar <michael@xlate.io>
1 parent 0d6025f commit db4d461

4 files changed

Lines changed: 50 additions & 18 deletions

File tree

core/src/main/java/io/smallrye/openapi/runtime/io/ModelIO.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,15 @@ public T read(AnnotationValue annotation) {
219219
.orElse(null);
220220
}
221221

222-
@SuppressWarnings("unchecked")
223222
public <C extends Constructible> T read(Class<C> type, AnnotationInstance annotation) {
223+
return read(type, annotation, new String[0]);
224+
}
225+
226+
@SuppressWarnings("unchecked")
227+
public <C extends Constructible> T read(Class<C> type, AnnotationInstance annotation, String... ignoredProperties) {
224228
IoLogging.logger.singleAnnotation(annotation.name().toString());
225229
BaseModel<C> model = (BaseModel<C>) OASFactory.createObject(type);
230+
Set<String> ignoredNames = Set.of(ignoredProperties);
226231

227232
for (AnnotationValue annotationValue : annotation.values()) {
228233
Object value = scannerContext().annotations().value(annotation, annotationValue);
@@ -234,7 +239,7 @@ public <C extends Constructible> T read(Class<C> type, AnnotationInstance annota
234239
model.setRef(annotationValue.asString());
235240
} else if ("extensions".equals(name) && Extensible.class.isAssignableFrom(type)) {
236241
((BaseExtensibleModel<?>) model).setExtensions(extensionIO().readExtensible(annotation));
237-
} else {
242+
} else if (!ignoredNames.contains(name)) {
238243
model.setProperty(name, value);
239244
}
240245
}
Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,56 @@
11
package io.smallrye.openapi.runtime.io.headers;
22

3-
import org.eclipse.microprofile.openapi.OASFactory;
43
import org.eclipse.microprofile.openapi.models.headers.Header;
54
import org.jboss.jandex.AnnotationInstance;
5+
import org.jboss.jandex.AnnotationValue;
66

7-
import io.smallrye.openapi.model.ReferenceType;
87
import io.smallrye.openapi.runtime.io.IOContext;
9-
import io.smallrye.openapi.runtime.io.IoLogging;
108
import io.smallrye.openapi.runtime.io.MapModelIO;
119
import io.smallrye.openapi.runtime.io.Names;
1210
import io.smallrye.openapi.runtime.io.ReferenceIO;
1311

1412
public class HeaderIO<V, A extends V, O extends V, AB, OB> extends MapModelIO<Header, V, A, O, AB, OB>
1513
implements ReferenceIO<V, A, O, AB, OB> {
1614

17-
private static final String PROP_DESCRIPTION = "description";
1815
private static final String PROP_SCHEMA = "schema";
19-
private static final String PROP_ALLOW_EMPTY_VALUE = "allowEmptyValue";
20-
private static final String PROP_REQUIRED = "required";
21-
private static final String PROP_DEPRECATED = "deprecated";
16+
private static final String PROP_EXAMPLE = "example";
17+
private static final String PROP_EXAMPLES = "examples";
2218

2319
public HeaderIO(IOContext<V, A, O, AB, OB> context) {
2420
super(context, Names.HEADER, Names.create(Header.class));
2521
}
2622

2723
@Override
2824
public Header read(AnnotationInstance annotation) {
29-
IoLogging.logger.singleAnnotation("@Header");
30-
Header header = OASFactory.createHeader();
31-
header.setRef(ReferenceType.HEADER.refValue(annotation));
32-
header.setDescription(value(annotation, PROP_DESCRIPTION));
33-
header.setSchema(schemaIO().read(annotation.value(PROP_SCHEMA)));
34-
header.setRequired(value(annotation, PROP_REQUIRED));
35-
header.setDeprecated(value(annotation, PROP_DEPRECATED));
36-
header.setAllowEmptyValue(value(annotation, PROP_ALLOW_EMPTY_VALUE));
37-
header.setExtensions(extensionIO().readExtensible(annotation));
25+
Header header = read(Header.class, annotation, "name");
26+
27+
if (header.getExample() != null || header.getExamples() != null) {
28+
/*
29+
* Save the header for later parsing. The schema may not yet be set
30+
* so we do not know if it should be parsed.
31+
*/
32+
scannerContext().getUnparsedExamples().add(header);
33+
}
34+
3835
return header;
3936
}
37+
38+
@Override
39+
protected boolean setProperty(Header model, AnnotationValue value) {
40+
switch (value.name()) {
41+
case PROP_SCHEMA:
42+
model.setSchema(schemaIO().read(value));
43+
return true;
44+
case PROP_EXAMPLES:
45+
model.setExamples(exampleObjectIO().readMap(value));
46+
return true;
47+
case PROP_EXAMPLE:
48+
model.setExample(value.asString());
49+
return true;
50+
default:
51+
break;
52+
}
53+
54+
return false;
55+
}
4056
}

core/src/main/java/io/smallrye/openapi/runtime/scanner/OpenApiAnnotationScanner.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.eclipse.microprofile.openapi.models.OpenAPI;
2424
import org.eclipse.microprofile.openapi.models.Paths;
2525
import org.eclipse.microprofile.openapi.models.examples.Example;
26+
import org.eclipse.microprofile.openapi.models.headers.Header;
2627
import org.eclipse.microprofile.openapi.models.media.MediaType;
2728
import org.eclipse.microprofile.openapi.models.media.Schema.SchemaType;
2829
import org.eclipse.microprofile.openapi.models.parameters.Parameter;
@@ -417,6 +418,10 @@ private void parseExamples() {
417418
MediaType mediaType = (MediaType) model;
418419
parseExample(mediaType.getExample(), mediaType::setExample);
419420
examples = mediaType.getExamples();
421+
} else if (model instanceof Header) {
422+
Header header = (Header) model;
423+
parseExample(header.getExample(), header::setExample);
424+
examples = header.getExamples();
420425
}
421426

422427
if (examples != null) {

core/src/main/java/io/smallrye/openapi/runtime/scanner/spi/AnnotationScanner.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.stream.Stream;
1919

2020
import org.eclipse.microprofile.openapi.OASFactory;
21+
import org.eclipse.microprofile.openapi.models.ExternalDocumentation;
2122
import org.eclipse.microprofile.openapi.models.OpenAPI;
2223
import org.eclipse.microprofile.openapi.models.Operation;
2324
import org.eclipse.microprofile.openapi.models.callbacks.Callback;
@@ -313,6 +314,11 @@ default Optional<Operation> processOperation(final AnnotationScannerContext cont
313314
saveOperationId(context, resourceClass, method, operationId);
314315
}
315316

317+
ExternalDocumentation externalDocs = context.io().extDocIO().read(method);
318+
if (externalDocs != null) {
319+
operation.setExternalDocs(externalDocs);
320+
}
321+
316322
return Optional.of(operation);
317323
}
318324

0 commit comments

Comments
 (0)