ohair@286: /* alanb@368: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ohair@286: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ohair@286: * ohair@286: * This code is free software; you can redistribute it and/or modify it ohair@286: * under the terms of the GNU General Public License version 2 only, as ohair@286: * published by the Free Software Foundation. Oracle designates this ohair@286: * particular file as subject to the "Classpath" exception as provided ohair@286: * by Oracle in the LICENSE file that accompanied this code. ohair@286: * ohair@286: * This code is distributed in the hope that it will be useful, but WITHOUT ohair@286: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ohair@286: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ohair@286: * version 2 for more details (a copy is included in the LICENSE file that ohair@286: * accompanied this code). ohair@286: * ohair@286: * You should have received a copy of the GNU General Public License version ohair@286: * 2 along with this work; if not, write to the Free Software Foundation, ohair@286: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ohair@286: * ohair@286: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@286: * or visit www.oracle.com if you need additional information or have any ohair@286: * questions. ohair@286: */ ohair@286: ohair@286: /* ohair@286: * SOAPHandlerProcessor.java ohair@286: * ohair@286: * Created on February 8, 2006, 5:43 PM ohair@286: * ohair@286: * ohair@286: */ ohair@286: ohair@286: package com.sun.xml.internal.ws.handler; ohair@286: ohair@286: import com.sun.xml.internal.ws.api.WSBinding; ohair@286: import com.sun.xml.internal.ws.api.SOAPVersion; ohair@286: import com.sun.xml.internal.ws.api.message.Message; ohair@286: import com.sun.xml.internal.ws.api.message.Messages; ohair@286: import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants; ohair@286: import com.sun.xml.internal.ws.encoding.soap.SOAPConstants; ohair@286: import java.util.List; ohair@286: import java.util.logging.Level; ohair@286: import javax.xml.namespace.QName; ohair@286: import javax.xml.ws.ProtocolException; ohair@286: import javax.xml.ws.handler.Handler; ohair@286: ohair@286: /** ohair@286: * ohair@286: * @author WS Development Team ohair@286: */ ohair@286: final class SOAPHandlerProcessor extends HandlerProcessor { ohair@286: ohair@286: /** ohair@286: * Creates a new instance of SOAPHandlerProcessor ohair@286: */ ohair@286: public SOAPHandlerProcessor(boolean isClient, HandlerTube owner, WSBinding binding, List chain) { ohair@286: super(owner, binding, chain); ohair@286: this.isClient = isClient; ohair@286: } ohair@286: ohair@286: /** ohair@286: * Replace the message in the given message context with a ohair@286: * fault message. If the context already contains a fault ohair@286: * message, then return without changing it. ohair@286: * ohair@286: *

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

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