View Javadoc

1   package net.sf.crispy.impl.rmi;
2   
3   import java.lang.reflect.Method;
4   import java.rmi.RemoteException;
5   import java.rmi.server.UnicastRemoteObject;
6   import java.util.Vector;
7   
8   import net.sf.crispy.ExceptionWrapper;
9   import net.sf.crispy.InterceptorHandler;
10  import net.sf.crispy.server.InterceptorHandlerCreator;
11  import net.sf.crispy.server.ServiceEndpoint;
12  import net.sf.crispy.server.ServiceEndpointImpl;
13  import net.sf.crispy.server.SingleServiceContainer;
14  import net.sf.crispy.server.SingleServiceContainerImpl;
15  import net.sf.crispy.util.Converter;
16  import net.sf.crispy.util.Invoker;
17  
18  import org.apache.commons.logging.Log;
19  import org.apache.commons.logging.LogFactory;
20  
21  /**
22   * This is the central Invocation Handler for all client calls.
23   * You must register the service. The invoke methode make the call per reflection API. 
24   * @author Linke
25   *
26   */
27  public class RmiInvocationHandlerImpl extends UnicastRemoteObject implements RmiInvocationHandler, ServiceEndpoint, SingleServiceContainer  {
28  
29  	protected static final Log log = LogFactory.getLog (RmiInvocationHandlerImpl.class);
30  	
31  	private static final long serialVersionUID = 998729587238L;
32  	
33  	private ServiceEndpoint serviceEndpoint = new ServiceEndpointImpl();
34  	private SingleServiceContainer singleServiceImplContainer = new SingleServiceContainerImpl();
35  	
36  	public RmiInvocationHandlerImpl() throws RemoteException {
37  		super();
38  	}
39  	
40  
41  	/**
42  	 * @see net.sf.crispy.impl.rmi.RmiInvocationHandler#invoke(java.lang.String, java.lang.String, java.util.Vector)
43  	 */
44  	public Object invoke(String pvClassName, String pvMethodName, Vector pvParams)  throws RemoteException, Exception {
45  		Object lvProxyObject = getService(pvClassName);
46  		if (lvProxyObject == null) {
47  			throw new RemoteException("On the server is the class: " + pvClassName + " is not registered!");
48  		}
49  		
50  		Object lvReturn = null;
51  		Converter lvConverter = new Converter();
52  		lvConverter.setWithSimpleKeyMapper(true);
53  		try {
54  			Method lvMethod = Invoker.findMethod(lvProxyObject.getClass(), pvMethodName, pvParams);
55  			Object[] lvArgs = Invoker.vector2Array(pvParams, lvMethod, lvConverter);
56  			lvReturn = doInvoke(lvProxyObject, lvMethod, lvArgs, createNewInterceptorHandlerInstance());
57  		} catch (Exception e) {
58  			lvReturn = ExceptionWrapper.isThrowableThanHandleThrowable(e);
59  		}
60  		lvReturn = lvConverter.makeSimple(lvReturn);
61  		return lvReturn;
62  	}
63  
64  	public void addService(String pvServiceInterfaceName, Object pvServiceImpl) {
65  		singleServiceImplContainer.addService(pvServiceInterfaceName, pvServiceImpl);
66  	}
67  
68  	public void addService(String pvServiceInterfaceName, String pvServiceImplName) {
69  		singleServiceImplContainer.addService(pvServiceInterfaceName, pvServiceImplName);
70  	}
71  
72  	public void removeService(String pvServiceInterfaceName) {
73  		singleServiceImplContainer.removeService(pvServiceInterfaceName);
74  	}
75  
76  	public Object getService(String pvServiceInterfaceName) {
77  		return singleServiceImplContainer.getService(pvServiceInterfaceName);
78  	}
79  
80  	public int getServiceSize() {
81  		return singleServiceImplContainer.getServiceSize();
82  	}
83  
84      
85  
86  
87  	public Object doInvoke(Object pvServiceImpl, Method pvMethod, Object[] pvArgs, InterceptorHandler pvInterceptorHandler) {
88  		return serviceEndpoint.doInvoke(pvServiceImpl, pvMethod, pvArgs, pvInterceptorHandler);
89  	}
90  
91  
92  	public void setInterceptorHandlerCreator(InterceptorHandlerCreator pvCreator) {
93  		serviceEndpoint.setInterceptorHandlerCreator(pvCreator);		
94  	}
95  
96  
97  	public InterceptorHandlerCreator getInterceptorHandlerCreator() {
98  		return serviceEndpoint.getInterceptorHandlerCreator();
99  	}
100 
101 
102 	public InterceptorHandler createNewInterceptorHandlerInstance() {
103 		return serviceEndpoint.createNewInterceptorHandlerInstance();
104 	}
105 	
106 }