Skip to content

Commit 458fb2f

Browse files
authored
Jackson views/ignored properties: fix view names, in-line custom schemas (#2063)
Signed-off-by: Michael Edgar <[email protected]>
1 parent 1d86923 commit 458fb2f

File tree

19 files changed

+487
-123
lines changed

19 files changed

+487
-123
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.Arrays;
44
import java.util.Collection;
5+
import java.util.LinkedHashMap;
56
import java.util.Map;
67
import java.util.Optional;
78
import java.util.function.BiFunction;
@@ -65,6 +66,9 @@ public Map<String, T> readMap(Collection<AnnotationInstance> annotations,
6566

6667
protected Map<String, T> readMap(Collection<AnnotationInstance> annotations,
6768
Function<AnnotationInstance, Optional<String>> nameFn, BiFunction<String, AnnotationInstance, T> reader) {
69+
if (annotations.isEmpty()) {
70+
return new LinkedHashMap<>(0);
71+
}
6872
IoLogging.logger.annotationsMap('@' + annotationName.local());
6973
return annotations.stream()
7074
.map(annotation -> nameFn.apply(annotation).map(name -> entry(name, reader.apply(name, annotation))))

core/src/main/java/io/smallrye/openapi/runtime/io/media/DiscriminatorIO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ public DiscriminatorIO(IOContext<V, A, O, AB, OB> context) {
3939
*/
4040
@Override
4141
public Discriminator read(AnnotationInstance annotation) {
42-
IoLogging.logger.singleAnnotationAs("@Schema", "Discriminator");
4342
String propertyName = value(annotation, SchemaConstant.PROP_DISCRIMINATOR_PROPERTY);
4443
AnnotationInstance[] mapping = value(annotation, SchemaConstant.PROP_DISCRIMINATOR_MAPPING);
4544

4645
if (propertyName == null && mapping == null) {
4746
return null;
4847
}
4948

49+
IoLogging.logger.singleAnnotationAs("@Schema", "Discriminator");
5050
Discriminator discriminator = OASFactory.createDiscriminator();
5151

5252
/*

core/src/main/java/io/smallrye/openapi/runtime/io/servers/ServerIO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public List<Server> readList(AnnotationInstance[] annotations) {
4444
}
4545

4646
public List<Server> readList(Collection<AnnotationInstance> annotations) {
47+
if (annotations.isEmpty()) {
48+
return new ArrayList<>(0);
49+
}
4750
IoLogging.logger.annotationsArray("@Server");
4851
return annotations.stream()
4952
.map(this::read)

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

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public class SchemaRegistry {
6565
*
6666
* @param type
6767
* the {@link Type} the {@link Schema} applies to
68+
* @param views types applied to the currently-active JsonView (Jackson annotation)
6869
* @param resolver
6970
* a {@link TypeResolver} that will be used to resolve
7071
* parameterized and wildcard types
@@ -73,7 +74,7 @@ public class SchemaRegistry {
7374
* @return the same schema if not eligible for registration, or a reference
7475
* to the schema registered for the given Type
7576
*/
76-
public Schema checkRegistration(Type type, Set<Type> views, TypeResolver resolver, Schema schema) {
77+
public Schema checkRegistration(Type type, Map<Type, Boolean> views, TypeResolver resolver, Schema schema) {
7778
return register(type, views, resolver, schema, (reg, key) -> reg.register(key, schema, null));
7879
}
7980

@@ -99,6 +100,7 @@ public Schema checkRegistration(Type type, Set<Type> views, TypeResolver resolve
99100
*
100101
* @param type
101102
* the {@link Type} the {@link Schema} applies to
103+
* @param views types applied to the currently-active JsonView (Jackson annotation)
102104
* @param resolver
103105
* a {@link TypeResolver} that will be used to resolve
104106
* parameterized and wildcard types
@@ -107,11 +109,11 @@ public Schema checkRegistration(Type type, Set<Type> views, TypeResolver resolve
107109
* @return the same schema if not eligible for registration, or a reference
108110
* to the schema registered for the given Type
109111
*/
110-
public Schema registerReference(Type type, Set<Type> views, TypeResolver resolver, Schema schema) {
112+
public Schema registerReference(Type type, Map<Type, Boolean> views, TypeResolver resolver, Schema schema) {
111113
return register(type, views, resolver, schema, SchemaRegistry::registerReference);
112114
}
113115

114-
public Schema register(Type type, Set<Type> views, TypeResolver resolver, Schema schema,
116+
public Schema register(Type type, Map<Type, Boolean> views, TypeResolver resolver, Schema schema,
115117
BiFunction<SchemaRegistry, TypeKey, Schema> registrationAction) {
116118

117119
final Type resolvedType = TypeResolver.resolve(type, resolver);
@@ -130,7 +132,7 @@ public Schema register(Type type, Set<Type> views, TypeResolver resolver, Schema
130132
return schema;
131133
}
132134

133-
TypeKey key = new TypeKey(resolvedType, views);
135+
TypeKey key = keyFor(resolvedType, views);
134136

135137
if (hasRef(key)) {
136138
schema = lookupRef(key);
@@ -153,7 +155,7 @@ public Schema register(Type type, Set<Type> views, TypeResolver resolver, Schema
153155
* @param resolver resolver for type parameter
154156
* @return true when schema references are enabled and the type is present in the registry, otherwise false
155157
*/
156-
public boolean hasSchema(Type type, Set<Type> views, TypeResolver resolver) {
158+
public boolean hasSchema(Type type, Map<Type, Boolean> views, TypeResolver resolver) {
157159
if (disabled) {
158160
return false;
159161
}
@@ -235,11 +237,20 @@ public SchemaRegistry(AnnotationScannerContext context) {
235237
return;
236238
}
237239

238-
this.register(new TypeKey(type, Collections.emptySet()), schema, Extensions.getName(schema));
240+
this.register(keyFor(type, Collections.emptyMap()), schema, Extensions.getName(schema));
239241
ScannerLogging.logger.configSchemaRegistered(typeSignature);
240242
});
241243
}
242244

245+
private static TypeKey keyFor(Type type, Map<Type, Boolean> views) {
246+
if (TypeUtil.knownJavaType(type.name())) {
247+
// do not apply views for JDK types
248+
return new TypeKey(type, Collections.emptyMap());
249+
}
250+
251+
return new TypeKey(type, views);
252+
}
253+
243254
/**
244255
* Register the provided {@link Schema} for the provided {@link Type}. If an
245256
* existing schema has already been registered for the type, it will be
@@ -253,8 +264,8 @@ public SchemaRegistry(AnnotationScannerContext context) {
253264
* {@link Schema} to add to the registry
254265
* @return a reference to the newly registered {@link Schema}
255266
*/
256-
public Schema register(Type entityType, Set<Type> views, Schema schema) {
257-
TypeKey key = new TypeKey(entityType, views);
267+
public Schema register(Type entityType, Map<Type, Boolean> views, Schema schema) {
268+
TypeKey key = keyFor(entityType, views);
258269

259270
if (hasRef(key)) {
260271
// This is a replacement registration
@@ -324,20 +335,20 @@ String deriveName(TypeKey key, String schemaName) {
324335
return name;
325336
}
326337

327-
public Schema lookupRef(Type instanceType, Set<Type> views) {
328-
return lookupRef(new TypeKey(instanceType, views));
338+
public Schema lookupRef(Type instanceType, Map<Type, Boolean> views) {
339+
return lookupRef(keyFor(instanceType, views));
329340
}
330341

331-
public boolean hasRef(Type instanceType, Set<Type> views) {
332-
return hasRef(new TypeKey(instanceType, views));
342+
public boolean hasRef(Type instanceType, Map<Type, Boolean> views) {
343+
return hasRef(keyFor(instanceType, views));
333344
}
334345

335-
public Schema lookupSchema(Type instanceType, Set<Type> views) {
336-
return lookupSchema(new TypeKey(instanceType, views));
346+
public Schema lookupSchema(Type instanceType, Map<Type, Boolean> views) {
347+
return lookupSchema(keyFor(instanceType, views));
337348
}
338349

339-
public boolean hasSchema(Type instanceType, Set<Type> views) {
340-
return hasSchema(new TypeKey(instanceType, views));
350+
public boolean hasSchema(Type instanceType, Map<Type, Boolean> views) {
351+
return hasSchema(keyFor(instanceType, views));
341352
}
342353

343354
public boolean isTypeRegistrationSupported(Type type, Schema schema) {
@@ -398,20 +409,14 @@ private void remove(TypeKey key) {
398409
*/
399410
public static final class TypeKey {
400411
private final Type type;
401-
private final Set<Type> views;
412+
private final Map<Type, Boolean> views;
402413
private int hashCode = 0;
403414

404-
TypeKey(Type type, Set<Type> views) {
415+
TypeKey(Type type, Map<Type, Boolean> views) {
405416
this.type = type;
406-
this.views = new LinkedHashSet<>(views);
417+
this.views = new LinkedHashMap<>(views);
407418
}
408419

409-
/*
410-
* TypeKey(Type type) {
411-
* this(type, Collections.emptySet());
412-
* }
413-
*/
414-
415420
public String defaultName() {
416421
StringBuilder name = new StringBuilder(type.name().local());
417422

@@ -436,9 +441,12 @@ public String viewSuffix() {
436441

437442
StringBuilder suffix = new StringBuilder();
438443

439-
for (Type view : views) {
440-
suffix.append('_');
441-
suffix.append(view.name().local());
444+
for (Map.Entry<Type, Boolean> view : views.entrySet()) {
445+
if (Boolean.TRUE.equals(view.getValue())) {
446+
// Only views that are directly specified contribute to the schema's name
447+
suffix.append('_');
448+
suffix.append(view.getKey().name().local());
449+
}
442450
}
443451

444452
return suffix.toString();

core/src/main/java/io/smallrye/openapi/runtime/scanner/dataobject/AnnotationTargetProcessor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ Schema processField() {
159159
// The registeredTypeSchema will be a reference to typeSchema if registration occurs
160160
registrationType = TypeUtil.isWrappedType(entityType) ? fieldType : entityType;
161161
registrationCandidate = !JandexUtil.isRef(schemaAnnotation) &&
162+
typeProcessor.allowRegistration() &&
162163
schemaRegistry.register(registrationType, context.getJsonViews(), typeResolver,
163164
initTypeSchema,
164165
(reg, key) -> null) != initTypeSchema;

0 commit comments

Comments
 (0)