diff --git a/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/RangeDeserializer.java b/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/RangeDeserializer.java index 7a9be1d0..9c335ffb 100644 --- a/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/RangeDeserializer.java +++ b/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/RangeDeserializer.java @@ -102,6 +102,9 @@ public JsonDeserializer createContextual(DeserializationContext ctxt, endpointType = TypeFactory.unknownType(); } deser = ctxt.findContextualValueDeserializer(endpointType, property); + } else if (deser instanceof ContextualDeserializer) { + // 04-Sep-2019, tatu: If we already have a deserialize, should contextualize, right? + deser = ((ContextualDeserializer) deser).createContextual(ctxt, property); } if ((deser != _endpointDeserializer) || (fieldNames != _fieldNames)) { return new RangeDeserializer(_rangeType, deser, _defaultBoundType, fieldNames); diff --git a/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/util/RangeFactory.java b/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/util/RangeFactory.java index 0d7c54d8..5bf13a6b 100644 --- a/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/util/RangeFactory.java +++ b/guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/util/RangeFactory.java @@ -2,62 +2,16 @@ package com.fasterxml.jackson.datatype.guava.deser.util; import com.google.common.collect.BoundType; -import com.google.common.collect.Lists; import com.google.common.collect.Range; -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - /** - * A factory for creating Guava {@link Range}s that is compatible with Guava 10 and later. - * - * If Guava 10, 11, 12, or 13 is being used, the factory methods in the com.google.common.collect.Ranges class (a beta - * class that was removed in Guava 14) are used to reflectively instantiate Ranges. If Guava 14 or later is being used, - * the factory methods in the Range class itself (added in Guava 14) are used to instantiate Ranges. + * A factory for creating Guava {@link Range}s that is compatible with Guava 14 and later. + *

+ * NOTE: up until Jackson 2.9.x, supported versions from Guava 10 and higher; support for + * older versions dropped in Jackson 2.10. */ public class RangeFactory { - private static final String LEGACY_RANGES_CLASS_NAME = "com.google.common.collect.Ranges"; - - private static final String LEGACY_RANGE_METHOD_NAME = "range"; - private static final String LEGACY_DOWN_TO_METHOD_NAME = "downTo"; - private static final String LEGACY_UP_TO_METHOD_NAME = "upTo"; - private static final String LEGACY_ALL_METHOD_NAME = "all"; - - private static Method legacyRangeMethod; - private static Method legacyDownToMethod; - private static Method legacyUpToMethod; - private static Method legacyAllMethod; - - static - { - initLegacyRangeFactoryMethods(); - } - - private static void initLegacyRangeFactoryMethods() - { - try { - Class rangesClass = Class.forName(LEGACY_RANGES_CLASS_NAME); - legacyRangeMethod = findMethod(rangesClass, LEGACY_RANGE_METHOD_NAME, Comparable.class, BoundType.class, - Comparable.class, BoundType.class); - legacyDownToMethod = findMethod(rangesClass, LEGACY_DOWN_TO_METHOD_NAME, Comparable.class, BoundType.class); - legacyUpToMethod = findMethod(rangesClass, LEGACY_UP_TO_METHOD_NAME, Comparable.class, BoundType.class); - legacyAllMethod = findMethod(rangesClass, LEGACY_ALL_METHOD_NAME); - } catch (ClassNotFoundException e) { - // ignore - } - } - - // returns null if the method is not found - private static Method findMethod(Class clazz, String methodName, Class ... paramTypes) - { - try { - return clazz.getMethod(methodName, paramTypes); - } catch (NoSuchMethodException e) { - return null; - } - } - public static > Range open(C lowerEndpoint, C upperEndpoint) { return range(lowerEndpoint, BoundType.OPEN, upperEndpoint, BoundType.OPEN); @@ -81,12 +35,7 @@ public static > Range closed(C lowerEndpoint, C upper public static > Range range(final C lowerEndpoint, final BoundType lowerBoundType, final C upperEndpoint, final BoundType upperBoundType) { - return createRange(new Callable>() { - @Override - public Range call() throws Exception { - return Range.range(lowerEndpoint, lowerBoundType, upperEndpoint, upperBoundType); - } - }, legacyRangeMethod, lowerEndpoint, lowerBoundType, upperEndpoint, upperBoundType); + return Range.range(lowerEndpoint, lowerBoundType, upperEndpoint, upperBoundType); } public static > Range greaterThan(C lowerEndpoint) @@ -101,12 +50,7 @@ public static > Range atLeast(C lowerEndpoint) public static > Range downTo(final C lowerEndpoint, final BoundType lowerBoundType) { - return createRange(new Callable>() { - @Override - public Range call() throws Exception { - return Range.downTo(lowerEndpoint, lowerBoundType); - } - }, legacyDownToMethod, lowerEndpoint, lowerBoundType); + return Range.downTo(lowerEndpoint, lowerBoundType); } public static > Range lessThan(C upperEndpoint) @@ -121,59 +65,17 @@ public static > Range atMost(C upperEndpoint) public static > Range upTo(final C upperEndpoint, final BoundType upperBoundType) { - return createRange(new Callable>() { - @Override - public Range call() throws Exception { - return Range.upTo(upperEndpoint, upperBoundType); - } - }, legacyUpToMethod, upperEndpoint, upperBoundType); + return Range.upTo(upperEndpoint, upperBoundType); } public static > Range all() { - return createRange(new Callable>() { - @Override - public Range call() throws Exception { - return Range.all(); - } - }, legacyAllMethod); + return Range.all(); } public static > Range singleton(final C value) { - return createRange(new Callable>() { - @Override - public Range call() throws Exception { - return Range.singleton(value); - } - }, legacyRangeMethod, value, BoundType.CLOSED, value, BoundType.CLOSED); - } - - private static > Range createRange(Callable> rangeCallable, Method legacyRangeFactoryMethod, Object ... params) - { - try { - return rangeCallable.call(); - } catch (NoSuchMethodError noSuchMethodError) { - if (legacyRangeFactoryMethod != null) { - return invokeLegacyRangeFactoryMethod(legacyRangeFactoryMethod, params); - } else { - throw noSuchMethodError; - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @SuppressWarnings("unchecked") - private static > Range invokeLegacyRangeFactoryMethod(Method method, Object... params) - { - try { - //noinspection unchecked - return (Range) method.invoke(null, params); - } catch (Exception e) { - throw new RuntimeException("Failed to invoke legacy Range factory method [" + method.getName() + - "] with params " + Lists.newArrayList(params) + ".", e); - } + return Range.singleton(value); } // prevent instantiation diff --git a/guava/src/test/java/com/fasterxml/jackson/datatype/guava/failing/Range56Test.java b/guava/src/test/java/com/fasterxml/jackson/datatype/guava/Range56Test.java similarity index 92% rename from guava/src/test/java/com/fasterxml/jackson/datatype/guava/failing/Range56Test.java rename to guava/src/test/java/com/fasterxml/jackson/datatype/guava/Range56Test.java index 3dd52e12..321c7638 100644 --- a/guava/src/test/java/com/fasterxml/jackson/datatype/guava/failing/Range56Test.java +++ b/guava/src/test/java/com/fasterxml/jackson/datatype/guava/Range56Test.java @@ -1,4 +1,4 @@ -package com.fasterxml.jackson.datatype.guava.failing; +package com.fasterxml.jackson.datatype.guava; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; @@ -8,7 +8,6 @@ import com.google.common.collect.Range; import com.fasterxml.jackson.datatype.guava.GuavaModule; -import com.fasterxml.jackson.datatype.guava.ModuleTestBase; // [datatypes-collections#56]: support naming strategy public class Range56Test extends ModuleTestBase diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 20a6eb38..3454eac6 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -63,3 +63,8 @@ Jon Freedman (jonfreedman@github) * Reported #53: (guava) `GuavaImmutableCollectionDeserializer` cannot deserialize an empty `Optional` from null (2.10.0) + +Philip Leonard (philleonard@github) + * Reported#56, contributed fix: Range property name (de)serialisation doesn't + respect property naming strategy + (2.10.0) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 1a7b3b8a..0eddfb4a 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -9,6 +9,12 @@ Modules: === Releases === ------------------------------------------------------------------------ +2.10.0 (not yet released) + +#56: Range property name (de)serialisation doesn't respect property naming strategy + (reported, fix contributed by Philip L) +#59: Drop support for Guava v10 - v13 to simplify `RangeFactory` + 2.10.0.pr2 (31-Aug-2019) #53: (guava) `GuavaImmutableCollectionDeserializer` cannot deserialize