/**
*
*/
package fr.cedrik.email.fs.maildir;
import java.io.File;
import java.io.IOException;
import java.util.List;
import com.sun.mail.imap.protocol.BASE64MailboxEncoder;
import fr.cedrik.email.FoldersList;
import fr.cedrik.email.spi.PropertiesFileSupplier;
import fr.cedrik.email.spi.SessionSupplier;
import fr.cedrik.inotes.Folder;
/**
* @author Cédrik LIME
*/
public class MailDirPP extends BaseMailDir {
protected File baseMailDir;
public MailDirPP() throws IOException {
super();
}
/**
* @param args
*/
public static void main(String[] args) throws IOException {
new MailDirPP().run(args, null);
}
/**
* @param args
*/
@Override
public void _main(String[] args) throws IOException {
main(args);
}
@Override
protected void help() {
System.out.println("Usage: "+MailDirPP.class.getSimpleName()+" <out_dir>");
}
@Override
protected boolean prepareDestinationObjects(String baseName, String extension) {
return super.prepareDestinationObjects(baseName, extension);
}
@Override
protected void run(String[] args, String extension) throws IOException {
if (args.length != 1) {
help();
System.exit(-1);
}
if (! prepareDestinationObjects(args[0], extension)) {
return;
}
baseMailDir = new File(args[0]);
assert writer != null;
email = PropertiesFileSupplier.Util.get();
email.setCurrentFolderId(email.getDefaultFolderId());
session = SessionSupplier.Util.get(email);
// login
if (! session.login(email.getUserName(), email.getUserPassword())) {
logger.error("Can not login user {}!", email.getUserName());
return;
}
try {
// export folders hierarchy
FoldersList folders = session.getFolders();
//FIXME check no 2 folders have the same .name hierarchy
for (Folder folder : folders) {
if (folder.getName().startsWith(".")) {
throw new IllegalArgumentException("Folder can not start with a '.': " + folder);
}
if (folder.isAllMails()) {
continue;
}
if (! prepareDestinationObjects(computeMaildirFolderName(folder, folders), extension)) {
continue;
}
export(folder, args);
}
} finally {
session.logout();
}
}
protected String computeMaildirFolderName(Folder folder, FoldersList folders) {
if (folder.isInbox()) {
return baseMailDir.getPath();
} else {
// compute MailDir++ full folder name and encode each segment
List<Folder> foldersChain = folders.getFoldersChain(folder);
StringBuilder result = new StringBuilder();
result.append('.');
for (Folder parent : foldersChain) {
result.append(encodeFolderName(parent.getName()));
result.append('.');
}
result.deleteCharAt(result.length() - 1); // remove trailing '.'
return new File(baseMailDir, result.toString()).getPath();
}
}
/**
* @see RFC2060 5.1.3. Mailbox International Naming Convention + special treatment for '.' and '/' as per MailDir++ specification
*/
protected String encodeFolderName(String folderName) {
return BASE64MailboxEncoder.encode(folderName).replace(".", "&AC4-").replace("/", "&AC8-");
}
}