Skip to content

Commit c8de5aa

Browse files
committed
Fix #959
1 parent 7e4e115 commit c8de5aa

File tree

11 files changed

+148
-23
lines changed

11 files changed

+148
-23
lines changed

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Project: jackson-databind
1313
#948: Support leap seconds, any number of millisecond digits for ISO-8601 Dates.
1414
(contributed by Jesse W)
1515
#957: Merge `datatype-jdk7` stuff in (java.nio.file.Path handling)
16+
#959: Schema generation: consider active view, discard non-included properties
1617
- Make `JsonValueFormat` (self-)serializable, deserializable, to/from valid external
1718
value (as per JSON Schema spec)
1819

src/main/java/com/fasterxml/jackson/databind/BeanProperty.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,17 @@ public interface BeanProperty extends Named
144144
* Note that not all implementations support traversal with this
145145
* method; those that do not should throw
146146
* {@link UnsupportedOperationException}.
147+
*<p>
148+
* NOTE: Starting with 2.7, takes explicit {@link SerializerProvider}
149+
* argument to reduce the need to rely on provider visitor may or may not
150+
* have assigned.
147151
*
148152
* @param objectVisitor Visitor to used as the callback handler
149153
*
150-
* @since 2.2
154+
* @since 2.2 (although signature did change in 2.7)
151155
*/
152-
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor)
156+
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor,
157+
SerializerProvider provider)
153158
throws JsonMappingException;
154159

155160
/*
@@ -256,7 +261,8 @@ public JsonFormat.Value findFormatOverrides(AnnotationIntrospector intr) {
256261
* visited. Rather, other implementations should handle it.
257262
*/
258263
@Override
259-
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor) {
264+
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor,
265+
SerializerProvider provider) {
260266
throw new UnsupportedOperationException("Instances of "+getClass().getName()+" should not get visited");
261267
}
262268
}

src/main/java/com/fasterxml/jackson/databind/deser/SettableBeanProperty.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.lang.annotation.Annotation;
55

66
import com.fasterxml.jackson.core.*;
7-
87
import com.fasterxml.jackson.databind.*;
98
import com.fasterxml.jackson.databind.deser.impl.FailingDeserializer;
109
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
@@ -347,7 +346,8 @@ public <A extends Annotation> A getContextAnnotation(Class<A> acls) {
347346
}
348347

