if (Object.class == method.getDeclaringClass()) {
return invokeObjectMethod(method, args);
}
// obtain a dedicated wire to be used for this callback invocation
RuntimeWire wire = ((CallbackReferenceImpl)callableReference).getCallbackWire();
if (wire == null) {
//FIXME: need better exception
throw new ServiceRuntimeException("No callback wire found");
}
// set the conversational state based on the interface that
// is specified for the reference that this wire belongs to
initConversational(wire);
// set the conversation id into the conversation object. This is
// a special case for callbacks as, unless otherwise set manually,
// the callback should use the same conversation id as was received
// on the incoming call to this component
if (conversational) {
if (conversation == null || conversation.getState() == ConversationState.ENDED) {
conversation = null;
}
Object convID = conversation == null ? null : conversation.getConversationID();
// create a conversation id if one doesn't exist
// already, i.e. the conversation is just starting
if (convID == null) {
convID = ((CallbackReferenceImpl)callableReference).getConvID();
if (convID != null) {
conversation = ((RuntimeWireImpl2)wire).getConversationManager().getConversation(convID);
if (callableReference != null) {
((CallableReferenceImpl)callableReference).attachConversation(conversation);
}
}
}
}
setEndpoint(((CallbackReferenceImpl)callableReference).getResolvedEndpoint());
InvocationChain chain = getInvocationChain(method, wire);
if (chain == null) {
throw new IllegalArgumentException("No matching operation is found: " + method);
}
try {
return invoke(chain, args, wire, wire.getSource());
} catch (InvocationTargetException e) {
Throwable t = e.getCause();
if (t instanceof NoRegisteredCallbackException) {
throw t;
}