diff --git a/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java b/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java index 128572c2280597bcb86f5d286b65e77a580aeffb..5b75ad22618d0e6f2082ac6e237ebd0ca1452879 100644 --- a/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java +++ b/solidify-client/src/main/java/ch/unige/solidify/service/NoSqlResourceClientService.java @@ -68,7 +68,12 @@ public abstract class NoSqlResourceClientService<T extends NoSqlResource> extend protected void downloadWithToken(String urlString, Path path) { final String url = this.getBaseUrl() + urlString; - this.restClientTool.downloadContent(URI.create(url), path, TokenUsage.WITH_TOKEN); + this.restClientTool.downloadContent(URI.create(url), path, TokenUsage.WITH_TOKEN, false); + } + + protected void downloadContentToDirectory(String urlString, Path path) { + final String url = this.getBaseUrl() + urlString; + this.restClientTool.downloadContent(URI.create(url), path, TokenUsage.WITH_TOKEN, true); } protected String getResources(String url, Map<String, String> params) { diff --git a/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java b/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java index 97d3142afea23191b40e9ac8cbe4329e7d6c86a5..850382c361c1446fc4f5d774fa7927df27724c52 100644 --- a/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java +++ b/solidify-rest-client/src/main/java/ch/unige/solidify/util/AbstractRestClientTool.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.text.ParseException; import java.util.Arrays; @@ -73,7 +74,16 @@ public abstract class AbstractRestClientTool { } public void downloadContent(URI uri, Path path, TokenUsage tokenUsage) { - final ResponseExtractor<Void> responseExtractor = this.buildExtractor(uri, path); + this.downloadContent(uri, path, tokenUsage, false); + } + + public void downloadContent(URI uri, Path path, TokenUsage tokenUsage, boolean downloadToDirectory) { + ResponseExtractor<Void> responseExtractor; + if (downloadToDirectory) { + responseExtractor = this.buildExtractorToDirectory(uri, path); + } else { + responseExtractor = this.buildExtractor(uri, path); + } final RequestCallback requestCallback = request -> request.getHeaders() .setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL)); final RestTemplate restTemplate; @@ -87,18 +97,46 @@ public abstract class AbstractRestClientTool { restTemplate.execute(uri, HttpMethod.GET, requestCallback, responseExtractor); } - private ResponseExtractor<Void> buildExtractor(URI uri, Path path) { + private ResponseExtractor<Void> buildExtractor(URI uri, Path filePath) { + return response -> { + final byte[] data = new byte[SolidifyConstants.BUFFER_SIZE]; + try (final InputStream inputStream = response.getBody(); + final FileOutputStream fileOutputStream = new FileOutputStream(filePath.toFile()); + final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, SolidifyConstants.BUFFER_SIZE)) { + int nRead; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + bufferedOutputStream.write(data, 0, nRead); + } + } catch (final IOException e) { + throw new SolidifyRuntimeException("Error downloading " + uri.toString() + " to " + filePath.toString(), e); + } + return null; + }; + } + + + private ResponseExtractor<Void> buildExtractorToDirectory(URI uri, Path directoryPath) { return response -> { final byte[] data = new byte[SolidifyConstants.BUFFER_SIZE]; + String disposition = response.getHeaders().getFirst("Content-Disposition"); + // Check if the provided path is a directory or a filename + Path fullPath; + if (!StringTool.isNullOrEmpty(disposition) && Files.isDirectory(directoryPath)) { + String filename = disposition.replaceFirst("(?i)^.*filename=\"([^\"]*)\".*$", "$1"); + fullPath = directoryPath.resolve(filename); + } else { + fullPath = directoryPath; + } + try (final InputStream inputStream = response.getBody(); - final FileOutputStream fileOutputStream = new FileOutputStream(path.toFile()); - final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, SolidifyConstants.BUFFER_SIZE)) { + final FileOutputStream fileOutputStream = new FileOutputStream(fullPath.toFile()); + final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, SolidifyConstants.BUFFER_SIZE)) { int nRead; while ((nRead = inputStream.read(data, 0, data.length)) != -1) { bufferedOutputStream.write(data, 0, nRead); } } catch (final IOException e) { - throw new SolidifyRuntimeException("Error downloading " + uri.toString() + " to " + path.toString(), e); + throw new SolidifyRuntimeException("Error downloading " + uri.toString() + " to " + fullPath.toString(), e); } return null; };