1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  package org.openehealth.ipf.commons.ihe.fhir.audit.events;
18  
19  import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
20  import org.openehealth.ipf.commons.audit.AuditContext;
21  import org.openehealth.ipf.commons.audit.codes.EventActionCode;
22  import org.openehealth.ipf.commons.audit.codes.ParticipantObjectIdTypeCode;
23  import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCode;
24  import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCodeRole;
25  import org.openehealth.ipf.commons.audit.event.CustomAuditMessageBuilder;
26  import org.openehealth.ipf.commons.ihe.core.atna.event.IHEAuditMessageBuilder;
27  import org.openehealth.ipf.commons.ihe.fhir.audit.GenericFhirAuditDataset;
28  import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventIdCode;
29  import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode;
30  import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirParticipantObjectIdTypeCode;
31  
32  import java.nio.charset.StandardCharsets;
33  import java.util.Base64;
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  public class GenericFhirAuditMessageBuilder extends
51          IHEAuditMessageBuilder<GenericFhirAuditMessageBuilder, CustomAuditMessageBuilder> {
52  
53      public GenericFhirAuditMessageBuilder(AuditContext auditContext, GenericFhirAuditDataset auditDataset) {
54          super(auditContext, new CustomAuditMessageBuilder(
55                  auditDataset.getEventOutcomeIndicator(),
56                  auditDataset.getEventOutcomeDescription(),
57                  eventActionCode(auditDataset.getOperation()),
58                  FhirEventIdCode.RestfulOperation,
59                  FhirEventTypeCode.fromRestOperationType(auditDataset.getOperation())
60          ));
61  
62          
63          if (auditDataset.isServerSide()) {
64              setRemoteParticipant(auditDataset);
65              addHumanRequestor(auditDataset);
66              setLocalParticipant(auditDataset);
67          } else {
68              setLocalParticipant(auditDataset);
69              addHumanRequestor(auditDataset);
70              setRemoteParticipant(auditDataset);
71          }
72      }
73  
74      public GenericFhirAuditMessageBuilder addPatients(GenericFhirAuditDataset auditDataset) {
75          auditDataset.getPatientIds().forEach(patientId ->
76                  delegate.addParticipantObjectIdentification(
77                          ParticipantObjectIdTypeCode.PatientNumber,
78                          null,
79                          null,
80                          null,
81                          patientId,
82                          ParticipantObjectTypeCode.Person,
83                          ParticipantObjectTypeCodeRole.Patient,
84                          null,
85                          null));
86          return self();
87      }
88  
89      
90  
91  
92  
93      public GenericFhirAuditMessageBuilder addQueryParticipantObject(GenericFhirAuditDataset auditDataset) {
94          delegate.addParticipantObjectIdentification(
95                  FhirParticipantObjectIdTypeCode.fromResourceType(auditDataset.getAffectedResourceType()),
96                  auditDataset.getAffectedResourceType(),
97                  Base64.getEncoder().encode(auditDataset.getQueryString().getBytes(StandardCharsets.UTF_8)),
98                  null,
99                  "FHIR Restful Query",
100                 ParticipantObjectTypeCode.System,
101                 ParticipantObjectTypeCodeRole.Query,
102                 null,
103                 null);
104 
105         return self();
106     }
107 
108     
109 
110 
111 
112     public GenericFhirAuditMessageBuilder addResourceParticipantObject(GenericFhirAuditDataset auditDataset) {
113         delegate.addParticipantObjectIdentification(
114                 FhirParticipantObjectIdTypeCode.fromResourceType(
115                         auditDataset.getResourceId().getResourceType()),
116                 null,
117                 null,
118                 null,
119                 auditDataset.getResourceId().getValue(),
120                 ParticipantObjectTypeCode.System,
121                 ParticipantObjectTypeCodeRole.Job,
122                 null,
123                 auditDataset.getSecurityLabel());
124         return self();
125     }
126 
127 
128     private static EventActionCode eventActionCode(RestOperationTypeEnum operation) {
129         switch (operation) {
130             case CREATE:
131                 return EventActionCode.Create;
132             case READ:
133             case VREAD:
134                 return EventActionCode.Read;
135             case UPDATE:
136             case PATCH:
137                 return EventActionCode.Update;
138             case DELETE:
139                 return EventActionCode.Delete;
140             default:
141                 return EventActionCode.Execute;
142         }
143     }
144 }