All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.xml.ws.client.AsyncResponseImpl Maven / Gradle / Ivy

There is a newer version: 4.0.2
Show newest version
/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License).  You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the license at
 * https://glassfish.dev.java.net/public/CDDLv1.0.html.
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at https://glassfish.dev.java.net/public/CDDLv1.0.html.
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * you own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 *
 * Copyright 2006 Sun Microsystems Inc. All Rights Reserved
 */

package com.sun.xml.ws.client;

import com.sun.istack.Nullable;
import com.sun.xml.ws.util.CompletedFuture;

import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Response;
import javax.xml.ws.WebServiceException;
import java.util.Map;
import java.util.concurrent.FutureTask;

/**
 * {@link Response} implementation. When Runnbale is executed, it just hands the
 * request to Fiber and returns. When the Fiber finishes the execution, it sets
 * response in the {@link FutureTask}
 *
 * 

* {@link ResponseImpl} executes things synchronously and waits for the return * parameter. * * @author Jitendra Kotamraju */ public final class AsyncResponseImpl extends FutureTask implements Response, ResponseContextReceiver { /** * Optional {@link AsyncHandler} that gets invoked * at the completion of the task. */ private final AsyncHandler handler; private ResponseContext responseContext; private final Runnable callable; /** * * @param runnable * This {@link Runnable} is executed asynchronously. * @param handler * Optional {@link AsyncHandler} to invoke at the end * of the processing. Can be null. */ public AsyncResponseImpl(Runnable runnable, @Nullable AsyncHandler handler) { super(runnable, null); this.callable = runnable; this.handler = handler; } @Override public void run() { // override so that AsyncInvoker calls set() // when Fiber calls the callback try { callable.run(); } catch (WebServiceException e) { //it could be a WebServiceException or a ProtocolException or any RuntimeException // resulting due to some internal bug. set(null, e); } catch (Throwable e) { //its some other exception resulting from user error, wrap it in // WebServiceException set(null, new WebServiceException(e)); } } public ResponseContext getContext() { return responseContext; } public void setResponseContext(ResponseContext rc) { responseContext = rc; } public void set(final T v, final Throwable t) { // call the handler before we mark the future as 'done' if (handler!=null) { try { /** * {@link Response} object passed into the callback. * We need a separate {@link java.util.concurrent.Future} because we don't want {@link ResponseImpl} * to be marked as 'done' before the callback finishes execution. * (That would provide implicit synchronization between the application code * in the main thread and the callback code, and is compatible with the JAX-RI 2.0 FCS. */ class CallbackFuture extends CompletedFuture implements Response { public CallbackFuture(T v, Throwable t) { super(v, t); } public Map getContext() { return AsyncResponseImpl.this.getContext(); } } handler.handleResponse(new CallbackFuture(v, t)); } catch (Throwable e) { super.setException(e); return; } } if (t != null) { super.setException(t); } else { super.set(v); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy