Skip to content

Commit

Permalink
Badoken/global enum naming strategy (#4723)
Browse files Browse the repository at this point in the history
  • Loading branch information
badoken authored Oct 3, 2024
1 parent f562772 commit 1c07359
Show file tree
Hide file tree
Showing 12 changed files with 170 additions and 40 deletions.
7 changes: 5 additions & 2 deletions release-notes/CREDITS-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -1839,10 +1839,13 @@ Maxim Valeev (@MaximValeev)
(2.18.1)

@SandeepGaur2016

* Contributed fix for #2461: Nested `@JsonUnwrapped` property names not correctly handled
(2.19.0)

Konstantin Maliuga (@badoken)
* Contributed #4674: Allow setting global enum naming strategy similar to property naming strategy
(2.19.0)

Lars Benedetto (@lbenedetto)
* Contributed #4676: Support other enum naming strategies than camelCase
* Contributed #4676: Support other enum naming strategies than camelCas
(2.19.0)
3 changes: 3 additions & 0 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ Project: jackson-databind
#2461: Nested `@JsonUnwrapped` property names not correctly handled
(reported by @plovell)
(fix contributed by @SandeepGaur2016)
#4674: Allow setting global enum naming strategy similar to property naming strategy
(requested by @hajdamak)
(contributed by Konstantin M)
#4676: Support other enum naming strategies than camelCase
(requested by @hajdamak)
(contributed by Lars
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -1750,6 +1750,24 @@ public PropertyNamingStrategy getPropertyNamingStrategy() {
return _serializationConfig.getPropertyNamingStrategy();
}

/**
* Method for setting custom enum naming strategy to use.
*
* @since 2.19
*/
public ObjectMapper setEnumNamingStrategy(EnumNamingStrategy s) {
_serializationConfig = _serializationConfig.with(s);
_deserializationConfig = _deserializationConfig.with(s);
return this;
}

/**
* @since 2.19
*/
public EnumNamingStrategy getEnumNamingStrategy() {
return _serializationConfig.getEnumNamingStrategy();
}

/**
* Method for setting custom accessor naming strategy to use.
*
Expand Down
99 changes: 65 additions & 34 deletions src/main/java/com/fasterxml/jackson/databind/cfg/BaseSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import com.fasterxml.jackson.databind.introspect.AccessorNamingStrategy;
import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
import com.fasterxml.jackson.databind.introspect.ClassIntrospector;
import com.fasterxml.jackson.databind.introspect.DefaultAccessorNamingStrategy;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
import com.fasterxml.jackson.databind.type.TypeFactory;
Expand Down Expand Up @@ -67,6 +66,13 @@ public final class BaseSettings
*/
protected final PropertyNamingStrategy _propertyNamingStrategy;

/**
* Custom enum naming strategy in use, if any.
*
* @since 2.19
*/
protected final EnumNamingStrategy _enumNamingStrategy;

/**
* Provider for creating {@link AccessorNamingStrategy} instances to use
*
Expand Down Expand Up @@ -157,10 +163,10 @@ public final class BaseSettings
*/

/**
* @since 2.16
* @since 2.19
*/
public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai,
PropertyNamingStrategy pns, TypeFactory tf,
PropertyNamingStrategy pns, EnumNamingStrategy ens, TypeFactory tf,
TypeResolverBuilder<?> typer, DateFormat dateFormat, HandlerInstantiator hi,
Locale locale, TimeZone tz, Base64Variant defaultBase64,
PolymorphicTypeValidator ptv, AccessorNamingStrategy.Provider accNaming,
Expand All @@ -169,6 +175,7 @@ public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai,
_classIntrospector = ci;
_annotationIntrospector = ai;
_propertyNamingStrategy = pns;
_enumNamingStrategy = ens;
_typeFactory = tf;
_typeResolverBuilder = typer;
_dateFormat = dateFormat;
Expand All @@ -182,29 +189,33 @@ public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai,
}

/**
* @since 2.12
* @deprecated Since 2.16, use variant that takes {@link CacheProvider} instead.
* @since 2.16
* @deprecated Since 2.19, use variant that takes {@link EnumNamingStrategy} instead.
*/
@Deprecated
public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai,
PropertyNamingStrategy pns, TypeFactory tf,
TypeResolverBuilder<?> typer, DateFormat dateFormat, HandlerInstantiator hi,
Locale locale, TimeZone tz, Base64Variant defaultBase64,
PolymorphicTypeValidator ptv, AccessorNamingStrategy.Provider accNaming)
PolymorphicTypeValidator ptv, AccessorNamingStrategy.Provider accNaming,
CacheProvider cacheProvider)
{
this(ci, ai, pns, tf, typer, dateFormat, hi, locale, tz, defaultBase64, ptv, accNaming,
DefaultCacheProvider.defaultInstance());
this(ci, ai, pns, null, tf, typer, dateFormat, hi, locale, tz, defaultBase64, ptv, accNaming, cacheProvider);
}

@Deprecated // since 2.12
/**
* @since 2.12
* @deprecated Since 2.16, use variant that takes {@link CacheProvider} instead.
*/
@Deprecated
public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai,
PropertyNamingStrategy pns, TypeFactory tf,
TypeResolverBuilder<?> typer, DateFormat dateFormat, HandlerInstantiator hi,
Locale locale, TimeZone tz, Base64Variant defaultBase64,
PolymorphicTypeValidator ptv)
PolymorphicTypeValidator ptv, AccessorNamingStrategy.Provider accNaming)
{
this(ci, ai, pns, tf, typer, dateFormat, hi, locale, tz, defaultBase64, ptv,
new DefaultAccessorNamingStrategy.Provider(), DefaultCacheProvider.defaultInstance());
this(ci, ai, pns, tf, typer, dateFormat, hi, locale, tz, defaultBase64, ptv, accNaming,
DefaultCacheProvider.defaultInstance());
}

/**
Expand All @@ -217,6 +228,7 @@ public BaseSettings copy() {
return new BaseSettings(_classIntrospector.copy(),
_annotationIntrospector,
_propertyNamingStrategy,
_enumNamingStrategy,
_typeFactory,
_typeResolverBuilder,
_dateFormat,
Expand All @@ -239,17 +251,17 @@ public BaseSettings withClassIntrospector(ClassIntrospector ci) {
if (_classIntrospector == ci) {
return this;
}
return new BaseSettings(ci, _annotationIntrospector, _propertyNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
return new BaseSettings(ci, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

public BaseSettings withAnnotationIntrospector(AnnotationIntrospector ai) {
if (_annotationIntrospector == ai) {
return this;
}
return new BaseSettings(_classIntrospector, ai, _propertyNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
return new BaseSettings(_classIntrospector, ai, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

Expand All @@ -275,8 +287,20 @@ public BaseSettings withPropertyNamingStrategy(PropertyNamingStrategy pns) {
if (_propertyNamingStrategy == pns) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, pns, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
return new BaseSettings(_classIntrospector, _annotationIntrospector, pns, _enumNamingStrategy,
_typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

/**
* @since 2.19
*/
public BaseSettings withEnumNamingStrategy(EnumNamingStrategy ens) {
if (_enumNamingStrategy == ens) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, ens,
_typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

Expand All @@ -285,26 +309,26 @@ public BaseSettings withAccessorNaming(AccessorNamingStrategy.Provider p) {
if (_accessorNaming == p) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, p, _cacheProvider);
}

public BaseSettings withTypeFactory(TypeFactory tf) {
if (_typeFactory == tf) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, tf,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
tf, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

public BaseSettings withTypeResolverBuilder(TypeResolverBuilder<?> typer) {
if (_typeResolverBuilder == typer) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory,
typer, _dateFormat, _handlerInstantiator, _locale,
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory, typer, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

Expand All @@ -317,26 +341,26 @@ public BaseSettings withDateFormat(DateFormat df) {
if ((df != null) && hasExplicitTimeZone()) {
df = _force(df, _timeZone);
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory,
_typeResolverBuilder, df, _handlerInstantiator, _locale,
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory, _typeResolverBuilder, df, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

public BaseSettings withHandlerInstantiator(HandlerInstantiator hi) {
if (_handlerInstantiator == hi) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, hi, _locale,
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory, _typeResolverBuilder, _dateFormat, hi, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

public BaseSettings with(Locale l) {
if (_locale == l) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, l,
return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _enumNamingStrategy,
_typeFactory,_typeResolverBuilder, _dateFormat, _handlerInstantiator, l,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}

Expand All @@ -358,7 +382,7 @@ public BaseSettings with(TimeZone tz)

DateFormat df = _force(_dateFormat, (tz == null) ? DEFAULT_TIMEZONE : tz);
return new BaseSettings(_classIntrospector, _annotationIntrospector,
_propertyNamingStrategy, _typeFactory,
_propertyNamingStrategy, _enumNamingStrategy, _typeFactory,
_typeResolverBuilder, df, _handlerInstantiator, _locale,
tz, _defaultBase64, _typeValidator, _accessorNaming, _cacheProvider);
}
Expand All @@ -371,7 +395,7 @@ public BaseSettings with(Base64Variant base64) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector,
_propertyNamingStrategy, _typeFactory,
_propertyNamingStrategy, _enumNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, base64, _typeValidator, _accessorNaming, _cacheProvider);
}
Expand All @@ -384,7 +408,7 @@ public BaseSettings with(PolymorphicTypeValidator v) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector,
_propertyNamingStrategy, _typeFactory,
_propertyNamingStrategy, _enumNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, v, _accessorNaming, _cacheProvider);
}
Expand All @@ -400,7 +424,7 @@ public BaseSettings with(CacheProvider cacheProvider) {
return this;
}
return new BaseSettings(_classIntrospector, _annotationIntrospector,
_propertyNamingStrategy, _typeFactory,
_propertyNamingStrategy, _enumNamingStrategy, _typeFactory,
_typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale,
_timeZone, _defaultBase64, _typeValidator, _accessorNaming, cacheProvider);
}
Expand All @@ -423,6 +447,13 @@ public PropertyNamingStrategy getPropertyNamingStrategy() {
return _propertyNamingStrategy;
}

