1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.commons.ihe.ws.cxf;
17
18 import org.apache.cxf.binding.soap.SoapHeader;
19 import org.apache.cxf.binding.soap.SoapMessage;
20 import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
21 import org.apache.cxf.ext.logging.LoggingOutInterceptor;
22 import org.apache.cxf.headers.Header;
23 import org.apache.cxf.interceptor.Fault;
24 import org.apache.cxf.phase.Phase;
25 import org.apache.cxf.ws.addressing.soap.MAPCodec;
26
27 import javax.xml.namespace.QName;
28 import java.util.ArrayList;
29 import java.util.List;
30
31
32
33
34
35 public class MustUnderstandDecoratorInterceptor extends AbstractSoapInterceptor {
36 private final List<QName> mustUnderstandHeaders = new ArrayList<>();
37
38
39
40
41 public MustUnderstandDecoratorInterceptor() {
42 super(Phase.WRITE);
43 addAfter(MAPCodec.class.getName());
44 addBefore(LoggingOutInterceptor.class.getName());
45 }
46
47 @Override
48 public void handleMessage(SoapMessage message) throws Fault {
49 List<Header> headers = message.getHeaders();
50 for (QName name : mustUnderstandHeaders) {
51 mustUnderstand(headers, name);
52 }
53 }
54
55
56
57
58
59
60
61
62 public void addHeaders(List<String> headers) {
63 for (String header : headers) {
64 int namespaceEnd = header.indexOf('}');
65 String namespace = header.substring(1, namespaceEnd);
66 String name = header.substring(namespaceEnd + 1);
67 mustUnderstandHeaders.add(new QName(namespace, name));
68 }
69 }
70
71
72
73
74
75
76
77
78 public void addHeader(QName header) {
79 mustUnderstandHeaders.add(header);
80 }
81
82
83 private Header getHeader(List<Header> headers, QName name) {
84 for (Header header : headers) {
85 if (header.getName().equals(name)) {
86 return header;
87 }
88 }
89 return null;
90 }
91
92 private void mustUnderstand(List<Header> headers, QName name) {
93 Header header = getHeader(headers, name);
94 if (header == null) {
95 return;
96 }
97
98 if (header instanceof SoapHeader) {
99 SoapHeader soapHeader = (SoapHeader) header;
100 soapHeader.setMustUnderstand(true);
101 return;
102 }
103
104 headers.remove(header);
105 SoapHeader newHeader = new SoapHeader(name, header.getObject());
106 newHeader.setMustUnderstand(true);
107 headers.add(newHeader);
108 }
109 }