1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.platform.camel.ihe.ws;
17
18 import static org.apache.cxf.message.Message.PROTOCOL_HEADERS;
19
20 import java.util.*;
21 import java.util.function.Supplier;
22
23 import javax.xml.namespace.QName;
24
25 import org.apache.camel.Message;
26 import org.apache.cxf.headers.Header;
27 import org.apache.cxf.helpers.CastUtils;
28 import org.apache.cxf.jaxws.context.WrappedMessageContext;
29
30
31
32
33
34 abstract public class HeaderUtils {
35
36 private HeaderUtils() {
37 throw new IllegalStateException("Cannot instantiate utility class");
38 }
39
40
41 public static void processIncomingHeaders(
42 Map<String, Object> messageContext,
43 Message message)
44 {
45 processIncomingHttpHeaders(messageContext, message);
46 processIncomingSoapHeaders(messageContext, message);
47 }
48
49
50 public static void processUserDefinedOutgoingHeaders(
51 Map<String, Object> messageContext,
52 Message message,
53 boolean isRequest)
54 {
55 processUserDefinedOutgoingHttpHeaders(messageContext, message, isRequest);
56 processUserDefinedOutgoingSoapHeaders(messageContext, message, isRequest);
57 }
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 @SuppressWarnings("unchecked")
82 public static <T> T getHeaders(
83 Map<String, Object> messageContext,
84 String key,
85 boolean useInputMessage,
86 boolean needCreateWhenNotExist,
87 Supplier<T> defaultValueFactory)
88 {
89 WrappedMessageContext wrappedContext = (WrappedMessageContext) messageContext;
90 Map<String, Object> headersContainer = useInputMessage
91 ? wrappedContext.getWrappedMap()
92 : wrappedContext.getWrappedMessage().getExchange().getOutMessage();
93
94 T headers = (T) headersContainer.get(key);
95 if ((headers == null) && needCreateWhenNotExist) {
96 headers = defaultValueFactory.get();
97 headersContainer.put(key, headers);
98 }
99 return headers;
100 }
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 private static void processIncomingSoapHeaders(
116 Map<String, Object> messageContext,
117 Message message)
118 {
119 HashMap<QName, Header> userHeaders = new HashMap<>();
120 List<Header> soapHeaders = getHeaders(
121 messageContext, Header.HEADER_LIST, true, false, null);
122 if (soapHeaders != null) {
123 for (Header soapHeader : soapHeaders) {
124 userHeaders.put(soapHeader.getName(), soapHeader);
125 }
126 }
127 message.setHeader(AbstractWsEndpoint.INCOMING_SOAP_HEADERS, userHeaders);
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147 @SuppressWarnings("unchecked")
148 private static void processUserDefinedOutgoingSoapHeaders(
149 Map<String, Object> messageContext,
150 Message message,
151 boolean isRequest)
152 {
153 Collection<Header> userHeaders = null;
154 Object o = message.getHeader(AbstractWsEndpoint.OUTGOING_SOAP_HEADERS);
155 if (o instanceof Collection) {
156 userHeaders = (Collection<Header>) o;
157 } else if (o instanceof Map) {
158 userHeaders = ((Map<QName, Header>) o).values();
159 }
160
161 if ((userHeaders != null) && ! userHeaders.isEmpty()) {
162 List<Header> soapHeaders = getHeaders(
163 messageContext, Header.HEADER_LIST, isRequest, true, ArrayList::new);
164 soapHeaders.addAll(userHeaders);
165 }
166 }
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 private static void processIncomingHttpHeaders(
182 Map<String, Object> messageContext,
183 Message message)
184 {
185 Map<String, String> userHeaders = new HashMap<>();
186 Map<String, List<String>> httpHeaders = getHeaders(
187 messageContext, PROTOCOL_HEADERS, true, false, null);
188 if (httpHeaders != null) {
189 for (Map.Entry<String, List<String>> entry : httpHeaders.entrySet()) {
190 userHeaders.put(entry.getKey(), entry.getValue().get(0));
191 }
192 }
193 message.setHeader(AbstractWsEndpoint.INCOMING_HTTP_HEADERS, userHeaders);
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213 private static void processUserDefinedOutgoingHttpHeaders(
214 Map<String, Object> messageContext,
215 Message message,
216 boolean isRequest)
217 {
218 Map<String, String> headers = CastUtils.cast(
219 message.getHeader(AbstractWsEndpoint.OUTGOING_HTTP_HEADERS, Map.class));
220
221 if ((headers != null) && ! headers.isEmpty()) {
222 Map<String, List<String>> httpHeaders = getHeaders(
223 messageContext, PROTOCOL_HEADERS, isRequest, true, HashMap::new);
224 for (Map.Entry<String, String> entry : headers.entrySet()) {
225 httpHeaders.put(entry.getKey(), Collections.singletonList(entry.getValue()));
226 }
227 }
228 }
229 }