001 /* 002 * Copyright 2010 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package com.hs.mail.imap.server.codec; 017 018 import java.text.DateFormat; 019 import java.text.ParseException; 020 import java.text.SimpleDateFormat; 021 import java.util.Date; 022 import java.util.Locale; 023 024 import javax.mail.Flags; 025 026 import com.hs.mail.imap.message.SequenceRange; 027 import com.hs.mail.imap.message.request.Status; 028 029 /** 030 * 031 * @author Won Chul Doh 032 * @since Jan 22, 2010 033 * 034 */ 035 public class DecoderUtils { 036 037 public static void decodeFlagList(String flagString, final Flags flags) { 038 if (flagString.equalsIgnoreCase("\\Answered")) { 039 flags.add(Flags.Flag.ANSWERED); 040 } else if (flagString.equalsIgnoreCase("\\Flagged")) { 041 flags.add(Flags.Flag.FLAGGED); 042 } else if (flagString.equalsIgnoreCase("\\Deleted")) { 043 flags.add(Flags.Flag.DELETED); 044 } else if (flagString.equalsIgnoreCase("\\Seen")) { 045 flags.add(Flags.Flag.SEEN); 046 } else if (flagString.equalsIgnoreCase("\\Draft")) { 047 flags.add(Flags.Flag.DRAFT); 048 } else { 049 if (flagString.equalsIgnoreCase("\\Recent")) { 050 // RFC3501 specifically excludes /Recent 051 // The /Recent flag should be set automatically by the server 052 } else { 053 // RFC3501 allows novel flags 054 flags.add(flagString); 055 } 056 } 057 } 058 059 private static final DateFormat DATE_FORMAT0; 060 private static final DateFormat DATE_FORMAT1; 061 private static final DateFormat DATE_FORMAT2; 062 static { 063 DATE_FORMAT0 = new SimpleDateFormat("dd-MMM-yyyy", Locale.US); 064 DATE_FORMAT1 = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss ZZZZ", 065 Locale.US); 066 DATE_FORMAT2 = new SimpleDateFormat(" d-MMM-yyyy HH:mm:ss ZZZZ", 067 Locale.US); 068 } 069 070 public static Date parseDate(String date) throws ParseException { 071 DateFormat df = DATE_FORMAT0; 072 return df.parse(date); 073 } 074 075 public static Date parseDateTime(String dateTime) throws ParseException { 076 String tz = dateTime.substring(21); 077 tz = "GMT" + tz.charAt(0) + tz.charAt(1) + tz.charAt(2) + ":" 078 + tz.charAt(3) + tz.charAt(4); 079 dateTime = dateTime.substring(0, 21) + tz; 080 DateFormat df = (dateTime.charAt(0) != ' ') ? DATE_FORMAT1 081 : DATE_FORMAT2; 082 return df.parse(dateTime); 083 } 084 085 public static void decodeStatusAttList(String statusAtt, 086 Status statusAtts) { 087 String val = statusAtt.toUpperCase(); 088 if ("MESSAGES".equals(val)) { 089 statusAtts.setMessages(true); 090 } else if ("RECENT".equals(val)) { 091 statusAtts.setRecent(true); 092 } else if ("UIDNEXT".equals(val)) { 093 statusAtts.setUidNext(true); 094 } else if ("UIDVALIDITY".equals(val)) { 095 statusAtts.setUidValidity(true); 096 } else if ("UNSEEN".equals(val)) { 097 statusAtts.setUnseen(true); 098 } 099 } 100 101 public static SequenceRange parseSeqRange(String range) { 102 int pos = range.indexOf(':'); 103 if (pos == -1) { 104 long value = parseSeqNumber(range); 105 return new SequenceRange(value); 106 } else { 107 long min = parseSeqNumber(range.substring(0, pos)); 108 long max = parseSeqNumber(range.substring(pos + 1)); 109 return new SequenceRange(Math.min(min, max), Math.max(min, max)); 110 } 111 } 112 113 private static long parseSeqNumber(String value) { 114 if (value.length() == 1 && value.charAt(0) == '*') { 115 return Long.MAX_VALUE; 116 } 117 return Long.parseLong(value); 118 } 119 120 }