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 */
25
26 package com.sun.xml.internal.ws.api.message.saaj;
27
28 import java.util.ArrayList;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.HashSet;
32 import java.util.Iterator;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Set;
36
37 import javax.xml.namespace.QName;
38 import javax.xml.soap.SOAPException;
39 import javax.xml.soap.SOAPHeader;
40 import javax.xml.soap.SOAPHeaderElement;
41 import javax.xml.soap.SOAPMessage;
42
43 import com.sun.xml.internal.ws.api.SOAPVersion;
44 import com.sun.xml.internal.ws.api.WSBinding;
45 import com.sun.xml.internal.ws.api.message.Header;
46 import com.sun.xml.internal.ws.api.message.MessageHeaders;
47 import com.sun.xml.internal.ws.binding.SOAPBindingImpl;
48 import com.sun.xml.internal.ws.message.saaj.SAAJHeader;
49
50 public class SAAJMessageHeaders implements MessageHeaders {
51 SOAPMessage sm;
52 Map<SOAPHeaderElement, Header> nonSAAJHeaders;
53 Map<QName, Integer> notUnderstoodCount;
54 SOAPVersion soapVersion;
55 private Set<QName> understoodHeaders;
56
57 public SAAJMessageHeaders(SOAPMessage sm, SOAPVersion version) {
58 this.sm = sm;
59 this.soapVersion = version;
60 initHeaderUnderstanding();
61 }
62
217 if (isNonSAAJHeader(header)) {
218 //TODO assumes only one header with that name?
219 addNonSAAJHeader(find(header.getNamespaceURI(), header.getLocalPart()),
220 header);
221 }
222
223 return true;
224 }
225
226 @Override
227 public Header remove(QName name) {
228 return remove(name.getNamespaceURI(), name.getLocalPart());
229 }
230
231 @Override
232 public Header remove(String nsUri, String localName) {
233 SOAPHeader soapHeader = ensureSOAPHeader();
234 if (soapHeader == null) {
235 return null;
236 }
237 SOAPHeaderElement headerElem = find(nsUri, localName);
238 if (headerElem == null) {
239 return null;
240 }
241 headerElem = (SOAPHeaderElement) soapHeader.removeChild(headerElem);
242
243 //it might have been a nonSAAJHeader - remove from that map
244 removeNonSAAJHeader(headerElem);
245
246 //remove it from understoodHeaders and notUnderstoodHeaders if present
247 QName hdrName = (nsUri == null) ? new QName(localName) : new QName(nsUri, localName);
248 if (understoodHeaders != null) {
249 understoodHeaders.remove(hdrName);
250 }
251 removeNotUnderstood(hdrName);
252
253 return new SAAJHeader(headerElem);
254 }
255
256 private void removeNotUnderstood(QName hdrName) {
257 if (notUnderstoodCount == null) {
258 return;
259 }
260 Integer notUnderstood = notUnderstoodCount.get(hdrName);
261 if (notUnderstood != null) {
313 private SOAPHeader ensureSOAPHeader() {
314 SOAPHeader header;
315 try {
316 header = sm.getSOAPPart().getEnvelope().getHeader();
317 if (header != null) {
318 return header;
319 } else {
320 return sm.getSOAPPart().getEnvelope().addHeader();
321 }
322 } catch (Exception e) {
323 return null;
324 }
325 }
326
327 private boolean isNonSAAJHeader(Header header) {
328 return !(header instanceof SAAJHeader);
329 }
330
331 private void addNonSAAJHeader(SOAPHeaderElement headerElem, Header header) {
332 if (nonSAAJHeaders == null) {
333 nonSAAJHeaders = new HashMap<SOAPHeaderElement, Header>();
334 }
335 nonSAAJHeaders.put(headerElem, header);
336 }
337
338 private void removeNonSAAJHeader(SOAPHeaderElement headerElem) {
339 if (nonSAAJHeaders != null) {
340 nonSAAJHeaders.remove(headerElem);
341 }
342 }
343
344 @Override
345 public boolean addOrReplace(Header header) {
346 remove(header.getNamespaceURI(), header.getLocalPart());
347 return add(header);
348 }
349
350 @Override
351 public void replace(Header old, Header header) {
352 if (remove(old.getNamespaceURI(), old.getLocalPart()) == null)
353 throw new IllegalArgumentException();
|
1 /*
2 * Copyright (c) 1997, 2017, 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 */
25
26 package com.sun.xml.internal.ws.api.message.saaj;
27
28 import java.util.ArrayList;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.HashSet;
32 import java.util.Iterator;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Set;
36
37 import javax.xml.namespace.QName;
38 import javax.xml.soap.SOAPException;
39 import javax.xml.soap.SOAPHeader;
40 import javax.xml.soap.SOAPHeaderElement;
41 import javax.xml.soap.SOAPMessage;
42
43 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
44 import com.sun.xml.internal.messaging.saaj.soap.impl.HeaderImpl;
45 import com.sun.xml.internal.ws.api.SOAPVersion;
46 import com.sun.xml.internal.ws.api.WSBinding;
47 import com.sun.xml.internal.ws.api.message.Header;
48 import com.sun.xml.internal.ws.api.message.MessageHeaders;
49 import com.sun.xml.internal.ws.binding.SOAPBindingImpl;
50 import com.sun.xml.internal.ws.message.saaj.SAAJHeader;
51
52 public class SAAJMessageHeaders implements MessageHeaders {
53 SOAPMessage sm;
54 Map<SOAPHeaderElement, Header> nonSAAJHeaders;
55 Map<QName, Integer> notUnderstoodCount;
56 SOAPVersion soapVersion;
57 private Set<QName> understoodHeaders;
58
59 public SAAJMessageHeaders(SOAPMessage sm, SOAPVersion version) {
60 this.sm = sm;
61 this.soapVersion = version;
62 initHeaderUnderstanding();
63 }
64
219 if (isNonSAAJHeader(header)) {
220 //TODO assumes only one header with that name?
221 addNonSAAJHeader(find(header.getNamespaceURI(), header.getLocalPart()),
222 header);
223 }
224
225 return true;
226 }
227
228 @Override
229 public Header remove(QName name) {
230 return remove(name.getNamespaceURI(), name.getLocalPart());
231 }
232
233 @Override
234 public Header remove(String nsUri, String localName) {
235 SOAPHeader soapHeader = ensureSOAPHeader();
236 if (soapHeader == null) {
237 return null;
238 }
239 SOAPDocumentImpl soapDocument = ((HeaderImpl)soapHeader).getSoapDocument();
240 SOAPHeaderElement headerElem = find(nsUri, localName);
241 if (headerElem == null) {
242 return null;
243 }
244 headerElem = (SOAPHeaderElement) soapDocument.find(soapHeader.removeChild(headerElem));
245
246 //it might have been a nonSAAJHeader - remove from that map
247 removeNonSAAJHeader(headerElem);
248
249 //remove it from understoodHeaders and notUnderstoodHeaders if present
250 QName hdrName = (nsUri == null) ? new QName(localName) : new QName(nsUri, localName);
251 if (understoodHeaders != null) {
252 understoodHeaders.remove(hdrName);
253 }
254 removeNotUnderstood(hdrName);
255
256 return new SAAJHeader(headerElem);
257 }
258
259 private void removeNotUnderstood(QName hdrName) {
260 if (notUnderstoodCount == null) {
261 return;
262 }
263 Integer notUnderstood = notUnderstoodCount.get(hdrName);
264 if (notUnderstood != null) {
316 private SOAPHeader ensureSOAPHeader() {
317 SOAPHeader header;
318 try {
319 header = sm.getSOAPPart().getEnvelope().getHeader();
320 if (header != null) {
321 return header;
322 } else {
323 return sm.getSOAPPart().getEnvelope().addHeader();
324 }
325 } catch (Exception e) {
326 return null;
327 }
328 }
329
330 private boolean isNonSAAJHeader(Header header) {
331 return !(header instanceof SAAJHeader);
332 }
333
334 private void addNonSAAJHeader(SOAPHeaderElement headerElem, Header header) {
335 if (nonSAAJHeaders == null) {
336 nonSAAJHeaders = new HashMap<>();
337 }
338 nonSAAJHeaders.put(headerElem, header);
339 }
340
341 private void removeNonSAAJHeader(SOAPHeaderElement headerElem) {
342 if (nonSAAJHeaders != null) {
343 nonSAAJHeaders.remove(headerElem);
344 }
345 }
346
347 @Override
348 public boolean addOrReplace(Header header) {
349 remove(header.getNamespaceURI(), header.getLocalPart());
350 return add(header);
351 }
352
353 @Override
354 public void replace(Header old, Header header) {
355 if (remove(old.getNamespaceURI(), old.getLocalPart()) == null)
356 throw new IllegalArgumentException();
|