/sitebricks-mail/src/main/java/com/google/sitebricks/mail/imap/MessageExtractor.java

http://github.com/dhanji/sitebricks · Java · 68 lines · 46 code · 8 blank · 14 comment · 6 complexity · f2ca6af994011c30821c74670be66ace MD5 · raw file

  1. package com.google.sitebricks.mail.imap;
  2. import com.google.common.collect.Lists;
  3. import java.util.List;
  4. /**
  5. * Extracts a Message from a complete IMAP fetch. Specifically
  6. * a "fetch full" command which comes back with subject, sender, uid
  7. * internaldate and rfc822.size (length) and all body parts.
  8. * <p>
  9. * This is the more robust form of {@link MessageStatus}, which should
  10. * be preferred for fetching just subjects/status info as this extraction
  11. * mechanism can be slower for messages with large bodies.
  12. *
  13. * @author dhanji@gmail.com (Dhanji R. Prasanna)
  14. */
  15. class MessageExtractor implements Extractor<List<MessageStatus>> {
  16. private static final String ENVELOPE_PREFIX = "(ENVELOPE ";
  17. private static final String INTERNALDATE = "INTERNALDATE";
  18. @Override
  19. public List<MessageStatus> extract(List<String> messages) {
  20. List<MessageStatus> statuses = Lists.newArrayList();
  21. for (String message : messages) {
  22. String[] split = message.split("[ ]+", 3);
  23. // Only parse Fetch responses.
  24. if (split.length > 1 && "FETCH".equalsIgnoreCase(split[1])) {
  25. // Strip the "XX FETCH" sequence prefix first.
  26. // statuses.add(parseEnvelope(split[2]));
  27. }
  28. }
  29. return statuses;
  30. }
  31. private static List<String> tokenize(String message) {
  32. List<String> pieces = Lists.newArrayList();
  33. char[] chars = message.toCharArray();
  34. boolean inString = false;
  35. StringBuilder token = new StringBuilder();
  36. for (int i = 0; i < chars.length; i++) {
  37. char c = chars[i];
  38. if (c == '"') {
  39. // Close of string, bake this token.
  40. if (inString) {
  41. pieces.add(token.toString().trim());
  42. token = new StringBuilder();
  43. inString = false;
  44. } else
  45. inString = true;
  46. continue;
  47. }
  48. // Skip parentheticals
  49. if (!inString && (c == '(' || c == ')')) {
  50. continue;
  51. }
  52. token.append(c);
  53. }
  54. return pieces;
  55. }
  56. }