Prepare next development cycle
[gpl/argeo-suite.git] / org.argeo.app.core / src / org / argeo / app / mail / EmailMigration.java
index c5b3083268682fabad204aa23bd253268ecc2712..8c899c2316ccb4dbb18433dc8501ec5b63bd5e35 100644 (file)
@@ -53,6 +53,8 @@ public class EmailMigration {
        private String targetUsername;
        private String targetPassword;
 
+       private boolean targetSupportDualTypeFolders = true;
+
        public void process() throws MessagingException, IOException {
 //             Path baseDir = Paths.get(targetBaseDir).resolve(sourceUsername).resolve("mbox");
 
@@ -94,63 +96,83 @@ public class EmailMigration {
                }
        }
 
-       protected void migrateFolders(Folder sourceFolder, Store targetStore) throws MessagingException, IOException {
-               folders: for (Folder folder : sourceFolder.list()) {
-                       String folderName = folder.getName();
+       protected void migrateFolders(Folder sourceParentFolder, Store targetStore) throws MessagingException, IOException {
+               folders: for (Folder sourceFolder : sourceParentFolder.list()) {
+                       String sourceFolderName = sourceFolder.getName();
 
-                       String folderFullName = folder.getFullName();
+                       String sourceFolderFullName = sourceFolder.getFullName();
+                       char sourceFolderSeparator = sourceParentFolder.getSeparator();
+                       char targetFolderSeparator = targetStore.getDefaultFolder().getSeparator();
+                       String targetFolderFullName = sourceFolderFullName.replace(sourceFolderSeparator, targetFolderSeparator);
 
                        // GMail specific
-                       if (folderFullName.equals("[Gmail]")) {
-                               migrateFolders(folder, targetStore);
+                       if (sourceFolderFullName.equals("[Gmail]")) {
+                               migrateFolders(sourceFolder, targetStore);
                                continue folders;
                        }
-                       if (folderFullName.startsWith("[Gmail]")) {
+                       if (sourceFolderFullName.startsWith("[Gmail]")) {
+                               String subFolderName = null;
                                // Make it configurable
-                               switch (folderName) {
+                               switch (sourceFolderName) {
                                case "All Mail":
                                case "Important":
                                case "Spam":
                                        continue folders;
+                               case "Sent Mail":
+                                       subFolderName = "Sent";
                                default:
                                        // does nothing
                                }
-                               folderFullName = folder.getName();
+                               targetFolderFullName = subFolderName == null ? sourceFolder.getName() : subFolderName;
                        }
 
-                       int messageCount = (folder.getType() & Folder.HOLDS_MESSAGES) != 0 ? folder.getMessageCount() : 0;
-                       boolean hasSubFolders = (folder.getType() & Folder.HOLDS_FOLDERS) != 0 ? folder.list().length != 0 : false;
+                       // nature of the source folder
+                       int messageCount = (sourceFolder.getType() & Folder.HOLDS_MESSAGES) != 0 ? sourceFolder.getMessageCount()
+                                       : 0;
+                       boolean hasSubFolders = (sourceFolder.getType() & Folder.HOLDS_FOLDERS) != 0
+                                       ? sourceFolder.list().length != 0
+                                       : false;
+
                        Folder targetFolder;
-                       if (hasSubFolders) {// has sub-folders
-                               if (messageCount == 0) {
-                                       targetFolder = targetStore.getFolder(folderFullName);
-                                       if (!targetFolder.exists()) {
-                                               targetFolder.create(Folder.HOLDS_FOLDERS);
-                                               logger.log(DEBUG, "Created HOLDS_FOLDERS folder " + targetFolder.getFullName());
+                       if (targetSupportDualTypeFolders) {
+                               targetFolder = targetStore.getFolder(targetFolderFullName);
+                               if (!targetFolder.exists()) {
+                                       targetFolder.create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
+                                       logger.log(DEBUG, "Created HOLDS_FOLDERS | HOLDS_MESSAGES folder " + targetFolder.getFullName());
+                               }
+
+                       } else {
+                               if (hasSubFolders) {// has sub-folders
+                                       if (messageCount == 0) {
+                                               targetFolder = targetStore.getFolder(targetFolderFullName);
+                                               if (!targetFolder.exists()) {
+                                                       targetFolder.create(Folder.HOLDS_FOLDERS);
+                                                       logger.log(DEBUG, "Created HOLDS_FOLDERS folder " + targetFolder.getFullName());
+                                               }
+                                       } else {// also has messages
+                                               Folder parentFolder = targetStore.getFolder(targetFolderFullName);
+                                               if (!parentFolder.exists()) {
+                                                       parentFolder.create(Folder.HOLDS_FOLDERS);
+                                                       logger.log(DEBUG, "Created HOLDS_FOLDERS folder " + parentFolder.getFullName());
+                                               }
+                                               String miscFullName = targetFolderFullName + targetFolderSeparator + "_Misc";
+                                               targetFolder = targetStore.getFolder(miscFullName);
+                                               if (!targetFolder.exists()) {
+                                                       targetFolder.create(Folder.HOLDS_MESSAGES);
+                                                       logger.log(DEBUG, "Created HOLDS_MESSAGES folder " + targetFolder.getFullName());
+                                               }
                                        }
-                               } else {// also has messages
-                                       Folder parentFolder = targetStore.getFolder(folderFullName);
-                                       if (!parentFolder.exists()) {
-                                               parentFolder.create(Folder.HOLDS_FOLDERS);
-                                               logger.log(DEBUG, "Created HOLDS_FOLDERS folder " + parentFolder.getFullName());
+                               } else {// no sub-folders
+                                       if (messageCount == 0) { // empty
+                                               logger.log(DEBUG, "Skip empty folder " + targetFolderFullName);
+                                               continue folders;
                                        }
-                                       String miscFullName = folderFullName + "/_Misc";
-                                       targetFolder = targetStore.getFolder(miscFullName);
+                                       targetFolder = targetStore.getFolder(targetFolderFullName);
                                        if (!targetFolder.exists()) {
                                                targetFolder.create(Folder.HOLDS_MESSAGES);
                                                logger.log(DEBUG, "Created HOLDS_MESSAGES folder " + targetFolder.getFullName());
                                        }
                                }
-                       } else {// no sub-folders
-                               if (messageCount == 0) { // empty
-                                       logger.log(DEBUG, "Skip empty folder " + folderFullName);
-                                       continue folders;
-                               }
-                               targetFolder = targetStore.getFolder(folderFullName);
-                               if (!targetFolder.exists()) {
-                                       targetFolder.create(Folder.HOLDS_MESSAGES);
-                                       logger.log(DEBUG, "Created HOLDS_MESSAGES folder " + targetFolder.getFullName());
-                               }
                        }
 
                        if (messageCount != 0) {
@@ -158,20 +180,20 @@ public class EmailMigration {
                                targetFolder.open(Folder.READ_WRITE);
                                try {
                                        long begin = System.currentTimeMillis();
-                                       folder.open(Folder.READ_ONLY);
-                                       migrateFolder(folder, targetFolder);
+                                       sourceFolder.open(Folder.READ_ONLY);
+                                       migrateFolder(sourceFolder, targetFolder);
                                        long duration = System.currentTimeMillis() - begin;
-                                       logger.log(DEBUG, folderFullName + " - Migration of " + messageCount + " messages took "
+                                       logger.log(DEBUG, targetFolderFullName + " - Migration of " + messageCount + " messages took "
                                                        + (duration / 1000) + " s (" + (duration / messageCount) + " ms per message)");
                                } finally {
-                                       folder.close();
+                                       sourceFolder.close();
                                        targetFolder.close();
                                }
                        }
 
                        // recursive
                        if (hasSubFolders) {
-                               migrateFolders(folder, targetStore);
+                               migrateFolders(sourceFolder, targetStore);
                        }
                }
        }
@@ -231,8 +253,7 @@ public class EmailMigration {
                                        Path file = baseDir.resolve(fileName);
                                        savePartsAsFiles(msg.getContent(), file);
                                }
-                       } 
-                       else {
+                       } else {
                                long begin = System.currentTimeMillis();
                                targetFolder = openMboxTargetFolder(sourceFolder, baseDir);
                                migrateFolder(sourceFolder, targetFolder);