KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > dotmarketing > factories > EmailFactory


1 package com.dotmarketing.factories;
2
3 //import com.dotmarketing.threads.DeliverNewsletterThread;
4

5 import java.io.StringWriter JavaDoc;
6 import java.util.HashMap JavaDoc;
7 import java.util.List JavaDoc;
8
9 import org.apache.velocity.Template;
10 import org.apache.velocity.VelocityContext;
11 import org.apache.velocity.context.Context;
12 import org.apache.velocity.exception.ResourceNotFoundException;
13
14 import com.dotmarketing.beans.Identifier;
15 import com.dotmarketing.beans.UserProxy;
16 import com.dotmarketing.cache.IdentifierCache;
17 import com.dotmarketing.cms.factories.PublicCompanyFactory;
18 import com.dotmarketing.cms.login.factories.LoginFactory;
19 import com.dotmarketing.portlets.campaigns.factories.CampaignFactory;
20 import com.dotmarketing.portlets.campaigns.factories.RecipientFactory;
21 import com.dotmarketing.portlets.campaigns.model.Campaign;
22 import com.dotmarketing.portlets.campaigns.model.Recipient;
23 import com.dotmarketing.portlets.communications.model.Communication;
24 import com.dotmarketing.portlets.htmlpages.model.HTMLPage;
25 import com.dotmarketing.portlets.mailinglists.factories.MailingListFactory;
26 import com.dotmarketing.portlets.mailinglists.model.MailingList;
27 import com.dotmarketing.portlets.user.factories.UserCommentsFactory;
28 import com.dotmarketing.threads.DeliverCampaignThread;
29 import com.dotmarketing.util.Config;
30 import com.dotmarketing.util.Logger;
31 import com.dotmarketing.util.Mailer;
32 import com.dotmarketing.util.UtilMethods;
33 import com.liferay.portal.ejb.UserLocalManagerUtil;
34 import com.liferay.portal.model.User;
35
36 /**
37  * DOCUMENT ME!
38  *
39  * @author $author$
40  * @version $Revision: 1.10 $
41  */

