Skip to content
This repository has been archived by the owner on Jan 22, 2019. It is now read-only.

Commit

Permalink
Fix #83
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Sep 29, 2015
1 parent 44c5057 commit 08f2393
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 3 deletions.
2 changes: 2 additions & 0 deletions release-notes/VERSION
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Project: jackson-datatype-guava

2.6.3 (not yet released)

#83: Generic type information for `Optional` wrapped generic type lost in visitor
(reported by vzx@github)
#84: Class not found exception in OSGi (com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanPropertyWriter)
(reported by mjameson-se@github)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,9 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
{
JsonSerializer<?> ser = _valueSerializer;
if (ser == null) {
ser = _findSerializer(visitor.getProvider(), _referredType.getRawClass());
// 28-Sep-2015, tatu: as per [datatype-guava#83] need to ensure we don't
// accidentally drop parameterization
ser = _findSerializer(visitor.getProvider(), _referredType, _property);
}
ser.acceptJsonFormatVisitor(visitor, _referredType);
}
Expand All @@ -208,8 +210,8 @@ protected static JavaType _valueType(JavaType optionalType) {
* Helper method that encapsulates logic of retrieving and caching required
* serializer.
*/
protected final JsonSerializer<Object> _findSerializer(SerializerProvider provider, Class<?> type)
throws JsonMappingException
protected final JsonSerializer<Object> _findSerializer(SerializerProvider provider,
Class<?> type) throws JsonMappingException
{
JsonSerializer<Object> ser = _dynamicSerializers.serializerFor(type);
if (ser == null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package com.fasterxml.jackson.datatype.guava;

import java.util.*;

import com.google.common.base.Optional;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.jsonFormatVisitors.*;

public class OptionalSchema83Test
extends ModuleTestBase
{
static class TopLevel {
@JsonProperty("values")
public Optional<CollectionHolder<ValueHolder>> values;
}

static class ValueHolder {
@JsonProperty("value")
public String value;
}

static class CollectionHolder<T> {
@JsonProperty("data")
public Collection<T> data;
}

static class VisitorWrapper implements JsonFormatVisitorWrapper {
private SerializerProvider serializerProvider;
private final String baseName;
private final Set<String> traversedProperties;

public VisitorWrapper(SerializerProvider serializerProvider, String baseName, Set<String> traversedProperties) {
this.serializerProvider = serializerProvider;
this.baseName = baseName;
this.traversedProperties = traversedProperties;
}

private VisitorWrapper createSubtraverser(String bn) {
return new VisitorWrapper(getProvider(), bn, traversedProperties);
}

public Set<String> getTraversedProperties() {
return traversedProperties;
}

@Override
public JsonObjectFormatVisitor expectObjectFormat(JavaType type) throws JsonMappingException {
return new JsonObjectFormatVisitor.Base(serializerProvider) {
@Override
public void property(BeanProperty prop) throws JsonMappingException {
anyProperty(prop);
}

@Override
public void optionalProperty(BeanProperty prop) throws JsonMappingException {
anyProperty(prop);
}

private void anyProperty(BeanProperty prop) throws JsonMappingException {
final String propertyName = prop.getFullName().toString();
traversedProperties.add(baseName + propertyName);
serializerProvider.findValueSerializer(prop.getType(), prop)
.acceptJsonFormatVisitor(createSubtraverser(baseName + propertyName + "."), prop.getType());
}
};
}

@Override
public JsonArrayFormatVisitor expectArrayFormat(JavaType type) throws JsonMappingException {
serializerProvider.findValueSerializer(type.getContentType())
.acceptJsonFormatVisitor(createSubtraverser(baseName), type.getContentType());
return new JsonArrayFormatVisitor.Base(serializerProvider);
}

@Override
public JsonStringFormatVisitor expectStringFormat(JavaType type) throws JsonMappingException {
return new JsonStringFormatVisitor.Base();
}

@Override
public JsonNumberFormatVisitor expectNumberFormat(JavaType type) throws JsonMappingException {
return new JsonNumberFormatVisitor.Base();
}

@Override
public JsonIntegerFormatVisitor expectIntegerFormat(JavaType type) throws JsonMappingException {
return new JsonIntegerFormatVisitor.Base();
}

@Override
public JsonBooleanFormatVisitor expectBooleanFormat(JavaType type) throws JsonMappingException {
return new JsonBooleanFormatVisitor.Base();
}

@Override
public JsonNullFormatVisitor expectNullFormat(JavaType type) throws JsonMappingException {
return new JsonNullFormatVisitor.Base();
}

@Override
public JsonAnyFormatVisitor expectAnyFormat(JavaType type) throws JsonMappingException {
return new JsonAnyFormatVisitor.Base();
}

@Override
public JsonMapFormatVisitor expectMapFormat(JavaType type) throws JsonMappingException {
return new JsonMapFormatVisitor.Base(serializerProvider);
}

@Override
public SerializerProvider getProvider() {
return serializerProvider;
}

@Override
public void setProvider(SerializerProvider provider) {
this.serializerProvider = provider;
}
}

public void testOptionalTypeSchema83() throws Exception {
VisitorWrapper wrapper = new VisitorWrapper(null, "", new HashSet<String>());
mapperWithModule()
.acceptJsonFormatVisitor(TopLevel.class, wrapper);
Set<String> properties = wrapper.getTraversedProperties();

assertTrue(properties.contains("values.data.value"));
}
}

0 comments on commit 08f2393

Please sign in to comment.