this.type = type;
this.operations = Collections.unmodifiableMap(org.apache.tuscany.sca.binding.ejb.corba.Java2IDLUtil.mapMethodToOperation(type));
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Stub stub = (Stub) proxy;
// handle is identical in stub to avoid unnecessary round trip
if (method.equals(ISIDENTICAL)) {
org.omg.CORBA.Object otherObject = (org.omg.CORBA.Object) args[0];
return new Boolean(stub._is_equivalent(otherObject));
}
// get the operation name object
String operationName = (String) operations.get(method);
if (operationName == null) {
throw new IllegalStateException("Unknown method: " + method);
}
while (true) {
// if this is a stub to a remote object we invoke over the wire
if (!Util.isLocal(stub)) {
InputStream in = null;
try {
// create the request output stream
OutputStream out = (OutputStream) stub._request(operationName, true);
// write the arguments
Class[] parameterTypes = method.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
Class parameterType = parameterTypes[i];
org.apache.tuscany.sca.binding.ejb.corba.Java2IDLUtil.writeObject(parameterType, args[i], out);
}
// send the invocation
in = (InputStream) stub._invoke(out);
// read the result
Object result = org.apache.tuscany.sca.binding.ejb.corba.Java2IDLUtil.readObject(method.getReturnType(), in);
return result;
} catch (RemarshalException exception) {
continue;
} catch (ApplicationException exception) {
org.apache.tuscany.sca.binding.ejb.corba.Java2IDLUtil.throwException(method, (InputStream) exception.getInputStream());
} catch (SystemException e) {
throw Util.mapSystemException(e);
} finally {
stub._releaseReply(in);
}
} else {
// get the servant
ServantObject servantObject = stub._servant_preinvoke(operationName, type);
if (servantObject == null) {
continue;
}
try {
// copy the arguments
Object[] argsCopy = Util.copyObjects(args, stub._orb());
// invoke the servant
Object result = null;
try {
result = method.invoke(servantObject.servant, argsCopy);
} catch (InvocationTargetException e) {
if (e.getCause() != null) {
throw e.getCause();
}
throw e;
}
// copy the result
result = Util.copyObject(result, stub._orb());
return result;
} catch (Throwable throwable) {
// copy the exception
Throwable throwableCopy = (Throwable) Util.copyObject(throwable, stub._orb());
// if it is one of my exception rethrow it
Class[] exceptionTypes = method.getExceptionTypes();
for (int i = 0; i < exceptionTypes.length; i++) {
Class exceptionType = exceptionTypes[i];
if (exceptionType.isInstance(throwableCopy)) {
throw throwableCopy;
}
}
throw Util.wrapException(throwableCopy);
} finally {
stub._servant_postinvoke(servantObject);
}
}
}
}