This is an automated email from the ASF dual-hosted git repository. kusal pushed a commit to branch WW-5339-astmap-block in repository https://gitbox.apache.org/repos/asf/struts.git
commit 48a82feadad6d0f46b04898bebbe848abf1af164 Author: Kusal Kithul-Godage <g...@kusal.io> AuthorDate: Tue Dec 5 12:54:27 2023 +1100 WW-5339 Make ClassResolver a bean --- .../xwork2/config/impl/DefaultConfiguration.java | 2 ++ .../main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java | 9 +++++---- .../com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java | 13 ++++++------- core/src/main/resources/struts-beans.xml | 3 +++ 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index 2d2a4a2b1..4a6ee1373 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -100,6 +100,7 @@ import com.opensymphony.xwork2.util.fs.DefaultFileManager; import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory; import com.opensymphony.xwork2.util.location.LocatableProperties; import com.opensymphony.xwork2.util.reflection.ReflectionProvider; +import ognl.ClassResolver; import ognl.PropertyAccessor; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -390,6 +391,7 @@ public class DefaultConfiguration implements Configuration { .factory(ObjectTypeDeterminer.class, DefaultObjectTypeDeterminer.class, Scope.SINGLETON) .factory(PropertyAccessor.class, CompoundRoot.class.getName(), CompoundRootAccessor.class, Scope.SINGLETON) + .factory(ClassResolver.class, CompoundRoot.class.getName(), CompoundRootAccessor.class, Scope.SINGLETON) .factory(ExpressionCacheFactory.class, DefaultOgnlExpressionCacheFactory.class, Scope.SINGLETON) .factory(BeanInfoCacheFactory.class, DefaultOgnlBeanInfoCacheFactory.class, Scope.SINGLETON) diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java index 18a73c47a..c4ee4b655 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java @@ -21,7 +21,6 @@ package com.opensymphony.xwork2.ognl; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor; import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.util.reflection.ReflectionException; import ognl.ClassResolver; @@ -856,10 +855,12 @@ public class OgnlUtil { return createDefaultContext(root, null); } - protected Map<String, Object> createDefaultContext(Object root, ClassResolver classResolver) { - ClassResolver resolver = classResolver; + protected Map<String, Object> createDefaultContext(Object root, ClassResolver resolver) { if (resolver == null) { - resolver = container.getInstance(CompoundRootAccessor.class); + resolver = container.getInstance(ClassResolver.class, CompoundRoot.class.getName()); + if (resolver == null) { + throw new IllegalStateException("Cannot find ClassResolver"); + } } SecurityMemberAccess memberAccess = container.getInstance(SecurityMemberAccess.class); diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java index 111a44d79..66798c034 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java @@ -24,9 +24,9 @@ import com.opensymphony.xwork2.conversion.impl.XWorkConverter; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor; -import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; +import ognl.ClassResolver; import ognl.MethodAccessor; import ognl.OgnlRuntime; import ognl.PropertyAccessor; @@ -50,6 +50,11 @@ public class OgnlValueStackFactory implements ValueStackFactory { this.xworkConverter = converter; } + @Inject(value = "com.opensymphony.xwork2.util.CompoundRoot") + protected void setClassResolver(ClassResolver classResolver) { + this.compoundRootAccessor = (CompoundRootAccessor) classResolver; + } + @Inject("system") protected void setTextProvider(TextProvider textProvider) { this.textProvider = textProvider; @@ -75,9 +80,6 @@ public class OgnlValueStackFactory implements ValueStackFactory { for (String name : names) { Class<?> cls = Class.forName(name); OgnlRuntime.setPropertyAccessor(cls, container.getInstance(PropertyAccessor.class, name)); - if (compoundRootAccessor == null && CompoundRoot.class.isAssignableFrom(cls)) { - compoundRootAccessor = (CompoundRootAccessor) container.getInstance(PropertyAccessor.class, name); - } } names = container.getInstanceNames(MethodAccessor.class); @@ -91,9 +93,6 @@ public class OgnlValueStackFactory implements ValueStackFactory { Class<?> cls = Class.forName(name); OgnlRuntime.setNullHandler(cls, new OgnlNullHandlerWrapper(container.getInstance(NullHandler.class, name))); } - if (compoundRootAccessor == null) { - throw new IllegalStateException("Couldn't find the compound root accessor"); - } this.container = container; } diff --git a/core/src/main/resources/struts-beans.xml b/core/src/main/resources/struts-beans.xml index 8c751c0c1..1238c9e05 100644 --- a/core/src/main/resources/struts-beans.xml +++ b/core/src/main/resources/struts-beans.xml @@ -174,6 +174,9 @@ <bean type="com.opensymphony.xwork2.util.TextParser" name="struts" class="com.opensymphony.xwork2.util.OgnlTextParser" scope="singleton"/> + <bean type="ognl.ClassResolver" name="com.opensymphony.xwork2.util.CompoundRoot" + class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"/> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"/> <bean type="ognl.PropertyAccessor" name="java.lang.Object"