/*
* $Id$
*
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jboss.mockgenerator;
import java.io.File;
/**
* <p class="changed_added_4_0"></p>
* @author asmirnov@exadel.com
*
*/
public class MockControlSource extends JavaSource {
private static final String fileHeader="/*\n" +
" * GENERATED FILE - DO NOT EDIT\n" +
" */\n" +
"\n" +
"package %1$s;\n" +
"\n" +
"import static org.easymock.EasyMock.*;\n" +
"\n" +
"import java.lang.reflect.Constructor;\n" +
"import java.lang.reflect.Method;\n" +
"\n" +
"import org.easymock.IMocksControl;\n" +
"import org.easymock.internal.Invocation;\n" +
"import org.easymock.internal.LastControl;\n" +
"import org.easymock.internal.MocksControl;\n" +
"import org.easymock.internal.RecordState;\n" +
"/**\n" +
" * <p class=\"changed_added_4_0\"></p>\n" +
" * @author asmirnov@exadel.com\n" +
" *\n" +
" */\n" +
"public class %2$s {\n" +
" \n" +
" public interface MockObject {\n" +
" \n" +
" public IMocksControl getControl();\n" +
"\n" +
" }\n" +
"\n" +
" private static final Class<?>[] mockClasses = {\n" +
"";
private static final String fileFooter = " };\n" +
"\n" +
" \n" +
" \n" +
" public static <T> T createMock(String name, Class<T> clazz, IMocksControl control) throws ClassNotFoundException {\n" +
" for (Class<?> mockClass : mockClasses) {\n" +
" if(clazz.isAssignableFrom(mockClass)){\n" +
" try {\n" +
" Constructor<?> constructor = mockClass.getConstructor(IMocksControl.class, String.class);\n" +
" return (T) constructor.newInstance(control, name);\n" +
" } catch (Exception e) {\n" +
" throw new ClassNotFoundException(\"Cannot instantiate object for class \"+clazz.getName(),e);\n" +
" }\n" +
" }\n" +
" }\n" +
" throw new ClassNotFoundException(\"Mock object for class \"+clazz.getName()+\" not found\");\n" +
" }\n" +
" \n" +
" public static <T> T createMock(String name, Class<T> clazz) throws ClassNotFoundException {\n" +
" return createMock(name, clazz, createControl());\n" +
" }\n" +
" \n" +
" public static <T> T createMock(Class<T> clazz) throws ClassNotFoundException {\n" +
" return createMock(null, clazz, createControl());\n" +
" }\n" +
" \n" +
" public static <T> T invokeCurrent(MockObject target,Object... args){\n" +
" StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();\n" +
" for (StackTraceElement traceElement : stackTrace) {\n" +
" if(traceElement.getClassName().equals(target.getClass().getName())){\n" +
" String methodName = traceElement.getMethodName();\n" +
" Method[] methods = target.getClass().getDeclaredMethods();\n" +
" for (Method method : methods) {\n" +
" if(method.getName().equals(methodName)){\n" +
" Class<?>[] parameterTypes = method.getParameterTypes();\n" +
" boolean acceptParameters = false;\n" +
" if(null == args){\n" +
" acceptParameters = parameterTypes.length == 0;\n" +
" } else if(parameterTypes.length == args.length){\n" +
" acceptParameters = true;\n" +
" for (int i = 0; i < parameterTypes.length; i++) {\n" +
" if(null != args[i] && !parameterTypes[i].isInstance(args[i]) && !parameterTypes[i].isPrimitive()){\n" +
" acceptParameters = false;\n" +
" break;\n" +
" }\n" +
" }\n" +
" }\n" +
" if(acceptParameters){\n" +
" return %2$s.<T>invokeMethod(target, method, args);\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" throw new RuntimeException(\"cannot find current method\");\n" +
" }\n" +
""+
" public static <T> T invokeMethod(MockObject target, Method method, Object... args) {\n" +
" IMocksControl mcontrol = target.getControl();\n" +
" return %2$s.<T>invokeMethod(mcontrol, target, method, args);\n" +
" }\n" +
"\n" +
" @SuppressWarnings(\"unchecked\")\n" +
" public static <T> T invokeMethod(IMocksControl control, MockObject target, Method method, Object... args)\n" +
" throws AssertionError, Error {\n" +
" if (null != control) {\n" +
" try {\n" +
" MocksControl mcontrol = (MocksControl) control;\n" +
" if (mcontrol.getState() instanceof RecordState) {" +
" LastControl.reportLastControl(mcontrol);\n" +
" }\n" +
" return (T) mcontrol.getState().invoke(new Invocation(target, method, args));\n" +
"\n" +
" } catch (org.easymock.internal.RuntimeExceptionWrapper e) {\n" +
" throw (RuntimeException) e.getRuntimeException().fillInStackTrace();\n" +
" } catch (org.easymock.internal.AssertionErrorWrapper e) {\n" +
" throw (AssertionError) e.getAssertionError().fillInStackTrace();\n" +
" } catch (org.easymock.internal.ThrowableWrapper t) {\n" +
" Throwable wrappedThrowable = t.getThrowable().fillInStackTrace();\n" +
" if (wrappedThrowable instanceof RuntimeException) {\n" +
" throw (RuntimeException) wrappedThrowable;\n" +
" } else if (wrappedThrowable instanceof Error) {\n" +
" throw (Error) wrappedThrowable;\n" +
" } else {\n" +
" throw new RuntimeException(t.fillInStackTrace());\n" +
" }\n" +
" } catch (Throwable t) {\n" +
" throw new RuntimeException(t.fillInStackTrace());\n" +
" }\n" +
"\n" +
" } else {\n" +
" return null;\n" +
" }\n" +
" }\n" +
" \n" +
" public static Method findMethod(Class<?> clazz,String name,Class<?>...classes ){\n" +
" try {\n" +
" return clazz.getMethod(name, classes);\n" +
" } catch (SecurityException e) {\n" +
" throw new RuntimeException(e); \n" +
" } catch (NoSuchMethodException e) {\n" +
" return null; \n" +
" }\n" +
" }\n" +
""+
"}\n" +
"";
/**
* <p class="changed_added_4_0"></p>
* @param directory
* @param mockClassName
*/
public MockControlSource(File directory, String mockClassName) {
super(directory, mockClassName);
}
public void printFileHeader() {
sprintf(fileHeader,mockPackage,mockClass);
}
public void printMockClass(String name){
sprintf(" %1$s.class,\n",name);
}
public void printFileFooter(){
sprintf(fileFooter,mockPackage,mockClass);
// write(fileFooter);
}
}