14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * This code is free software; you can redistribute it and/or modify it
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * under the terms of the GNU General Public License version 2 only, as
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * published by the Free Software Foundation. Oracle designates this
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * particular file as subject to the "Classpath" exception as provided
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * by Oracle in the LICENSE file that accompanied this code.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * This code is distributed in the hope that it will be useful, but WITHOUT
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * version 2 for more details (a copy is included in the LICENSE file that
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * accompanied this code).
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * You should have received a copy of the GNU General Public License version
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * 2 along with this work; if not, write to the Free Software Foundation,
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * or visit www.oracle.com if you need additional information or have any
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * questions.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.api.client.WSPortInfo;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.api.addressing.WSEndpointReference;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.api.message.Attachment;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.api.message.AttachmentSet;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.encoding.soap.DeserializationException;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.fault.SOAPFaultBuilder;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.message.AttachmentSetImpl;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.message.DataHandlerAttachment;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncimport com.sun.xml.internal.ws.resources.DispatchMessages;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * The <code>DispatchImpl</code> abstract class provides support
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * for the dynamic invocation of a service endpoint operation using XML
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * constructs, JAXB objects or <code>SOAPMessage</code>. The <code>javax.xml.ws.Service</code>
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * interface acts as a factory for the creation of <code>DispatchImpl</code>
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * instances.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @author WS Development Team
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @version 1.0
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncpublic abstract class DispatchImpl<T> extends Stub implements Dispatch<T> {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param port dispatch instance is asssociated with this wsdl port qName
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param mode Service.mode associated with this Dispatch instance - Service.mode.MESSAGE or Service.mode.PAYLOAD
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param owner Service that created the Dispatch
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param pipe Master pipe for the pipeline
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param binding Binding of this Dispatch instance, current one of SOAP/HTTP or XML/HTTP
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync protected DispatchImpl(QName port, Service.Mode mode, WSServiceDelegate owner, Tube pipe, BindingImpl binding, @Nullable WSEndpointReference epr) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync super(owner, pipe, binding, (owner.getWsdlService() != null)? owner.getWsdlService().get(port) : null , owner.getEndpointAddress(port), epr);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param portInfo dispatch instance is asssociated with this portInfo
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param mode Service.mode associated with this Dispatch instance - Service.mode.MESSAGE or Service.mode.PAYLOAD
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param binding Binding of this Dispatch instance, current one of SOAP/HTTP or XML/HTTP
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync protected DispatchImpl(WSPortInfo portInfo, Service.Mode mode, BindingImpl binding, @Nullable WSEndpointReference epr) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync super(portInfo, binding, portInfo.getEndpointAddress(), epr);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * Abstract method that is implemented by each concrete Dispatch class
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @param msg message passed in from the client program on the invocation
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * @return The Message created returned as the Interface in actuallity a
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * concrete Message Type
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * Obtains the value to return from the response message.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync AsyncInvoker invoker = new DispatchAsyncInvoker(param);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync AsyncResponseImpl<T> ft = new AsyncResponseImpl<T>(invoker,null);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync public final Future<?> invokeAsync(T param, AsyncHandler<T> asyncHandler) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync AsyncInvoker invoker = new DispatchAsyncInvoker(param);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync AsyncResponseImpl<T> ft = new AsyncResponseImpl<T>(invoker,asyncHandler);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // temp needed so that unit tests run and complete otherwise they may
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //not. Need a way to put this in the test harness or other way to do this
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //todo: as above
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync// ExecutorService exec = (ExecutorService) owner.getExecutor();
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync// exec.awaitTermination(AWAIT_TERMINATION_TIME, TimeUnit.MICROSECONDS);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync// } catch (InterruptedException e) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync// throw new WebServiceException(e);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * Synchronously invokes a service.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * See {@link #process(Packet, RequestContext, ResponseContextReceiver)} on
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * why it takes a {@link RequestContext} and {@link ResponseContextReceiver} as a parameter.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync public final T doInvoke(T in, RequestContext rc, ResponseContextReceiver receiver){
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync SOAPFaultBuilder faultBuilder = SOAPFaultBuilder.create(msg);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // passing null means there is no checked excpetion we're looking for all
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // it will get back to us is a protocol exception
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw (SOAPFaultException)faultBuilder.createException(null);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //TODO: i18nify
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new DeserializationException(DispatchMessages.INVALID_RESPONSE_DESERIALIZATION(),e);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //it could be a WebServiceException or a ProtocolException
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // it could be a RuntimeException resulting due to some internal bug or
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // its some other exception resulting from user error, wrap it in
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // WebServiceException
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync checkNullAllowed(in, requestContext, binding, mode);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync Packet response = process(request,requestContext,this);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //it could be a WebServiceException or a ProtocolException
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // it could be a RuntimeException resulting due to some internal bug or
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // its some other exception resulting from user error, wrap it in
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // WebServiceException
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync void setProperties(Packet packet, boolean expectReply) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync static boolean isXMLHttp(@NotNull WSBinding binding) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync return binding.getBindingId().equals(BindingID.XML_HTTP);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync static boolean isPAYLOADMode(@NotNull Service.Mode mode) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync static void checkNullAllowed(@Nullable Object in, RequestContext rc, WSBinding binding, Service.Mode mode) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //With HTTP Binding a null invocation parameter can not be used
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //with HTTP Request Method == POST
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new WebServiceException(DispatchMessages.INVALID_NULLARG_XMLHTTP_REQUEST_METHOD(HTTP_REQUEST_METHOD_POST, HTTP_REQUEST_METHOD_GET));
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync } else { //soapBinding
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new WebServiceException(DispatchMessages.INVALID_NULLARG_SOAP_MSGMODE(mode.name(), Service.Mode.PAYLOAD.toString()));
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync static boolean methodNotOk(@NotNull RequestContext rc) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync String requestMethod = (String)rc.get(MessageContext.HTTP_REQUEST_METHOD);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync String request = (requestMethod == null)? HTTP_REQUEST_METHOD_POST: requestMethod;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // if method == post or put with a null invocation parameter in xml/http binding this is not ok
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync return HTTP_REQUEST_METHOD_POST.equalsIgnoreCase(request) || HTTP_REQUEST_METHOD_PUT.equalsIgnoreCase(request);
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync public static void checkValidSOAPMessageDispatch(WSBinding binding, Service.Mode mode) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // Dispatch<SOAPMessage> is only valid for soap binding and in Service.Mode.MESSAGE
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new WebServiceException(DispatchMessages.INVALID_SOAPMESSAGE_DISPATCH_BINDING(HTTPBinding.HTTP_BINDING, SOAPBinding.SOAP11HTTP_BINDING + " or " + SOAPBinding.SOAP12HTTP_BINDING));
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new WebServiceException(DispatchMessages.INVALID_SOAPMESSAGE_DISPATCH_MSGMODE(mode.name(), Service.Mode.MESSAGE.toString()));
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync public static void checkValidDataSourceDispatch(WSBinding binding, Service.Mode mode) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync // Dispatch<DataSource> is only valid with xml/http binding and in Service.Mode.MESSAGE
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new WebServiceException(DispatchMessages.INVALID_DATASOURCE_DISPATCH_BINDING("SOAP/HTTP", HTTPBinding.HTTP_BINDING));
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync throw new WebServiceException(DispatchMessages.INVALID_DATASOURCE_DISPATCH_MSGMODE(mode.name(), Service.Mode.MESSAGE.toString()));
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync void resolveEndpointAddress(@NotNull Packet message, @NotNull RequestContext requestContext) {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync //resolve endpoint look for query parameters, pathInfo
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync String endpoint = (String) requestContext.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY);
} catch (URISyntaxException e) {
protected @NotNull String resolveURI(@NotNull URI endpointURI, @Nullable String pathInfo, @Nullable String queryString) {
} catch (URISyntaxException e) {
} catch (MalformedURLException e) {
return query;
return new AttachmentSetImpl();
} catch (JAXBException e) {
responseImpl.set(null, new DeserializationException(DispatchMessages.INVALID_RESPONSE_DESERIALIZATION(),e));
} catch(WebServiceException e){
} catch(Throwable e){
throw new UnsupportedOperationException();
public static Dispatch<Source> createSourceDispatch(QName port, Mode mode, WSServiceDelegate owner, Tube pipe, BindingImpl binding, WSEndpointReference epr) {
public static Dispatch<Source> createSourceDispatch(WSPortInfo portInfo, Mode mode, BindingImpl binding, WSEndpointReference epr) {