/**
* @since 2.19
*/
public EnumNamingStrategy getEnumNamingStrategy() {
return _enumNamingStrategy;
}

public AccessorNamingStrategy.Provider getAccessorNaming() {
return _accessorNaming;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,22 @@ public B propertyNamingStrategy(PropertyNamingStrategy s) {
return _this();
}

/**
* Method for configuring {@link EnumNamingStrategy} to use for adapting
* POJO enum names (internal) into content property names (external)
*
* @param s Strategy instance to use
*
* @return Builder instance itself to allow chaining
*
* @since 2.19
*/
public B enumNamingStrategy(EnumNamingStrategy s) {
_mapper.setEnumNamingStrategy(s);
return _this();
}


/**
* Method for configuring {@link AccessorNamingStrategy} to use for auto-detecting
* accessor ("getter") and mutator ("setter") methods based on naming of methods.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,13 @@ public final PropertyNamingStrategy getPropertyNamingStrategy() {
return _base.getPropertyNamingStrategy();
}

/**
* @since 2.19
*/
public final EnumNamingStrategy getEnumNamingStrategy() {
return _base.getEnumNamingStrategy();
}

// @since 2.12
public final AccessorNamingStrategy.Provider getAccessorNaming() {
return _base.getAccessorNaming();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,20 @@ public final T with(PropertyNamingStrategy pns) {
return _withBase(_base.withPropertyNamingStrategy(pns));
}

/**
* Method for constructing and returning a new instance with different
* {@link EnumNamingStrategy}
* to use.
*<p>
* NOTE: make sure to register new instance with <code>ObjectMapper</code>
* if directly calling this method.
*
* @since 2.19
*/
public final T with(EnumNamingStrategy ens) {
return _withBase(_base.withEnumNamingStrategy(ens));
}

/**
* Method for constructing and returning a new instance with different
* {@link PropertyNamingStrategy}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1858,7 +1858,7 @@ protected EnumResolver constructEnumNamingStrategyResolver(DeserializationConfig
{
Object namingDef = config.getAnnotationIntrospector().findEnumNamingStrategy(config, annotatedClass);
EnumNamingStrategy enumNamingStrategy = EnumNamingStrategyFactory.createEnumNamingStrategyInstance(
namingDef, config.canOverrideAccessModifiers());
namingDef, config.canOverrideAccessModifiers(), config.getEnumNamingStrategy());
return enumNamingStrategy == null ? null
: EnumResolver.constructUsingEnumNamingStrategy(config, annotatedClass, enumNamingStrategy);
}
Expand All @@ -1875,7 +1875,7 @@ protected EnumResolver constructEnumNamingStrategyResolver(DeserializationConfig
AnnotatedClass annotatedClass) {
Object namingDef = config.getAnnotationIntrospector().findEnumNamingStrategy(config, annotatedClass);
EnumNamingStrategy enumNamingStrategy = EnumNamingStrategyFactory.createEnumNamingStrategyInstance(
namingDef, config.canOverrideAccessModifiers());
namingDef, config.canOverrideAccessModifiers(), config.getEnumNamingStrategy());
return enumNamingStrategy == null ? null
: EnumResolver.constructUsingEnumNamingStrategy(config, enumClass, enumNamingStrategy);
}
Expand Down
Loading

0 comments on commit 1c07359

Please sign in to comment.