X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.app.core%2Fsrc%2Forg%2Fargeo%2Fapp%2Fmail%2FEmailMigration.java;h=8c899c2316ccb4dbb18433dc8501ec5b63bd5e35;hb=26edd36fbbd565d7459a134a20a9c60d489dbb35;hp=c5b3083268682fabad204aa23bd253268ecc2712;hpb=b76993554efeb10d1f7994efdb78403513707f47;p=gpl%2Fargeo-suite.git diff --git a/org.argeo.app.core/src/org/argeo/app/mail/EmailMigration.java b/org.argeo.app.core/src/org/argeo/app/mail/EmailMigration.java index c5b3083..8c899c2 100644 --- a/org.argeo.app.core/src/org/argeo/app/mail/EmailMigration.java +++ b/org.argeo.app.core/src/org/argeo/app/mail/EmailMigration.java @@ -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);