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");
}
}
- 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) {
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);
}
}
}
Path file = baseDir.resolve(fileName);
savePartsAsFiles(msg.getContent(), file);
}
- }
- else {
+ } else {
long begin = System.currentTimeMillis();
targetFolder = openMboxTargetFolder(sourceFolder, baseDir);
migrateFolder(sourceFolder, targetFolder);