1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.commons.ihe.ws.cxf.audit;
17
18 import org.openehealth.ipf.commons.audit.AuditContext;
19 import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator;
20 import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategy;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23 import org.apache.cxf.binding.soap.SoapMessage;
24 import org.apache.cxf.headers.Header;
25 import org.apache.cxf.interceptor.ServiceInvokerInterceptor;
26 import org.apache.cxf.message.Exchange;
27 import org.apache.cxf.message.MessageUtils;
28 import org.apache.cxf.phase.Phase;
29 import org.apache.cxf.ws.addressing.VersionTransformer;
30 import org.openehealth.ipf.commons.ihe.ws.correlation.AsynchronyCorrelator;
31 import org.openehealth.ipf.commons.ihe.ws.cxf.payload.InPayloadInjectorInterceptor;
32 import org.w3c.dom.Element;
33
34
35
36
37
38
39
40
41
42 public class AuditResponseInterceptor<T extends WsAuditDataset> extends AbstractAuditInterceptor<T> {
43 private static final transient Logger LOG = LoggerFactory.getLogger(AuditResponseInterceptor.class);
44
45 private final AsynchronyCorrelator<T> correlator;
46 private final boolean asyncReceiver;
47 private final boolean serverSide;
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 public AuditResponseInterceptor(
65 AuditStrategy<T> auditStrategy,
66 AuditContext auditContext,
67 boolean serverSide,
68 AsynchronyCorrelator<T> correlator,
69 boolean asyncReceiver)
70 {
71 super(isClient(asyncReceiver, serverSide) ? Phase.INVOKE : Phase.PREPARE_SEND, auditStrategy, auditContext);
72 if (isClient(asyncReceiver, serverSide)) {
73 addAfter(InPayloadInjectorInterceptor.class.getName());
74 addBefore(ServiceInvokerInterceptor.class.getName());
75 }
76 this.correlator = correlator;
77 this.serverSide = serverSide;
78 this.asyncReceiver = asyncReceiver;
79 }
80
81
82
83
84
85
86
87 private static boolean isClient(boolean asyncReceiver, boolean serverSide) {
88 return (asyncReceiver || (! serverSide));
89 }
90
91
92 @Override
93 protected void process(SoapMessage message) {
94 if (isGET(message)) {
95 return;
96 }
97
98
99 if (MessageUtils.isPartialResponse(message)) {
100 return;
101 }
102
103
104 Object response = extractPojo(message);
105 AuditStrategy<T> auditStrategy = getAuditStrategy();
106 if (! auditStrategy.isAuditableResponse(response)) {
107 return;
108 }
109
110 T auditDataset = null;
111
112
113
114
115
116 if (asyncReceiver) {
117 String messageId = null;
118 for (Header header : message.getHeaders()) {
119 if ("RelatesTo".equals(header.getName().getLocalPart())
120 && VersionTransformer.isSupported(header.getName().getNamespaceURI()))
121 {
122 messageId = ((Element) header.getObject()).getTextContent();
123 break;
124 }
125 }
126 if (messageId != null) {
127 auditDataset = correlator.getAuditDataset(messageId);
128
129 } else {
130 LOG.error("Cannot determine WSA message ID");
131 }
132 }
133 if (auditDataset == null) {
134 auditDataset = getAuditDataset(message);
135 }
136
137
138 extractUserIdFromWSAddressing(
139 message,
140 isClient(asyncReceiver, serverSide),
141 serverSide,
142 auditDataset);
143
144
145
146 Exchange exchange = message.getExchange();
147 if ((message == exchange.getInFaultMessage())
148 || (message == exchange.getOutFaultMessage())
149 || (response == null))
150 {
151 auditDataset.setEventOutcomeIndicator(EventOutcomeIndicator.SeriousFailure);
152 } else {
153 auditStrategy.enrichAuditDatasetFromResponse(auditDataset, response, getAuditContext());
154 }
155
156
157 auditStrategy.doAudit(getAuditContext(), auditDataset);
158 }
159
160 }