/**
*
*/
package fr.cedrik.email.fs.maildir;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.zip.ZipOutputStream;
import fr.cedrik.email.fs.BaseZipWriter;
import fr.cedrik.email.spi.Message;
import gnu.trove.set.TLongSet;
import gnu.trove.set.hash.TLongHashSet;
/**
* @author Cédrik LIME
*/
public class EMLZipWriter extends BaseZipWriter {
public static final String MAILBOX_SUFFIX = fr.cedrik.email.fs.maildir.EMLWriter.EXTENSION_EML;
// names of already-exported emails, to avoid overwriting
protected TLongSet exportedMails = new TLongHashSet(1000); // should be per folder
public EMLZipWriter(ZipOutputStream out, String baseName) {
super(out, baseName);
}
@Override
protected void writeMIME(Writer mbox, Message message, Iterator<String> mime) throws IOException {
while (mime.hasNext()) {
String line = mime.next();
mbox.append(line).append(newLine());
}
}
@Override
public void openFolder(String folderChainStr) throws IOException {
// noop
}
@Override
public void openFile(String folderChainStr, Message message) throws IOException {
newZipEntry(folderChainStr, message);
}
@Override
protected String computeZipMailFileName(String folderChainStr, Message message) {
String zipFolder = baseName + folderChainStr;
long id = message.getDate().getTime();
while (exportedMails.contains(id)) {
++id;
}
String zipFQN = zipFolder + '/' + id + EMLZipWriter.MAILBOX_SUFFIX;
exportedMails.add(id);
return zipFQN;
}
@Override
public void closeFile(Message message) throws IOException {
closeZipEntry();
}
@Override
public void closeFolder() throws IOException {
// noop
}
/**
* @return Outlook-compliant new-line char
*/
@Override
protected String newLine() {
return "\r\n";//$NON-NLS-1$
}
}