1*ef39d40dSAndrew Rist /************************************************************** 2*ef39d40dSAndrew Rist * 3*ef39d40dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*ef39d40dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*ef39d40dSAndrew Rist * distributed with this work for additional information 6*ef39d40dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*ef39d40dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*ef39d40dSAndrew Rist * "License"); you may not use this file except in compliance 9*ef39d40dSAndrew Rist * with the License. You may obtain a copy of the License at 10*ef39d40dSAndrew Rist * 11*ef39d40dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*ef39d40dSAndrew Rist * 13*ef39d40dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*ef39d40dSAndrew Rist * software distributed under the License is distributed on an 15*ef39d40dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*ef39d40dSAndrew Rist * KIND, either express or implied. See the License for the 17*ef39d40dSAndrew Rist * specific language governing permissions and limitations 18*ef39d40dSAndrew Rist * under the License. 19*ef39d40dSAndrew Rist * 20*ef39d40dSAndrew Rist *************************************************************/ 21*ef39d40dSAndrew Rist 22cdf0e10cSrcweir package complexlib; 23cdf0e10cSrcweir 24cdf0e10cSrcweir import java.io.PrintWriter; 25cdf0e10cSrcweir import java.lang.reflect.Method; 26cdf0e10cSrcweir 27cdf0e10cSrcweir /** 28cdf0e10cSrcweir * Invoke a method of a class in an own thread. Provide a method to end 29cdf0e10cSrcweir * the thread. 30cdf0e10cSrcweir */ 31cdf0e10cSrcweir public class MethodThread extends Thread 32cdf0e10cSrcweir { 33cdf0e10cSrcweir 34cdf0e10cSrcweir /** The method that should be executed **/ 35cdf0e10cSrcweir private Method mTestMethod = null; 36cdf0e10cSrcweir /** The object that implements the method **/ 37cdf0e10cSrcweir private Object mInvokeClass = null; 38cdf0e10cSrcweir /** A PrintWriter for debug Output **/ 39cdf0e10cSrcweir private PrintWriter mLog = null; 40cdf0e10cSrcweir /** An Error String **/ 41cdf0e10cSrcweir private String mErrMessage = null; 42cdf0e10cSrcweir /** Did an Exception happen? **/ 43cdf0e10cSrcweir private boolean mExceptionHappened = false; 44cdf0e10cSrcweir private Object[] mParameter = null; 45cdf0e10cSrcweir 46cdf0e10cSrcweir /** 47cdf0e10cSrcweir * Constructor. 48cdf0e10cSrcweir * @param testMethod The method that will be invoked. 49cdf0e10cSrcweir * @param invokeClass The class where the method is invoked. 50cdf0e10cSrcweir * @param log The logging mechanism. 51cdf0e10cSrcweir */ MethodThread(Method testMethod, Object invokeClass, PrintWriter log)52cdf0e10cSrcweir public MethodThread(Method testMethod, Object invokeClass, PrintWriter log) 53cdf0e10cSrcweir { 54cdf0e10cSrcweir mTestMethod = testMethod; 55cdf0e10cSrcweir mInvokeClass = invokeClass; 56cdf0e10cSrcweir mLog = log; 57cdf0e10cSrcweir } 58cdf0e10cSrcweir MethodThread(Method testMethod, Object invokeClass, Object[] parameter, PrintWriter log)59cdf0e10cSrcweir public MethodThread(Method testMethod, Object invokeClass, Object[] parameter, PrintWriter log) 60cdf0e10cSrcweir { 61cdf0e10cSrcweir mTestMethod = testMethod; 62cdf0e10cSrcweir mInvokeClass = invokeClass; 63cdf0e10cSrcweir mParameter = parameter; 64cdf0e10cSrcweir mLog = log; 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir /** 68cdf0e10cSrcweir * Invoke the method. 69cdf0e10cSrcweir */ run()70cdf0e10cSrcweir public void run() 71cdf0e10cSrcweir { 72cdf0e10cSrcweir try 73cdf0e10cSrcweir { 74cdf0e10cSrcweir mTestMethod.invoke(mInvokeClass, mParameter); 75cdf0e10cSrcweir } 76cdf0e10cSrcweir catch (IllegalAccessException e) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir e.printStackTrace(mLog); 79cdf0e10cSrcweir mErrMessage = e.getMessage(); 80cdf0e10cSrcweir mExceptionHappened = true; 81cdf0e10cSrcweir } 82cdf0e10cSrcweir catch (java.lang.reflect.InvocationTargetException e) 83cdf0e10cSrcweir { 84cdf0e10cSrcweir Throwable t = e.getTargetException(); 85cdf0e10cSrcweir if (!(t instanceof ComplexTestCase.AssureException)) 86cdf0e10cSrcweir { 87cdf0e10cSrcweir t.printStackTrace(mLog); 88cdf0e10cSrcweir mErrMessage = t.getMessage(); 89cdf0e10cSrcweir if (mErrMessage == null) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir mErrMessage = t.toString(); 92cdf0e10cSrcweir } 93cdf0e10cSrcweir mExceptionHappened = true; 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir } 97cdf0e10cSrcweir } 98cdf0e10cSrcweir 99cdf0e10cSrcweir /** 100cdf0e10cSrcweir * Get the error message 101cdf0e10cSrcweir * @return The error message. 102cdf0e10cSrcweir */ getErrorMessage()103cdf0e10cSrcweir public String getErrorMessage() 104cdf0e10cSrcweir { 105cdf0e10cSrcweir return mErrMessage; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir /** 109cdf0e10cSrcweir * Is there an error message? 110cdf0e10cSrcweir * @return True, if an error did happen. 111cdf0e10cSrcweir */ hasErrorMessage()112cdf0e10cSrcweir public boolean hasErrorMessage() 113cdf0e10cSrcweir { 114cdf0e10cSrcweir return mExceptionHappened; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir /** 118cdf0e10cSrcweir * Stop the running method. 119cdf0e10cSrcweir */ destroy()120cdf0e10cSrcweir public void destroy() 121cdf0e10cSrcweir { 122cdf0e10cSrcweir try 123cdf0e10cSrcweir { 124cdf0e10cSrcweir interrupt(); 125cdf0e10cSrcweir } 126cdf0e10cSrcweir catch (SecurityException e) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir e.printStackTrace(mLog); 129cdf0e10cSrcweir mErrMessage = e.getMessage(); 130cdf0e10cSrcweir mExceptionHappened = true; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir } 133cdf0e10cSrcweir } 134