01: /*
02: * CoadunationUtil: The coadunation util library.
03: * Copyright (C) 2007 Rift IT Contracting
04: *
05: * This library is free software; you can redistribute it and/or
06: * modify it under the terms of the GNU Lesser General Public
07: * License as published by the Free Software Foundation; either
08: * version 2.1 of the License, or (at your option) any later version.
09: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this library; if not, write to the Free Software
17: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18: *
19: * ConnectionHandler.java
20: */
21:
22: // package path
23: package com.rift.coad.util.connection;
24:
25: // java imports
26: import java.lang.reflect.InvocationHandler;
27: import java.lang.reflect.Method;
28: import java.lang.reflect.InvocationTargetException;
29:
30: /**
31: * This object is responsible for controlling the Proxy wrapping of any RMI
32: * classes in the connection manager.
33: *
34: * @author Brett Chaldecott
35: */
36: public class ConnectionHandler implements InvocationHandler {
37:
38: // private member variables
39: private RMIConnection rmiConnection = null;
40: private Object rmiRef = null;
41:
42: /**
43: * Creates a new instance of ConnectionHandler.
44: *
45: * @param rmiConnection The reference to the connection object.
46: * @param rmiRef The reference to the sub object to make the call onto.
47: */
48: public ConnectionHandler(RMIConnection rmiConnection, Object rmiRef) {
49: this .rmiConnection = rmiConnection;
50: this .rmiRef = rmiRef;
51: }
52:
53: /**
54: * This method performs the call on the rmi reference.
55: *
56: * @param proxy The proxy that is making the call on this handler.
57: * @param method The method that is being called.
58: * @param args The arguments that are being called.
59: * @exception Throwable.
60: */
61: public Object invoke(Object proxy, Method method, Object[] args)
62: throws Throwable {
63: try {
64: // retrieve the method information
65: Method rmiMethod = rmiRef.getClass().getMethod(
66: method.getName(), method.getParameterTypes());
67:
68: // make the call
69: return rmiMethod.invoke(rmiRef, args);
70: } catch (InvocationTargetException ex) {
71: Throwable ex2 = ex.getTargetException();
72: if ((ex2 instanceof java.rmi.RemoteException)
73: || (ex2 instanceof java.lang.RuntimeException)) {
74: rmiConnection.invalidateConnection();
75: }
76: throw ex2;
77: } catch (Throwable ex) {
78: if ((ex instanceof java.rmi.RemoteException)
79: || (ex instanceof java.lang.RuntimeException)) {
80: rmiConnection.invalidateConnection();
81: }
82: throw ex;
83: }
84: }
85:
86: }
|