View Javadoc
1   package davmail.exchange;
2   
3   import davmail.Settings;
4   import org.apache.log4j.Logger;
5   
6   import javax.mail.internet.MimeMessage;
7   import java.io.IOException;
8   import java.io.OutputStream;
9   import java.net.SocketException;
10  import java.nio.charset.StandardCharsets;
11  import java.util.HashMap;
12  
13  /**
14   * Create message in a separate thread.
15   */
16  public class MessageCreateThread extends Thread {
17      private static final Logger LOGGER = Logger.getLogger(MessageCreateThread.class);
18  
19      boolean isComplete = false;
20      ExchangeSession session;
21      String folderPath;
22      String messageName;
23      HashMap<String, String> properties;
24      MimeMessage mimeMessage;
25      ExchangeSession.Message message;
26      IOException exception;
27  
28      MessageCreateThread(String threadName, ExchangeSession session, String folderPath, String messageName, HashMap<String, String> properties, MimeMessage mimeMessage) {
29          super(threadName + "-MessageCreate");
30          setDaemon(true);
31          this.session = session;
32          this.folderPath = folderPath;
33          this.messageName = messageName;
34          this.properties = properties;
35          this.mimeMessage = mimeMessage;
36      }
37  
38      public void run() {
39          try {
40              this.message = session.createMessage(folderPath, messageName, properties, mimeMessage);
41          } catch (IOException e) {
42              exception = e;
43          } finally {
44              isComplete = true;
45          }
46      }
47  
48      /**
49       * Create message in a separate thread.
50       *
51       * @param session      Exchange session
52       * @param folderPath   folder path
53       * @param messageName  message name
54       * @param properties   message properties
55       * @param mimeMessage  message content
56       * @param outputStream output stream
57       * @param capabilities IMAP capabilities
58       * @throws InterruptedException on error
59       * @throws IOException          on error
60       */
61      public static ExchangeSession.Message createMessage(ExchangeSession session, String folderPath, String messageName, HashMap<String, String> properties, MimeMessage mimeMessage, OutputStream outputStream, String capabilities) throws IOException {
62          MessageCreateThread messageCreateThread = new MessageCreateThread(currentThread().getName(), session, folderPath, messageName, properties, mimeMessage);
63          messageCreateThread.start();
64          while (!messageCreateThread.isComplete) {
65              try {
66                  messageCreateThread.join(20000);
67              } catch (InterruptedException e) {
68                  LOGGER.warn("Thread interrupted", e);
69                  Thread.currentThread().interrupt();
70              }
71              if (!messageCreateThread.isComplete) {
72                  if (Settings.getBooleanProperty("davmail.enableKeepAlive", false)) {
73                      LOGGER.debug("Still loading message, send capabilities untagged response to avoid timeout");
74                      try {
75                          LOGGER.debug("* " + capabilities);
76                          outputStream.write(("* " + capabilities).getBytes(StandardCharsets.US_ASCII));
77                          outputStream.write((char) 13);
78                          outputStream.write((char) 10);
79                          outputStream.flush();
80                      } catch (SocketException e) {
81                          messageCreateThread.interrupt();
82                          throw e;
83                      }
84                  }
85              }
86          }
87          if (messageCreateThread.exception != null) {
88              throw messageCreateThread.exception;
89          }
90          return messageCreateThread.message;
91      }
92  }