42 public class EmailFactory {
43
44     /*
45      * rewrites urls to point back to the redirection servlet
46      */

47
48     private static StringBuffer JavaDoc alterBodyHTML(StringBuffer JavaDoc HTML, String JavaDoc serverName) {
49         //This is the new Regular Expression for white spaces ([ .\r\n&&[^>]]*)
50
// Replacing links "a href" like tags axcluding the mail to links
51
String JavaDoc message = HTML
52                 .toString()
53                 .replaceAll(
54                         "(?i)(?s)<a[^>]+href=\"([^>]+)\"[^>]*>(.*?)</[^>]*a[^>]*>",
55                         "<a HREF=\"http://"
56                                 + serverName
57                                 + "/redirect?r=<rId>&redir=$1\">$2</a>")
58                 .replaceAll("<a HREF=\"http://" + serverName + "/redirect\\?r=<rId>&redir=(mailto:[^\"]+)\">", "<a HREF=\"$1\">");
59         // Replacing links "td background" like tags
60
message = message
61                 .replaceAll(
62                         "<\\s*td([^>]*)background\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
63                         "<td$1background=\"http://"
64                                 + serverName
65                                 + "$2\"$3>");
66         // Replacing links "tr background" like tags
67
message = message
68                 .replaceAll(
69                         "<\\s*tr([^>]*)background\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
70                         "<tr$1background=\"http://"
71                                 + serverName
72                                 + "$2\"$3>");
73         // Replacing links "img src" like tags
74
message = message.replaceAll(
75                 "<\\s*img([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
76                 "<img$1src=\"http://" + serverName
77                         + "$2\"$3>");
78         // Replacing links "link href" like tags
79
message = message
80                 .replaceAll(
81                         "<\\s*link([^>]*)href\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
82                         "<link$1href=\"http://"
83                                 + serverName
84                                 + "$2\"$3>");
85         // Replacing links "script" like tags
86
message = message
87                 .replaceAll(
88                         "<\\s*script([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
89                         "<script$1src=\"http://"
90                                 + serverName
91                                 + "$2\"$3>");
92         // Replacing links "applet" with codebase like tags
93
message = message
94                 .replaceAll(
95                         "<\\s*applet([^>]*)codebase\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
96                         "<applet$1codebase=\"http://"
97                                 + serverName
98                                 + "$2\"$3>");
99         // Replacing links "applet" without codebase like tags
100
message = message
101                 .replaceAll(
102                         "<\\s*applet(([^>][^(codebase)])*)code\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?(([^>][^(codebase)])*)>",
103                         "<applet$1code=\"http://"
104                                 + serverName
105                                 + "$4\"$5>");
106         // Replacing links "iframe" src replacement
107
message = message
108                 .replaceAll(
109                         "<\\s*iframe([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
110                         "<iframe$1src=\"http://"
111                                 + serverName
112                                 + "$2\"$3>");
113         // Replacing links "iframe" longdesc replacement
114
message = message
115                 .replaceAll(
116                         "<\\s*iframe([^>]*)longdesc\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
117                         "<iframe$1longdesc=\"http://"
118                                 + serverName
119                                 + "$2\"$3>");
120         // Replacing links "frame" src replacement
121
message = message
122                 .replaceAll(
123                         "<\\s*frame([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
124                         "<frame$1src=\"http://"
125                                 + serverName
126                                 + "$2\"$3>");
127         // Replacing links "frame" longdesc replacement
128
message = message
129                 .replaceAll(
130                         "<\\s*frame([^>]*)longdesc\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>",
131                         "<frame$1longdesc=\"http://"
132                                 + serverName
133                                 + "$2\"$3>");
134         // Replacing some styles urls
135
message = message
136                 .replaceAll(
137                         "<([^>]*)style\\s*=\\s*[\"\']?([^\'\">]*)url\\s*\\(\\s*([^>]*)\\s*\\)([^\'\">]*)[\"\']?([^>]*)>",
138                         "<$1style=\"$2url(http://"
139                                 + serverName
140                                 + "$3)$4\"$5>");
141         // Fixing absolute paths
142
message = message.replaceAll("http://"
143                 + serverName + "\\s*http://",
144                 "http://");
145         return new StringBuffer JavaDoc(message);
146
147     }
148
149     /**
150      * pulls a list of all waiting recipients, iterates through that list and
151      * calls the sendNewsletter method for each one. After sending, the
152      * recipient sent property is updated to the current time
153      *
154      */

155
156     public static void deliverCampaigns() {
157
158         StringBuffer JavaDoc message = null;
159         java.util.List JavaDoc attachments = null;
160         boolean html = false;
161
162         //get a list of waiting queues
163
List JavaDoc campaigns = CampaignFactory.getWaitingCampaigns();
164         if (campaigns.size() == 0)
165         {
166             campaigns = null;
167             return;
168         }
169         Logger.debug(EmailFactory.class, "GOING to deliver campaigns");
170         java.util.Iterator JavaDoc campIter = campaigns.iterator();
171         
172         //build the thread pool
173
java.util.Map JavaDoc<String JavaDoc, com.dotmarketing.threads.DeliverCampaignThread> deliverThreads = new HashMap JavaDoc<String JavaDoc, com.dotmarketing.threads.DeliverCampaignThread>();
174         
175         //### LOOP THE CAMPAIGNS ###
176
while (campIter.hasNext())
177         {
178             //Obtain the campaign
179
Campaign c = (Campaign) campIter.next();
180             Communication comm = (Communication) InodeFactory.getChildOfClass(c, Communication.class);
181
182             Logger.debug(EmailFactory.class, "got campaign:" + c.getTitle());
183             //Mailing list
184
MailingList ml = (MailingList) InodeFactory.getChildOfClass(c,MailingList.class);
185             
186             if (ml.getInode() == 0)
187             {
188                 Logger.warn(EmailFactory.class,"I didn't find a mailing list!");
189                 c.setLocked(false);
190                 InodeFactory.saveInode(c);
191                 continue;
192             }
193             else
194             {
195                 Logger.debug(EmailFactory.class, "got mailingList:" + ml.getTitle());
196             }
197             
198             //Unsubscriber mailing list
199
MailingList unSubscribers = MailingListFactory.getUnsubscribersMailingList();
200
201             //Get the subscribers
202
//java.util.List subscribers = SubscriberFactory.getSubscribersByList(ml);
203
List JavaDoc subscribers = InodeFactory.getChildrenClass(ml, UserProxy.class);
204             Logger.debug(EmailFactory.class, "Got subscribers:" + subscribers.size());
205
206             //do we have an html page?
207
String JavaDoc alternateTextMessage = null;
208             //HTMLPage htmlPage = (HTMLPage) InodeFactory.getChildOfClass(c,HTMLPage.class);
209
HTMLPage htmlPage = (HTMLPage) InodeFactory.getChildOfClass(comm,HTMLPage.class);
210             if (htmlPage.getInode() > 0) {
211                 html = true;
212                 Logger.debug(EmailFactory.class, "Got htmlPage:"+ htmlPage.getTitle());
213
214                 // get the newsletter and the attachments
215
Identifier id = IdentifierCache.getIdentifierByInodeFromCache(htmlPage);
216                 
217                 
218                 String JavaDoc serverName = HostFactory.getHost(id.getHostInode()).getHostname();
219
220                 //rewrite the urls
221
message = alterBodyHTML(UtilMethods.getURL("http://"+ serverName + id.getURI()), serverName );
222                 alternateTextMessage = "If you are having trouble reading this message, click here: "+ "http://"+ serverName + id.getURI();
223                 // add tracking shim
224
message.append("<img SRC='http://"+ serverName + "/imageShim?r=<rId>' width='1' height='1'>");
225
226             } else {
227                 html = false;
228                 //message = new StringBuffer(c.getMessage());
229
message = new StringBuffer JavaDoc(comm.getTextMessage());
230             }
231
232             // big loop over recipients
233
java.util.Iterator JavaDoc subscriberIterator = subscribers.iterator();
234             String JavaDoc send_per_hour = c.getSendsPerHour();
235             
236             //### LOOP THE SUBSCRIBERS OF EACH CAMPAIGN ###
237
while (subscriberIterator.hasNext())
238             {
239                 //find an available thread
240
DeliverCampaignThread deliveryThread = null;
241                 while(deliveryThread == null)
242                 {
243                     for (int j = 0; j < Config.getIntProperty("EMAIL_SENDING_THREADS",10); j++)
244                     {
245                         deliveryThread = (DeliverCampaignThread) deliverThreads.get("thread" + j);
246                         //if there isn't a thread, build a new one
247
if (deliveryThread == null || !deliveryThread.isAlive())
248                         {
249                             deliveryThread = new DeliverCampaignThread("thread" + j);
250                             deliverThreads.put("thread" + j, deliveryThread);
251                             break;
252                         } else if (deliveryThread.isAlive()) {
253                             continue;
254                         }
255                     }
256                     try
257                     {
258                         Thread.sleep(1000);
259                     }
260                     catch(Exception JavaDoc ex)
261                     {
262                         Logger.debug(EmailFactory.class,ex.toString());
263                     }
264                 }
265
266                 //Subscriber subscriber = (Subscriber) subscriberIterator.next();
267
UserProxy subscriber = (UserProxy) subscriberIterator.next();
268                 User member = new User();
269                 try {
270                     String JavaDoc companyId = PublicCompanyFactory.getDefaultCompanyId();
271                     member = UserLocalManagerUtil.getUserById(companyId, subscriber.getUserId());
272                 } catch (Exception JavaDoc e) {
273                     Logger.error(LoginFactory.class, "deliverCampaigns Failed" + e);
274                     e.printStackTrace(System.out);
275                 }
276
277                 Recipient recipient = RecipientFactory.getRecipientByCampaignAndSubscriber(c, member);
278                 if (isSubscribed(unSubscribers,member))
279                 {
280                     recipient.setLastMessage("On Do Not Send List");
281                     recipient.setLastResult(500);
282                     subscriber.setLastMessage("On Do Not Send List");
283                     subscriber.setLastResult(500);
284                     c.addChild(recipient);
285                     continue;
286                 }
287
288                 //if this recipient already got the email
289
List JavaDoc l = UserCommentsFactory.getUserCommentsByComm(subscriber.getInode(), comm.getInode());
290                 
291                 if (recipient.getInode() > 0 || l.size() > 0)
292                 {
293                     Logger.debug(EmailFactory.class,"Already got this email:" + recipient.getEmail());
294                     if (!c.isSendEmail()) {
295                         continue;
296                     }
297                 }
298
299                 recipient.setEmail(member.getEmailAddress());
300                 recipient.setName(member.getFirstName());
301                 recipient.setLastname(member.getLastName());
302
303                 recipient.setSent(new java.util.Date JavaDoc());
304                 InodeFactory.saveInode(recipient);
305
306                 deliveryThread.setRecipient(recipient);
307                 deliveryThread.setAttachments(attachments);
308                 deliveryThread.setCampaign(c);
309                 deliveryThread.setSubscriber(member);
310                 deliveryThread.setAlternateTextMessage(alternateTextMessage);
311                 deliveryThread.setMessage(message);
312                 deliveryThread.setHtml(html);
313                 deliveryThread.start();
314                 
315                 long sleepTime = 10;
316                 if(UtilMethods.isSet(send_per_hour) && !send_per_hour.equals("unlimited"))
317                 {
318                     sleepTime = 3600000 / Integer.parseInt(send_per_hour);
319                 }
320                 try
321                 {
322                     Thread.sleep(sleepTime);
323                 }
324                 catch(Exception JavaDoc t)
325                 {
326                     t.printStackTrace();
327                 }
328             }
329             c.setCompletedDate(new java.util.Date JavaDoc());
330             c.setLocked(false);
331             attachments = null;
332             message = null;
333             InodeFactory.saveInode(c);
334             Logger.debug(EmailFactory.class, "Camapign sent: " + c.getTitle());
335             
336         }
337     
338         /*
339          * Clean Up the threads
340          */

341         for (int j = 0; j < Config.getIntProperty("EMAIL_SENDING_THREADS", 10); j++)
342         {
343             deliverThreads.put("thread" + j, null);
344         }
345         // final clean up
346
deliverThreads = null;
347     }
348     
349
350
351
352     public static boolean sendForgotPassword(User user, String JavaDoc newPassword,
353             long hostId) {
354         // build a decent default context
355
Context context = new VelocityContext();
356         context.put("user", user);
357         context.put("UtilMethods", new UtilMethods());
358         context.put("language", "1");
359         context.put("password", newPassword);
360
361         StringWriter JavaDoc writer = new StringWriter JavaDoc();
362
363         long idInode = IdentifierCache.getPathFromIdCache(Config
364                 .getStringProperty("PATH_FORGOT_PASSWORD_EMAIL"), hostId).getInode();
365
366         HTMLPage page = (HTMLPage) IdentifierFactory.getLiveChildOfClass(
367                 InodeFactory.getInode(idInode, Identifier.class),
368                 HTMLPage.class);
369
370         try {
371             String JavaDoc message = "";
372             try {
373                 Template t = UtilMethods.getVelocityTemplate("live/"+ idInode+ "."+ Config.getStringProperty("VELOCITY_HTMLPAGE_EXTENSION"));
374                 t.merge(context, writer);
375                 Logger
376                         .debug(EmailFactory.class, "writer:"
377                                 + writer.getBuffer());
378                 message = writer.toString().trim();
379             } catch (ResourceNotFoundException ex) {
380                 message = "<center><b>And error has ocurred loading de message's page<b></center>";
381             }
382
383             Mailer m = new Mailer();
384             m.setToEmail(user.getEmailAddress());
385             m.setSubject(page.getTitle());
386             m.setHTMLBody(message);
387             m.setFromEmail(Config.getStringProperty("EMAIL_SYSTEM_ADDRESS"));
388             return m.sendMessage();
389         } catch (Exception JavaDoc e) {
390             Logger.warn(EmailFactory.class, e.toString(), e);
391             return false;
392         }
393
394     }
395
396     private static boolean isSubscribed(MailingList list, User s){
397         
398         UserProxy sub = (UserProxy) InodeFactory.getChildOfClassbyCondition(list, UserProxy.class, "user_id like '" + s.getUserId() + "'");
399
400         return (sub.getInode() > 0);
401     }
402
403 }
404
Popular Tags