001: /*
002: * Created on Jan 14, 2006
003: */
004: package com.openedit.blog;
005:
006: import java.io.File;
007: import java.io.FileWriter;
008: import java.io.Serializable;
009: import java.io.Writer;
010: import java.util.Date;
011: import java.util.HashSet;
012: import java.util.Iterator;
013: import java.util.Set;
014:
015: import org.apache.commons.logging.Log;
016: import org.apache.commons.logging.LogFactory;
017: import org.openedit.repository.filesystem.StringItem;
018:
019: import com.openedit.OpenEditException;
020: import com.openedit.hittracker.HitTracker;
021: import com.openedit.modules.email.Recipient;
022: import com.openedit.modules.email.TemplateWebEmail;
023: import com.openedit.page.Page;
024: import com.openedit.page.manage.PageManager;
025: import com.openedit.users.Group;
026: import com.openedit.users.User;
027: import com.openedit.users.UserManager;
028: import com.openedit.util.FileUtils;
029:
030: public class Notify implements Serializable {
031: private static final Log log = LogFactory.getLog(Notify.class);
032: transient protected UserManager fieldUserManager;
033: transient protected PageManager fieldPageManager;
034:
035: protected File fieldRootDirectory;
036: protected String[] fieldGroupNames;
037: protected boolean fieldKeepRunning;
038:
039: public UserManager getUserManager() {
040: return fieldUserManager;
041: }
042:
043: public void setUserManager(UserManager inUserManager) {
044: fieldUserManager = inUserManager;
045: }
046:
047: public void sendEmail(TemplateWebEmail inEmail, Writer inLog)
048: throws OpenEditException {
049: fieldKeepRunning = true;
050: FileWriter out = null;
051: int grandTotal = 0;
052: try {
053: Set duplicate = new HashSet();
054: inLog.write("<pre>");
055: File logFile = getLogFile(inEmail.getMailTemplatePath());
056: if (logFile.exists()) {
057: out = new FileWriter(logFile, true);
058: } else {
059: out = new FileWriter(logFile);
060: }
061: out.write("Starting Sending " + new Date() + "\n");
062:
063: for (int i = 0; i < getGroupNames().length
064: && isKeepRunning(); i++) {
065: Group group = getUserManager().getGroup(
066: getGroupNames()[i]);
067: inLog.write("Status, " + group.getName()
068: + " group starting to send\n");
069: out.write("Status, " + group.getName()
070: + " group starting to send\n");
071: int countSent = 0;
072: int countSkipped = 0;
073: int logCount = 0;
074: HitTracker users = getUserManager().getUsersInGroup(
075: group);
076: for (Iterator iter = users.iterator(); iter.hasNext();) {
077: User user = (User) iter.next();
078: String email = user.getEmail();
079: if (email.length() > 4
080: && !duplicate.contains(email.toLowerCase())) {
081: Recipient rec = new Recipient();
082: rec.setEmailAddress(user.getEmail());
083: rec.setLastName(user.getLastName());
084: rec.setFirstName(user.getFirstName());
085: try {
086: inEmail.send(rec);
087: out.write("Sent, email: "
088: + rec.getEmailAddress()
089: + ", username:"
090: + user.getUserName() + "\n");
091: duplicate.add(email.toLowerCase());
092: countSent++;
093: } catch (Exception ex) {
094: inLog.write("Error, email: "
095: + rec.getEmailAddress()
096: + ", username:"
097: + user.getUserName() + ", error: "
098: + ex.toString() + "\n");
099: out.write("Error, email: "
100: + rec.getEmailAddress()
101: + ", username:"
102: + user.getUserName() + ", error: "
103: + ex.toString() + "\n");
104: log.error(ex);
105: }
106: } else {
107: inLog.write("Skipping, " + email
108: + " looks invalid or a duplicate\n");
109: out.write("Skipping, " + email
110: + " looks invalid or a duplicate\n");
111:
112: countSkipped++;
113: }
114: logCount++;
115: grandTotal++;
116: if (logCount == 100) {
117: inLog
118: .write("Status, Processed 100 more emails and "
119: + grandTotal + " total\n");
120: logCount = 0;
121: }
122: inLog.flush();
123: out.flush();
124: }
125: inLog.write("Status, completed. sent:" + countSent
126: + " skipped: " + countSkipped + "\n");
127: out.write("Status, completed. sent:" + countSent
128: + " skipped: " + countSkipped + "\n");
129: inLog.write("</pre>");
130: inLog.flush();
131: setKeepRunning(false);
132: }
133: } catch (Exception ex) {
134: setKeepRunning(false);
135: if (ex instanceof OpenEditException) {
136: throw (OpenEditException) ex;
137: }
138: throw new OpenEditException(ex);
139: } finally {
140: FileUtils.safeClose(out);
141: }
142: }
143:
144: public void fixLinks(Page inMailTemplatePage, String base)
145: throws OpenEditException {
146: String content = inMailTemplatePage.getContent();
147: //String base = inUrl.buildRoot() + inUrl.relativeHomePrefix();
148:
149: content = content
150: .replaceAll("src=\\\"/", "src=\"" + base + "/");
151: content = content.replaceAll("src=/", "src=" + base + "/");
152: content = content.replaceAll("href=\\\"/", "href=\"" + base
153: + "/");
154: content = content.replaceAll("href=/", "href=" + base + "/");
155: content = content.replaceAll("url\\('/", "url('" + base + "/");
156: content = content.replaceAll("\\$home", base);
157:
158: StringItem item = new StringItem(inMailTemplatePage.getPath(),
159: content, inMailTemplatePage.getCharacterEncoding());
160: inMailTemplatePage.setContentItem(item);
161:
162: getPageManager().putPage(inMailTemplatePage);
163:
164: }
165:
166: protected File getLogFile(String inPath) {
167: File f = new File(getRootDirectory(), inPath + ".log");
168: return f;
169: }
170:
171: public boolean hasLog(String inPath) {
172: File f = getLogFile(inPath);
173: return f.exists();
174: }
175:
176: public String[] getGroupNames() {
177: return fieldGroupNames;
178: }
179:
180: public void setGroupNames(String[] inGroupNames) {
181: fieldGroupNames = inGroupNames;
182: }
183:
184: public void cancel() {
185: fieldKeepRunning = false;
186: }
187:
188: public boolean isKeepRunning() {
189: return fieldKeepRunning;
190: }
191:
192: public void setKeepRunning(boolean inKeepRunning) {
193: fieldKeepRunning = inKeepRunning;
194: }
195:
196: public File getRootDirectory() {
197: return fieldRootDirectory;
198: }
199:
200: public void setRootDirectory(File inRootDirectory) {
201: fieldRootDirectory = inRootDirectory;
202: }
203:
204: public PageManager getPageManager() {
205: return fieldPageManager;
206: }
207:
208: public void setPageManager(PageManager inPageManager) {
209: fieldPageManager = inPageManager;
210: }
211:
212: }
|