aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.xml.internal.ws.handler; aoqi@0: aoqi@0: import com.sun.xml.internal.ws.api.WSBinding; aoqi@0: import com.sun.xml.internal.ws.api.message.Packet; aoqi@0: import com.sun.xml.internal.ws.api.message.Attachment; aoqi@0: import com.sun.xml.internal.ws.api.message.AttachmentSet; aoqi@0: import com.sun.xml.internal.ws.api.pipe.TubeCloner; aoqi@0: import com.sun.xml.internal.ws.api.pipe.Tube; aoqi@0: import com.sun.xml.internal.ws.api.pipe.helper.AbstractFilterTubeImpl; aoqi@0: import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort; aoqi@0: import com.sun.xml.internal.ws.client.HandlerConfiguration; aoqi@0: import com.sun.xml.internal.ws.binding.BindingImpl; aoqi@0: import com.sun.xml.internal.ws.message.DataHandlerAttachment; aoqi@0: aoqi@0: import javax.xml.ws.handler.soap.SOAPHandler; aoqi@0: import javax.xml.ws.handler.MessageContext; aoqi@0: import javax.xml.ws.handler.Handler; aoqi@0: import javax.xml.ws.WebServiceException; aoqi@0: import javax.activation.DataHandler; aoqi@0: import java.util.*; aoqi@0: import java.util.Map.Entry; aoqi@0: aoqi@0: /** aoqi@0: * aoqi@0: * @author WS Development Team aoqi@0: */ aoqi@0: public class ClientSOAPHandlerTube extends HandlerTube { aoqi@0: aoqi@0: private Set roles; aoqi@0: aoqi@0: /** aoqi@0: * Creates a new instance of SOAPHandlerTube aoqi@0: */ aoqi@0: public ClientSOAPHandlerTube(WSBinding binding, WSDLPort port, Tube next) { aoqi@0: super(next, port, binding); aoqi@0: if (binding.getSOAPVersion() != null) { aoqi@0: // SOAPHandlerTube should n't be used for bindings other than SOAP. aoqi@0: // TODO: throw Exception aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: // Handle to LogicalHandlerTube means its used on SERVER-SIDE aoqi@0: aoqi@0: /** aoqi@0: * This constructor is used on client-side where, LogicalHandlerTube is created aoqi@0: * first and then a SOAPHandlerTube is created with a handler to that aoqi@0: * LogicalHandlerTube. aoqi@0: * With this handle, SOAPHandlerTube can call LogicalHandlerTube.closeHandlers() aoqi@0: */ aoqi@0: public ClientSOAPHandlerTube(WSBinding binding, Tube next, HandlerTube cousinTube) { aoqi@0: super(next, cousinTube, binding); aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Copy constructor for {@link com.sun.xml.internal.ws.api.pipe.Tube#copy(com.sun.xml.internal.ws.api.pipe.TubeCloner)}. aoqi@0: */ aoqi@0: private ClientSOAPHandlerTube(ClientSOAPHandlerTube that, TubeCloner cloner) { aoqi@0: super(that, cloner); aoqi@0: } aoqi@0: aoqi@0: public AbstractFilterTubeImpl copy(TubeCloner cloner) { aoqi@0: return new ClientSOAPHandlerTube(this, cloner); aoqi@0: } aoqi@0: aoqi@0: void setUpProcessor() { aoqi@0: if (handlers == null) { aoqi@0: // Take a snapshot, User may change chain after invocation, Same chain aoqi@0: // should be used for the entire MEP aoqi@0: handlers = new ArrayList(); aoqi@0: HandlerConfiguration handlerConfig = ((BindingImpl) getBinding()).getHandlerConfig(); aoqi@0: List soapSnapShot= handlerConfig.getSoapHandlers(); aoqi@0: if (!soapSnapShot.isEmpty()) { aoqi@0: handlers.addAll(soapSnapShot); aoqi@0: roles = new HashSet(); aoqi@0: roles.addAll(handlerConfig.getRoles()); aoqi@0: processor = new SOAPHandlerProcessor(true, this, getBinding(), handlers); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: MessageUpdatableContext getContext(Packet packet) { aoqi@0: SOAPMessageContextImpl context = new SOAPMessageContextImpl(getBinding(), packet,roles); aoqi@0: return context; aoqi@0: } aoqi@0: aoqi@0: boolean callHandlersOnRequest(MessageUpdatableContext context, boolean isOneWay) { aoqi@0: aoqi@0: boolean handlerResult; aoqi@0: //Lets copy all the MessageContext.OUTBOUND_ATTACHMENT_PROPERTY to the message aoqi@0: Map atts = (Map) context.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS); aoqi@0: AttachmentSet attSet = context.packet.getMessage().getAttachments(); aoqi@0: for (Entry entry : atts.entrySet()) { aoqi@0: String cid = entry.getKey(); aoqi@0: if (attSet.get(cid) == null) { // Otherwise we would be adding attachments twice aoqi@0: Attachment att = new DataHandlerAttachment(cid, atts.get(cid)); aoqi@0: attSet.add(att); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: try { aoqi@0: //CLIENT-SIDE aoqi@0: handlerResult = processor.callHandlersRequest(HandlerProcessor.Direction.OUTBOUND, context, !isOneWay); aoqi@0: } catch (WebServiceException wse) { aoqi@0: remedyActionTaken = true; aoqi@0: //no rewrapping aoqi@0: throw wse; aoqi@0: } catch (RuntimeException re) { aoqi@0: remedyActionTaken = true; aoqi@0: aoqi@0: throw new WebServiceException(re); aoqi@0: aoqi@0: } aoqi@0: if (!handlerResult) { aoqi@0: remedyActionTaken = true; aoqi@0: } aoqi@0: return handlerResult; aoqi@0: } aoqi@0: aoqi@0: void callHandlersOnResponse(MessageUpdatableContext context, boolean handleFault) { aoqi@0: try { aoqi@0: aoqi@0: //CLIENT-SIDE aoqi@0: processor.callHandlersResponse(HandlerProcessor.Direction.INBOUND, context, handleFault); aoqi@0: aoqi@0: } catch (WebServiceException wse) { aoqi@0: //no rewrapping aoqi@0: throw wse; aoqi@0: } catch (RuntimeException re) { aoqi@0: throw new WebServiceException(re); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: void closeHandlers(MessageContext mc) { aoqi@0: closeClientsideHandlers(mc); aoqi@0: aoqi@0: } aoqi@0: }