001    package biz.hammurapi.remoting;
002    
003    import java.lang.reflect.Method;
004    import java.util.HashMap;
005    import java.util.Map;
006    
007    public class MapLocalDelegate implements LocalDelegate {
008                    
009            private Map state = new HashMap();
010    
011    
012            public Object invoke(Object proxy, Method method, Object[] args, Remoter remoter) throws Throwable {
013                    Class[] parameterTypes = method.getParameterTypes();
014                    if (method.getName().length()>3) {
015                            if (method.getName().startsWith("set") && parameterTypes.length==1 && void.class.equals(method.getReturnType())) {
016                                    state.put(method.getName().substring(3), args[0]);
017                                    return null;
018                            }
019                            
020                            if (method.getName().startsWith("get") && parameterTypes.length==0 && !void.class.equals(method.getReturnType())) {
021                                    return state.get(method.getName().substring(3));
022                            }
023                    }
024                    
025                    if (Object.class.equals(method.getDeclaringClass())) {
026                            return method.invoke(state, args);
027                    }
028                    
029                    String[] pt = new String[parameterTypes.length];
030                    for (int i=0; i<pt.length; ++i) {
031                            pt[i] = parameterTypes[i].getName();
032                    }
033    
034                    return remoter.invoke(new Invocation(state, method.getDeclaringClass().getName(), method.getName(), pt, args, null));
035            }
036    
037    
038    }