use of org.teiid.transport.ClientServiceRegistryImpl.ClientService in project teiid by teiid.
the class ServerWorkItem method run.
/**
* main entry point for remote method calls.
*/
public void run() {
Message result = null;
String loggingContext = null;
final boolean encrypt = !(message.getContents() instanceof ServiceInvocationStruct);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
try {
Thread.currentThread().setContextClassLoader(this.csr.getCallerClassloader());
} catch (Throwable t) {
// ignore
}
message.setContents(this.socketClientInstance.getCryptor().unsealObject(message.getContents()));
if (!(message.getContents() instanceof ServiceInvocationStruct)) {
// $NON-NLS-1$
throw new AssertionError("unknown message contents");
}
final ServiceInvocationStruct serviceStruct = (ServiceInvocationStruct) message.getContents();
final ClientService clientService = this.csr.getClientService(serviceStruct.targetClass.getName());
loggingContext = clientService.getLoggingContext();
Method m = clientService.getReflectionHelper().findBestMethodOnTarget(serviceStruct.methodName, serviceStruct.args);
Object methodResult;
try {
methodResult = m.invoke(clientService.getInstance(), serviceStruct.args);
} catch (InvocationTargetException e) {
throw e.getCause();
}
if (ResultsFuture.class.isAssignableFrom(m.getReturnType()) && methodResult != null) {
ResultsFuture<Object> future = (ResultsFuture<Object>) methodResult;
future.addCompletionListener(new ResultsFuture.CompletionListener<Object>() {
public void onCompletion(ResultsFuture<Object> completedFuture) {
Message asynchResult = new Message();
try {
asynchResult.setContents(completedFuture.get());
} catch (InterruptedException e) {
asynchResult.setContents(processException(e, clientService.getLoggingContext()));
} catch (ExecutionException e) {
asynchResult.setContents(processException(e.getCause(), clientService.getLoggingContext()));
}
sendResult(asynchResult, encrypt);
}
});
} else {
// synch call
Message resultHolder = new Message();
resultHolder.setContents(methodResult);
result = resultHolder;
}
} catch (Throwable t) {
Message holder = new Message();
holder.setContents(processException(t, loggingContext));
result = holder;
} finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
if (result != null) {
sendResult(result, encrypt);
}
}
Aggregations