001 package com.mockrunner.struts; 002 003 import java.lang.reflect.Method; 004 005 import org.apache.struts.action.ActionMapping; 006 import org.apache.struts.config.ActionConfig; 007 008 import com.mockrunner.base.NestedApplicationException; 009 import com.mockrunner.mock.web.MockActionMapping; 010 import com.mockrunner.util.common.MethodUtil; 011 012 /** 013 * Helper class to generate CGLib proxies for <code>ActionMapping</code>. Not meant for application use. 014 */ 015 public class ActionMappingProxyGenerator 016 { 017 private final static Method[] delegateMethods; 018 private final static Method[] duplicateMethods; 019 static 020 { 021 delegateMethods = new Method[3]; 022 try 023 { 024 delegateMethods[0] = MockActionMapping.class.getDeclaredMethod("findForward", new Class[] {String.class}); 025 delegateMethods[1] = MockActionMapping.class.getDeclaredMethod("findForwards", null); 026 delegateMethods[2] = MockActionMapping.class.getDeclaredMethod("getInputForward", null); 027 duplicateMethods = MethodUtil.getMatchingDeclaredMethods(ActionConfig.class, "(set.*)|(remove.*)|(add.*)"); 028 } 029 catch(Exception exc) 030 { 031 throw new NestedApplicationException(exc); 032 } 033 } 034 035 036 private MockActionMapping delegateMapping; 037 038 public ActionMappingProxyGenerator(MockActionMapping delegateMapping) 039 { 040 this.delegateMapping = delegateMapping; 041 } 042 043 public ActionMapping createActionMappingProxy(Class mappingClass) 044 { 045 if(null == mappingClass) return null; 046 if(!ActionMapping.class.isAssignableFrom(mappingClass)) 047 { 048 throw new ClassCastException(mappingClass.getClass().getName() + " must be an instance of " + ActionMapping.class.getName()); 049 } 050 DynamicMockProxyGenerator generator = new DynamicMockProxyGenerator(mappingClass, delegateMapping, delegateMethods, duplicateMethods); 051 return (ActionMapping)generator.createProxy(); 052 } 053 }