01: /*
02: * $Id: ClosureListener.java 2121 2005-04-12 16:38:42Z jstrachan $
03: *
04: * Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
05: *
06: * Redistribution and use of this software and associated documentation
07: * ("Software"), with or without modification, are permitted provided that the
08: * following conditions are met: 1. Redistributions of source code must retain
09: * copyright statements and notices. Redistributions must also contain a copy
10: * of this document. 2. Redistributions in binary form must reproduce the above
11: * copyright notice, this list of conditions and the following disclaimer in
12: * the documentation and/or other materials provided with the distribution. 3.
13: * The name "groovy" must not be used to endorse or promote products derived
14: * from this Software without prior written permission of The Codehaus. For
15: * written permission, please contact info@codehaus.org. 4. Products derived
16: * from this Software may not be called "groovy" nor may "groovy" appear in
17: * their names without prior written permission of The Codehaus. "groovy" is a
18: * registered trademark of The Codehaus. 5. Due credit should be given to The
19: * Codehaus - http://groovy.codehaus.org/
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
22: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24: * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
25: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28: * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31: * DAMAGE.
32: *
33: */
34: package org.codehaus.groovy.runtime;
35:
36: import groovy.lang.Closure;
37:
38: import java.lang.reflect.InvocationHandler;
39: import java.lang.reflect.Method;
40:
41: /**
42: * Represents a method on an object using a closure which can be invoked at any
43: * time
44: *
45: * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
46: * @version $Revision: 2121 $
47: */
48: public class ClosureListener implements InvocationHandler {
49:
50: private String listenerMethodName;
51: private Closure closure;
52:
53: public ClosureListener(String listenerMethodName, Closure closure) {
54: this .listenerMethodName = listenerMethodName;
55: this .closure = closure;
56: }
57:
58: public Object invoke(Object object, Method method,
59: Object[] arguments) throws Throwable {
60: if (listenerMethodName.equals(method.getName())) {
61: /** @todo hack! */
62: closure.call(arguments[0]);
63: return null;
64: }
65:
66: // lets try call this object
67: String name = method.getName();
68: if (name.equals("equals")) {
69: return object == arguments[0] ? Boolean.TRUE
70: : Boolean.FALSE;
71: } else if (name.equals("hashCode")) {
72: return new Integer(hashCode());
73: } else if (name.equals("toString")) {
74: return super .toString() + "[listener:" + listenerMethodName
75: + "]";
76: }
77:
78: /*
79: * int paramCount = method.getParameterTypes().length;
80: *
81: * System.out.println("Now calling method: " + method);
82: *
83: * Method[] methods = Object.class.getMethods(); for (int i = 0; i
84: * < methods.length; i++ ) { Method aMethod = methods[i]; if
85: * (name.equals(aMethod.getName()) &&
86: * aMethod.getParameterTypes().length == paramCount) { return
87: * aMethod.invoke(object, arguments); } }
88: */
89: return null;
90: }
91:
92: }
|