annotate Samples/FHIR/src/main/java/OrthancResource.java @ 11:8d876a4f541b

added sample FHIR server
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sat, 21 Oct 2023 09:53:25 +0200
parents
children 0dc05fe76bd5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SPDX-FileCopyrightText: 2023 Sebastien Jodogne, UCLouvain, Belgium
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * SPDX-License-Identifier: GPL-3.0-or-later
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 */
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /**
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Java plugin for Orthanc
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * Copyright (C) 2023 Sebastien Jodogne, UCLouvain, Belgium
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * This program is free software: you can redistribute it and/or
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * modify it under the terms of the GNU General Public License as
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * published by the Free Software Foundation, either version 3 of the
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * License, or (at your option) any later version.
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 *
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful, but
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * General Public License for more details.
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 *
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 **/
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 import be.uclouvain.orthanc.ResourceType;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 import org.hl7.fhir.r5.model.*;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 import org.json.JSONArray;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 import org.json.JSONObject;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 import java.nio.charset.StandardCharsets;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 import java.util.ArrayList;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 import java.util.HashMap;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 import java.util.List;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 import java.util.Map;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 public class OrthancResource {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 private ResourceType type;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 private String id;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 private String lastUpdate;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 private Map<String, String> tags;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 private List<String> children;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 public OrthancResource(JSONObject info) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 String s = info.getString("Type");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 if (s.equals("Patient")) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 type = ResourceType.PATIENT;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 } else if (s.equals("Study")) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 type = ResourceType.STUDY;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 } else if (s.equals("Series")) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 type = ResourceType.SERIES;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 } else if (s.equals("Instance")) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 type = ResourceType.INSTANCE;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 } else {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 throw new RuntimeException("Unknown resource type");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 id = info.getString("ID");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 lastUpdate = info.optString("LastUpdate");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 tags = new HashMap<>();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 addToDictionary(tags, info.getJSONObject("MainDicomTags"));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 if (type != ResourceType.INSTANCE) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 String childKey;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 switch (type) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 case PATIENT:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 childKey = "Studies";
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 case STUDY:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 childKey = "Series";
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 addToDictionary(tags, info.getJSONObject("PatientMainDicomTags"));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 case SERIES:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 childKey = "Instances";
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 default:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 throw new RuntimeException();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 children = new ArrayList<>();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 addToListOfStrings(children, info.getJSONArray(childKey));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 static public void addToDictionary(Map<String, String> target,
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 JSONObject source) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 for (String key : source.keySet()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 target.put(key, source.getString(key));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 static public void addToListOfStrings(List<String> target,
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 JSONArray source) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 for (int i = 0; i < source.length(); i++) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 target.add(source.getString(i));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 public ResourceType getType() {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 return type;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 public String getId() {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 return id;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 public String getLastUpdate() {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 return lastUpdate;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 public Map<String, String> getTags() {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 return tags;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 public List<String> getChildren() {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 if (type == ResourceType.INSTANCE) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 throw new RuntimeException("A DICOM instance has no child");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 } else {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 return children;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 public static List<OrthancResource> find(IOrthancConnection connection,
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 ResourceType type,
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 Map<String, String> tags,
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 boolean caseSensitive) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 JSONObject query = new JSONObject();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 for (Map.Entry<String, String> entry : tags.entrySet()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 query.put(entry.getKey(), entry.getValue());
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 JSONObject request = new JSONObject();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 request.put("Expand", true);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 request.put("Query", query);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 request.put("Short", true);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 request.put("CaseSensitive", caseSensitive);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 switch (type) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 case PATIENT:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 request.put("Level", "Patient");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 case STUDY:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 request.put("Level", "Study");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 case SERIES:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 request.put("Level", "Series");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 case INSTANCE:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 request.put("Level", "Instance");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 break;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 default:
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 throw new RuntimeException();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 byte[] response = connection.doPost("/tools/find", request.toString().getBytes(StandardCharsets.UTF_8));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 JSONArray arr = new JSONArray(new String(response, StandardCharsets.UTF_8));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 List<OrthancResource> result = new ArrayList<>();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 for (int i = 0; i < arr.length(); i++) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 result.add(new OrthancResource(arr.getJSONObject(i)));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 return result;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 public Patient getFhirPatient() {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 if (type != ResourceType.PATIENT) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 throw new RuntimeException("Not a patient");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 Patient patient = new Patient();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 patient.setId(getTags().getOrDefault(Toolbox.TAG_PATIENT_ID, ""));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 String birthDate = getTags().getOrDefault(Toolbox.TAG_PATIENT_BIRTH_DATE, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 if (birthDate != null) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 patient.setBirthDate(Toolbox.parseDicomDate(birthDate));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 String patientName = getTags().getOrDefault(Toolbox.TAG_PATIENT_NAME, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 if (!patientName.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 patient.addName();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 HumanName name = patient.getName().get(0);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 String[] parts = patientName.split("\\^");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 // https://dicom.nema.org/medical/dicom/current/output/chtml/part19/sect_10.2.html
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 // https://www.hl7.org/fhir/datatypes.html#HumanName
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 if (parts.length > 0) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 name.setFamily(parts[0]);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 for (int i = 1; i < parts.length; i++) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 name.addGiven(parts[i]);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 String sex = getTags().getOrDefault(Toolbox.TAG_PATIENT_SEX, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 if (sex.equals("M")) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 patient.setGender(Enumerations.AdministrativeGender.MALE);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 } else if (sex.equals("F")) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 patient.setGender(Enumerations.AdministrativeGender.FEMALE);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 return patient;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 public ImagingStudy getFhirStudy(IOrthancConnection orthanc) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 if (type != ResourceType.STUDY) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 throw new RuntimeException("Not a study");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 boolean hasDicomWeb = IOrthancConnection.hasPluginInstalled(orthanc, "dicom-web");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 // https://build.fhir.org/imagingstudy-example.json.html
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 ImagingStudy study = new ImagingStudy();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 study.setId(getTags().getOrDefault(Toolbox.TAG_STUDY_INSTANCE_UID, ""));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 study.setStatus(ImagingStudy.ImagingStudyStatus.AVAILABLE);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 if (hasDicomWeb) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 study.addEndpoint(Toolbox.createLocalReference("Endpoint", EndpointProvider.ID));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 study.setSubject(Toolbox.createLocalReference("Patient", getTags().getOrDefault(Toolbox.TAG_PATIENT_ID, "")));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 String studyDate = getTags().getOrDefault(Toolbox.TAG_STUDY_DATE, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 if (!studyDate.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 study.setStarted(Toolbox.parseDicomDate(studyDate));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 study.addIdentifier();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 study.getIdentifier().get(0).setSystem("urn:dicom:uid");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 study.getIdentifier().get(0).setValue("urn:oid:" + study.getId());
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 study.setNumberOfSeries(getChildren().size());
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 int countInstances = 0;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 Map<String, String> shortTags = new HashMap<>();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240 shortTags.put("short", "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 Map<String, String> expand = new HashMap<>();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 expand.put("expand", "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 for (int i = 0; i < getChildren().size(); i++) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 String seriesUri = "/series/" + getChildren().get(i);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 OrthancResource orthancSeries = new OrthancResource(IOrthancConnection.getJSONObject(orthanc, seriesUri, shortTags));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 ImagingStudy.ImagingStudySeriesComponent fhirSeries = study.addSeries();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 fhirSeries.setUid(orthancSeries.getTags().getOrDefault(Toolbox.TAG_SERIES_INSTANCE_UID, ""));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 String modality = orthancSeries.getTags().getOrDefault(Toolbox.TAG_MODALITY, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 if (!modality.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 fhirSeries.setModality(Toolbox.createDicomCodeableConcept(modality));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 String seriesDescription = orthancSeries.getTags().getOrDefault(Toolbox.TAG_SERIES_DESCRIPTION, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 if (!seriesDescription.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 fhirSeries.setDescription(seriesDescription);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 String seriesNumber = orthancSeries.getTags().getOrDefault(Toolbox.TAG_SERIES_NUMBER, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 if (!seriesNumber.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 fhirSeries.setNumber(Integer.parseInt(seriesNumber));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 fhirSeries.setNumberOfInstances(orthancSeries.getChildren().size());
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 for (int j = 0; j < orthancSeries.getChildren().size(); j++) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 String instanceUri = "/instances/" + orthancSeries.getChildren().get(j);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 OrthancResource orthancInstance = new OrthancResource(IOrthancConnection.getJSONObject(orthanc, instanceUri, shortTags));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273 JSONObject instanceMetadata = IOrthancConnection.getJSONObject(orthanc, instanceUri + "/metadata", expand);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
275 ImagingStudy.ImagingStudySeriesInstanceComponent fhirInstance = fhirSeries.addInstance();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
276 fhirInstance.setUid(orthancInstance.getTags().getOrDefault(Toolbox.TAG_SOP_INSTANCE_UID, ""));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
277
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
278 String instanceNumber = orthancInstance.getTags().getOrDefault(Toolbox.TAG_INSTANCE_NUMBER, "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
279 if (!instanceNumber.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
280 fhirInstance.setNumber(Integer.parseInt(instanceNumber));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
281 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
282
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
283 String sopClassUid = instanceMetadata.optString("SopClassUid", "");
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
284 if (!sopClassUid.isEmpty()) {
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
285 fhirInstance.setSopClass(new Coding("urn:ietf:rfc:3986", "urn:oid:" + sopClassUid, ""));
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
286 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
287 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
288
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
289 countInstances += orthancSeries.getChildren().size();
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
290 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
291
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
292 study.setNumberOfInstances(countInstances);
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
293
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
294 return study;
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
295 }
8d876a4f541b added sample FHIR server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
296 }