1 /* 2 * #%L 3 * Nuiton Utils 4 * %% 5 * Copyright (C) 2004 - 2010 CodeLutin 6 * %% 7 * This program is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU Lesser General Public License as 9 * published by the Free Software Foundation, either version 3 of the 10 * License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Lesser Public License for more details. 16 * 17 * You should have received a copy of the GNU General Lesser Public 18 * License along with this program. If not, see 19 * <http://www.gnu.org/licenses/lgpl-3.0.html>. 20 * #L% 21 */ 22 package org.nuiton.util.rmi; 23 24 import java.lang.reflect.InvocationTargetException; 25 import java.lang.reflect.Method; 26 import java.rmi.RemoteException; 27 28 /** 29 * RMI implementation of an invocation handler. This object will be exported to 30 * a RMI registry and will delegate method calls to some business service. The 31 * service is provided in the constructor. 32 * 33 * @author Arnaud Thimel - thimel@codelutin.com 34 */ 35 public class RemoteMethodExecutorImpl<T> implements RemoteMethodExecutor { 36 37 /** The target service on which calls will be made */ 38 protected T service; 39 40 /** 41 * This is the only available constructor. It is mandatory to specify a 42 * target service on which call will be 43 * delegated. 44 * 45 * @param service the mandatory service which calls will be delegated on 46 */ 47 public RemoteMethodExecutorImpl(T service) { 48 if (service == null) { 49 throw new NullPointerException("Service cannot be null"); 50 } 51 this.service = service; 52 } 53 54 @Override 55 public Object execute( 56 String methodName, Class<?>[] parametersType, Object[] args) 57 throws RemoteException { 58 59 Object result; 60 try { 61 62 // Get the method on the target service then invoke it 63 Method method = service.getClass().getMethod( 64 methodName, parametersType); 65 result = method.invoke(service, args); 66 67 } catch (InvocationTargetException ite) { 68 // This is the normal behaviour if a business exception is thrown 69 Throwable targetException = ite.getTargetException(); 70 throw new RemoteException( 71 "Business exception occurred", targetException); 72 } catch (NoSuchMethodException nsme) { 73 throw new RemoteException("Delegate method not found", nsme); 74 } catch (IllegalAccessException iae) { 75 throw new RemoteException("Delegate method not accessible", iae); 76 } 77 78 return result; 79 } 80 81 }