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.schedule;
017
018 import java.util.Date;
019 import java.util.HashMap;
020 import java.util.List;
021 import java.util.Map;
022
023 import org.apache.commons.collections.CollectionUtils;
024 import org.apache.commons.collections.MapUtils;
025 import org.apache.commons.lang.StringUtils;
026 import org.apache.commons.lang.time.DateFormatUtils;
027 import org.apache.log4j.Logger;
028
029 import com.hs.mail.imap.mailbox.MailboxManager;
030 import com.hs.mail.imap.message.search.ComparisonKey;
031 import com.hs.mail.imap.message.search.CompositeKey;
032 import com.hs.mail.imap.message.search.InternalDateKey;
033
034 /**
035 *
036 * @author Won Chul Doh
037 * @since Oct 2, 2010
038 *
039 */
040 public class MessageExpunger {
041
042 static Logger logger = Logger.getLogger(MessageExpunger.class);
043
044 private MailboxManager manager;
045
046 public MessageExpunger(MailboxManager manager) {
047 this.manager = manager;
048 }
049
050 public void expunge(String prop, long timeLimit) {
051 Map<String, Date> criteria = getExpungeCriteria(prop);
052 if (MapUtils.isNotEmpty(criteria)) {
053 expungeMailboxes(criteria, timeLimit);
054 }
055 }
056
057 private Map<String, Date> getExpungeCriteria(String prop) {
058 String[] tokens = StringUtils.split(prop);
059 int sz = tokens.length / 2;
060 if (sz > 0) {
061 Map<String, Date> criteria = new HashMap<String, Date>(sz);
062 for (int i = 0; i < tokens.length / 2; i++) {
063 Date base = ScheduleUtils.getDateBefore(tokens[i + 1]);
064 if (base != null) {
065 criteria.put(tokens[i], base);
066 }
067 }
068 return criteria;
069 }
070 return null;
071 }
072
073 private void expungeMailboxes(Map<String, Date> criteria, long timeLimit) {
074 for (String name : criteria.keySet()) {
075 if (logger.isDebugEnabled()) {
076 logger.debug("Expunging messages from "
077 + name
078 + " which are older than "
079 + DateFormatUtils.ISO_DATE_FORMAT.format(criteria
080 .get(name)) + ".");
081 }
082 List<Long> mailboxIdes = manager.getMailboxIDList(name);
083 if (CollectionUtils.isNotEmpty(mailboxIdes)) {
084 for (Long mailboxID : mailboxIdes) {
085 if (System.currentTimeMillis() >= timeLimit) {
086 return;
087 }
088 expungeMessages(mailboxID, criteria.get(name));
089 }
090 }
091 }
092 }
093
094 private void expungeMessages(long mailboxID, Date date) {
095 List<Long> uids = manager.search(null, mailboxID, new CompositeKey(
096 new InternalDateKey(ComparisonKey.LT, date)));
097 if (CollectionUtils.isNotEmpty(uids)) {
098 for (Long uid : uids) {
099 manager.deleteMessage(uid);
100 }
101 }
102 }
103
104 }