Skip to content

Commit

Permalink
Merge branch '2.5'
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Apr 8, 2015
2 parents db18789 + c94ec60 commit 43a4a3f
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ protected void serializeContents(EnumMap<? extends Enum<?>,?> value, JsonGenerat
Class<?> prevClass = null;
EnumValues keyEnums = _keyEnums;
final boolean skipNulls = !provider.isEnabled(SerializationFeature.WRITE_NULL_MAP_VALUES);
final boolean useToString = provider.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
final TypeSerializer vts = _valueTypeSerializer;

for (Map.Entry<? extends Enum<?>,?> entry : value.entrySet()) {
Expand All @@ -219,18 +220,22 @@ protected void serializeContents(EnumMap<? extends Enum<?>,?> value, JsonGenerat
continue;
}
// First, serialize key
Enum<?> key = entry.getKey();
if (keyEnums == null) {
/* 15-Oct-2009, tatu: This is clumsy, but still the simplest efficient
* way to do it currently, as Serializers get cached. (it does assume we'll always use
* default serializer tho -- so ideally code should be rewritten)
*/
// ... and lovely two-step casting process too...
StdSerializer<?> ser = (StdSerializer<?>) provider.findValueSerializer(
key.getDeclaringClass(), _property);
keyEnums = ((EnumSerializer) ser).getEnumValues();
final Enum<?> key = entry.getKey();
if (useToString) {
jgen.writeFieldName(key.toString());
} else {
if (keyEnums == null) {
/* 15-Oct-2009, tatu: This is clumsy, but still the simplest efficient
* way to do it currently, as Serializers get cached. (it does assume we'll always use
* default serializer tho -- so ideally code should be rewritten)
*/
// ... and lovely two-step casting process too...
StdSerializer<?> ser = (StdSerializer<?>) provider.findValueSerializer(
key.getDeclaringClass(), _property);
keyEnums = ((EnumSerializer) ser).getEnumValues();
}
jgen.writeFieldName(keyEnums.serializedValueFor(key));
}
jgen.writeFieldName(keyEnums.serializedValueFor(key));
if (valueElem == null) {
provider.defaultSerializeNull(jgen);
continue;
Expand Down Expand Up @@ -263,6 +268,7 @@ protected void serializeContentsUsing(EnumMap<? extends Enum<?>,?> value, JsonGe
{
EnumValues keyEnums = _keyEnums;
final boolean skipNulls = !provider.isEnabled(SerializationFeature.WRITE_NULL_MAP_VALUES);
final boolean useToString = provider.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
final TypeSerializer vts = _valueTypeSerializer;

for (Map.Entry<? extends Enum<?>,?> entry : value.entrySet()) {
Expand All @@ -271,13 +277,17 @@ protected void serializeContentsUsing(EnumMap<? extends Enum<?>,?> value, JsonGe
continue;
}
Enum<?> key = entry.getKey();
if (keyEnums == null) {
// clumsy, but has to do for now:
StdSerializer<?> ser = (StdSerializer<?>) provider.findValueSerializer(key.getDeclaringClass(),
_property);
keyEnums = ((EnumSerializer) ser).getEnumValues();
if (useToString) {
jgen.writeFieldName(key.toString());
} else {
if (keyEnums == null) {
// clumsy, but has to do for now:
StdSerializer<?> ser = (StdSerializer<?>) provider.findValueSerializer(key.getDeclaringClass(),
_property);
keyEnums = ((EnumSerializer) ser).getEnumValues();
}
jgen.writeFieldName(keyEnums.serializedValueFor(key));
}
jgen.writeFieldName(keyEnums.serializedValueFor(key));
if (valueElem == null) {
provider.defaultSerializeNull(jgen);
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public EnumSerializer(EnumValues v) {

public EnumSerializer(EnumValues v, Boolean serializeAsIndex)
{
super(Enum.class, false);
super(v.getEnumClass(), false);
_values = v;
_serializeAsIndex = serializeAsIndex;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -376,31 +376,6 @@ public void testCustomEnumMapKeySerializer() throws Exception {
String json = mapper.writeValueAsString(new MyBean661("abc"));
assertEquals(aposToQuotes("{'X-FOO':'abc'}"), json);
}

// [databind#749]

public void testEnumMapSerDefault() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
EnumMap<LowerCaseEnum, String> m = new EnumMap<LowerCaseEnum, String>(LowerCaseEnum.class);
m.put(LowerCaseEnum.A, "value");
assertEquals("{\"A\":\"value\"}", mapper.writeValueAsString(m));
}

public void testEnumMapSerDisableToString() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
ObjectWriter w = mapper.writer().without(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
EnumMap<LowerCaseEnum, String> m = new EnumMap<LowerCaseEnum, String>(LowerCaseEnum.class);
m.put(LowerCaseEnum.A, "value");
assertEquals("{\"A\":\"value\"}", w.writeValueAsString(m));
}

public void testEnumMapSerEnableToString() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
ObjectWriter w = mapper.writer().with(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
EnumMap<LowerCaseEnum, String> m = new EnumMap<LowerCaseEnum, String>(LowerCaseEnum.class);
m.put(LowerCaseEnum.A, "value");
assertEquals("{\"a\":\"value\"}", w.writeValueAsString(m));
}
}

// [JACKSON-757], non-inner enum
Expand Down
51 changes: 51 additions & 0 deletions src/test/java/com/fasterxml/jackson/failing/EnumMap749Test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.fasterxml.jackson.failing;

import java.util.*;

import com.fasterxml.jackson.databind.*;

/**
* Failing tests for [databind#749]: problems using (or not) of `toString()` for Enum keys
* of EnumMap, EnumSet.
*/
public class EnumMap749Test
extends BaseMapTest
{
protected static enum LC749Enum {
A, B, C;
private LC749Enum() { }
@Override
public String toString() { return name().toLowerCase(); }
}

/*
/**********************************************************
/* Tests
/**********************************************************
*/

// [databind#749]

public void testEnumMapSerDefault() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
EnumMap<LC749Enum, String> m = new EnumMap<LC749Enum, String>(LC749Enum.class);
m.put(LC749Enum.A, "value");
assertEquals("{\"A\":\"value\"}", mapper.writeValueAsString(m));
}

public void testEnumMapSerDisableToString() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
ObjectWriter w = mapper.writer().without(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
EnumMap<LC749Enum, String> m = new EnumMap<LC749Enum, String>(LC749Enum.class);
m.put(LC749Enum.A, "value");
assertEquals("{\"A\":\"value\"}", w.writeValueAsString(m));
}

public void testEnumMapSerEnableToString() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
ObjectWriter w = mapper.writer().with(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
EnumMap<LC749Enum, String> m = new EnumMap<LC749Enum, String>(LC749Enum.class);
m.put(LC749Enum.A, "value");
assertEquals("{\"a\":\"value\"}", w.writeValueAsString(m));
}
}

0 comments on commit 43a4a3f

Please sign in to comment.