1 36 package org.columba.ristretto.imap.parser; 37 38 import java.util.regex.Matcher ; 39 import java.util.regex.Pattern ; 40 41 import org.columba.ristretto.imap.IMAPResponse; 42 import org.columba.ristretto.parser.ParserException; 43 44 51 public class IMAPResponseParser { 52 53 54 private static final Pattern response = 57 Pattern.compile("^((\\*)" + "|([0-9a-zA-Z]+)" + "|(\\+)) " + "([^\r\n]*)\r?\n?"); 62 63 private static final Pattern resp_cond = 65 Pattern.compile( 66 "^(OK|BAD|NO|BYE|PREAUTH) " + "(\\[(\\w+[^\\]]+)\\])?" + " ?([^\r\n]*)"); 70 71 private static final Pattern mailbox_data = 73 Pattern.compile( 74 "^((FLAGS|LIST|LSUB|SEARCH|STATUS|CAPABILITY|NAMESPACE)" + "|((\\d+) " + "(EXISTS|RECENT)))" + " ?([^\r\n]*)"); 79 80 private static final Pattern message_data = 82 Pattern.compile("^(\\d+) " + "(EXPUNGE|FETCH)" + " ?([^\r\n]*)"); 86 87 private static final Pattern resp_cont = 89 Pattern.compile("^(\\[(\\w+[^\\]]+)\\] )?" + "([^\r\n]*)"); 92 93 100 public static IMAPResponse parse(CharSequence input) throws ParserException { 101 Matcher matcher = response.matcher(input); 102 103 if (matcher.matches()) { 105 IMAPResponse result = new IMAPResponse(input.toString()); 106 107 if (matcher.group(2) != null) { 109 110 Matcher respCode = resp_cond.matcher(matcher.group(5)); 112 if (respCode.matches()) { 113 result.setResponseType(IMAPResponse.RESPONSE_STATUS); 114 result.setResponseSubType(respCode.group(1)); 115 116 if (respCode.group(3) != null) { 118 result.setResponseTextCode(ResponseTextCodeParser.parse(respCode.group(3))); 119 } 120 121 result.setResponseMessage(respCode.group(4)); 123 124 return result; 125 } 126 127 Matcher mailboxData = mailbox_data.matcher(matcher.group(5)); 129 if (mailboxData.matches()) { 130 result.setResponseType(IMAPResponse.RESPONSE_MAILBOX_DATA); 131 132 if (mailboxData.group(2) != null) { 134 result.setResponseSubType(mailboxData.group(1)); 135 } else { 136 result.setPreNumber(Integer.parseInt(mailboxData.group(4))); 137 result.setResponseSubType(mailboxData.group(5)); 138 } 139 140 result.setResponseMessage(mailboxData.group(6)); 141 142 return result; 143 } 144 145 Matcher messageData = message_data.matcher(matcher.group(5)); 147 if (messageData.matches()) { 148 result.setResponseType(IMAPResponse.RESPONSE_MESSAGE_DATA); 149 150 result.setPreNumber(Integer.parseInt(messageData.group(1))); 151 result.setResponseSubType(messageData.group(2)); 152 153 result.setResponseMessage(messageData.group(3)); 154 155 return result; 156 } 157 158 throw new ParserException( 160 "Unkown subytpe : " + result.getSource()); 161 } 162 163 if (matcher.group(3) != null) { 165 result.setTag(matcher.group(3)); 166 167 Matcher respCode = resp_cond.matcher(matcher.group(5)); 169 if (respCode.matches()) { 170 result.setResponseType(IMAPResponse.RESPONSE_STATUS); 171 result.setResponseSubType(respCode.group(1)); 172 173 if (respCode.group(3) != null) { 175 result.setResponseTextCode(ResponseTextCodeParser.parse(respCode.group(3))); 176 } 177 178 result.setResponseMessage(respCode.group(4)); 180 181 return result; 182 } 183 184 throw new ParserException( 186 "Unkown subytpe :" + result.getSource()); 187 } 188 189 if (matcher.group(4) != null) { 191 result.setResponseType(IMAPResponse.RESPONSE_CONTINUATION); 192 193 Matcher respCont = resp_cont.matcher(matcher.group(5)); 194 if (respCont.matches()) { 195 if (respCont.group(2) != null) { 197 result.setResponseTextCode(ResponseTextCodeParser.parse(respCont.group(2))); 198 } 199 200 result.setResponseMessage(respCont.group(3)); 202 203 return result; 204 } 205 206 } 207 208 } 209 210 throw new ParserException("Not a valid IMAP response : " + input); 211 } 212 } 213 | Popular Tags |