1 42 package com.mvnforum.user; 43 44 import java.io.IOException ; 45 import java.io.StringWriter ; 46 import java.sql.Timestamp ; 47 import java.text.DateFormat ; 48 import java.util.*; 49 50 import com.mvnforum.*; 51 import com.mvnforum.auth.MVNForumPermission; 52 import com.mvnforum.db.*; 53 import freemarker.template.*; 54 import net.myvietnam.mvncore.exception.*; 55 import net.myvietnam.mvncore.util.DateUtil; 56 import org.apache.commons.logging.Log; 57 import org.apache.commons.logging.LogFactory; 58 59 class WatchMail { 60 61 private static Log log = LogFactory.getLog(WatchMail.class); 63 64 private ArrayList m_threadList = new ArrayList(); 65 private DateFormat m_dateFormat; 66 67 private String m_forumBase = null; 68 private Timestamp m_lastSent = null; 69 private Timestamp m_now = null; 70 71 private MemberBean m_receiver; 72 private double m_receiverTimeZone = 0; 73 74 private MVNForumPermission m_permission; 75 76 private Map m_root = new HashMap(); 77 private ArrayList m_threadWatchList = new ArrayList(); 78 79 WatchMail(MemberBean member, MVNForumPermission perm, String forumBase, Timestamp lastSent, Timestamp now) 80 throws IllegalArgumentException { 81 82 if (member == null) { 83 throw new IllegalArgumentException ("MemberBean in WatchMail must not be null."); 84 } 85 if (perm == null) { 86 throw new IllegalArgumentException ("Permission in WatchMail must not be null."); 87 } 88 89 m_receiver = member; 90 m_permission = perm; 91 m_forumBase = forumBase; 92 m_lastSent = lastSent; 93 m_now = now; 94 95 init(); 96 } 97 98 private void init() { 99 m_receiverTimeZone = m_receiver.getMemberTimeZone(); 100 if (Math.abs(m_receiverTimeZone) > 12) { 101 m_receiverTimeZone = 0; 103 } 104 105 String localeName = m_receiver.getMemberLanguage(); 106 Locale locale = null; 107 if (localeName.length() == 0) { 108 locale = MVNForumConfig.getDefaultLocale(); 109 } else { 110 locale = MyUtil.getLocale(localeName); 111 } 112 m_dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, locale); 113 114 String lastSentDesc = m_dateFormat.format(DateUtil.convertGMTDate(m_lastSent, m_receiverTimeZone)); 115 String nowDesc = m_dateFormat.format(DateUtil.convertGMTDate(m_now, m_receiverTimeZone)); 116 117 m_root.put("lastSent", lastSentDesc); 118 m_root.put("now", nowDesc); 119 m_root.put("forumBase", m_forumBase); 120 m_root.put("threadWatchList", m_threadWatchList); 121 } 122 123 boolean haveAtLeastOneNewThread() { 124 return (m_threadList.size() > 0); 125 } 126 127 void appendWatch(WatchBean watchBean) 128 throws ObjectNotFoundException, DatabaseException, AssertionException { 129 130 if (m_receiver.getMemberID() != watchBean.getMemberID()) { 131 throw new AssertionException("Assertion: receiver.getMemberID() == watchBean.getMemberID()"); 132 } 133 134 Timestamp lastSent = watchBean.getWatchLastSentDate(); 135 136 int categoryID = watchBean.getCategoryID(); 137 int forumID = watchBean.getForumID(); 138 int threadID = watchBean.getThreadID(); 139 140 142 Collection threadBeans = null; 143 if (categoryID != 0) { 144 threadBeans = DAOFactory.getThreadDAO().getEnableThreads_inCategory(categoryID, lastSent); 145 } else if (forumID != 0) { 146 threadBeans = DAOFactory.getThreadDAO().getEnableThreads_inForum(forumID, lastSent); 147 } else if (threadID != 0) { 148 if (shouldProcessThread(threadID)) { 149 threadBeans = DAOFactory.getThreadDAO().getEnableThreads_inThread(threadID, lastSent); 150 } else { 151 return; } 153 } else { 154 threadBeans = DAOFactory.getThreadDAO().getEnableThreads_inGlobal(lastSent); 155 } 156 if (threadBeans.size() == 0) { 157 return; } 159 160 rememberThread(threadBeans); 162 163 createWatchMessageBean(threadBeans); 164 } 165 166 private void createWatchMessageBean(Collection threadBeans) 167 throws DatabaseException, ObjectNotFoundException { 168 169 int lastForumID = -1; 172 for (Iterator iterator = threadBeans.iterator(); iterator.hasNext(); ) { 173 ThreadBean thread = (ThreadBean)iterator.next(); 174 SimpleHash beanWatchMail = new SimpleHash(); 175 176 ForumBean forumBean = ForumCache.getInstance().getBean(thread.getForumID()); 177 CategoryBean categoryBean = CategoryCache.getInstance().getBean(forumBean.getCategoryID()); 178 179 if ((m_permission.canReadPost(thread.getForumID()) == false) || 180 (forumBean.getForumStatus() == ForumBean.FORUM_STATUS_DISABLED)) { 181 continue; 182 } 183 184 m_threadWatchList.add(beanWatchMail); 185 186 if (thread.getForumID() != lastForumID) { 188 lastForumID = thread.getForumID(); 189 beanWatchMail.put("leader", true); 190 } else { 191 beanWatchMail.put("leader", false); 192 } 193 194 String forumName = forumBean.getForumName(); 195 String categoryName = categoryBean.getCategoryName(); 196 197 beanWatchMail.put("categoryName", categoryName); 198 beanWatchMail.put("forumName", forumName); 199 beanWatchMail.put("threadTopic", thread.getThreadTopic()); 200 beanWatchMail.put("memberName", thread.getMemberName()); 201 beanWatchMail.put("lastPostMemberName", thread.getLastPostMemberName()); 202 beanWatchMail.put("threadLastPostDate", m_dateFormat.format(DateUtil.convertGMTDate(thread.getThreadLastPostDate(),m_receiverTimeZone))); 203 beanWatchMail.put("threadUrl", m_forumBase + "/viewthread?thread=" + thread.getThreadID()); 204 } 205 } 206 207 private boolean shouldProcessThread(int threadID) { 208 int size = m_threadList.size(); 209 for (int i = 0; i < size; i++) { 210 int currentThreadID = ((Integer )m_threadList.get(i)).intValue(); 211 if (currentThreadID == threadID) { 212 return false; 213 } 214 } 215 return true; 216 } 217 218 222 private void rememberThread(Collection threadBeans) { 223 for (Iterator iter = threadBeans.iterator(); iter.hasNext(); ) { 224 int currentThreadID = ((ThreadBean)iter.next()).getThreadID(); 225 if (shouldProcessThread(currentThreadID)) { 226 m_threadList.add(new Integer (currentThreadID)); 227 } else { 228 iter.remove(); 229 } 230 } 231 } 232 233 String getWatchSubject() throws IOException , TemplateException { 234 Configuration cfg = MVNForumConfig.getFreeMarkerConfiguration(); 236 237 StringWriter subjectWriter = new StringWriter (256); 238 Template subjectTemplate = cfg.getTemplate(MVNForumGlobal.TEMPLATE_WATCHMAIL_SUBJECT, "UTF-8"); 239 subjectTemplate.process(m_root, subjectWriter); 240 241 return subjectWriter.toString(); 242 } 243 244 String getMailContent() throws IOException , TemplateException { 245 Configuration cfg = MVNForumConfig.getFreeMarkerConfiguration(); 247 248 StringWriter bodyWriter = new StringWriter (4096); 249 Template bodyTemplate = cfg.getTemplate(MVNForumGlobal.TEMPLATE_WATCHMAIL_BODY, "UTF-8"); 250 bodyTemplate.process(m_root, bodyWriter); 251 252 return bodyWriter.toString(); 253 } 254 255 } 256 | Popular Tags |