All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.sitebricks.mail.imap.StoreFlagsResponseExtractor Maven / Gradle / Ivy

The newest version!
package com.google.sitebricks.mail.imap;

import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Parse STORE_FLAGS response, including new flags as echoed by server.
 * TODO: replace "STORE_FLAGS RESPONSE" with an error code or string for easy classification.
 * @author [email protected] (Jochen Bekmann)
 */
public class StoreFlagsResponseExtractor implements Extractor> {
  private static final Pattern FETCH_FLAG_PATT = Pattern.compile(".* FETCH *\\((FLAGS *\\(.*\\)).*\\)");
  private static final Pattern BAD_PATT = Pattern.compile("\\d+ +BAD (.*)");
  private static final Pattern NO_PATT = Pattern.compile("\\d+ +NO (.*)");
  private static final Pattern OK_PATT = Pattern.compile("\\d+ +OK (.*)");

  /**
   * Parse the response, which includes new flag settings and command status.
   * We expect only one FETCH response as we only set flags on one msg.
   * 
   * http://tools.ietf.org/html/rfc3501#section-6.4.6
   *   C: A003 STORE_FLAGS 6 +FLAGS (\Deleted)
   *   S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen) UID 6)
   *   S: A003 OK STORE_FLAGS completed
   */
  @Override
  public Set extract(List messages) throws ExtractionException {
    boolean gotFetch = false;
    Set result = null;

    // Find FETCH, throw error if none or more than one, or if we receive an error response.
    String fetchStr = null;
    for (int i = 0, messagesSize = messages.size(); i < messagesSize; i++) {
      String message = messages.get(i);
      if (null == message || message.isEmpty())
        continue;

      fetchStr = matchAndGetGroup1(FETCH_FLAG_PATT, message);
      if(fetchStr != null) {
        if (gotFetch) {
          throw new ExtractionException("STORE_FLAGS RESPONSE: Got more than one FETCH response " +
              message);
        }
        gotFetch = true;
        result = Flag.parseFlagList(Parsing.tokenize(fetchStr));
      } else {
        if(matchAndGetGroup1(OK_PATT, message) != null) {
          if (!gotFetch) {
            throw new ExtractionException("STORE_FLAGS RESPONSE: no FLAGS received." + message);
          }
          // All Good.
        } else if (matchAndGetGroup1(BAD_PATT, message) != null || matchAndGetGroup1(NO_PATT,
            message) != null) {
          throw new ExtractionException("STORE_FLAGS RESPONSE: " + message);
        }
      }
    }
    return result;
  }

  private String matchAndGetGroup1(Pattern p, String s) {
    Matcher m = p.matcher(s);

    if (m.matches() && m.groupCount() > 0) {
      return m.group(1);
    }
    return null;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy