1 48 49 package com.caucho.hessian.server; 50 51 import com.caucho.hessian.io.AbstractHessianInput; 52 import com.caucho.hessian.io.AbstractHessianOutput; 53 import com.caucho.services.server.AbstractSkeleton; 54 import com.caucho.services.server.ServiceContext; 55 56 import java.lang.reflect.InvocationTargetException ; 57 import java.lang.reflect.Method ; 58 import java.util.logging.Level ; 59 import java.util.logging.Logger ; 60 61 64 public class HessianSkeleton extends AbstractSkeleton { 65 private static final Logger log = Logger.getLogger(HessianSkeleton.class.getName()); 66 67 private Object _service; 68 69 75 public HessianSkeleton(Object service, Class apiClass) 76 { 77 super(apiClass); 78 79 _service = service; 80 81 if (! apiClass.isAssignableFrom(service.getClass())) 82 throw new IllegalArgumentException ("Service " + service + " must be an instance of " + apiClass.getName()); 83 } 84 85 91 public void invoke(AbstractHessianInput in, AbstractHessianOutput out) 92 throws Throwable 93 { 94 ServiceContext context = ServiceContext.getContext(); 95 96 String header; 97 while ((header = in.readHeader()) != null) { 98 Object value = in.readObject(); 99 100 context.addHeader(header, value); 101 } 102 103 String methodName = in.readMethod(); 104 Method method = getMethod(methodName); 105 106 if (method != null) { 107 } 108 else if ("_hessian_getAttribute".equals(methodName)) { 109 String attrName = in.readString(); 110 in.completeCall(); 111 112 String value = null; 113 114 if ("java.api.class".equals(attrName)) 115 value = getAPIClassName(); 116 else if ("java.home.class".equals(attrName)) 117 value = getHomeClassName(); 118 else if ("java.object.class".equals(attrName)) 119 value = getObjectClassName(); 120 121 out.startReply(); 122 123 out.writeObject(value); 124 125 out.completeReply(); 126 return; 127 } 128 else if (method == null) { 129 out.startReply(); 130 out.writeFault("NoSuchMethodException", 131 "The service has no method named: " + in.getMethod(), 132 null); 133 out.completeReply(); 134 return; 135 } 136 137 Class []args = method.getParameterTypes(); 138 Object []values = new Object [args.length]; 139 140 for (int i = 0; i < args.length; i++) 141 values[i] = in.readObject(args[i]); 142 143 in.completeCall(); 144 145 Object result = null; 146 147 try { 148 result = method.invoke(_service, values); 149 } catch (Throwable e) { 150 if (e instanceof InvocationTargetException ) 151 e = ((InvocationTargetException ) e).getTargetException(); 152 153 log.log(Level.WARNING, e.toString(), e); 154 155 out.startReply(); 156 out.writeFault("ServiceException", e.getMessage(), e); 157 out.completeReply(); 158 return; 159 } 160 161 out.startReply(); 162 163 out.writeObject(result); 164 165 out.completeReply(); 166 } 167 } 168 | Popular Tags |