| /* |
| * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Sun designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Sun in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| * CA 95054 USA or visit www.sun.com if you need additional information or |
| * have any questions. |
| */ |
| |
| package com.sun.xml.internal.ws.api.pipe; |
| |
| import com.sun.istack.internal.NotNull; |
| import com.sun.istack.internal.Nullable; |
| import com.sun.xml.internal.ws.addressing.WsaClientTube; |
| import com.sun.xml.internal.ws.api.EndpointAddress; |
| import com.sun.xml.internal.ws.api.WSBinding; |
| import com.sun.xml.internal.ws.api.WSService; |
| import com.sun.xml.internal.ws.api.addressing.AddressingVersion; |
| import com.sun.xml.internal.ws.api.client.ClientPipelineHook; |
| import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort; |
| import com.sun.xml.internal.ws.api.pipe.helper.PipeAdapter; |
| import com.sun.xml.internal.ws.api.server.Container; |
| import com.sun.xml.internal.ws.binding.BindingImpl; |
| import com.sun.xml.internal.ws.handler.ClientLogicalHandlerTube; |
| import com.sun.xml.internal.ws.handler.ClientSOAPHandlerTube; |
| import com.sun.xml.internal.ws.handler.HandlerTube; |
| import com.sun.xml.internal.ws.protocol.soap.ClientMUTube; |
| import com.sun.xml.internal.ws.transport.DeferredTransportPipe; |
| import com.sun.xml.internal.ws.util.pipe.DumpTube; |
| |
| import javax.xml.ws.soap.SOAPBinding; |
| import java.io.PrintStream; |
| |
| /** |
| * Factory for well-known {@link Tube} implementations |
| * that the {@link TubelineAssembler} needs to use |
| * to satisfy JAX-WS requirements. |
| * |
| * @author Jitendra Kotamraju |
| */ |
| public class ClientTubeAssemblerContext { |
| |
| private final @NotNull EndpointAddress address; |
| private final @NotNull WSDLPort wsdlModel; |
| private final @NotNull WSService rootOwner; |
| private final @NotNull WSBinding binding; |
| private final @NotNull Container container; |
| private @NotNull Codec codec; |
| |
| public ClientTubeAssemblerContext(@NotNull EndpointAddress address, @NotNull WSDLPort wsdlModel, @NotNull WSService rootOwner, @NotNull WSBinding binding) { |
| this(address, wsdlModel, rootOwner, binding, Container.NONE); |
| } |
| |
| public ClientTubeAssemblerContext(@NotNull EndpointAddress address, @NotNull WSDLPort wsdlModel, |
| @NotNull WSService rootOwner, @NotNull WSBinding binding, |
| @NotNull Container container, Codec codec) { |
| this.address = address; |
| this.wsdlModel = wsdlModel; |
| this.rootOwner = rootOwner; |
| this.binding = binding; |
| this.container = container; |
| this.codec = codec; |
| } |
| |
| public ClientTubeAssemblerContext(@NotNull EndpointAddress address, @NotNull WSDLPort wsdlModel, |
| @NotNull WSService rootOwner, @NotNull WSBinding binding, |
| @NotNull Container container) { |
| // WSBinding is actually BindingImpl |
| this(address, wsdlModel, rootOwner, binding, container, ((BindingImpl)binding).createCodec() ); |
| } |
| |
| /** |
| * The endpoint address. Always non-null. This parameter is taken separately |
| * from {@link com.sun.xml.internal.ws.api.model.wsdl.WSDLPort} (even though there's {@link com.sun.xml.internal.ws.api.model.wsdl.WSDLPort#getAddress()}) |
| * because sometimes WSDL is not available. |
| */ |
| public @NotNull EndpointAddress getAddress() { |
| return address; |
| } |
| |
| /** |
| * The created pipeline will be used to serve this port. |
| * Null if the service isn't associated with any port definition in WSDL, |
| * and otherwise non-null. |
| */ |
| public @Nullable WSDLPort getWsdlModel() { |
| return wsdlModel; |
| } |
| |
| /** |
| * The pipeline is created for this {@link com.sun.xml.internal.ws.api.WSService}. |
| * Always non-null. (To be precise, the newly created pipeline |
| * is owned by a proxy or a dispatch created from thsi {@link com.sun.xml.internal.ws.api.WSService}.) |
| */ |
| public @NotNull WSService getService() { |
| return rootOwner; |
| } |
| |
| /** |
| * The binding of the new pipeline to be created. |
| */ |
| public @NotNull WSBinding getBinding() { |
| return binding; |
| } |
| |
| /** |
| * Returns the Container in which the client is running |
| * |
| * @return Container in which client is running |
| */ |
| public Container getContainer() { |
| return container; |
| } |
| |
| /** |
| * creates a {@link Tube} that dumps messages that pass through. |
| */ |
| public Tube createDumpTube(String name, PrintStream out, Tube next) { |
| return new DumpTube(name, out, next); |
| } |
| |
| /** |
| * Creates a {@link Tube} that adds container specific security |
| */ |
| public @NotNull Tube createSecurityTube(@NotNull Tube next) { |
| ClientPipelineHook hook = container.getSPI(ClientPipelineHook.class); |
| if (hook != null) { |
| ClientPipeAssemblerContext ctxt = new ClientPipeAssemblerContext(address, wsdlModel, |
| rootOwner, binding, container); |
| return PipeAdapter.adapt(hook.createSecurityPipe(ctxt, PipeAdapter.adapt(next))); |
| } |
| return next; |
| } |
| |
| /** |
| * Creates a {@link Tube} that invokes protocol and logical handlers. |
| */ |
| public Tube createWsaTube(Tube next) { |
| if (binding instanceof SOAPBinding && AddressingVersion.isEnabled(binding) && wsdlModel!=null) |
| return new WsaClientTube(wsdlModel, binding, next); |
| else |
| return next; |
| } |
| |
| /** |
| * Creates a {@link Tube} that invokes protocol and logical handlers. |
| */ |
| public Tube createHandlerTube(Tube next) { |
| HandlerTube soapHandlerTube = null; |
| //XML/HTTP Binding can have only LogicalHandlerPipe |
| if (binding instanceof SOAPBinding) { |
| soapHandlerTube = new ClientSOAPHandlerTube(binding, wsdlModel, next); |
| next = soapHandlerTube; |
| } |
| return new ClientLogicalHandlerTube(binding, next, soapHandlerTube); |
| } |
| |
| /** |
| * Creates a {@link Tube} that performs SOAP mustUnderstand processing. |
| * This pipe should be before HandlerPipes. |
| */ |
| public Tube createClientMUTube(Tube next) { |
| if(binding instanceof SOAPBinding) |
| return new ClientMUTube(binding,next); |
| else |
| return next; |
| } |
| |
| /** |
| * Creates a transport pipe (for client), which becomes the terminal pipe. |
| */ |
| public Tube createTransportTube() { |
| ClassLoader cl = Thread.currentThread().getContextClassLoader(); |
| |
| // wsgen generates a WSDL with the address attribute that says "REPLACE_WITH_ACTUAL_URL". |
| // while it's technically correct to reject such address (since there's no transport registered |
| // with it), it's desirable to allow the user a benefit of doubt, and wait until the runtime |
| // to see if the user configures the endpoint address through request context. |
| // DeferredTransportPipe is used for this purpose. |
| // |
| // Ideally, we shouldn't have @address at all for such cases, but due to the backward |
| // compatibility and the fact that this attribute is mandatory, we have no option but |
| // to check for REPLACE_WITH_ACTUAL_URL. |
| if(address.toString().equals("") || address.toString().equals("REPLACE_WITH_ACTUAL_URL")) |
| return new DeferredTransportPipe(cl,this); |
| |
| return TransportTubeFactory.create(cl, this); |
| } |
| |
| /** |
| * Gets the {@link Codec} that is set by {@link #setCodec} or the default codec |
| * based on the binding. |
| * |
| * @return codec to be used for web service requests |
| */ |
| public @NotNull Codec getCodec() { |
| return codec; |
| } |
| |
| /** |
| * Interception point to change {@link Codec} during {@link Tube}line assembly. The |
| * new codec will be used by jax-ws client runtime for encoding/decoding web service |
| * request/response messages. The new codec should be used by the transport tubes. |
| * |
| * <p> |
| * the codec should correctly implement {@link Codec#copy} since it is used while |
| * serving requests concurrently. |
| * |
| * @param codec codec to be used for web service requests |
| */ |
| public void setCodec(@NotNull Codec codec) { |
| this.codec = codec; |
| } |
| |
| } |