This is an automated email from the ASF dual-hosted git repository. kusal pushed a commit to branch kusal-depr-apis-5 in repository https://gitbox.apache.org/repos/asf/struts.git
commit 24dce170b5bad4a5cf298ab1177aab7e3609e24e Author: Kusal Kithul-Godage <g...@kusal.io> AuthorDate: Thu Oct 17 15:46:25 2024 +1100 WW-3714 Deprecate and migrate ValueStack --- .../com/opensymphony/xwork2/ActionContext.java | 2 +- .../opensymphony/xwork2/ActionEventListener.java | 14 ++ .../com/opensymphony/xwork2/ActionInvocation.java | 5 +- .../com/opensymphony/xwork2/util/ValueStack.java | 254 ++++++++++----------- .../org/apache/struts2/ActionEventListener.java | 2 +- .../java/org/apache/struts2/ActionInvocation.java | 2 +- .../apache/struts2}/util/ValueStack.java | 7 +- 7 files changed, 142 insertions(+), 144 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionContext.java b/core/src/main/java/com/opensymphony/xwork2/ActionContext.java index d62da3219..4d042ad3d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ActionContext.java +++ b/core/src/main/java/com/opensymphony/xwork2/ActionContext.java @@ -43,7 +43,7 @@ public class ActionContext extends org.apache.struts2.ActionContext { super(actualContext.getContextMap()); } - static ActionContext adapt(org.apache.struts2.ActionContext actualContext) { + public static ActionContext adapt(org.apache.struts2.ActionContext actualContext) { return actualContext != null ? new ActionContext(actualContext) : null; } diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionEventListener.java b/core/src/main/java/com/opensymphony/xwork2/ActionEventListener.java index 4d2143848..5bd4f86d5 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ActionEventListener.java +++ b/core/src/main/java/com/opensymphony/xwork2/ActionEventListener.java @@ -28,6 +28,20 @@ import com.opensymphony.xwork2.util.ValueStack; @Deprecated public interface ActionEventListener extends org.apache.struts2.ActionEventListener { + @Override + default Object prepare(Object action, org.apache.struts2.util.ValueStack stack) { + return prepare(action, ValueStack.adapt(stack)); + } + + @Override + default String handleException(Throwable t, org.apache.struts2.util.ValueStack stack) { + return handleException(t, ValueStack.adapt(stack)); + } + + Object prepare(Object action, ValueStack stack); + + String handleException(Throwable t, ValueStack stack); + static ActionEventListener adapt(org.apache.struts2.ActionEventListener actualListener) { return actualListener != null ? new LegacyAdapter(actualListener) : null; } diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java b/core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java index 82020bbe1..76929a647 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java +++ b/core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java @@ -38,6 +38,9 @@ public interface ActionInvocation extends org.apache.struts2.ActionInvocation { @Override ActionProxy getProxy(); + @Override + ValueStack getStack(); + @Override default void addPreResultListener(org.apache.struts2.interceptor.PreResultListener listener) { addPreResultListener(PreResultListener.adapt(listener)); @@ -108,7 +111,7 @@ public interface ActionInvocation extends org.apache.struts2.ActionInvocation { @Override public ValueStack getStack() { - return adaptee.getStack(); + return ValueStack.adapt(adaptee.getStack()); } @Override diff --git a/core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java b/core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java index 4d02b235f..9e3e98b57 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java @@ -23,144 +23,124 @@ import com.opensymphony.xwork2.ActionContext; import java.util.Map; /** - * ValueStack allows multiple beans to be pushed in and dynamic EL expressions to be evaluated against it. When - * evaluating an expression, the stack will be searched down the stack, from the latest objects pushed in to the - * earliest, looking for a bean with a getter or setter for the given property or a method of the given name (depending - * on the expression being evaluated). + * @deprecated since 6.7.0, use {@link org.apache.struts2.util.ValueStack} instead. */ -public interface ValueStack { - - String VALUE_STACK = "com.opensymphony.xwork2.util.ValueStack.ValueStack"; - - String REPORT_ERRORS_ON_NO_PROP = "com.opensymphony.xwork2.util.ValueStack.ReportErrorsOnNoProp"; - - /** - * Gets the context for this value stack. The context holds all the information in the value stack and it's surroundings. - * - * @return the context. - */ - Map<String, Object> getContext(); +@Deprecated +public interface ValueStack extends org.apache.struts2.util.ValueStack { + @Override ActionContext getActionContext(); - /** - * Sets the default type to convert to if no type is provided when getting a value. - * - * @param defaultType the new default type - */ - void setDefaultType(Class defaultType); - - /** - * Set a override map containing <code> key -> values </code> that takes precedent when doing find operations on the ValueStack. - * <p> - * See the unit test for ValueStackTest for examples. - * </p> - * - * @param overrides overrides map. - */ - void setExprOverrides(Map<Object, Object> overrides); - - /** - * Gets the override map if anyone exists. - * - * @return the override map, <tt>null</tt> if not set. - */ - Map<Object, Object> getExprOverrides(); - - /** - * Get the CompoundRoot which holds the objects pushed onto the stack - * - * @return the root - */ - CompoundRoot getRoot(); - - /** - * Attempts to set a property on a bean in the stack with the given expression using the default search order. - * - * @param expr the expression defining the path to the property to be set. - * @param value the value to be set into the named property - */ - void setValue(String expr, Object value); - - /** - * Attempts to set a property on a bean in the stack with the given expression using the default search order. - * N.B.: unlike #setValue(String,Object) it doesn't allow eval expression. - * @param expr the expression defining the path to the property to be set. - * @param value the value to be set into the named property - */ - void setParameter(String expr, Object value); - - /** - * Attempts to set a property on a bean in the stack with the given expression using the default search order. - * - * @param expr the expression defining the path to the property to be set. - * @param value the value to be set into the named property - * @param throwExceptionOnFailure a flag to tell whether an exception should be thrown if there is no property with - * the given name. - */ - void setValue(String expr, Object value, boolean throwExceptionOnFailure); - - String findString(String expr); - String findString(String expr, boolean throwExceptionOnFailure); - - /** - * Find a value by evaluating the given expression against the stack in the default search order. - * - * @param expr the expression giving the path of properties to navigate to find the property value to return - * @return the result of evaluating the expression - */ - Object findValue(String expr); - - Object findValue(String expr, boolean throwExceptionOnFailure); - - /** - * Find a value by evaluating the given expression against the stack in the default search order. - * - * @param expr the expression giving the path of properties to navigate to find the property value to return - * @param asType the type to convert the return value to - * @return the result of evaluating the expression - */ - Object findValue(String expr, Class asType); - Object findValue(String expr, Class asType, boolean throwExceptionOnFailure); - - /** - * Get the object on the top of the stack <b>without</b> changing the stack. - * - * @return the object on the top. - * @see CompoundRoot#peek() - */ - Object peek(); - - /** - * Get the object on the top of the stack and <b>remove</b> it from the stack. - * - * @return the object on the top of the stack - * @see CompoundRoot#pop() - */ - Object pop(); - - /** - * Put this object onto the top of the stack - * - * @param o the object to be pushed onto the stack - * @see CompoundRoot#push(Object) - */ - void push(Object o); - - /** - * Sets an object on the stack with the given key - * so it is retrievable by {@link #findValue(String)}, {@link #findValue(String, Class)} - * - * @param key the key - * @param o the object - */ - void set(String key, Object o); - - /** - * Get the number of objects in the stack - * - * @return the number of objects in the stack - */ - int size(); - -} \ No newline at end of file + static ValueStack adapt(org.apache.struts2.util.ValueStack actualStack) { + return actualStack != null ? new LegacyAdapter(actualStack) : null; + } + + class LegacyAdapter implements ValueStack { + + private final org.apache.struts2.util.ValueStack adaptee; + + private LegacyAdapter(org.apache.struts2.util.ValueStack adaptee) { + this.adaptee = adaptee; + } + + @Override + public Map<String, Object> getContext() { + return adaptee.getContext(); + } + + @Override + public ActionContext getActionContext() { + return ActionContext.adapt(adaptee.getActionContext()); + } + + @Override + public void setDefaultType(Class defaultType) { + adaptee.setDefaultType(defaultType); + } + + @Override + public void setExprOverrides(Map<Object, Object> overrides) { + adaptee.setExprOverrides(overrides); + } + + @Override + public Map<Object, Object> getExprOverrides() { + return adaptee.getExprOverrides(); + } + + @Override + public CompoundRoot getRoot() { + return adaptee.getRoot(); + } + + @Override + public void setValue(String expr, Object value) { + adaptee.setValue(expr, value); + } + + @Override + public void setParameter(String expr, Object value) { + adaptee.setParameter(expr, value); + } + + @Override + public void setValue(String expr, Object value, boolean throwExceptionOnFailure) { + adaptee.setValue(expr, value, throwExceptionOnFailure); + } + + @Override + public String findString(String expr) { + return adaptee.findString(expr); + } + + @Override + public String findString(String expr, boolean throwExceptionOnFailure) { + return adaptee.findString(expr, throwExceptionOnFailure); + } + + @Override + public Object findValue(String expr) { + return adaptee.findValue(expr); + } + + @Override + public Object findValue(String expr, boolean throwExceptionOnFailure) { + return adaptee.findValue(expr, throwExceptionOnFailure); + } + + @Override + public Object findValue(String expr, Class asType) { + return adaptee.findValue(expr, asType); + } + + @Override + public Object findValue(String expr, Class asType, boolean throwExceptionOnFailure) { + return adaptee.findValue(expr, asType, throwExceptionOnFailure); + } + + @Override + public Object peek() { + return adaptee.peek(); + } + + @Override + public Object pop() { + return adaptee.pop(); + } + + @Override + public void push(Object o) { + adaptee.push(o); + } + + @Override + public void set(String key, Object o) { + adaptee.set(key, o); + } + + @Override + public int size() { + return adaptee.size(); + } + } +} diff --git a/core/src/main/java/org/apache/struts2/ActionEventListener.java b/core/src/main/java/org/apache/struts2/ActionEventListener.java index 8c01a9a23..23077cc9a 100644 --- a/core/src/main/java/org/apache/struts2/ActionEventListener.java +++ b/core/src/main/java/org/apache/struts2/ActionEventListener.java @@ -18,7 +18,7 @@ */ package org.apache.struts2; -import com.opensymphony.xwork2.util.ValueStack; +import org.apache.struts2.util.ValueStack; /** * Provides hooks for handling key action events diff --git a/core/src/main/java/org/apache/struts2/ActionInvocation.java b/core/src/main/java/org/apache/struts2/ActionInvocation.java index e3d446bc0..5fcbc75ec 100644 --- a/core/src/main/java/org/apache/struts2/ActionInvocation.java +++ b/core/src/main/java/org/apache/struts2/ActionInvocation.java @@ -19,8 +19,8 @@ package org.apache.struts2; import com.opensymphony.xwork2.ActionChainResult; -import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.interceptor.PreResultListener; +import org.apache.struts2.util.ValueStack; /** * An {@link ActionInvocation} represents the execution state of an {@link com.opensymphony.xwork2.Action}. It holds the Interceptors and the Action instance. diff --git a/core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java b/core/src/main/java/org/apache/struts2/util/ValueStack.java similarity index 97% copy from core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java copy to core/src/main/java/org/apache/struts2/util/ValueStack.java index 4d02b235f..f7d70a35d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/ValueStack.java +++ b/core/src/main/java/org/apache/struts2/util/ValueStack.java @@ -16,9 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -package com.opensymphony.xwork2.util; +package org.apache.struts2.util; -import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.util.CompoundRoot; +import org.apache.struts2.ActionContext; import java.util.Map; @@ -163,4 +164,4 @@ public interface ValueStack { */ int size(); -} \ No newline at end of file +}