Skip to content

Commit

Permalink
fix NPE (#3907)
Browse files Browse the repository at this point in the history
  • Loading branch information
daniel-schel authored and frantuma committed Apr 11, 2021
1 parent 5153456 commit 96b072c
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context
if (jsonIdentityReference == null) {
jsonIdentityReference = type.getRawClass().getAnnotation(JsonIdentityReference.class);
}
model = GeneratorWrapper.processJsonIdentity(annotatedType, context, _mapper, jsonIdentityInfo, jsonIdentityReference);
model = new GeneratorWrapper().processJsonIdentity(annotatedType, context, _mapper, jsonIdentityInfo, jsonIdentityReference);
if (model != null) {
return model;
}
Expand Down Expand Up @@ -1047,8 +1047,18 @@ private void handleUnwrapped(List<Schema> props, Schema innerModel, String prefi
}
}

private enum GeneratorWrapper {
PROPERTY(ObjectIdGenerators.PropertyGenerator.class) {

private class GeneratorWrapper {

private final List<Base> wrappers = new ArrayList();


private final class PropertyGeneratorWrapper extends GeneratorWrapper.Base<ObjectIdGenerators.PropertyGenerator> {

public PropertyGeneratorWrapper(Class<? extends ObjectIdGenerator> generator) {
super(generator);
}

@Override
protected Schema processAsProperty(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
Expand All @@ -1065,7 +1075,7 @@ protected Schema processAsId(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
final JavaType javaType;
if (type.getType() instanceof JavaType) {
javaType = (JavaType)type.getType();
javaType = (JavaType) type.getType();
} else {
javaType = mapper.constructType(type.getType());
}
Expand Down Expand Up @@ -1099,8 +1109,14 @@ protected Schema processAsId(String propertyName, AnnotatedType type,
}
return null;
}
},
INT(ObjectIdGenerators.IntSequenceGenerator.class) {
}

private final class IntGeneratorWrapper extends GeneratorWrapper.Base<ObjectIdGenerators.IntSequenceGenerator> {

public IntGeneratorWrapper(Class<? extends ObjectIdGenerator> generator) {
super(generator);
}

@Override
protected Schema processAsProperty(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
Expand All @@ -1113,8 +1129,14 @@ protected Schema processAsId(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
return new IntegerSchema();
}
},
UUID(ObjectIdGenerators.UUIDGenerator.class) {

}

private final class UUIDGeneratorWrapper extends GeneratorWrapper.Base<ObjectIdGenerators.UUIDGenerator> {

public UUIDGeneratorWrapper(Class<? extends ObjectIdGenerator> generator) {
super(generator);
}
@Override
protected Schema processAsProperty(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
Expand All @@ -1127,8 +1149,15 @@ protected Schema processAsId(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
return new UUIDSchema();
}
},
NONE(ObjectIdGenerators.None.class) {

}

private final class NoneGeneratorWrapper extends GeneratorWrapper.Base<ObjectIdGenerators.None> {

public NoneGeneratorWrapper(Class<? extends ObjectIdGenerator> generator) {
super(generator);
}

// When generator = ObjectIdGenerators.None.class property should be processed as normal property.
@Override
protected Schema processAsProperty(String propertyName, AnnotatedType type,
Expand All @@ -1141,24 +1170,27 @@ protected Schema processAsId(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper) {
return null;
}
};
}

private final Class<? extends ObjectIdGenerator> generator;
private abstract class Base<T> {

GeneratorWrapper(Class<? extends ObjectIdGenerator> generator) {
this.generator = generator;
}
private final Class<? extends ObjectIdGenerator> generator;

protected abstract Schema processAsProperty(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper);
Base(Class<? extends ObjectIdGenerator> generator) {
this.generator = generator;
}

protected abstract Schema processAsId(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper);
protected abstract Schema processAsProperty(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper);

public static Schema processJsonIdentity(AnnotatedType type, ModelConverterContext context,
protected abstract Schema processAsId(String propertyName, AnnotatedType type,
ModelConverterContext context, ObjectMapper mapper);
}

public Schema processJsonIdentity(AnnotatedType type, ModelConverterContext context,
ObjectMapper mapper, JsonIdentityInfo identityInfo,
JsonIdentityReference identityReference) {
final GeneratorWrapper wrapper = identityInfo != null ? getWrapper(identityInfo.generator()) : null;
final GeneratorWrapper.Base wrapper = identityInfo != null ? getWrapper(identityInfo.generator()) : null;
if (wrapper == null) {
return null;
}
Expand All @@ -1169,25 +1201,32 @@ public static Schema processJsonIdentity(AnnotatedType type, ModelConverterConte
}
}

private static GeneratorWrapper getWrapper(Class<?> generator) {
for (GeneratorWrapper value : GeneratorWrapper.values()) {
if (value.generator.isAssignableFrom(generator)) {
return value;
}
private GeneratorWrapper.Base getWrapper(Class<? extends ObjectIdGenerator> generator) {
if(ObjectIdGenerators.PropertyGenerator.class.isAssignableFrom(generator)) {
return new PropertyGeneratorWrapper(generator);
} else if(ObjectIdGenerators.IntSequenceGenerator.class.isAssignableFrom(generator)) {
return new IntGeneratorWrapper(generator);
} else if(ObjectIdGenerators.UUIDGenerator.class.isAssignableFrom(generator)) {
return new UUIDGeneratorWrapper(generator);
} else if(ObjectIdGenerators.None.class.isAssignableFrom(generator)) {
return new NoneGeneratorWrapper(generator);
}
return null;
}

private static Schema process(Schema id, String propertyName, AnnotatedType type,
protected Schema process(Schema id, String propertyName, AnnotatedType type,
ModelConverterContext context) {

Schema model = context.resolve(removeJsonIdentityAnnotations(type));
Schema mi = model;
mi.addProperties(propertyName, id);
return new Schema().$ref(StringUtils.isNotEmpty(mi.get$ref())
? mi.get$ref() : mi.getName());
type = removeJsonIdentityAnnotations(type);
Schema model = context.resolve(type);
if(model == null){
model = resolve(type,context, null);
}
model.addProperties(propertyName, id);
return new Schema().$ref(StringUtils.isNotEmpty(model.get$ref())
? model.get$ref() : model.getName());
}
private static AnnotatedType removeJsonIdentityAnnotations(AnnotatedType type) {
private AnnotatedType removeJsonIdentityAnnotations(AnnotatedType type) {
return new AnnotatedType()
.jsonUnwrappedHandler(type.getJsonUnwrappedHandler())
.jsonViewAnnotation(type.getJsonViewAnnotation())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,22 +85,6 @@ public void testJsonIdentityCyclic() throws IOException {
" application/xml: {}\n" +
"components:\n" +
" schemas:\n" +
" SourceDefinition4:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" testName2:\n" +
" type: integer\n" +
" format: int32\n" +
" SourceDefinition5:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" '@id':\n" +
" type: integer\n" +
" format: int32\n" +
" ModelWithJsonIdentity:\n" +
" type: object\n" +
" properties:\n" +
Expand Down Expand Up @@ -144,15 +128,6 @@ public void testJsonIdentityCyclic() throws IOException {
" $ref: '#/components/schemas/SourceDefinition10'\n" +
" IntSequenceGeneratorAtClassLevel:\n" +
" $ref: '#/components/schemas/SourceDefinition11'\n" +
" SourceDefinition3:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" driverId:\n" +
" type: string\n" +
" '@id':\n" +
" type: string\n" +
" SourceDefinition1:\n" +
" type: object\n" +
" properties:\n" +
Expand All @@ -168,20 +143,38 @@ public void testJsonIdentityCyclic() throws IOException {
" name:\n" +
" type: string\n" +
" SourceDefinition11:\n" +
" title: SourceDefinition11\n" +
" type: object\n" +
" properties:\n" +
" 'name':\n" +
" type: string\n" +
" '@id':\n" +
" type: integer\n" +
" format: int32\n"+
" 'name':\n" +
" type: string\n" +
" SourceDefinition8:\n" +
" SourceDefinition3:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" driverId:\n" +
" type: string\n" +
" '@id':\n" +
" type: string\n" +
" SourceDefinition4:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" testName2:\n" +
" type: integer\n" +
" format: int32\n" +
" SourceDefinition5:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" '@id':\n" +
" type: integer\n" +
" format: int32\n" +
" SourceDefinition6:\n" +
" type: object\n" +
" properties:\n" +
Expand All @@ -197,5 +190,13 @@ public void testJsonIdentityCyclic() throws IOException {
" type: string\n" +
" '@id':\n" +
" type: string\n" +
" format: uuid\n";
" format: uuid\n" +
" SourceDefinition8:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" driverId:\n" +
" type: string\n";

}

0 comments on commit 96b072c

Please sign in to comment.