Skip to content

Commit 3b9e9f1

Browse files
committed
Refactored to use SchemaFactoryWrapper
1 parent 8167745 commit 3b9e9f1

File tree

5 files changed

+157
-45
lines changed

5 files changed

+157
-45
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.fasterxml.jackson.module.jsonSchema.customProperties;
2+
3+
import com.fasterxml.jackson.databind.BeanProperty;
4+
import com.fasterxml.jackson.databind.JavaType;
5+
import com.fasterxml.jackson.databind.JsonMappingException;
6+
import com.fasterxml.jackson.databind.SerializerProvider;
7+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
8+
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
9+
import com.fasterxml.jackson.module.jsonSchema.factories.*;
10+
import com.fasterxml.jackson.module.jsonSchema.types.ArraySchema;
11+
import com.fasterxml.jackson.module.jsonSchema.types.NumberSchema;
12+
import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
13+
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
14+
import com.fasterxml.jackson.module.jsonSchema.validation.AnnotationConstraintResolver;
15+
import com.fasterxml.jackson.module.jsonSchema.validation.ValidationConstraintResolver;
16+
17+
/**
18+
* @author cponomaryov
19+
*/
20+
public class ValidationSchemaFactoryWrapper extends SchemaFactoryWrapper {
21+
22+
private ValidationConstraintResolver constraintResolver;
23+
24+
private static class ValidationSchemaFactoryWrapperFactory extends WrapperFactory {
25+
@Override
26+
public SchemaFactoryWrapper getWrapper(SerializerProvider p) {
27+
SchemaFactoryWrapper wrapper = new ValidationSchemaFactoryWrapper();
28+
wrapper.setProvider(p);
29+
return wrapper;
30+
}
31+
32+
@Override
33+
public SchemaFactoryWrapper getWrapper(SerializerProvider p, VisitorContext rvc) {
34+
SchemaFactoryWrapper wrapper = new ValidationSchemaFactoryWrapper();
35+
wrapper.setProvider(p);
36+
wrapper.setVisitorContext(rvc);
37+
return wrapper;
38+
}
39+
}
40+
41+
public ValidationSchemaFactoryWrapper() {
42+
this(new AnnotationConstraintResolver());
43+
}
44+
45+
public ValidationSchemaFactoryWrapper(ValidationConstraintResolver constraintResolver) {
46+
super(new ValidationSchemaFactoryWrapperFactory());
47+
this.constraintResolver = constraintResolver;
48+
}
49+
50+
@Override
51+
public JsonObjectFormatVisitor expectObjectFormat(JavaType convertedType) {
52+
return new ObjectVisitorDecorator((ObjectVisitor) super.expectObjectFormat(convertedType)) {
53+
private JsonSchema getPropertySchema(BeanProperty writer) {
54+
return ((ObjectSchema) getSchema()).getProperties().get(writer.getName());
55+
}
56+
57+
@Override
58+
public void optionalProperty(BeanProperty writer) throws JsonMappingException {
59+
super.optionalProperty(writer);
60+
addValidationConstraints(getPropertySchema(writer), writer);
61+
}
62+
63+
@Override
64+
public void property(BeanProperty writer) throws JsonMappingException {
65+
super.property(writer);
66+
addValidationConstraints(getPropertySchema(writer), writer);
67+
}
68+
};
69+
}
70+
71+
private JsonSchema addValidationConstraints(JsonSchema schema, BeanProperty prop) {
72+
if (schema.isArraySchema()) {
73+
ArraySchema arraySchema = schema.asArraySchema();
74+
arraySchema.setMaxItems(constraintResolver.getArrayMaxItems(prop));
75+
arraySchema.setMinItems(constraintResolver.getArrayMinItems(prop));
76+
} else if (schema.isNumberSchema()) {
77+
NumberSchema numberSchema = schema.asNumberSchema();
78+
numberSchema.setMaximum(constraintResolver.getNumberMaximum(prop));
79+
numberSchema.setMinimum(constraintResolver.getNumberMinimum(prop));
80+
} else if (schema.isStringSchema()) {
81+
StringSchema stringSchema = schema.asStringSchema();
82+
stringSchema.setMaxLength(constraintResolver.getStringMaxLength(prop));
83+
stringSchema.setMinLength(constraintResolver.getStringMinLength(prop));
84+
}
85+
return schema;
86+
}
87+
88+
}

