147d431f63a66505a645f282416659a9758a91f1cBrett Chabot/*
247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Copyright 2003-2009 OFFIS, Henri Tremblay
347d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License");
547d431f63a66505a645f282416659a9758a91f1cBrett Chabot * you may not use this file except in compliance with the License.
647d431f63a66505a645f282416659a9758a91f1cBrett Chabot * You may obtain a copy of the License at
747d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
847d431f63a66505a645f282416659a9758a91f1cBrett Chabot *     http://www.apache.org/licenses/LICENSE-2.0
947d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
1047d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Unless required by applicable law or agreed to in writing, software
1147d431f63a66505a645f282416659a9758a91f1cBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS,
1247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347d431f63a66505a645f282416659a9758a91f1cBrett Chabot * See the License for the specific language governing permissions and
1447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * limitations under the License.
1547d431f63a66505a645f282416659a9758a91f1cBrett Chabot */
1647d431f63a66505a645f282416659a9758a91f1cBrett Chabotpackage org.easymock.internal;
1747d431f63a66505a645f282416659a9758a91f1cBrett Chabot
1847d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.io.Serializable;
1947d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.lang.reflect.Method;
2047d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.util.HashMap;
2147d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.util.Map;
2247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2347d431f63a66505a645f282416659a9758a91f1cBrett Chabotpublic class MethodSerializationWrapper implements Serializable {
2447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private static final long serialVersionUID = 1775475200823842126L;
2647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private static final Map<String, Class<?>> primitiveTypes = new HashMap<String, Class<?>>(
2847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            10);
2947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    static {
3147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Boolean.TYPE.getName(), Boolean.TYPE);
3247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Byte.TYPE.getName(), Byte.TYPE);
3347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Short.TYPE.getName(), Short.TYPE);
3447d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Character.TYPE.getName(), Character.TYPE);
3547d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Integer.TYPE.getName(), Integer.TYPE);
3647d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Long.TYPE.getName(), Long.TYPE);
3747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Float.TYPE.getName(), Float.TYPE);
3847d431f63a66505a645f282416659a9758a91f1cBrett Chabot        primitiveTypes.put(Double.TYPE.getName(), Double.TYPE);
3947d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
4047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private String className;
4247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private String methodName;
4447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private String[] parameterTypeNames;
4647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public MethodSerializationWrapper(Method m) {
4847d431f63a66505a645f282416659a9758a91f1cBrett Chabot        className = m.getDeclaringClass().getName();
4947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        methodName = m.getName();
5047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        Class<?>[] parameterTypes = m.getParameterTypes();
5247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        parameterTypeNames = new String[parameterTypes.length];
5447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5547d431f63a66505a645f282416659a9758a91f1cBrett Chabot        for (int i = 0; i < parameterTypes.length; i++) {
5647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            parameterTypeNames[i] = parameterTypes[i].getName();
5747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
5847d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
5947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public Method getMethod() throws ClassNotFoundException,
6147d431f63a66505a645f282416659a9758a91f1cBrett Chabot            NoSuchMethodException {
6247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        Class<?> clazz = Class.forName(className, true, Thread.currentThread()
6347d431f63a66505a645f282416659a9758a91f1cBrett Chabot                .getContextClassLoader());
6447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6547d431f63a66505a645f282416659a9758a91f1cBrett Chabot        Class<?>[] parameterTypes = new Class[parameterTypeNames.length];
6647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        for (int i = 0; i < parameterTypeNames.length; i++) {
6847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            Class<?> primitiveType = primitiveTypes.get(parameterTypeNames[i]);
6947d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (primitiveType != null) {
7047d431f63a66505a645f282416659a9758a91f1cBrett Chabot                parameterTypes[i] = primitiveType;
7147d431f63a66505a645f282416659a9758a91f1cBrett Chabot            } else {
7247d431f63a66505a645f282416659a9758a91f1cBrett Chabot                parameterTypes[i] = Class.forName(parameterTypeNames[i], true,
7347d431f63a66505a645f282416659a9758a91f1cBrett Chabot                        Thread.currentThread().getContextClassLoader());
7447d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
7547d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
7647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        Method m = clazz.getMethod(methodName, parameterTypes);
7847d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return m;
8047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
8147d431f63a66505a645f282416659a9758a91f1cBrett Chabot}
82