Wed, 27 Apr 2016 01:27:09 +0800
Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/jaxws/
changeset: 657:d47a47f961ee
tag: jdk8u25-b17
1 /*
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
26 package com.sun.xml.internal.ws.protocol.soap;
28 import com.sun.xml.internal.ws.api.SOAPVersion;
29 import static com.sun.xml.internal.ws.api.SOAPVersion.SOAP_11;
30 import static com.sun.xml.internal.ws.api.SOAPVersion.SOAP_12;
31 import com.sun.xml.internal.ws.api.WSBinding;
32 import com.sun.xml.internal.ws.api.message.Header;
33 import com.sun.xml.internal.ws.api.message.Message;
34 import com.sun.xml.internal.ws.api.message.MessageHeaders;
35 import com.sun.xml.internal.ws.api.pipe.Tube;
36 import com.sun.xml.internal.ws.api.pipe.TubeCloner;
37 import com.sun.xml.internal.ws.api.pipe.helper.AbstractFilterTubeImpl;
38 import com.sun.xml.internal.ws.binding.SOAPBindingImpl;
39 import com.sun.xml.internal.ws.message.DOMHeader;
40 import com.sun.xml.internal.ws.fault.SOAPFaultBuilder;
41 import org.w3c.dom.Element;
43 import javax.xml.namespace.QName;
44 import javax.xml.soap.SOAPElement;
45 import javax.xml.soap.SOAPException;
46 import javax.xml.soap.SOAPFault;
47 import javax.xml.ws.WebServiceException;
48 import javax.xml.ws.soap.SOAPBinding;
49 import javax.xml.ws.soap.SOAPFaultException;
50 import java.util.Set;
51 import java.util.logging.Logger;
53 /**
54 * @author Rama Pulavarthi
55 */
57 abstract class MUTube extends AbstractFilterTubeImpl {
59 private static final String MU_FAULT_DETAIL_LOCALPART = "NotUnderstood";
60 private final static QName MU_HEADER_DETAIL = new QName(SOAPVersion.SOAP_12.nsUri, MU_FAULT_DETAIL_LOCALPART);
61 //TODO: change
62 protected static final Logger logger = Logger.getLogger(
63 com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".soap.decoder");
64 private final static String MUST_UNDERSTAND_FAULT_MESSAGE_STRING =
65 "One or more mandatory SOAP header blocks not understood";
67 protected final SOAPVersion soapVersion;
68 protected SOAPBindingImpl binding;
70 protected MUTube(WSBinding binding, Tube next) {
71 super(next);
72 // MUPipe should n't be used for bindings other than SOAP.
73 if (!(binding instanceof SOAPBinding)) {
74 throw new WebServiceException(
75 "MUPipe should n't be used for bindings other than SOAP.");
76 }
77 this.binding = (SOAPBindingImpl) binding;
78 this.soapVersion = binding.getSOAPVersion();
79 }
81 protected MUTube(MUTube that, TubeCloner cloner) {
82 super(that, cloner);
83 binding = that.binding;
84 soapVersion = that.soapVersion;
85 }
87 /**
88 * @param headers HeaderList that needs MU processing
89 * @param roles Roles configured on the Binding. Required Roles supposed to be assumbed a by a
90 * SOAP Binding implementation are added.
91 * @param handlerKnownHeaders Set of headers that the handlerchain associated with the binding understands
92 * @return returns the headers that have mustUnderstand attribute and are not understood
93 * by the binding.
94 */
95 public final Set<QName> getMisUnderstoodHeaders(MessageHeaders headers, Set<String> roles,
96 Set<QName> handlerKnownHeaders) {
97 return headers.getNotUnderstoodHeaders(roles, handlerKnownHeaders, binding);
99 }
101 /**
102 * @param notUnderstoodHeaders
103 * @return SOAPfaultException with SOAPFault representing the MustUnderstand SOAP Fault.
104 * notUnderstoodHeaders are added in the fault detail.
105 */
106 final SOAPFaultException createMUSOAPFaultException(Set<QName> notUnderstoodHeaders) {
107 try {
108 SOAPFault fault = soapVersion.getSOAPFactory().createFault(
109 MUST_UNDERSTAND_FAULT_MESSAGE_STRING,
110 soapVersion.faultCodeMustUnderstand);
111 fault.setFaultString("MustUnderstand headers:" +
112 notUnderstoodHeaders + " are not understood");
113 return new SOAPFaultException(fault);
114 } catch (SOAPException e) {
115 throw new WebServiceException(e);
116 }
117 }
119 /**
120 * This should be used only in ServerMUPipe
121 *
122 * @param notUnderstoodHeaders
123 * @return Message representing a SOAPFault
124 * In SOAP 1.1, notUnderstoodHeaders are added in the fault Detail
125 * in SOAP 1.2, notUnderstoodHeaders are added as the SOAP Headers
126 */
128 final Message createMUSOAPFaultMessage(Set<QName> notUnderstoodHeaders) {
129 try {
130 String faultString = MUST_UNDERSTAND_FAULT_MESSAGE_STRING;
131 if (soapVersion == SOAP_11) {
132 faultString = "MustUnderstand headers:" + notUnderstoodHeaders + " are not understood";
133 }
134 Message muFaultMessage = SOAPFaultBuilder.createSOAPFaultMessage(
135 soapVersion,faultString,soapVersion.faultCodeMustUnderstand);
137 if (soapVersion == SOAP_12) {
138 addHeader(muFaultMessage, notUnderstoodHeaders);
139 }
140 return muFaultMessage;
141 } catch (SOAPException e) {
142 throw new WebServiceException(e);
143 }
144 }
146 private static void addHeader(Message m, Set<QName> notUnderstoodHeaders) throws SOAPException {
147 for (QName qname : notUnderstoodHeaders) {
148 SOAPElement soapEl = SOAP_12.getSOAPFactory().createElement(MU_HEADER_DETAIL);
149 soapEl.addNamespaceDeclaration("abc", qname.getNamespaceURI());
150 soapEl.setAttribute("qname", "abc:" + qname.getLocalPart());
151 Header header = new DOMHeader<Element>(soapEl);
152 m.getHeaders().add(header);
153 }
154 }
155 }