src/main/java/com/fasterxml/jackson/module/jsonSchema/factories/ObjectVisitor.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
66
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
77
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
8-
import com.fasterxml.jackson.module.jsonSchema.types.ArraySchema;
9-
import com.fasterxml.jackson.module.jsonSchema.types.NumberSchema;
108
import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
11-
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
12-
import com.fasterxml.jackson.module.jsonSchema.validation.ValidationConstraintResolver;
139
import com.fasterxml.jackson.module.jsonSchema.types.ReferenceSchema;
1410

1511
public class ObjectVisitor extends JsonObjectFormatVisitor.Base
@@ -121,25 +117,7 @@ protected JsonSchema propertySchema(BeanProperty prop)
121117
}
122118
ser.acceptJsonFormatVisitor(visitor, type);
123119
}
124-
return setValidationConstraints(visitor.finalSchema(), prop);
125-
}
126-
127-
private JsonSchema setValidationConstraints(JsonSchema schema, BeanProperty prop) {
128-
ValidationConstraintResolver constraintResolver = wrapperFactory.getValidationConstraintResolver();
129-
if (schema.isArraySchema()) {
130-
ArraySchema arraySchema = schema.asArraySchema();
131-
arraySchema.setMaxItems(constraintResolver.getArrayMaxItems(prop));
132-
arraySchema.setMinItems(constraintResolver.getArrayMinItems(prop));
133-
} else if (schema.isNumberSchema()) {
134-
NumberSchema numberSchema = schema.asNumberSchema();
135-
numberSchema.setMaximum(constraintResolver.getNumberMaximum(prop));
136-
numberSchema.setMinimum(constraintResolver.getNumberMinimum(prop));
137-
} else if (schema.isStringSchema()) {
138-
StringSchema stringSchema = schema.asStringSchema();
139-
stringSchema.setMaxLength(constraintResolver.getStringMaxLength(prop));
140-
stringSchema.setMinLength(constraintResolver.getStringMinLength(prop));
141-
}
142-
return schema;
120+
return visitor.finalSchema();
143121
}
144122

145123
protected JsonSchema propertySchema(JsonFormatVisitable handler, JavaType propertyTypeHint)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.fasterxml.jackson.module.jsonSchema.factories;
2+
3+
import com.fasterxml.jackson.databind.BeanProperty;
4+
import com.fasterxml.jackson.databind.JavaType;
5+
import com.fasterxml.jackson.databind.JsonMappingException;
6+
import com.fasterxml.jackson.databind.SerializerProvider;
7+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
8+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
9+
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
10+
11+
/**
12+
* @author cponomaryov
13+
*/
14+
public class ObjectVisitorDecorator implements JsonObjectFormatVisitor, JsonSchemaProducer {
15+
16+
protected ObjectVisitor objectVisitor;
17+
18+
public ObjectVisitorDecorator(ObjectVisitor objectVisitor) {
19+
this.objectVisitor = objectVisitor;
20+
}
21+
22+
@Override
23+
public JsonSchema getSchema() {
24+
return objectVisitor.getSchema();
25+
}
26+
27+
@Override
28+
public SerializerProvider getProvider() {
29+
return objectVisitor.getProvider();
30+
}
31+
32+
@Override
33+
public void setProvider(SerializerProvider serializerProvider) {
34+
objectVisitor.setProvider(serializerProvider);
35+
}
36+
37+
@Override
38+
public void optionalProperty(BeanProperty writer) throws JsonMappingException {
39+
objectVisitor.optionalProperty(writer);
40+
}
41+
42+
@Override
43+
public void optionalProperty(String name, JsonFormatVisitable handler, JavaType propertyTypeHint) throws JsonMappingException {
44+
objectVisitor.optionalProperty(name, handler, propertyTypeHint);
45+
}
46+
47+
@Override
48+
public void property(BeanProperty writer) throws JsonMappingException {
49+
objectVisitor.property(writer);
50+
}
51+
52+
@Override
53+
public void property(String name, JsonFormatVisitable handler, JavaType propertyTypeHint) throws JsonMappingException {
54+
objectVisitor.property(name, handler, propertyTypeHint);
55+
}
56+
57+
}

