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.AttachmentSet; aoqi@0: import com.sun.xml.internal.ws.api.message.Attachment; 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.api.model.SEIModel; aoqi@0: import com.sun.xml.internal.ws.binding.BindingImpl; aoqi@0: import com.sun.xml.internal.ws.message.DataHandlerAttachment; aoqi@0: import com.sun.xml.internal.ws.model.AbstractSEIModelImpl; aoqi@0: import com.sun.xml.internal.ws.spi.db.BindingContext; aoqi@0: aoqi@0: import javax.xml.ws.handler.LogicalHandler; 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.List; aoqi@0: import java.util.ArrayList; aoqi@0: import java.util.Map; 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 ServerLogicalHandlerTube extends HandlerTube { aoqi@0: aoqi@0: private SEIModel seiModel; aoqi@0: aoqi@0: /** aoqi@0: * Creates a new instance of LogicalHandlerTube aoqi@0: */ aoqi@0: public ServerLogicalHandlerTube(WSBinding binding, SEIModel seiModel, WSDLPort port, Tube next) { aoqi@0: super(next, port, binding); aoqi@0: this.seiModel = seiModel; aoqi@0: setUpHandlersOnce(); aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * This constructor is used on client-side where, SOAPHandlerTube is created aoqi@0: * first and then a LogicalHandlerTube is created with a handler to that aoqi@0: * SOAPHandlerTube. aoqi@0: * With this handle, LogicalHandlerTube can call aoqi@0: * SOAPHandlerTube.closeHandlers() aoqi@0: */ aoqi@0: public ServerLogicalHandlerTube(WSBinding binding, SEIModel seiModel, Tube next, HandlerTube cousinTube) { aoqi@0: super(next, cousinTube, binding); aoqi@0: this.seiModel = seiModel; aoqi@0: setUpHandlersOnce(); 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: aoqi@0: private ServerLogicalHandlerTube(ServerLogicalHandlerTube that, TubeCloner cloner) { aoqi@0: super(that, cloner); aoqi@0: this.seiModel = that.seiModel; aoqi@0: this.handlers = that.handlers; aoqi@0: } aoqi@0: aoqi@0: //should be overridden by DriverHandlerTubes aoqi@0: @Override aoqi@0: protected void initiateClosing(MessageContext mc) { aoqi@0: if (getBinding().getSOAPVersion() != null) { aoqi@0: super.initiateClosing(mc); aoqi@0: } else { aoqi@0: close(mc); aoqi@0: super.initiateClosing(mc); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: public AbstractFilterTubeImpl copy(TubeCloner cloner) { aoqi@0: return new ServerLogicalHandlerTube(this, cloner); aoqi@0: } aoqi@0: aoqi@0: private void setUpHandlersOnce() { aoqi@0: handlers = new ArrayList(); aoqi@0: List logicalSnapShot= ((BindingImpl) getBinding()).getHandlerConfig().getLogicalHandlers(); aoqi@0: if (!logicalSnapShot.isEmpty()) { aoqi@0: handlers.addAll(logicalSnapShot); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: protected void resetProcessor() { aoqi@0: processor = null; aoqi@0: } aoqi@0: aoqi@0: void setUpProcessor() { aoqi@0: if (!handlers.isEmpty() && processor == null) { aoqi@0: if (getBinding().getSOAPVersion() == null) { aoqi@0: processor = new XMLHandlerProcessor(this, getBinding(), aoqi@0: handlers); aoqi@0: } else { aoqi@0: processor = new SOAPHandlerProcessor(false, this, getBinding(), handlers); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: MessageUpdatableContext getContext(Packet packet) { aoqi@0: return new LogicalMessageContextImpl(getBinding(), getBindingContext(), packet); aoqi@0: } aoqi@0: aoqi@0: private BindingContext getBindingContext() { aoqi@0: return (seiModel!= null && seiModel instanceof AbstractSEIModelImpl) ? aoqi@0: ((AbstractSEIModelImpl)seiModel).getBindingContext() : null; aoqi@0: } aoqi@0: aoqi@0: boolean callHandlersOnRequest(MessageUpdatableContext context, boolean isOneWay) { aoqi@0: aoqi@0: boolean handlerResult; aoqi@0: try { aoqi@0: //SERVER-SIDE aoqi@0: handlerResult = processor.callHandlersRequest(HandlerProcessor.Direction.INBOUND, context, !isOneWay); aoqi@0: aoqi@0: } catch (RuntimeException re) { aoqi@0: remedyActionTaken = true; aoqi@0: throw re; 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: //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: Attachment att = new DataHandlerAttachment(cid, atts.get(cid)); aoqi@0: attSet.add(att); aoqi@0: } aoqi@0: aoqi@0: try { aoqi@0: //SERVER-SIDE aoqi@0: processor.callHandlersResponse(HandlerProcessor.Direction.OUTBOUND, 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 re; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: void closeHandlers(MessageContext mc) { aoqi@0: closeServersideHandlers(mc); aoqi@0: aoqi@0: } aoqi@0: }