diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2016-11-27 20:45:46 -0800 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2016-11-27 20:45:46 -0800 |
commit | c0ceefd758990b32a16b06f53b690ab231ab7a04 (patch) | |
tree | 33a490b001df10e500edc6c5475622ef7611eadd | |
parent | 880c64bb105e67c8266dbed50c723a74f9ffb6ab (diff) | |
download | jackson-databind-c0ceefd758990b32a16b06f53b690ab231ab7a04.tar.gz |
Refactoring to change how default visibility settings are handled, to prepare for #1347
9 files changed, 77 insertions, 107 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java b/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java index 3a4566bce..66e252bee 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java +++ b/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java @@ -291,8 +291,6 @@ public class ObjectMapper // 16-May-2009, tatu: Ditto ^^^ protected final static AnnotationIntrospector DEFAULT_ANNOTATION_INTROSPECTOR = new JacksonAnnotationIntrospector(); - protected final static VisibilityChecker<?> STD_VISIBILITY_CHECKER = VisibilityChecker.Std.defaultInstance(); - /** * Base settings contain defaults used for all {@link ObjectMapper} * instances. @@ -300,7 +298,7 @@ public class ObjectMapper protected final static BaseSettings DEFAULT_BASE = new BaseSettings( null, // can not share global ClassIntrospector any more (2.5+) DEFAULT_ANNOTATION_INTROSPECTOR, - STD_VISIBILITY_CHECKER, null, TypeFactory.defaultInstance(), + null, TypeFactory.defaultInstance(), null, StdDateFormat.instance, null, Locale.getDefault(), null, // to indicate "use Jackson default TimeZone" (UTC since Jackson 2.7) @@ -1225,10 +1223,8 @@ public class ObjectMapper * * @since 2.6 */ - @SuppressWarnings("deprecation") public ObjectMapper setVisibility(VisibilityChecker<?> vc) { - _deserializationConfig = _deserializationConfig.with(vc); - _serializationConfig = _serializationConfig.with(vc); + _configOverrides.setDefaultVisibility(vc); return this; } @@ -1256,11 +1252,11 @@ public class ObjectMapper * @return Modified mapper instance (that is, "this"), to allow chaining * of configuration calls */ - @SuppressWarnings("deprecation") public ObjectMapper setVisibility(PropertyAccessor forMethod, JsonAutoDetect.Visibility visibility) { - _deserializationConfig = _deserializationConfig.withVisibility(forMethod, visibility); - _serializationConfig = _serializationConfig.withVisibility(forMethod, visibility); + VisibilityChecker<?> vc = _configOverrides.getDefaultVisibility(); + vc = vc.withVisibility(forMethod, visibility); + _configOverrides.setDefaultVisibility(vc); return this; } @@ -1404,6 +1400,19 @@ public class ObjectMapper return this; } + /** + * Method for setting auto-detection visibility definition + * defaults, which are in effect unless overridden by + * annotations (like <code>JsonAutoDetect</code>) or per-type + * visibility overrides. + * + * @since 2.9 + */ + public ObjectMapper setDefaultVisibility(JsonAutoDetect.Value vis) { + _configOverrides.setDefaultVisibility(VisibilityChecker.Std.construct(vis)); + return this; + } + /* /********************************************************** /* Type information configuration diff --git a/src/main/java/com/fasterxml/jackson/databind/cfg/BaseSettings.java b/src/main/java/com/fasterxml/jackson/databind/cfg/BaseSettings.java index 3421e87d6..8c83734cd 100644 --- a/src/main/java/com/fasterxml/jackson/databind/cfg/BaseSettings.java +++ b/src/main/java/com/fasterxml/jackson/databind/cfg/BaseSettings.java @@ -4,13 +4,10 @@ import java.text.DateFormat; import java.util.Locale; import java.util.TimeZone; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.Base64Variant; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.ClassIntrospector; -import com.fasterxml.jackson.databind.introspect.VisibilityChecker; import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.databind.util.StdDateFormat; @@ -55,17 +52,6 @@ public final class BaseSettings protected final AnnotationIntrospector _annotationIntrospector; /** - * Object used for determining whether specific property elements - * (method, constructors, fields) can be auto-detected based on - * their visibility (access modifiers). Can be changed to allow - * different minimum visibility levels for auto-detection. Note - * that this is the global handler; individual types (classes) - * can further override active checker used (using - * {@link JsonAutoDetect} annotation) - */ - protected final VisibilityChecker<?> _visibilityChecker; - - /** * Custom property naming strategy in use, if any. */ protected final PropertyNamingStrategy _propertyNamingStrategy; @@ -145,13 +131,12 @@ public final class BaseSettings */ public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai, - VisibilityChecker<?> vc, PropertyNamingStrategy pns, TypeFactory tf, + PropertyNamingStrategy pns, TypeFactory tf, TypeResolverBuilder<?> typer, DateFormat dateFormat, HandlerInstantiator hi, Locale locale, TimeZone tz, Base64Variant defaultBase64) { _classIntrospector = ci; _annotationIntrospector = ai; - _visibilityChecker = vc; _propertyNamingStrategy = pns; _typeFactory = tf; _typeResolverBuilder = typer; @@ -172,7 +157,7 @@ public final class BaseSettings if (_classIntrospector == ci) { return this; } - return new BaseSettings(ci, _annotationIntrospector, _visibilityChecker, _propertyNamingStrategy, _typeFactory, + return new BaseSettings(ci, _annotationIntrospector, _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } @@ -181,7 +166,7 @@ public final class BaseSettings if (_annotationIntrospector == ai) { return this; } - return new BaseSettings(_classIntrospector, ai, _visibilityChecker, _propertyNamingStrategy, _typeFactory, + return new BaseSettings(_classIntrospector, ai, _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } @@ -193,16 +178,8 @@ public final class BaseSettings public BaseSettings withAppendedAnnotationIntrospector(AnnotationIntrospector ai) { return withAnnotationIntrospector(AnnotationIntrospectorPair.create(_annotationIntrospector, ai)); } - - public BaseSettings withVisibilityChecker(VisibilityChecker<?> vc) { - if (_visibilityChecker == vc) { - return this; - } - return new BaseSettings(_classIntrospector, _annotationIntrospector, vc, _propertyNamingStrategy, _typeFactory, - _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, - _timeZone, _defaultBase64); - } + /* public BaseSettings withVisibility(PropertyAccessor forMethod, JsonAutoDetect.Visibility visibility) { return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker.withVisibility(forMethod, visibility), @@ -210,12 +187,13 @@ public final class BaseSettings _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } + */ public BaseSettings withPropertyNamingStrategy(PropertyNamingStrategy pns) { if (_propertyNamingStrategy == pns) { return this; } - return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker, pns, _typeFactory, + return new BaseSettings(_classIntrospector, _annotationIntrospector, pns, _typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } @@ -224,7 +202,7 @@ public final class BaseSettings if (_typeFactory == tf) { return this; } - return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker, _propertyNamingStrategy, tf, + return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, tf, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } @@ -233,7 +211,7 @@ public final class BaseSettings if (_typeResolverBuilder == typer) { return this; } - return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker, _propertyNamingStrategy, _typeFactory, + return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory, typer, _dateFormat, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } @@ -247,7 +225,7 @@ public final class BaseSettings if ((df != null) && hasExplicitTimeZone()) { df = _force(df, _timeZone); } - return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker, _propertyNamingStrategy, _typeFactory, + return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, df, _handlerInstantiator, _locale, _timeZone, _defaultBase64); } @@ -256,7 +234,7 @@ public final class BaseSettings if (_handlerInstantiator == hi) { return this; } - return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker, _propertyNamingStrategy, _typeFactory, + return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, _dateFormat, hi, _locale, _timeZone, _defaultBase64); } @@ -265,7 +243,7 @@ public final class BaseSettings if (_locale == l) { return this; } - return new BaseSettings(_classIntrospector, _annotationIntrospector, _visibilityChecker, _propertyNamingStrategy, _typeFactory, + return new BaseSettings(_classIntrospector, _annotationIntrospector, _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, l, _timeZone, _defaultBase64); } @@ -286,7 +264,7 @@ public final class BaseSettings DateFormat df = _force(_dateFormat, tz); return new BaseSettings(_classIntrospector, _annotationIntrospector, - _visibilityChecker, _propertyNamingStrategy, _typeFactory, + _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, df, _handlerInstantiator, _locale, tz, _defaultBase64); } @@ -299,7 +277,7 @@ public final class BaseSettings return this; } return new BaseSettings(_classIntrospector, _annotationIntrospector, - _visibilityChecker, _propertyNamingStrategy, _typeFactory, + _propertyNamingStrategy, _typeFactory, _typeResolverBuilder, _dateFormat, _handlerInstantiator, _locale, _timeZone, base64); } @@ -318,10 +296,6 @@ public final class BaseSettings return _annotationIntrospector; } - public VisibilityChecker<?> getVisibilityChecker() { - return _visibilityChecker; - } - public PropertyNamingStrategy getPropertyNamingStrategy() { return _propertyNamingStrategy; } diff --git a/src/main/java/com/fasterxml/jackson/databind/cfg/ConfigOverrides.java b/src/main/java/com/fasterxml/jackson/databind/cfg/ConfigOverrides.java index 753e442fd..aeb2a4744 100644 --- a/src/main/java/com/fasterxml/jackson/databind/cfg/ConfigOverrides.java +++ b/src/main/java/com/fasterxml/jackson/databind/cfg/ConfigOverrides.java @@ -48,16 +48,19 @@ public class ConfigOverrides this(null, // !!! TODO: change to (ALWAYS, ALWAYS)? JsonInclude.Value.empty(), - JsonSetter.Value.empty() + JsonSetter.Value.empty(), + VisibilityChecker.Std.defaultInstance() ); } protected ConfigOverrides(Map<Class<?>, MutableConfigOverride> overrides, JsonInclude.Value defIncl, - JsonSetter.Value defSetter) { + JsonSetter.Value defSetter, + VisibilityChecker<?> defVisibility) { _overrides = overrides; _defaultInclusion = defIncl; _defaultSetterInfo = defSetter; + _visibilityChecker = defVisibility; } public ConfigOverrides copy() @@ -70,7 +73,7 @@ public class ConfigOverrides newOverrides.put(entry.getKey(), entry.getValue().copy()); } return new ConfigOverrides(newOverrides, - _defaultInclusion, _defaultSetterInfo); + _defaultInclusion, _defaultSetterInfo, _visibilityChecker); } /* diff --git a/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfig.java b/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfig.java index d2167fbee..eb67f3a21 100644 --- a/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfig.java +++ b/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfig.java @@ -5,7 +5,6 @@ import java.util.Locale; import java.util.TimeZone; import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.core.Base64Variant; import com.fasterxml.jackson.core.SerializableString; import com.fasterxml.jackson.core.io.SerializedString; @@ -249,26 +248,7 @@ public abstract class MapperConfig<T extends MapperConfig<T>> * can further override active checker used (using * {@link JsonAutoDetect} annotation) */ - public VisibilityChecker<?> getDefaultVisibilityChecker() { - VisibilityChecker<?> vchecker = _base.getVisibilityChecker(); - // then global overrides (disabling) - if (!isEnabled(MapperFeature.AUTO_DETECT_SETTERS)) { - vchecker = vchecker.withSetterVisibility(Visibility.NONE); - } - if (!isEnabled(MapperFeature.AUTO_DETECT_CREATORS)) { - vchecker = vchecker.withCreatorVisibility(Visibility.NONE); - } - if (!isEnabled(MapperFeature.AUTO_DETECT_GETTERS)) { - vchecker = vchecker.withGetterVisibility(Visibility.NONE); - } - if (!isEnabled(MapperFeature.AUTO_DETECT_IS_GETTERS)) { - vchecker = vchecker.withIsGetterVisibility(Visibility.NONE); - } - if (!isEnabled(MapperFeature.AUTO_DETECT_FIELDS)) { - vchecker = vchecker.withFieldVisibility(Visibility.NONE); - } - return vchecker; - } + public abstract VisibilityChecker<?> getDefaultVisibilityChecker(); public final PropertyNamingStrategy getPropertyNamingStrategy() { return _base.getPropertyNamingStrategy(); @@ -277,7 +257,7 @@ public abstract class MapperConfig<T extends MapperConfig<T>> public final HandlerInstantiator getHandlerInstantiator() { return _base.getHandlerInstantiator(); } - + /* /********************************************************** /* Configuration: type and subtype handling diff --git a/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfigBase.java b/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfigBase.java index 60b22c371..9a3111092 100644 --- a/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfigBase.java +++ b/src/main/java/com/fasterxml/jackson/databind/cfg/MapperConfigBase.java @@ -4,7 +4,7 @@ import java.text.DateFormat; import java.util.*; import com.fasterxml.jackson.annotation.*; - +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.core.Base64Variant; import com.fasterxml.jackson.databind.*; @@ -535,22 +535,6 @@ public abstract class MapperConfigBase<CFG extends ConfigFeature, */ public abstract T withView(Class<?> view); - /** - * @deprecated Since 2.9 use configuration methods in {@link ObjectMapper} - */ - @Deprecated - public T with(VisibilityChecker<?> vc) { - return _withBase(_base.withVisibilityChecker(vc)); - } - - /** - * @deprecated Since 2.9 use configuration methods in {@link ObjectMapper} - */ - @Deprecated - public T withVisibility(PropertyAccessor forMethod, JsonAutoDetect.Visibility visibility) { - return _withBase(_base.withVisibility(forMethod, visibility)); - } - /* /********************************************************** /* Simple accessors @@ -592,6 +576,29 @@ public abstract class MapperConfigBase<CFG extends ConfigFeature, return _attributes; } + @Override + public VisibilityChecker<?> getDefaultVisibilityChecker() + { + VisibilityChecker<?> vchecker = _configOverrides.getDefaultVisibility(); + // then global overrides (disabling) + if (!isEnabled(MapperFeature.AUTO_DETECT_SETTERS)) { + vchecker = vchecker.withSetterVisibility(Visibility.NONE); + } + if (!isEnabled(MapperFeature.AUTO_DETECT_CREATORS)) { + vchecker = vchecker.withCreatorVisibility(Visibility.NONE); + } + if (!isEnabled(MapperFeature.AUTO_DETECT_GETTERS)) { + vchecker = vchecker.withGetterVisibility(Visibility.NONE); + } + if (!isEnabled(MapperFeature.AUTO_DETECT_IS_GETTERS)) { + vchecker = vchecker.withIsGetterVisibility(Visibility.NONE); + } + if (!isEnabled(MapperFeature.AUTO_DETECT_FIELDS)) { + vchecker = vchecker.withFieldVisibility(Visibility.NONE); + } + return vchecker; + } + /* /********************************************************** /* Configuration access; default/overrides diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/VisibilityChecker.java b/src/main/java/com/fasterxml/jackson/databind/introspect/VisibilityChecker.java index 81545eded..e62e96662 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/VisibilityChecker.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/VisibilityChecker.java @@ -230,6 +230,13 @@ public interface VisibilityChecker<T extends VisibilityChecker<T>> } } + /** + * @since 2.9 + */ + public static Std construct(JsonAutoDetect.Value vis) { + return DEFAULT.withOverrides(vis); + } + /* /******************************************************** /* Builder/fluent methods for instantiating configured diff --git a/src/test/java/com/fasterxml/jackson/databind/creators/MultiArgConstructorTest.java b/src/test/java/com/fasterxml/jackson/databind/creators/MultiArgConstructorTest.java index eb3bd21a9..ecbdff731 100644 --- a/src/test/java/com/fasterxml/jackson/databind/creators/MultiArgConstructorTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/creators/MultiArgConstructorTest.java @@ -1,8 +1,9 @@ package com.fasterxml.jackson.databind.creators; +import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.PropertyAccessor; + import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; @@ -93,7 +94,9 @@ public class MultiArgConstructorTest extends BaseMapTest { final ObjectMapper mapper = new ObjectMapper(); mapper.setAnnotationIntrospector(new MyParamIntrospector()); - mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.NONE); + mapper.setDefaultVisibility( + JsonAutoDetect.Value.noOverrides() + .withCreatorVisibility(Visibility.NONE)); try { /*MultiArgCtorBean bean =*/ mapper.readValue(aposToQuotes("{'b':13, 'a':-99}"), MultiArgCtorBean.class); diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKStringLikeTypesTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKStringLikeTypesTest.java index eb2ef04d8..b6b1a5efa 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKStringLikeTypesTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKStringLikeTypesTest.java @@ -10,10 +10,11 @@ import java.util.UUID; import java.util.regex.Pattern; import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; + import com.fasterxml.jackson.core.Base64Variants; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; + import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; @@ -162,13 +163,6 @@ public class JDKStringLikeTypesTest extends BaseMapTest String json = MAPPER.writeValueAsString(abs); File result = MAPPER.readValue(json, File.class); assertEquals(abs, result.getAbsolutePath()); - - // Then #170 - final ObjectMapper mapper2 = new ObjectMapper(); - mapper2.setVisibility(PropertyAccessor.CREATOR, Visibility.NONE); - - result = mapper2.readValue(json, File.class); - assertEquals(abs, result.getAbsolutePath()); } public void testLocale() throws IOException diff --git a/src/test/java/com/fasterxml/jackson/databind/objectid/TestObjectIdWithPolymorphic.java b/src/test/java/com/fasterxml/jackson/databind/objectid/TestObjectIdWithPolymorphic.java index 2ecca8e82..486abf336 100644 --- a/src/test/java/com/fasterxml/jackson/databind/objectid/TestObjectIdWithPolymorphic.java +++ b/src/test/java/com/fasterxml/jackson/databind/objectid/TestObjectIdWithPolymorphic.java @@ -2,11 +2,9 @@ package com.fasterxml.jackson.databind.objectid; import java.util.*; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; -import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; @@ -134,11 +132,6 @@ public class TestObjectIdWithPolymorphic extends BaseMapTest public void testIssue811() throws Exception { ObjectMapper om = new ObjectMapper(); - om.disable(MapperFeature.AUTO_DETECT_CREATORS); - om.disable(MapperFeature.AUTO_DETECT_GETTERS); - om.disable(MapperFeature.AUTO_DETECT_IS_GETTERS); - om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); - om.enable(SerializationFeature.WRITE_ENUMS_USING_INDEX); om.enable(SerializationFeature.INDENT_OUTPUT); om.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, "@class"); |