1 package org.sapia.ubik.rmi.server.invocation; 2 3 import org.sapia.ubik.rmi.Consts; 4 import org.sapia.ubik.rmi.server.Hub; 5 import org.sapia.ubik.rmi.server.Log; 6 import org.sapia.ubik.rmi.server.OID; 7 import org.sapia.ubik.rmi.server.RMICommand; 8 import org.sapia.ubik.rmi.server.RmiUtils; 9 import org.sapia.ubik.rmi.server.ShutdownException; 10 import org.sapia.ubik.rmi.server.VmId; 11 import org.sapia.ubik.rmi.server.transport.ClassDescriptor; 12 import org.sapia.ubik.rmi.server.transport.MarshalledObject; 13 14 import java.io.Externalizable ; 15 import java.io.IOException ; 16 import java.io.ObjectInput ; 17 import java.io.ObjectOutput ; 18 19 import java.lang.reflect.*; 20 21 22 32 public class InvokeCommand extends RMICommand implements Externalizable { 33 static final long serialVersionUID = 1L; 34 private static final boolean _vmUsesMarshalledObjects = (System.getProperty(Consts.MARSHALLING) != null) && 35 System.getProperty(Consts.MARSHALLING).equals("true"); 36 private transient Class [] _paramTypes; 37 private transient String _transportType; 38 private OID _oid; 39 private String _methodName; 40 private Object [] _params; 41 private ClassDescriptor[] _paramClasses; 42 private boolean _usesMarshalledObjects = _vmUsesMarshalledObjects; 43 44 47 public InvokeCommand() { 48 } 49 50 57 public InvokeCommand(OID oid, String methodName, Object [] params, 58 Class [] paramClasses, String transportType) { 59 _oid = oid; 60 _methodName = methodName; 61 _params = params; 62 _paramClasses = new ClassDescriptor[paramClasses.length]; 63 64 for (int i = 0; i < paramClasses.length; i++) { 65 _paramClasses[i] = new ClassDescriptor(paramClasses[i]); 66 } 67 68 _paramTypes = paramClasses; 69 _transportType = transportType; 70 } 71 72 78 public OID getOID() { 79 return _oid; 80 } 81 82 87 public String getMethodName() { 88 return _methodName; 89 } 90 91 97 public Class [] getParameterTypes() { 98 return _paramTypes; 99 } 100 101 public void setParams(Object [] params) { 102 _params = params; 103 } 104 105 113 public boolean usesMarshalledObjects() { 114 return _usesMarshalledObjects; 115 } 116 117 120 public Object [] getParams() { 121 return _params; 122 } 123 124 127 public Object execute() throws Throwable { 128 if (Hub.isShutdown()) { 129 throw new ShutdownException(); 130 } 131 132 Object obj = Hub.serverRuntime.objectTable.getObjectFor(_oid); 133 134 if (_paramTypes == null) { 135 if(obj.getClass().getClassLoader() == null){ 136 convertParams(Thread.currentThread().getContextClassLoader()); 137 } 138 else{ 139 convertParams(obj.getClass().getClassLoader()); 140 } 141 } 142 143 Method mt = obj.getClass().getMethod(_methodName, _paramTypes); 144 145 try { 146 if (Log.isDebug()) { 147 Log.debug(getClass(), 148 "invoking " + mt.getName() + " on " + _oid + "(" + obj + ")"); 149 } 150 151 long start = System.currentTimeMillis(); 152 153 ServerPreInvokeEvent preEvt = new ServerPreInvokeEvent(this, obj); 154 155 Hub.serverRuntime.dispatchEvent(preEvt); 156 157 Object toReturn = mt.invoke(preEvt.getTarget(), 158 preEvt.getInvokeCommand().getParams()); 159 160 ServerPostInvokeEvent postEvt = new ServerPostInvokeEvent(preEvt.getTarget(), 161 preEvt.getInvokeCommand(), 162 System.currentTimeMillis() - preEvt.getInvokeTime()); 163 164 Hub.serverRuntime.dispatchEvent(postEvt); 165 166 if (_usesMarshalledObjects) { 167 toReturn = new MarshalledObject(toReturn, VmId.getInstance(), 168 _config.getServerAddress().getTransportType(), _oid.getCodebase()); 169 } 170 171 return toReturn; 172 } catch (InvocationTargetException e) { 173 if (_usesMarshalledObjects) { 174 return new MarshalledObject(e, VmId.getInstance(), 175 _config.getServerAddress().getTransportType(), _oid.getCodebase()); 176 } 177 178 throw e.getTargetException(); 179 } 180 } 181 182 185 public void readExternal(ObjectInput in) 186 throws IOException , ClassNotFoundException { 187 super.readExternal(in); 188 _oid = (OID) in.readObject(); 189 _methodName = (String ) in.readObject(); 190 _paramClasses = (ClassDescriptor[]) in.readObject(); 191 _params = (Object []) in.readObject(); 192 _usesMarshalledObjects = in.readBoolean(); 193 } 194 195 198 public void writeExternal(ObjectOutput out) throws IOException { 199 super.writeExternal(out); 200 out.writeObject(_oid); 201 out.writeObject(_methodName); 202 203 if (_usesMarshalledObjects) { 204 if ((_params != null) && (_params.length > 0) && 205 !(_params[0] instanceof MarshalledObject)) { 206 for (int i = 0; i < _params.length; i++) { 207 _params[i] = new MarshalledObject(_params[i], _vmId, _transportType, RmiUtils.CODE_BASE); 208 } 209 } 210 } 211 212 out.writeObject(_paramClasses); 213 out.writeObject(_params); 214 out.writeBoolean(_usesMarshalledObjects); 215 } 216 217 223 protected void convertParams(ClassLoader loader) 224 throws IOException , ClassNotFoundException { 225 _paramTypes = new Class [_paramClasses.length]; 226 227 for (int i = 0; i < _paramClasses.length; i++) { 228 _paramTypes[i] = _paramClasses[i].resolve(loader); 229 } 230 231 if (_usesMarshalledObjects && (_params != null)) { 232 for (int i = 0; i < _params.length; i++) { 233 _params[i] = ((MarshalledObject) _params[i]).get(loader); 234 } 235 } 236 } 237 } 238 | Popular Tags |