jaxwsproxyhandler.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 443 行 · 第 1/2 页
JAVA
443 行
// Don't allow the invocation to continue if the invocation requires a callback
// object, but none was supplied.
if (asyncHandler == null) {
throw ExceptionFactory
.makeWebServiceException(Messages.getMessage("proxyNullCallback"));
}
AsyncResponse listener = createProxyListener(args, operationDesc);
requestIC.setAsyncResponseListener(listener);
if ((serviceDelegate.getExecutor() != null) &&
(serviceDelegate.getExecutor() instanceof ExecutorService)) {
ExecutorService es = (ExecutorService)serviceDelegate.getExecutor();
if (es.isShutdown()) {
// the executor service is shutdown and won't accept new tasks
// so return an error back to the client
throw ExceptionFactory
.makeWebServiceException(Messages.getMessage("ExecutorShutdown"));
}
}
requestIC.setExecutor(serviceDelegate.getExecutor());
Future<?> future = controller.invokeAsync(requestIC, asyncHandler);
//Check to see if we need to maintain session state
checkMaintainSessionState(request, requestIC);
return future;
}
if (method.getReturnType() == Response.class) {
if (log.isDebugEnabled()) {
log.debug("Async Polling");
}
AsyncResponse listener = createProxyListener(args, operationDesc);
requestIC.setAsyncResponseListener(listener);
requestIC.setExecutor(serviceDelegate.getExecutor());
Response response = controller.invokeAsync(requestIC);
//Check to see if we need to maintain session state
checkMaintainSessionState(request, requestIC);
return response;
}
if (!operationDesc.isOneWay()) {
InvocationContext responseIC = controller.invoke(requestIC);
//Check to see if we need to maintain session state
checkMaintainSessionState(request, requestIC);
MessageContext responseContext = responseIC.getResponseMessageContext();
// Migrate the properties from the response MessageContext back
// to the client response context bag.
ApplicationContextMigratorUtil.performMigrationFromMessageContext(
Constants.APPLICATION_CONTEXT_MIGRATOR_LIST_ID,
getResponseContext(), responseContext);
Object responseObj = createResponse(method, args, responseContext, operationDesc);
return responseObj;
}
return null;
}
private AsyncResponse createProxyListener(Object[] args, OperationDescription operationDesc) {
ProxyAsyncListener listener = new ProxyAsyncListener(operationDesc);
listener.setHandler(this);
listener.setInputArgs(args);
return listener;
}
protected boolean isAsync() {
String methodName = method.getName();
Class returnType = method.getReturnType();
return methodName.endsWith("Async") && (returnType.isAssignableFrom(Response.class) ||
returnType.isAssignableFrom(Future.class));
}
/**
* Creates a request MessageContext for the method call. This request context will be used by
* InvocationController to route the method call to axis engine.
*
* @param method - The method invoked on the proxy object.
* @param args - The parameter list
* @return A MessageContext that can be used for the invocation
*/
protected MessageContext createRequest(Method method, Object[] args) throws Throwable {
if (log.isDebugEnabled()) {
log.debug("Creating a new Message using the request parameters.");
}
OperationDescription operationDesc =
endpointDesc.getEndpointInterfaceDescription().getOperation(method);
Message message = MethodMarshallerFactory.getMarshaller(operationDesc, true)
.marshalRequest(args, operationDesc);
if (log.isDebugEnabled()) {
log.debug("Request Message created successfully.");
}
MessageContext request = new MessageContext();
request.setMessage(message);
// TODO: What happens here might be affected by the property migration plugpoint.
request.setProperties(getRequestContext());
if (log.isDebugEnabled()) {
log.debug("Request MessageContext created successfully.");
}
return request;
}
/**
* Creates a response MessageContext for the method call. This response context will be used to
* create response result to the client call.
*
* @param method - The method invoked on the proxy object.
* @param args - The parameter list.
* @param responseContext - The MessageContext to be used for the response.
* @param operationDesc - The OperationDescription that for the invoked method.
* @return
*/
protected Object createResponse(Method method, Object[] args, MessageContext responseContext,
OperationDescription operationDesc) throws Throwable {
Message responseMsg = responseContext.getMessage();
if (log.isDebugEnabled()) {
log.debug("Processing the response Message to create the return value(s).");
}
// Find out if there was a fault on the response and create the appropriate
// exception type.
if (hasFaultResponse(responseContext)) {
Throwable t = getFaultResponse(responseContext, operationDesc);
throw t;
}
Object object = MethodMarshallerFactory.getMarshaller(operationDesc, false)
.demarshalResponse(responseMsg, args, operationDesc);
if (log.isDebugEnabled()) {
log.debug("The response was processed and the return value created successfully.");
}
return object;
}
protected static Throwable getFaultResponse(MessageContext msgCtx,
OperationDescription opDesc) {
Message msg = msgCtx.getMessage();
//Operation Description for Async method does not store the fault description as Asyc operation
//will never have throws clause in the method signature.
//we will fetch the OperationDescription of the sync method and this should give us the
//correct fault description so we can throw the right user defined exception.
if (opDesc.isJAXWSAsyncClientMethod()) {
opDesc = opDesc.getSyncOperation();
}
if (msg != null && msg.isFault()) {
Object object = MethodMarshallerFactory.getMarshaller(opDesc, true)
.demarshalFaultResponse(msg, opDesc);
if (log.isDebugEnabled() && object != null) {
log.debug("A fault was found and processed.");
log.debug("Throwing a fault of type: " + object.getClass().getName() +
" back to the clent.");
}
return (Throwable)object;
} else if (msgCtx.getLocalException() != null) {
// use the factory, it'll throw the right thing:
return ExceptionFactory.makeWebServiceException(msgCtx.getLocalException());
}
return null;
}
protected static boolean hasFaultResponse(MessageContext mc) {
if (mc.getMessage() != null && mc.getMessage().isFault())
return true;
else if (mc.getLocalException() != null)
return true;
else
return false;
}
private boolean isBindingProviderInvoked(Method method) {
Class methodsClass = method.getDeclaringClass();
return (seiClazz == methodsClass) ? false : true;
}
private boolean isValidMethodCall(Method method) {
Class clazz = method.getDeclaringClass();
if (clazz.isAssignableFrom(seiClazz) ||
clazz.isAssignableFrom(org.apache.axis2.jaxws.spi.BindingProvider.class) ||
clazz.isAssignableFrom(javax.xml.ws.BindingProvider.class)) {
return true;
}
return false;
}
private boolean isPublic(Method method) {
return Modifier.isPublic(method.getModifiers());
}
private boolean isMethodExcluded(OperationDescription operationDesc) {
return operationDesc.isExcluded();
}
public Class getSeiClazz() {
return seiClazz;
}
public void setSeiClazz(Class seiClazz) {
this.seiClazz = seiClazz;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?