src/main/java/com/fasterxml/jackson/module/jsonSchema/factories/WrapperFactory.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.fasterxml.jackson.module.jsonSchema.factories;
22

33
import com.fasterxml.jackson.databind.SerializerProvider;
4-
import com.fasterxml.jackson.module.jsonSchema.validation.AnnotationConstraintResolver;
5-
import com.fasterxml.jackson.module.jsonSchema.validation.ValidationConstraintResolver;
64

75
/**
86
* Exists to supply {@link SchemaFactoryWrapper} or its subclasses
@@ -11,20 +9,6 @@
119
*/
1210
public class WrapperFactory {
1311

14-
private ValidationConstraintResolver validationConstraintResolver;
15-
16-
public WrapperFactory() {
17-
this(new AnnotationConstraintResolver());
18-
}
19-
20-
public WrapperFactory(ValidationConstraintResolver validationConstraintResolver) {
21-
this.validationConstraintResolver = validationConstraintResolver;
22-
}
23-
24-
public ValidationConstraintResolver getValidationConstraintResolver() {
25-
return validationConstraintResolver;
26-
}
27-
2812
public SchemaFactoryWrapper getWrapper(SerializerProvider provider) {
2913
return new SchemaFactoryWrapper(provider);
3014
}

src/test/java/com/fasterxml/jackson/module/jsonSchema/TestSetValidationConstraints.java renamed to src/test/java/com/fasterxml/jackson/module/jsonSchema/ValidationSchemaFactoryWrapperTest.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.module.jsonSchema;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.module.jsonSchema.customProperties.ValidationSchemaFactoryWrapper;
45
import com.fasterxml.jackson.module.jsonSchema.types.ArraySchema;
56
import com.fasterxml.jackson.module.jsonSchema.types.NumberSchema;
67
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
@@ -12,7 +13,7 @@
1213
/**
1314
* @author cponomaryov
1415
*/
15-
public class TestSetValidationConstraints extends SchemaTestBase {
16+
public class ValidationSchemaFactoryWrapperTest extends SchemaTestBase {
1617

1718
public static class ValidationBean {
1819

@@ -261,11 +262,15 @@ private Object[][] stringTestData() {
261262
* Test set validation constraints
262263
*/
263264
@SuppressWarnings("SuspiciousMethodCalls")
264-
public void testSetValidationConstraints() throws Exception {
265-
JsonSchemaGenerator generator = new JsonSchemaGenerator(MAPPER);
266-
JsonSchema jsonSchema = generator.generateSchema(ValidationBean.class);
267-
assertNotNull(jsonSchema);
268-
assertTrue(jsonSchema.isObjectSchema());
265+
public void testAddingValidationConstraints() throws Exception {
266+
ValidationSchemaFactoryWrapper visitor = new ValidationSchemaFactoryWrapper();
267+
ObjectMapper mapper = new ObjectMapper();
268+
269+
mapper.acceptJsonFormatVisitor(ValidationBean.class, visitor);
270+
JsonSchema jsonSchema = visitor.finalSchema();
271+
272+
assertNotNull("schema should not be null.", jsonSchema);
273+
assertTrue("schema should be an objectSchema.", jsonSchema.isObjectSchema());
269274
Map<String, JsonSchema> properties = jsonSchema.asObjectSchema().getProperties();
270275
assertNotNull(properties);
271276
for (Object[] testCase : listTestData()) {

0 commit comments

Comments
 (0)