001: package net.sf.crispy.impl.rmi;
002:
003: import java.lang.reflect.Method;
004: import java.rmi.RemoteException;
005: import java.rmi.server.UnicastRemoteObject;
006: import java.util.Vector;
007:
008: import net.sf.crispy.ExceptionWrapper;
009: import net.sf.crispy.InterceptorHandler;
010: import net.sf.crispy.server.InterceptorHandlerCreator;
011: import net.sf.crispy.server.ServiceEndpoint;
012: import net.sf.crispy.server.ServiceEndpointImpl;
013: import net.sf.crispy.server.SingleServiceContainer;
014: import net.sf.crispy.server.SingleServiceContainerImpl;
015: import net.sf.crispy.util.Converter;
016: import net.sf.crispy.util.Invoker;
017:
018: import org.apache.commons.logging.Log;
019: import org.apache.commons.logging.LogFactory;
020:
021: /**
022: * This is the central Invocation Handler for all client calls.
023: * You must register the service. The invoke methode make the call per reflection API.
024: * @author Linke
025: *
026: */
027: public class RmiInvocationHandlerImpl extends UnicastRemoteObject
028: implements RmiInvocationHandler, ServiceEndpoint,
029: SingleServiceContainer {
030:
031: protected static final Log log = LogFactory
032: .getLog(RmiInvocationHandlerImpl.class);
033:
034: private static final long serialVersionUID = 998729587238L;
035:
036: private ServiceEndpoint serviceEndpoint = new ServiceEndpointImpl();
037: private SingleServiceContainer singleServiceImplContainer = new SingleServiceContainerImpl();
038:
039: public RmiInvocationHandlerImpl() throws RemoteException {
040: super ();
041: }
042:
043: /**
044: * @see net.sf.crispy.impl.rmi.RmiInvocationHandler#invoke(java.lang.String, java.lang.String, java.util.Vector)
045: */
046: public Object invoke(String pvClassName, String pvMethodName,
047: Vector pvParams) throws RemoteException, Exception {
048: Object lvProxyObject = getService(pvClassName);
049: if (lvProxyObject == null) {
050: throw new RemoteException("On the server is the class: "
051: + pvClassName + " is not registered!");
052: }
053:
054: Object lvReturn = null;
055: Converter lvConverter = new Converter();
056: lvConverter.setWithSimpleKeyMapper(true);
057: try {
058: Method lvMethod = Invoker.findMethod(lvProxyObject
059: .getClass(), pvMethodName, pvParams);
060: Object[] lvArgs = Invoker.vector2Array(pvParams, lvMethod,
061: lvConverter);
062: lvReturn = doInvoke(lvProxyObject, lvMethod, lvArgs,
063: createNewInterceptorHandlerInstance());
064: } catch (Exception e) {
065: lvReturn = ExceptionWrapper
066: .isThrowableThanHandleThrowable(e);
067: }
068: lvReturn = lvConverter.makeSimple(lvReturn);
069: return lvReturn;
070: }
071:
072: public void addService(String pvServiceInterfaceName,
073: Object pvServiceImpl) {
074: singleServiceImplContainer.addService(pvServiceInterfaceName,
075: pvServiceImpl);
076: }
077:
078: public void addService(String pvServiceInterfaceName,
079: String pvServiceImplName) {
080: singleServiceImplContainer.addService(pvServiceInterfaceName,
081: pvServiceImplName);
082: }
083:
084: public void removeService(String pvServiceInterfaceName) {
085: singleServiceImplContainer
086: .removeService(pvServiceInterfaceName);
087: }
088:
089: public Object getService(String pvServiceInterfaceName) {
090: return singleServiceImplContainer
091: .getService(pvServiceInterfaceName);
092: }
093:
094: public int getServiceSize() {
095: return singleServiceImplContainer.getServiceSize();
096: }
097:
098: public Object doInvoke(Object pvServiceImpl, Method pvMethod,
099: Object[] pvArgs, InterceptorHandler pvInterceptorHandler) {
100: return serviceEndpoint.doInvoke(pvServiceImpl, pvMethod,
101: pvArgs, pvInterceptorHandler);
102: }
103:
104: public void setInterceptorHandlerCreator(
105: InterceptorHandlerCreator pvCreator) {
106: serviceEndpoint.setInterceptorHandlerCreator(pvCreator);
107: }
108:
109: public InterceptorHandlerCreator getInterceptorHandlerCreator() {
110: return serviceEndpoint.getInterceptorHandlerCreator();
111: }
112:
113: public InterceptorHandler createNewInterceptorHandlerInstance() {
114: return serviceEndpoint.createNewInterceptorHandlerInstance();
115: }
116:
117: }
|