Skip to content

Commit 373ccc4

Browse files
committed
Merge pull request #25 from idelvall/master
Proposed patch to issue #24 -- thanks!
2 parents 6f01a11 + d2c8cf7 commit 373ccc4

File tree

5 files changed

+245
-134
lines changed

5 files changed

+245
-134
lines changed

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.fasterxml.jackson.databind.SerializerProvider;
66
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
77
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonMapFormatVisitor;
8+
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
89
import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
910

1011
/**
@@ -19,6 +20,8 @@ public class MapVisitor extends JsonMapFormatVisitor.Base
1920

2021
protected SerializerProvider provider;
2122

23+
private WrapperFactory wrapperFactory = new WrapperFactory();
24+
2225
public MapVisitor(SerializerProvider provider, ObjectSchema schema)
2326
{
2427
this.provider = provider;
@@ -58,10 +61,21 @@ public void keyFormat(JsonFormatVisitable handler, JavaType keyType)
5861
// JSON Schema only allows String types so let's not bother too much
5962
}
6063

61-
@Override
64+
@Override
6265
public void valueFormat(JsonFormatVisitable handler, JavaType valueType)
6366
throws JsonMappingException {
64-
/* Also... not sure what to do with value type either.
65-
*/
67+
68+
// ISSUE #24: https://github.com/FasterXML/jackson-module-jsonSchema/issues/24
69+
70+
JsonSchema valueSchema = propertySchema(handler, valueType);
71+
ObjectSchema.AdditionalProperties ap = new ObjectSchema.SchemaAdditionalProperties(valueSchema.asSimpleTypeSchema());
72+
this.schema.setAdditionalProperties(ap);
73+
}
74+
75+
protected JsonSchema propertySchema(JsonFormatVisitable handler, JavaType propertyTypeHint)
76+
throws JsonMappingException {
77+
SchemaFactoryWrapper visitor = wrapperFactory.getWrapper(getProvider());
78+
handler.acceptJsonFormatVisitor(visitor, propertyTypeHint);
79+
return visitor.finalSchema();
6680
}
6781
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2013 FasterXML.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.fasterxml.jackson.module.jsonSchema.types;
17+
18+
import com.fasterxml.jackson.core.JsonParser;
19+
import com.fasterxml.jackson.core.JsonProcessingException;
20+
import com.fasterxml.jackson.core.TreeNode;
21+
import com.fasterxml.jackson.databind.DeserializationContext;
22+
import com.fasterxml.jackson.databind.JsonDeserializer;
23+
import com.fasterxml.jackson.databind.JsonMappingException;
24+
import com.fasterxml.jackson.databind.ObjectMapper;
25+
import com.fasterxml.jackson.databind.node.BooleanNode;
26+
import com.fasterxml.jackson.databind.node.ObjectNode;
27+
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
28+
import java.io.IOException;
29+
30+
/**
31+
*
32+
* @author Ignacio del Valle Alles
33+
*/
34+
public class AdditionalPropertiesDeserializer extends JsonDeserializer<ObjectSchema.AdditionalProperties> {
35+
36+
@Override
37+
public ObjectSchema.AdditionalProperties deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
38+
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
39+
TreeNode node = mapper.readTree(jp);
40+
String nodeStr = mapper.writeValueAsString(node);
41+
if (node instanceof ObjectNode) {
42+
JsonSchema innerSchema = mapper.readValue(nodeStr, JsonSchema.class);
43+
return new ObjectSchema.SchemaAdditionalProperties(innerSchema);
44+
} else if (node instanceof BooleanNode) {
45+
BooleanNode booleanNode = (BooleanNode) node;
46+
if (booleanNode.booleanValue()) {
47+
return null; // "additionalProperties":true is the default
48+
} else {
49+
return ObjectSchema.NoAdditionalProperties.instance;
50+
}
51+
} else {
52+
throw new JsonMappingException("additionalProperties nodes can only be of "
53+
+ "type boolean or object: " + nodeStr);
54+
}
55+
}
56+
}

src/main/java/com/fasterxml/jackson/module/jsonSchema/types/ObjectSchema.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.fasterxml.jackson.annotation.JsonValue;
1111

1212
import com.fasterxml.jackson.databind.BeanProperty;
13+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1314
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
1415

1516
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
@@ -184,6 +185,7 @@ public void setProperties(Map<String, JsonSchema> properties) {
184185
this.properties = properties;
185186
}
186187

188+
@JsonDeserialize(using = AdditionalPropertiesDeserializer.class)
187189
public static abstract class AdditionalProperties {
188190
@JsonCreator
189191
public AdditionalProperties jsonCreator() {
@@ -222,6 +224,7 @@ public Boolean value() {
222224
public static final NoAdditionalProperties instance = new NoAdditionalProperties();
223225
}
224226

227+
225228
public static class SchemaAdditionalProperties extends AdditionalProperties {
226229

227230
@JsonProperty
@@ -237,6 +240,7 @@ public boolean equals(Object obj) {
237240
getJsonSchema().equals(((SchemaAdditionalProperties)obj).getJsonSchema());
238241
}
239242

243+
@JsonValue
240244
public JsonSchema getJsonSchema() {
241245
return jsonSchema;
242246
}
@@ -333,4 +337,4 @@ public String getDependsOn() {
333337
}
334338
}
335339

336-
}
340+
}

0 commit comments

Comments
 (0)