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");