01: /*
02: This source file is part of Smyle, a database library.
03: For up-to-date information, see http://www.drjava.de/smyle
04: Copyright (C) 2001 Stefan Reich (doc@drjava.de)
05:
06: This library is free software; you can redistribute it and/or
07: modify it under the terms of the GNU Lesser General Public
08: License as published by the Free Software Foundation; either
09: version 2.1 of the License, or (at your option) any later version.
10:
11: This library is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: Lesser General Public License for more details.
15:
16: You should have received a copy of the GNU Lesser General Public
17: License along with this library; if not, write to the Free Software
18: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:
20: For full license text, see doc/license/lgpl.txt in this distribution
21: */
22:
23: package drjava.util;
24:
25: import java.lang.reflect.*;
26: import junit.framework.*;
27:
28: public class SynchronisationTester extends Assert {
29: public interface MethodPredicate {
30: public boolean evaluate(Method m);
31: }
32:
33: public static void assertPackageAndPublicMethodsAreSynchronized(
34: Class c) throws Exception {
35: assertPackageAndPublicMethodsAreSynchronized(c, null);
36: }
37:
38: public static void assertPackageAndPublicMethodsAreSynchronized(
39: Class c, MethodPredicate pred) throws Exception {
40: assertPublicMethodsAreSynchronized(c, pred);
41: Method[] methods = c.getDeclaredMethods();
42: for (int i = 0; i < methods.length; i++) {
43: Method m = methods[i];
44: if ((m.getModifiers() & (Modifier.PRIVATE
45: | Modifier.PROTECTED | Modifier.PUBLIC)) == 0
46: && (pred == null || pred.evaluate(m)))
47: checkMethod(m);
48: }
49: }
50:
51: public static void assertPublicMethodsAreSynchronized(Class c)
52: throws Exception {
53: assertPublicMethodsAreSynchronized(c, null);
54: }
55:
56: public static void assertPublicMethodsAreSynchronized(Class c,
57: MethodPredicate pred) throws Exception {
58: Method[] methods = c.getMethods();
59: for (int i = 0; i < methods.length; i++) {
60: Method m = methods[i];
61: if (m.getDeclaringClass() != Object.class
62: && (pred == null || pred.evaluate(m)))
63: checkMethod(m);
64: }
65: }
66:
67: static void checkMethod(Method m) throws Exception {
68: if ((m.getModifiers() & Modifier.SYNCHRONIZED) == 0) {
69: String hint = null;
70: if (m.getName().startsWith("access$"))
71: hint = "This probably means that you are calling a private method from an inner class; "
72: + "you might try making the method package private instead";
73:
74: fail(m + " is not synchronized"
75: + (hint != null ? " (" + hint + ")" : ""));
76: }
77: }
78: }
|