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