diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/ChainingInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/ChainingInterceptor.java index b90e2b662..59b1d8819 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/ChainingInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/ChainingInterceptor.java @@ -20,7 +20,7 @@ import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Result; import com.opensymphony.xwork2.Unchainable; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.spring.SpringUtils; +import com.opensymphony.xwork2.util.ProxyUtil; import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.ValueStack; @@ -163,8 +163,8 @@ public class ChainingInterceptor extends AbstractInterceptor { for (Object object : list) { if (shouldCopy(object)) { Object action = invocation.getAction(); - if(SpringUtils.isAopProxy(action)) { - action = SpringUtils.getUltimateTargetObject(action); + if(ProxyUtil.isSpringAopProxy(action)) { + action = ProxyUtil.getSpringUltimateTargetObject(action); } reflectionProvider.copy(object, action, ctxMap, prepareExcludes(), includes); } diff --git a/core/src/main/java/com/opensymphony/xwork2/spring/SpringUtils.java b/core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java similarity index 76% rename from core/src/main/java/com/opensymphony/xwork2/spring/SpringUtils.java rename to core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java index bb6584d24..6a8ac53e0 100644 --- a/core/src/main/java/com/opensymphony/xwork2/spring/SpringUtils.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/ProxyUtil.java @@ -13,21 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.opensymphony.xwork2.spring; +package com.opensymphony.xwork2.util; -import com.opensymphony.xwork2.util.ClassLoaderUtil; import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.Proxy; /** - * SpringUtils + * ProxyUtil *

- * Various utility methods dealing with spring framework + * Various utility methods dealing with proxies *

* */ -public class SpringUtils { +public class ProxyUtil { + private static final String SPRING_ADVISED_CLASS_NAME = "org.springframework.aop.framework.Advised"; + private static final String SPRING_SPRINGPROXY_CLASS_NAME = "org.springframework.aop.SpringProxy"; + /** * Get the ultimate target object of the supplied {@code candidate} * object, unwrapping not only a top-level proxy but also any number of @@ -40,13 +42,12 @@ public class SpringUtils { * @return the target object or the {@code candidate} (never {@code null}) * @throws IllegalStateException if an error occurs while unwrapping a proxy */ - public static T getUltimateTargetObject(Object candidate) { + public static T getSpringUltimateTargetObject(Object candidate) { try { - if (isAopProxy(candidate) && - implementsInterface(candidate.getClass(), "org.springframework.aop.framework.Advised")) { + if (isSpringAopProxy(candidate) && implementsInterface(candidate.getClass(), SPRING_ADVISED_CLASS_NAME)) { Object targetSource = MethodUtils.invokeMethod(candidate, "getTargetSource"); Object target = MethodUtils.invokeMethod(targetSource, "getTarget"); - return getUltimateTargetObject(target); + return getSpringUltimateTargetObject(target); } } catch (Throwable ex) { @@ -59,10 +60,10 @@ public class SpringUtils { * Check whether the given object is a Spring proxy. * @param object the object to check */ - public static boolean isAopProxy(Object object) { + public static boolean isSpringAopProxy(Object object) { Class clazz = object.getClass(); - return (implementsInterface(clazz, "org.springframework.aop.SpringProxy") && - (Proxy.isProxyClass(clazz) || isCglibProxyClass(clazz))); + return (implementsInterface(clazz, SPRING_SPRINGPROXY_CLASS_NAME) && (Proxy.isProxyClass(clazz) + || isCglibProxyClass(clazz))); } /** @@ -80,7 +81,7 @@ public class SpringUtils { */ private static boolean implementsInterface(Class clazz, String ifaceClassName) { try { - Class ifaceClass = ClassLoaderUtil.loadClass(ifaceClassName, SpringUtils.class); + Class ifaceClass = ClassLoaderUtil.loadClass(ifaceClassName, ProxyUtil.class); return ifaceClass.isAssignableFrom(clazz); } catch (ClassNotFoundException e) { return false; diff --git a/core/src/test/java/com/opensymphony/xwork2/spring/SpringUtilsTest.java b/core/src/test/java/com/opensymphony/xwork2/spring/SpringProxyUtilTest.java similarity index 66% rename from core/src/test/java/com/opensymphony/xwork2/spring/SpringUtilsTest.java rename to core/src/test/java/com/opensymphony/xwork2/spring/SpringProxyUtilTest.java index 7a1e0d7b4..9c047b842 100644 --- a/core/src/test/java/com/opensymphony/xwork2/spring/SpringUtilsTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/spring/SpringProxyUtilTest.java @@ -17,13 +17,14 @@ package com.opensymphony.xwork2.spring; import com.opensymphony.xwork2.*; import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; +import com.opensymphony.xwork2.util.ProxyUtil; import org.springframework.context.ApplicationContext; /** - * Test various utility methods dealing with spring framework. + * Test various utility methods dealing with spring proxies. * */ -public class SpringUtilsTest extends XWorkTestCase { +public class SpringProxyUtilTest extends XWorkTestCase { private ApplicationContext appContext; @Override public void setUp() throws Exception { @@ -36,49 +37,49 @@ public class SpringUtilsTest extends XWorkTestCase { appContext = ((SpringObjectFactory)container.getInstance(ObjectFactory.class)).appContext; } - public void testIsAopProxy() throws Exception { + public void testIsSpringAopProxy() throws Exception { Object simpleAction = appContext.getBean("simple-action"); - assertFalse(SpringUtils.isAopProxy(simpleAction)); + assertFalse(ProxyUtil.isSpringAopProxy(simpleAction)); Object proxiedAction = appContext.getBean("proxied-action"); - assertTrue(SpringUtils.isAopProxy(proxiedAction)); + assertTrue(ProxyUtil.isSpringAopProxy(proxiedAction)); Object autoProxiedAction = appContext.getBean("auto-proxied-action"); - assertTrue(SpringUtils.isAopProxy(autoProxiedAction)); + assertTrue(ProxyUtil.isSpringAopProxy(autoProxiedAction)); Object pointcuttedTestBean = appContext.getBean("pointcutted-test-bean"); - assertTrue(SpringUtils.isAopProxy(pointcuttedTestBean)); + assertTrue(ProxyUtil.isSpringAopProxy(pointcuttedTestBean)); Object pointcuttedTestSubBean = appContext.getBean("pointcutted-test-sub-bean"); - assertTrue(SpringUtils.isAopProxy(pointcuttedTestSubBean)); + assertTrue(ProxyUtil.isSpringAopProxy(pointcuttedTestSubBean)); Object aspectedTestSubBean = appContext.getBean("aspected-test-sub-bean"); - assertFalse(SpringUtils.isAopProxy(aspectedTestSubBean)); + assertFalse(ProxyUtil.isSpringAopProxy(aspectedTestSubBean)); } - public void testGetUltimateTargetObject() throws Exception { + public void testGetSpringUltimateTargetObject() throws Exception { Object simpleAction = appContext.getBean("simple-action"); - Object simpleActionUltimateTargetObject = SpringUtils.getUltimateTargetObject(simpleAction); + Object simpleActionUltimateTargetObject = ProxyUtil.getSpringUltimateTargetObject(simpleAction); assertEquals(simpleAction, simpleActionUltimateTargetObject); Object proxiedAction = appContext.getBean("proxied-action"); - Object proxiedActionUltimateTargetObject = SpringUtils.getUltimateTargetObject(proxiedAction); + Object proxiedActionUltimateTargetObject = ProxyUtil.getSpringUltimateTargetObject(proxiedAction); assertEquals(SimpleAction.class, proxiedActionUltimateTargetObject.getClass()); Object autoProxiedAction = appContext.getBean("auto-proxied-action"); - Object autoProxiedActionUltimateTargetObject = SpringUtils.getUltimateTargetObject(autoProxiedAction); + Object autoProxiedActionUltimateTargetObject = ProxyUtil.getSpringUltimateTargetObject(autoProxiedAction); assertEquals(SimpleAction.class, autoProxiedActionUltimateTargetObject.getClass()); Object pointcuttedTestBean = appContext.getBean("pointcutted-test-bean"); - Object pointcuttedTestBeanUltimateTargetObject = SpringUtils.getUltimateTargetObject(pointcuttedTestBean); + Object pointcuttedTestBeanUltimateTargetObject = ProxyUtil.getSpringUltimateTargetObject(pointcuttedTestBean); assertEquals(TestBean.class, pointcuttedTestBeanUltimateTargetObject.getClass()); Object pointcuttedTestSubBean = appContext.getBean("pointcutted-test-sub-bean"); - Object pointcuttedTestSubBeanUltimateTargetObject = SpringUtils.getUltimateTargetObject(pointcuttedTestSubBean); + Object pointcuttedTestSubBeanUltimateTargetObject = ProxyUtil.getSpringUltimateTargetObject(pointcuttedTestSubBean); assertEquals(TestSubBean.class, pointcuttedTestSubBeanUltimateTargetObject.getClass()); Object aspectedTestSubBean = appContext.getBean("aspected-test-sub-bean"); - Object aspectedTestSubBeanUltimateTargetObject = SpringUtils.getUltimateTargetObject(aspectedTestSubBean); + Object aspectedTestSubBeanUltimateTargetObject = ProxyUtil.getSpringUltimateTargetObject(aspectedTestSubBean); assertEquals(aspectedTestSubBean, aspectedTestSubBeanUltimateTargetObject); } }