Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix NPE with @JsonIdentityInfo at class level #3908

Merged
merged 4 commits into from
Apr 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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 @@ -142,15 +126,8 @@ public void testJsonIdentityCyclic() throws IOException {
" type: string\n" +
" WithoutJsonIdentityReference:\n" +
" $ref: '#/components/schemas/SourceDefinition10'\n" +
" SourceDefinition3:\n" +
" type: object\n" +
" properties:\n" +
" name:\n" +
" type: string\n" +
" driverId:\n" +
" type: string\n" +
" '@id':\n" +
" type: string\n" +
" IntSequenceGeneratorAtClassLevel:\n" +
" $ref: '#/components/schemas/SourceDefinition11'\n" +
" SourceDefinition1:\n" +
" type: object\n" +
" properties:\n" +
Expand All @@ -165,13 +142,39 @@ public void testJsonIdentityCyclic() throws IOException {
" type: string\n" +
" name:\n" +
" type: string\n" +
" SourceDefinition8:\n" +
" SourceDefinition11:\n" +
" type: object\n" +
" properties:\n" +
" 'name':\n" +
" type: string\n" +
" '@id':\n" +
" type: integer\n" +
" format: int32\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 @@ -187,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";

}
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,12 @@ public class SourceDefinition10 {
public String driver;
public String name;
}

@JsonProperty("IntSequenceGeneratorAtClassLevel")
public SourceDefinition11 testIntSequenceGeneratorAtClassLevel;

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
public class SourceDefinition11 {
public String name;
}
}