Skip to content

v0.2.48..v0.2.49 changeset ExportResource.java

Garret Voltz edited this page Oct 2, 2019 · 1 revision
diff --git a/hoot-services/src/main/java/hoot/services/controllers/export/ExportResource.java b/hoot-services/src/main/java/hoot/services/controllers/export/ExportResource.java
index 4475aa7..ac20be6 100644
--- a/hoot-services/src/main/java/hoot/services/controllers/export/ExportResource.java
+++ b/hoot-services/src/main/java/hoot/services/controllers/export/ExportResource.java
@@ -32,11 +32,14 @@ import static hoot.services.HootProperties.TRANSLATION_EXT_PATH;
 import static hoot.services.models.db.QMaps.maps;
 
 import java.io.File;
+import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.Stack;
 import java.util.UUID;
 
 import javax.servlet.http.HttpServletRequest;
@@ -134,8 +137,9 @@ public class ExportResource {
     @Path("/execute")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response export(ExportParams params, @Context HttpServletRequest request,
-                           @QueryParam("DEBUG_LEVEL") @DefaultValue("info") String debugLevel) {
+    public Response export(ExportParams params,
+            @Context HttpServletRequest request,
+            @QueryParam("DEBUG_LEVEL") @DefaultValue("info") String debugLevel) {
         Users user = Users.fromRequest(request);
         params.setUserEmail(user.getEmail());
         String jobId = "ex_" + UUID.randomUUID().toString().replace("-", "");
@@ -152,16 +156,37 @@ public class ExportResource {
             List<Command> workflow = new LinkedList<>();
 
             if (inputType.equalsIgnoreCase("folder")) {
-                Long folder_id = Long.parseLong(params.getInput());
                 params.setInputType("db"); // make folder input really a db input...
-
-                for (Tuple mapInfo: FolderResource.getFolderMaps(user, folder_id)) { // get all maps in folder...
-                    params.setInput(Long.toString(mapInfo.get(maps.id)));
-                    params.setOutputName(mapInfo.get(maps.displayName));
-                    workflow.add(getCommand(user, jobId, params, debugLevel));
+                Long rootfolder = Long.parseLong(params.getInput());
+
+                // create stack with the folder id and output path as values starting with main export folder
+                // Having the output path is helpful for making the child directories since you can just take parent path
+                // and append child directory name to it
+                Stack<Map.Entry<Long, String>> folderList = new Stack<Map.Entry<Long, String>>(){{
+                    push(new AbstractMap.SimpleEntry(rootfolder, workDir.getPath()));
+                }};
+
+                while(!folderList.empty()) {
+                    Map.Entry<Long, String> currentFolder = folderList.pop();
+                    Long currentId = currentFolder.getKey();
+
+                    // get all maps in folder...
+                    for (Tuple mapInfo: FolderResource.getFolderMaps(user, currentId)) {
+                        params.setInput(Long.toString(mapInfo.get(maps.id)));
+                        params.setOutputName(mapInfo.get(maps.displayName));
+                        params.setOutputPath(currentFolder.getValue());
+                        workflow.add(getCommand(user, jobId, params, debugLevel));
+                    }
+
+                    // get all children folders
+                    for (long folderId : DbUtils.getChildrenFolders(currentId)) {
+                        File childDir = new File(currentFolder.getValue(), FolderResource.getFolderName(folderId));
+                        FileUtils.forceMkdir(childDir);
+                        folderList.push(new AbstractMap.SimpleEntry(folderId, childDir.getPath()));
+                    }
                 }
 
-                Command zipCommand = getZIPCommand(workDir, FolderResource.getFolderName(folder_id));
+                Command zipCommand = getZIPCommand(workDir, FolderResource.getFolderName(rootfolder));
                 workflow.add(zipCommand);
                 params.setInputType("folder");
 
Clone this wiki locally