From 29027f395792cfefec5e330fc0fc3dc06f0343b0 Mon Sep 17 00:00:00 2001 From: Kusal Kithul-Godage Date: Tue, 2 Jan 2024 21:21:35 +1100 Subject: [PATCH] WW-5379 Use ValueStackProvider marker interface for Velocity context implementation flexibility --- .../org/apache/struts2/util/ValueStackProvider.java | 12 ++++++++++++ .../views/velocity/StrutsVelocityContext.java | 4 +++- .../views/velocity/components/AbstractDirective.java | 6 +++--- 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/org/apache/struts2/util/ValueStackProvider.java diff --git a/core/src/main/java/org/apache/struts2/util/ValueStackProvider.java b/core/src/main/java/org/apache/struts2/util/ValueStackProvider.java new file mode 100644 index 0000000000..9136c4c858 --- /dev/null +++ b/core/src/main/java/org/apache/struts2/util/ValueStackProvider.java @@ -0,0 +1,12 @@ +package org.apache.struts2.util; + +import com.opensymphony.xwork2.util.ValueStack; + +/** + * @since 6.4.0 + */ +public interface ValueStackProvider { + + ValueStack getValueStack(); + +} diff --git a/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java index 7ab4f24e78..d18ca6bcf4 100644 --- a/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java +++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java @@ -19,6 +19,7 @@ package org.apache.struts2.views.velocity; import com.opensymphony.xwork2.util.ValueStack; +import org.apache.struts2.util.ValueStackProvider; import org.apache.velocity.VelocityContext; import java.util.ArrayList; @@ -26,7 +27,7 @@ import java.util.List; import java.util.function.Function; -public class StrutsVelocityContext extends VelocityContext { +public class StrutsVelocityContext extends VelocityContext implements ValueStackProvider { private final ValueStack stack; private final List chainedContexts; @@ -104,6 +105,7 @@ protected Object chainedContextGet(String key) { return null; } + @Override public ValueStack getValueStack() { return stack; } diff --git a/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java index fd984a88da..539f64bdd9 100644 --- a/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java +++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java @@ -22,8 +22,8 @@ import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.ServletActionContext; import org.apache.struts2.components.Component; +import org.apache.struts2.util.ValueStackProvider; import org.apache.struts2.views.util.ContextUtil; -import org.apache.struts2.views.velocity.StrutsVelocityContext; import org.apache.velocity.context.AbstractContext; import org.apache.velocity.context.Context; import org.apache.velocity.context.InternalContextAdapter; @@ -86,8 +86,8 @@ public boolean render(InternalContextAdapter ctx, Writer writer, Node node) thro private ValueStack extractValueStack(Context context) { do { - if (context instanceof StrutsVelocityContext) { - return ((StrutsVelocityContext) context).getValueStack(); + if (context instanceof ValueStackProvider) { + return ((ValueStackProvider) context).getValueStack(); } context = extractContext(context); } while (context != null);