From 1138a7c90494f8017faeb92037bdcef4871f7674 Mon Sep 17 00:00:00 2001 From: Adam Gent Date: Wed, 6 Apr 2022 12:58:25 -0400 Subject: [PATCH 1/3] Fix #951 templates breaking on upgrade --- .../jknack/handlebars/ValueResolver.java | 11 ++++------ .../context/MemberValueResolver.java | 15 ++++++++++++- .../context/RecordValueResolver.java | 21 +++++++++++++++++++ 3 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java index 156d98f12..586267bcb 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java @@ -26,7 +26,7 @@ import com.github.jknack.handlebars.context.JavaBeanValueResolver; import com.github.jknack.handlebars.context.MapValueResolver; -import com.github.jknack.handlebars.context.MethodValueResolver; +import com.github.jknack.handlebars.context.RecordValueResolver; /** * A hook interface for resolving values from the {@link Context context stack}. @@ -79,15 +79,12 @@ public interface ValueResolver { * * - {@link MapValueResolver} * - {@link JavaBeanValueResolver} - * - {@link MethodValueResolver}. On Java 14 or higher. + * - {@link RecordValueResolver}. * * @return Immutable list of value resolvers. */ static List defaultValueResolvers() { - if (Handlebars.Utils.javaVersion14) { - return unmodifiableList(asList(MapValueResolver.INSTANCE, - JavaBeanValueResolver.INSTANCE, MethodValueResolver.INSTANCE)); - } - return unmodifiableList(asList(MapValueResolver.INSTANCE, JavaBeanValueResolver.INSTANCE)); + return unmodifiableList( + asList(MapValueResolver.INSTANCE, JavaBeanValueResolver.INSTANCE, RecordValueResolver.INSTANCE)); } } diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java index 1ec5c2dd0..8869e0197 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java @@ -50,6 +50,9 @@ public abstract class MemberValueResolver implements ValueReso @Override public final Object resolve(final Object context, final String name) { + if (! matches(context)) { + return UNRESOLVED; + } Class key = context.getClass(); Map mcache = cache(key); M member = mcache.get(name); @@ -59,7 +62,7 @@ public final Object resolve(final Object context, final String name) { return invokeMember(member, context); } } - + @Override public Object resolve(final Object context) { return UNRESOLVED; @@ -122,6 +125,16 @@ protected boolean isUseSetAccessible(final M member) { */ protected abstract Object invokeMember(M member, Object context); + /** + * True, if the context is worth examing by this resolver. + * + * @param context The context object. + * @return True, if the context is suitable. + */ + protected boolean matches(Object context) { + return true; + } + /** * True, if the member matches the one we look for. * diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java new file mode 100644 index 000000000..fe68ae3e1 --- /dev/null +++ b/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java @@ -0,0 +1,21 @@ +package com.github.jknack.handlebars.context; + +/** + * A resolver for Record types. + * + * This resolver is safe to use in JDKs that do not support records yet. + * + * @author agentgt + * + */ +public class RecordValueResolver extends MethodValueResolver { + + public static RecordValueResolver INSTANCE = new RecordValueResolver(); + + @Override + protected boolean matches(Object context) { + Class superClass = context.getClass().getSuperclass(); + return superClass.getName().equals("java.lang.Record"); + } + +} From 3ce41d9d967bfed75e10df5dfb41540885259e02 Mon Sep 17 00:00:00 2001 From: Adam Gent Date: Wed, 6 Apr 2022 13:09:11 -0400 Subject: [PATCH 2/3] Appeasing checkstyle --- .../com/github/jknack/handlebars/ValueResolver.java | 5 ++++- .../handlebars/context/MemberValueResolver.java | 8 ++++---- .../handlebars/context/RecordValueResolver.java | 13 ++++++++----- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java index 586267bcb..4009209d1 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/ValueResolver.java @@ -85,6 +85,9 @@ public interface ValueResolver { */ static List defaultValueResolvers() { return unmodifiableList( - asList(MapValueResolver.INSTANCE, JavaBeanValueResolver.INSTANCE, RecordValueResolver.INSTANCE)); + asList( + MapValueResolver.INSTANCE, + JavaBeanValueResolver.INSTANCE, + RecordValueResolver.INSTANCE)); } } diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java index 8869e0197..5e28cb58d 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/context/MemberValueResolver.java @@ -50,7 +50,7 @@ public abstract class MemberValueResolver implements ValueReso @Override public final Object resolve(final Object context, final String name) { - if (! matches(context)) { + if (!matches(context)) { return UNRESOLVED; } Class key = context.getClass(); @@ -62,7 +62,7 @@ public final Object resolve(final Object context, final String name) { return invokeMember(member, context); } } - + @Override public Object resolve(final Object context) { return UNRESOLVED; @@ -131,10 +131,10 @@ protected boolean isUseSetAccessible(final M member) { * @param context The context object. * @return True, if the context is suitable. */ - protected boolean matches(Object context) { + protected boolean matches(final Object context) { return true; } - + /** * True, if the member matches the one we look for. * diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java index fe68ae3e1..44cb22d32 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java @@ -2,18 +2,21 @@ /** * A resolver for Record types. - * + * * This resolver is safe to use in JDKs that do not support records yet. - * + * * @author agentgt * */ public class RecordValueResolver extends MethodValueResolver { - public static RecordValueResolver INSTANCE = new RecordValueResolver(); - + /** + * The default instance. + */ + public static final RecordValueResolver INSTANCE = new RecordValueResolver(); + @Override - protected boolean matches(Object context) { + protected boolean matches(final Object context) { Class superClass = context.getClass().getSuperclass(); return superClass.getName().equals("java.lang.Record"); } From 9455b38aab1516b224441b6ca5a18a0016d7a45a Mon Sep 17 00:00:00 2001 From: Adam Gent Date: Wed, 6 Apr 2022 13:14:15 -0400 Subject: [PATCH 3/3] Fix null pointer exception on superclass missing --- .../github/jknack/handlebars/context/RecordValueResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java b/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java index 44cb22d32..7e1aac731 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/context/RecordValueResolver.java @@ -18,7 +18,7 @@ public class RecordValueResolver extends MethodValueResolver { @Override protected boolean matches(final Object context) { Class superClass = context.getClass().getSuperclass(); - return superClass.getName().equals("java.lang.Record"); + return superClass != null && superClass.getName().equals("java.lang.Record"); } }