From f96713c51be0c9d1cdaa59e6d4304982d7cf44ea Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 16 Dec 2018 23:35:46 +0000
Subject: [PATCH] ...

---
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ArchivesRest.java |   64 +++++++++++++++++++++++++++++--
 1 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ArchivesRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ArchivesRest.java
index 04e69dd..e275c89 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ArchivesRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ArchivesRest.java
@@ -1,11 +1,18 @@
 package de.micromata.borgbutler.server.rest;
 
+import de.micromata.borgbutler.BorgCommands;
 import de.micromata.borgbutler.cache.ButlerCache;
+import de.micromata.borgbutler.config.BorgRepoConfig;
+import de.micromata.borgbutler.config.ConfigurationHandler;
 import de.micromata.borgbutler.data.Archive;
 import de.micromata.borgbutler.data.FileSystemFilter;
 import de.micromata.borgbutler.data.Repository;
 import de.micromata.borgbutler.json.JsonUtils;
 import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
+import de.micromata.borgbutler.utils.DirUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -16,6 +23,8 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.io.File;
+import java.io.IOException;
 import java.util.List;
 
 @Path("/archives")
@@ -77,14 +86,59 @@
      * {@link #getArchiveFileLIst(String, String, String, boolean, boolean)}
      */
     public Response downloadFilebyPath(@QueryParam("archiveId") String archiveId, @QueryParam("fileNumber") int fileNumber) {
-        log.info("Downloading file #" + fileNumber + " of archive '" + archiveId + "'.");
-        return null;
-/*        byte[] byteArray = result.getAsByteArrayOutputStream().toByteArray();
+        log.info("Requesting file #" + fileNumber + " of archive '" + archiveId + "'.");
+        FileSystemFilter filter = new FileSystemFilter().setFileNumber(fileNumber);
+        List<BorgFilesystemItem> items = ButlerCache.getInstance().getArchiveContent(archiveId, false,
+                filter);
+        if (CollectionUtils.isEmpty(items)) {
+            log.error("Requested file #" + fileNumber + " not found in archive '" + archiveId
+                    + ". (May-be the archive content isn't yet loaded to the cache.");
+            Response.ResponseBuilder builder = Response.status(404);
+            return builder.build();
+        }
+        if (items.size() != 1) {
+            log.error("Requested file #" + fileNumber + " found multiple times (" + items.size() + ") in archive '" + archiveId
+                    + "! Please remove the archive files (may-be corrupted).");
+            Response.ResponseBuilder builder = Response.status(404);
+            return builder.build();
+        }
+        BorgFilesystemItem item = items.get(0);
+        Archive archive = ButlerCache.getInstance().getArchive(archiveId);
+        if (archive == null) {
+            Response.ResponseBuilder builder = Response.status(404);
+            return builder.build();
+        }
+        BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(archive.getRepoId());
+        java.nio.file.Path path = null;
+        try {
+            java.nio.file.Path directory = BorgCommands.extractFiles(repoConfig, archive.getName(), item.getPath());
+            List<java.nio.file.Path> files = DirUtils.listFiles(directory);
+            if (CollectionUtils.isEmpty(files)) {
+                log.error("No file extracted.");
+                Response.ResponseBuilder builder = Response.status(404);
+                return builder.build();
+            }
+            path = files.get(0);
+        } catch (IOException ex) {
+            log.error("No file extracted: " + ex.getMessage(), ex);
+            Response.ResponseBuilder builder = Response.status(404);
+            return builder.build();
+        }
+        // ButlerCache.getInstance().getArchiveContent()
+        File file = path.toFile();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            FileUtils.copyFile(file, baos);
+        } catch (IOException ex) {
+            log.error(ex.getMessage(), ex);
+        }
+        file = new File(item.getPath());
+        byte[] byteArray = baos.toByteArray();//result.getAsByteArrayOutputStream().toByteArray();
         Response.ResponseBuilder builder = Response.ok(byteArray);
-        builder.header("Content-Disposition", "attachment; filename=" + filename);
+        builder.header("Content-Disposition", "attachment; filename=" + file.getName());
         // Needed to get the Content-Disposition by client:
         builder.header("Access-Control-Expose-Headers", "Content-Disposition");
         Response response = builder.build();
-        return response;*/
+        return response;
     }
 }

--
Gitblit v1.10.0