annotate Samples/MammographyDeepLearning/src/main/java/OrthancConnection.java @ 43:678bbed285a1 default tip

improved import of JNI in cmake
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 06 Sep 2024 13:53:54 +0200
parents 43923934e934
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * SPDX-License-Identifier: GPL-3.0-or-later
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 **/
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /**
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Java plugin for Orthanc
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * Copyright (C) 2023-2024 Sebastien Jodogne, UCLouvain, Belgium
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * This program is free software: you can redistribute it and/or
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * modify it under the terms of the GNU General Public License as
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * published by the Free Software Foundation, either version 3 of the
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * License, or (at your option) any later version.
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 *
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful, but
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * General Public License for more details.
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 *
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 **/
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 import org.json.JSONObject;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 import javax.imageio.ImageIO;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 import java.awt.image.BufferedImage;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 import java.io.ByteArrayInputStream;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 import java.io.FileNotFoundException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 import java.io.FileOutputStream;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 import java.io.IOException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 import java.math.BigInteger;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 import java.net.URI;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 import java.net.http.HttpClient;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 import java.net.http.HttpRequest;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 import java.net.http.HttpResponse;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 import java.nio.charset.StandardCharsets;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 import java.nio.file.Files;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 import java.nio.file.Paths;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 import java.security.MessageDigest;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 import java.security.NoSuchAlgorithmException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 import java.util.Optional;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 import java.util.OptionalLong;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 import java.util.concurrent.ExecutorService;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 import java.util.function.Consumer;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 public abstract class OrthancConnection {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 private static final String PIXEL_REPRESENTATION = "0028,0103";
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 private static final String BITS_STORED = "0028,0101";
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 private static final String SAMPLES_PER_PIXEL = "0028,0002";
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 public static OrthancConnection createHttpClient(ExecutorService executor,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 String baseUrl) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 return new OrthancConnection() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 private HttpClient client = HttpClient.newBuilder().executor(executor).build();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 public byte[] doGetAsByteArray(String uri) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 HttpRequest request = HttpRequest.newBuilder()
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 .uri(URI.create(baseUrl + uri))
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 .build();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 if (response.statusCode() != 200) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 throw new RuntimeException();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 return response.body();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 public byte[] doPostAsByteArray(String uri, byte[] body) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 HttpRequest request = HttpRequest.newBuilder()
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 .uri(URI.create(baseUrl + uri))
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 .POST(HttpRequest.BodyPublishers.ofByteArray(body))
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 .build();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 if (response.statusCode() != 200) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 throw new RuntimeException();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 return response.body();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 };
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 public static OrthancConnection createForPlugin() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 return new OrthancConnection() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 public byte[] doGetAsByteArray(String uri) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 return be.uclouvain.orthanc.Functions.restApiGet(uri);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 public byte[] doPostAsByteArray(String uri, byte[] body) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 return be.uclouvain.orthanc.Functions.restApiPost(uri, body);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 };
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 public abstract byte[] doGetAsByteArray(String uri) throws IOException, InterruptedException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 public abstract byte[] doPostAsByteArray(String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 byte[] body) throws IOException, InterruptedException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 public String doGetAsString(String uri) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 return new String(doGetAsByteArray(uri), StandardCharsets.UTF_8);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 public JSONObject doGetAsJsonObject(String uri) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 return new JSONObject(doGetAsString(uri));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 public String doPostAsString(String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 String body) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 byte[] answer = doPostAsByteArray(uri, body.getBytes(StandardCharsets.UTF_8));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 return new String(answer, StandardCharsets.UTF_8);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 public JSONObject doPostAsJsonObject(String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 String body) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 return new JSONObject(doPostAsString(uri, body));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 public BufferedImage getGrayscaleFrame(String instance,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 int frame) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 if (frame < 0) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 throw new IllegalArgumentException();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 JSONObject tags = doGetAsJsonObject("/instances/" + instance + "/tags?short");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 if (!tags.has(PIXEL_REPRESENTATION) ||
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 tags.getInt(PIXEL_REPRESENTATION) == 1) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 throw new IllegalArgumentException("Negative pixels not supported");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 if (!tags.has(BITS_STORED) ||
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 (tags.getInt(BITS_STORED) != 8 &&
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 tags.getInt(BITS_STORED) != 16)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 throw new IllegalArgumentException("Pixel depth not supported");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 if (!tags.has(SAMPLES_PER_PIXEL) ||
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 tags.getInt(SAMPLES_PER_PIXEL) != 1) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 throw new IllegalArgumentException("Color images not implemented");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 byte[] png = doGetAsByteArray("/instances/" + instance + "/frames/" + frame + "/image-uint16");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 try (ByteArrayInputStream stream = new ByteArrayInputStream(png)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 return ImageIO.read(stream);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 boolean isOrthancVersionAbove(int major,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 int minor,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 int revision) throws IOException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 JSONObject system = doGetAsJsonObject("/system");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 String version = system.getString("Version");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 if (version == null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 throw new RuntimeException("Not an Orthanc server");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 if (version.equals("mainline")) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 return true;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 String[] items = version.split("\\.");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 if (items.length != 3) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 throw new RuntimeException("Cannot parse Orthanc version: " + version);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 int thisMajor = Integer.valueOf(items[0]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 int thisMinor = Integer.valueOf(items[1]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 int thisRevision = Integer.valueOf(items[2]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 return (thisMajor > major ||
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 (thisMajor == major && thisMinor > minor) ||
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 (thisMajor == major && thisMinor == minor && thisRevision >= revision));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 public static void download(String targetPath,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 ExecutorService executor,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 String url,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 long expectedSize,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 String expectedMd5) throws IOException, NoSuchAlgorithmException, InterruptedException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 class FileDownloader implements HttpResponse.BodyHandler<Void>, Consumer<Optional<byte[]>> {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 private FileOutputStream target;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 private String url;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 private boolean success;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 private long contentLength;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 private long size;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 public FileDownloader(final FileOutputStream target,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 final String url) throws FileNotFoundException {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 this.target = target;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 this.success = false;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 public HttpResponse.BodySubscriber<Void> apply(final HttpResponse.ResponseInfo responseInfo) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 if (responseInfo.statusCode() != 200) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 throw new RuntimeException("URL does not exist: " + url);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 final OptionalLong contentLength = responseInfo.headers().firstValueAsLong("Content-Length");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 if (contentLength.isEmpty()) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 throw new RuntimeException("Server does not provide a content length: " + url);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 this.contentLength = contentLength.getAsLong();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 return HttpResponse.BodySubscribers.ofByteArrayConsumer(this);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 public void accept(final Optional<byte[]> bytes) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 if (bytes.isEmpty()) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 System.out.println();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 System.out.flush();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 if (this.success) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 throw new IllegalStateException("File already closed");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 if (this.size != this.contentLength) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 throw new RuntimeException("Server has not answered with the proper content length");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 this.success = true;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 this.target.write(bytes.get());
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 System.out.println();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 throw new RuntimeException("Cannot write to file");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 this.size += bytes.get().length;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 final int BAR_WIDTH = 30;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 final int a = Math.min(30, Math.round(this.size / (float) this.contentLength * 30.0f));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 System.out.print("\r Progress: [" + "=".repeat(a) + " ".repeat(30 - a) + "]");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 System.out.flush();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 boolean isSuccess() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 return this.success;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 System.out.println("Downloading: " + url);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251 if (Files.exists(Paths.get(targetPath))) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 System.out.println(" File already downloaded");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 FileOutputStream target = new FileOutputStream(targetPath);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 HttpClient client = HttpClient.newBuilder().executor(executor).followRedirects(HttpClient.Redirect.NORMAL).build();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 FileDownloader consumer = new FileDownloader(target, url);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 HttpResponse<Void> response = client.send(request, (HttpResponse.BodyHandler<Void>) consumer);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 target.close();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 if (!consumer.isSuccess()) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 throw new IOException("Could not download: " + url);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 byte[] content = Files.readAllBytes(Paths.get(targetPath));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 MessageDigest md = MessageDigest.getInstance("MD5");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 md.update(content);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 final String actualMd5 = new BigInteger(1, md.digest()).toString(16);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272 if (content.length != expectedSize ||
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273 !actualMd5.equals(expectedMd5)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274 throw new IOException("Incorrect content in a download file, please remove it and retry: " + targetPath);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
275 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
276 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
277 }