349348
@Override
350-
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor)
349+
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor,
350+
SerializerProvider provider)
351351
throws JsonMappingException
352352
{
353353
if (isRequired()) {

src/main/java/com/fasterxml/jackson/databind/ser/BeanPropertyWriter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
import java.util.HashMap;
88

99
import com.fasterxml.jackson.annotation.JsonInclude;
10-
1110
import com.fasterxml.jackson.core.JsonGenerator;
1211
import com.fasterxml.jackson.core.SerializableString;
1312
import com.fasterxml.jackson.core.io.SerializedString;
14-
1513
import com.fasterxml.jackson.databind.*;
1614
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
1715
import com.fasterxml.jackson.databind.introspect.*;
@@ -750,7 +748,8 @@ public void serializeAsPlaceholder(Object bean, JsonGenerator gen, SerializerPro
750748

751749
// Also part of BeanProperty implementation
752750
@Override
753-
public void depositSchemaProperty(JsonObjectFormatVisitor v)
751+
public void depositSchemaProperty(JsonObjectFormatVisitor v,
752+
SerializerProvider provider)
754753
throws JsonMappingException
755754
{
756755
if (v != null) {

src/main/java/com/fasterxml/jackson/databind/ser/PropertyWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,10 @@ public abstract void serializeAsPlaceholder(Object value, JsonGenerator jgen, Se
152152
* POJO introspection.
153153
*/
154154
@Override
155-
public abstract void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor)
155+
public abstract void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor,
156+
SerializerProvider provider)
156157
throws JsonMappingException;
157158

158-
159159
/**
160160
* Legacy method called for JSON Schema generation; should not be called by new code
161161
*

src/main/java/com/fasterxml/jackson/databind/ser/impl/FilteredBeanPropertyWriter.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.fasterxml.jackson.databind.ser.impl;
22

33
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.JsonMappingException;
45
import com.fasterxml.jackson.databind.JsonSerializer;
56
import com.fasterxml.jackson.databind.SerializerProvider;
7+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
68
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
79
import com.fasterxml.jackson.databind.util.NameTransformer;
810

@@ -81,6 +83,16 @@ public void serializeAsElement(Object bean, JsonGenerator jgen, SerializerProvid
8183
_delegate.serializeAsPlaceholder(bean, jgen, prov);
8284
}
8385
}
86+
87+
@Override
88+
public void depositSchemaProperty(JsonObjectFormatVisitor v,
89+
SerializerProvider provider) throws JsonMappingException
90+
{
91+
Class<?> activeView = provider.getActiveView();
92+
if (activeView == null || _view.isAssignableFrom(activeView)) {
93+
super.depositSchemaProperty(v, provider);
94+
}
95+
}
8496
}
8597

8698
private final static class MultiView
@@ -151,5 +163,22 @@ public void serializeAsElement(Object bean, JsonGenerator jgen, SerializerProvid
151163
}
152164
_delegate.serializeAsElement(bean, jgen, prov);
153165
}
166+
167+
@Override
168+
public void depositSchemaProperty(JsonObjectFormatVisitor v,
169+
SerializerProvider provider) throws JsonMappingException
170+
{
171+
Class<?> activeView = provider.getActiveView();
172+
if (activeView != null) {
173+
int i = 0, len = _views.length;
174+
for (; i < len; ++i) {
175+
if (_views[i].isAssignableFrom(activeView)) break;
176+
}
177+
if (i == len) { // not match? Just don't deposit
178+
return;
179+
}
180+
}
181+
super.depositSchemaProperty(v, provider);
182+
}
154183
}
155184
}

src/main/java/com/fasterxml/jackson/databind/ser/impl/SimpleBeanPropertyFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public void depositSchemaProperty(BeanPropertyWriter writer,
189189
throws JsonMappingException
190190
{
191191
if (include(writer)) {
192-
writer.depositSchemaProperty(objectVisitor);
192+
writer.depositSchemaProperty(objectVisitor, provider);
193193
}
194194
}
195195

@@ -238,7 +238,7 @@ public void depositSchemaProperty(PropertyWriter writer,
238238
SerializerProvider provider) throws JsonMappingException
239239
{
240240
if (include(writer)) {
241-
writer.depositSchemaProperty(objectVisitor);
241+
writer.depositSchemaProperty(objectVisitor, provider);
242242
}
243243
}
244244

src/main/java/com/fasterxml/jackson/databind/ser/impl/UnwrappingBeanPropertyWriter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ public void assignSerializer(JsonSerializer<Object> ser)
151151
*/
152152

153153
@Override
154-
public void depositSchemaProperty(final JsonObjectFormatVisitor visitor)
155-
throws JsonMappingException {
156-
SerializerProvider provider = visitor.getProvider();
154+
public void depositSchemaProperty(final JsonObjectFormatVisitor visitor,
155+
SerializerProvider provider) throws JsonMappingException
156+
{
157157
JsonSerializer<Object> ser = provider
158158
.findValueSerializer(this.getType(), this)
159159
.unwrappingSerializer(_nameTransformer);
@@ -169,7 +169,7 @@ public JsonObjectFormatVisitor expectObjectFormat(JavaType type)
169169
}
170170
}, this.getType());
171171
} else {
172-
super.depositSchemaProperty(visitor);
172+
super.depositSchemaProperty(visitor, provider);
173173
}
174174
}
175175

src/main/java/com/fasterxml/jackson/databind/ser/std/BeanSerializerBase.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ protected final String _customTypeId(Object bean)
659659
*/
660660

661661
protected void serializeFields(Object bean, JsonGenerator gen, SerializerProvider provider)
662-
throws IOException, JsonGenerationException
662+
throws IOException
663663
{
664664
final BeanPropertyWriter[] props;
665665
if (_filteredProps != null && provider.getActiveView() != null) {
@@ -790,15 +790,28 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
790790
if (objectVisitor == null) {
791791
return;
792792
}
793+
final SerializerProvider provider = visitor.getProvider();
793794
if (_propertyFilterId != null) {
794795
PropertyFilter filter = findPropertyFilter(visitor.getProvider(),
795796
_propertyFilterId, null);
796-
for (int i = 0; i < _props.length; i++) {
797-
filter.depositSchemaProperty(_props[i], objectVisitor, visitor.getProvider());
797+
for (int i = 0, end = _props.length; i < end; ++i) {
798+
filter.depositSchemaProperty(_props[i], objectVisitor, provider);
798799
}
799800
} else {
800-
for (int i = 0; i < _props.length; i++) {
801-
_props[i].depositSchemaProperty(objectVisitor);
801+
Class<?> view = ((_filteredProps == null) || (provider == null))
802+
? null : provider.getActiveView();
803+
final BeanPropertyWriter[] props;
804+
if (view != null) {
805+
props = _filteredProps;
806+
} else {
807+
props = _props;
808+
}
809+
810+
for (int i = 0, end = props.length; i < end; ++i) {
811+
BeanPropertyWriter prop = props[i];
812+
if (prop != null) { // may be filtered out unconditionally
813+
prop.depositSchemaProperty(objectVisitor, provider);
814+
}
802815
}
803816
}
804817
}

src/main/java/com/fasterxml/jackson/databind/ser/std/MapProperty.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
*/
2727
public class MapProperty extends PropertyWriter
2828
{
29+
private static final long serialVersionUID = 1L;
30+
2931
protected final TypeSerializer _typeSerializer;
3032

3133
protected final BeanProperty _property;
@@ -122,11 +124,12 @@ public void serializeAsPlaceholder(Object value, JsonGenerator gen,
122124
*/
123125

124126
@Override
125-
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor)
127+
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor,
128+
SerializerProvider provider)
126129
throws JsonMappingException
127130
{
128131
if (_property != null) {
129-
_property.depositSchemaProperty(objectVisitor);
132+
_property.depositSchemaProperty(objectVisitor, provider);
130133
}
131134
}
132135

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.fasterxml.jackson.databind.views;
2+
3+
import java.util.*;
4+
5+
import com.fasterxml.jackson.annotation.*;
6+
import com.fasterxml.jackson.databind.*;
7+
import com.fasterxml.jackson.databind.jsonFormatVisitors.*;
8+
9+
public class ViewsWithSchemaTest extends BaseMapTest
10+
{
11+
interface ViewBC { }
12+
interface ViewAB { }
13+
14+
@JsonPropertyOrder({ "a", "b", "c" })
15+
static class POJO {
16+
@JsonView({ ViewAB.class })
17+
public int a;
18+
19+
@JsonView({ ViewAB.class, ViewBC.class })
20+
public int b;
21+
22+
@JsonView({ ViewBC.class })
23+
public int c;
24+
}
25+
26+
static class ListingVisitor extends JsonFormatVisitorWrapper.Base
27+
{
28+
public final List<String> names = new ArrayList<String>();
29+
30+
@Override
31+
public JsonObjectFormatVisitor expectObjectFormat(JavaType type) {
32+
return new JsonObjectFormatVisitor.Base() {
33+
@Override
34+
public void optionalProperty(BeanProperty writer) {
35+
names.add(writer.getName());
36+
}
37+
38+
@Override
39+
public void optionalProperty(String name,
40+
JsonFormatVisitable handler, JavaType propertyTypeHint) {
41+
names.add(name);
42+
}
43+
};
44+
}
45+
}
46+
47+
/*
48+
/**********************************************************
49+
/* Test methods
50+
/**********************************************************
51+
*/
52+
53+
private final ObjectMapper MAPPER = new ObjectMapper();
54+
55+
public void testSchemaWithViews() throws Exception
56+
{
57+
ListingVisitor v = new ListingVisitor();
58+
MAPPER.writerWithView(ViewBC.class)
59+
.acceptJsonFormatVisitor(POJO.class, v);
60+
assertEquals(Arrays.asList("b", "c"), v.names);
61+
62+
v = new ListingVisitor();
63+
MAPPER.writerWithView(ViewAB.class)
64+
.acceptJsonFormatVisitor(POJO.class, v);
65+
assertEquals(Arrays.asList("a", "b"), v.names);
66+
}
67+
68+
public void testSchemaWithoutViews() throws Exception
69+
{
70+
ListingVisitor v = new ListingVisitor();
71+
MAPPER.acceptJsonFormatVisitor(POJO.class, v);
72+
assertEquals(Arrays.asList("a", "b", "c"), v.names);
73+
}
74+
}

0 commit comments

Comments
 (0)