diff -r 88b85470e72c -r f50545b5e2f1 src/share/jaxws_classes/com/sun/xml/internal/ws/handler/SOAPHandlerProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/jaxws_classes/com/sun/xml/internal/ws/handler/SOAPHandlerProcessor.java Tue Mar 06 16:09:35 2012 -0800 @@ -0,0 +1,101 @@ +/* + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * SOAPHandlerProcessor.java + * + * Created on February 8, 2006, 5:43 PM + * + * + */ + +package com.sun.xml.internal.ws.handler; + +import com.sun.xml.internal.ws.api.WSBinding; +import com.sun.xml.internal.ws.api.SOAPVersion; +import com.sun.xml.internal.ws.api.message.Message; +import com.sun.xml.internal.ws.api.message.Messages; +import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants; +import com.sun.xml.internal.ws.encoding.soap.SOAPConstants; +import java.util.List; +import java.util.logging.Level; +import javax.xml.namespace.QName; +import javax.xml.ws.ProtocolException; +import javax.xml.ws.handler.Handler; + +/** + * + * @author WS Development Team + */ +final class SOAPHandlerProcessor extends HandlerProcessor { + + /** + * Creates a new instance of SOAPHandlerProcessor + */ + public SOAPHandlerProcessor(boolean isClient, HandlerTube owner, WSBinding binding, List chain) { + super(owner, binding, chain); + this.isClient = isClient; + } + + /** + * Replace the message in the given message context with a + * fault message. If the context already contains a fault + * message, then return without changing it. + * + *

This method should only be called during a request, + * because during a response an exception from a handler + * is dispatched rather than replacing the message with + * a fault. So this method can use the MESSAGE_OUTBOUND_PROPERTY + * to determine whether it is being called on the client + * or the server side. If this changes in the spec, then + * something else will need to be passed to the method + * to determine whether the fault code is client or server. + */ + final void insertFaultMessage(C context, + ProtocolException exception) { + try { + if(!context.getPacketMessage().isFault()) { + Message faultMessage = Messages.create(binding.getSOAPVersion(), + exception,determineFaultCode(binding.getSOAPVersion())); + context.setPacketMessage(faultMessage); + } + } catch (Exception e) { + // severe since this is from runtime and not handler + logger.log(Level.SEVERE, + "exception while creating fault message in handler chain", e); + throw new RuntimeException(e); + } + } + + /** + *

Figure out if the fault code local part is client, + * server, sender, receiver, etc. This is called by + * insertFaultMessage. + */ + private QName determineFaultCode(SOAPVersion soapVersion) { + return isClient ? soapVersion.faultCodeClient : soapVersion.faultCodeServer; + } + +}