Skip to content

Commit

Permalink
Fix #2663
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Mar 25, 2020
1 parent a1dfaa7 commit 8af03c1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 10 deletions.
2 changes: 2 additions & 0 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ Project: jackson-databind
#2643: Change default textual serialization of `java.util.Date`/`Calendar`
to include colon in timezone offset
#2647: Add `ObjectMapper.createParser()` and `createGenerator()` methods
#2663: Add new factory method for creating custom `EnumValues` to pass to `EnumDeserializer
(requested by Rafal K)
- Add `SerializerProvider.findContentValueSerializer()` methods

2.10.4 (not yet released)
Expand Down
41 changes: 31 additions & 10 deletions src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import com.fasterxml.jackson.databind.cfg.MapperConfig;

/**
* Helper class used for storing String serializations of
* enumerations.
* Helper class used for storing String serializations of {@code Enum}s,
* to match to/from external representations.
*/
public final class EnumValues
implements java.io.Serializable
Expand Down Expand Up @@ -58,23 +58,44 @@ public static EnumValues constructFromName(MapperConfig<?> config, Class<Enum<?>
}
textual[en.ordinal()] = config.compileString(name);
}
return new EnumValues(enumClass, textual);
return construct(enumClass, textual);
}

public static EnumValues constructFromToString(MapperConfig<?> config, Class<Enum<?>> enumClass)
{
Class<? extends Enum<?>> cls = ClassUtil.findEnumType(enumClass);
Enum<?>[] values = cls.getEnumConstants();
if (values != null) {
SerializableString[] textual = new SerializableString[values.length];
for (Enum<?> en : values) {
textual[en.ordinal()] = config.compileString(en.toString());
}
return new EnumValues(enumClass, textual);
if (values == null) { // can this ever occur?
throw new IllegalArgumentException("Cannot determine enum constants for Class "+enumClass.getName());
}
ArrayList<String> external = new ArrayList<>(values.length);
for (Enum<?> en : values) {
external.add(en.toString());
}
throw new IllegalArgumentException("Cannot determine enum constants for Class "+enumClass.getName());
return construct(config, enumClass, external);
}

/**
* @since 2.11
*/
public static EnumValues construct(MapperConfig<?> config, Class<Enum<?>> enumClass,
List<String> externalValues) {
final int len = externalValues.size();
SerializableString[] textual = new SerializableString[len];
for (int i = 0; i < len; ++i) {
textual[i] = config.compileString(externalValues.get(i));
}
return construct(enumClass, textual);
}

/**
* @since 2.11
*/
public static EnumValues construct(Class<Enum<?>> enumClass,
SerializableString[] externalValues) {
return new EnumValues(enumClass, externalValues);
}

public SerializableString serializedValueFor(Enum<?> key) {
return _textual[key.ordinal()];
}
Expand Down

0 comments on commit 8af03c1

Please sign in to comment.