KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > knowgate > hipermail > DraftsHelper


1 /*
2   Copyright (C) 2004 Know Gate S.L. All rights reserved.
3                       C/Oņa, 107 1š2 28050 Madrid (Spain)
4
5   Redistribution and use in source and binary forms, with or without
6   modification, are permitted provided that the following conditions
7   are met:
8
9   1. Redistributions of source code must retain the above copyright
10      notice, this list of conditions and the following disclaimer.
11
12   2. The end-user documentation included with the redistribution,
13      if any, must include the following acknowledgment:
14      "This product includes software parts from hipergate
15      (http://www.hipergate.org/)."
16      Alternately, this acknowledgment may appear in the software itself,
17      if and wherever such third-party acknowledgments normally appear.
18
19   3. The name hipergate must not be used to endorse or promote products
20      derived from this software without prior written permission.
21      Products derived from this software may not be called hipergate,
22      nor may hipergate appear in their name, without prior written
23      permission.
24
25   This library is distributed in the hope that it will be useful,
26   but WITHOUT ANY WARRANTY; without even the implied warranty of
27   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
28
29   You should have received a copy of hipergate License with this code;
30   if not, visit http://www.hipergate.org or mail to info@hipergate.org
31 */

32
33 package com.knowgate.hipermail;
34
35 import java.io.ByteArrayOutputStream JavaDoc;
36 import java.io.IOException JavaDoc;
37
38 import java.sql.SQLException JavaDoc;
39 import java.sql.PreparedStatement JavaDoc;
40 import java.sql.ResultSet JavaDoc;
41
42 import javax.mail.MessagingException JavaDoc;
43 import javax.mail.internet.MimeBodyPart JavaDoc;
44
45 import com.knowgate.debug.DebugFile;
46 import com.knowgate.jdc.JDCConnection;
47 import com.knowgate.misc.Gadgets;
48 import com.knowgate.dataobjs.DB;
49
50 /**
51  * @author Sergio Montoro Ten
52  * @version 1.0
53  */

54 public class DraftsHelper {
55   public DraftsHelper() {
56   }
57
58   // ----------------------------------------------------------------------------------------
59

60   public static DBMimeMessage draftMessage(DBFolder oDraftsFldr,
61                                     String JavaDoc sMailHost, String JavaDoc sGuWorkArea,
62                                     String JavaDoc sUserId, String JavaDoc sContentType)
63     throws SQLException JavaDoc,MessagingException JavaDoc,IOException JavaDoc {
64
65     if (DebugFile.trace) {
66       DebugFile.writeln("Begin DraftsHelper.draftMessage("+sMailHost+","+sGuWorkArea+","+sUserId+","+sContentType+")");
67       DebugFile.incIdent();
68     }
69
70     JDCConnection oConn = oDraftsFldr.getConnection();
71
72     java.sql.PreparedStatement JavaDoc oStmt;
73     java.sql.ResultSet JavaDoc oRSet;
74
75     com.knowgate.acl.ACLUser oUsr = new com.knowgate.acl.ACLUser();
76     oUsr.load(oConn, new Object JavaDoc[]{sUserId});
77
78     String JavaDoc sGuMsg = Gadgets.generateUUID();
79     String JavaDoc sGuFldr= oUsr.getMailFolder(oConn,"drafts");
80     String JavaDoc sFrom = oUsr.getStringNull(DB.nm_user,"")+" "+oUsr.getStringNull(DB.tx_surname1,"")+" "+oUsr.getStringNull(DB.tx_surname2,"");
81     String JavaDoc sIdMsg = "<"+sGuMsg+"."+oUsr.getStringNull(DB.tx_nickname,"")+"@"+sMailHost+">";
82
83     oConn.setAutoCommit(false);
84
85     oStmt = oConn.prepareStatement("SELECT MAX("+DB.pg_message+") FROM "+DB.k_mime_msgs+" WHERE "+DB.gu_category+"=?");
86     oStmt.setString (1,sGuFldr);
87     oRSet = oStmt.executeQuery();
88     oRSet.next();
89     java.math.BigDecimal JavaDoc oMax = oRSet.getBigDecimal(1);
90     if (oRSet.wasNull()) oMax = new java.math.BigDecimal JavaDoc(0);
91     oRSet.close();
92     oStmt.close();
93
94     oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_mime_msgs+" ("+DB.gu_mimemsg+","+DB.pg_message+","+DB.gu_workarea+","+DB.gu_category+","+DB.id_type+","+DB.id_message+","+DB.tx_subject+","+DB.tx_email_from+","+DB.tx_email_reply+","+DB.nm_from+","+DB.len_mimemsg+","+DB.bo_draft+","+DB.bo_deleted+") VALUES(?,?,?,?,?,?,?,?,?,?,0,1,0)");
95     oStmt.setString (1,sGuMsg);
96     oStmt.setBigDecimal (2,oMax.add(new java.math.BigDecimal JavaDoc(1)));
97     oStmt.setString (3,sGuWorkArea);
98     oStmt.setString (4,sGuFldr);
99     oStmt.setString (5,"text/"+sContentType+"; charset=utf-8");
100     oStmt.setString (6,sIdMsg);
101     oStmt.setString (7,"");
102     oStmt.setString (8,oUsr.getString(DB.tx_main_email));
103     oStmt.setString (9,oUsr.getString(DB.tx_main_email));
104     oStmt.setString (10,sFrom.trim());
105     oStmt.executeUpdate();
106     oStmt.close();
107
108     oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") VALUES (?,?,?,?,?)");
109     oStmt.setString (1,sGuMsg);
110     oStmt.setString (2,sIdMsg);
111     oStmt.setString (3,oUsr.getString(DB.tx_main_email));
112     oStmt.setString (4,"from");
113     oStmt.setString (5,sFrom);
114     oStmt.executeUpdate();
115     oStmt.close();
116
117     oConn.commit();
118
119     if (DebugFile.trace) {
120       DebugFile.decIdent();
121       DebugFile.writeln("End DraftsHelper.draftMessage()");
122     }
123
124     return oDraftsFldr.getMessageByGuid(sGuMsg);
125
126   } // draftMessage
127

128   // ----------------------------------------------------------------------------------------
129

130   public static DBMimeMessage draftMessageForReply(DBFolder oDraftsFldr,
131                                             String JavaDoc sMailHost, String JavaDoc sGuWorkArea,
132                                             String JavaDoc sUserId, DBFolder oOriginalFldr,
133                                             String JavaDoc sGuOriginalMsg, boolean bReplyAll,
134                                             String JavaDoc sContentType)
135     throws SQLException JavaDoc,MessagingException JavaDoc,IOException JavaDoc {
136
137     if (DebugFile.trace) {
138       DebugFile.writeln("Begin DraftsHelper.draftMessageForReply([DBStore],"+sMailHost+","+sGuWorkArea+","+sUserId+",[DBFolder],"+sGuOriginalMsg+")");
139       DebugFile.incIdent();
140     }
141
142     PreparedStatement JavaDoc oStmt;
143
144     JDCConnection oConn = oDraftsFldr.getConnection();
145
146     DBMimeMessage oDraft = draftMessage(oDraftsFldr, sMailHost, sGuWorkArea, sUserId, sContentType);
147
148     com.knowgate.acl.ACLUser oUsr = new com.knowgate.acl.ACLUser();
149     oUsr.load(oConn, new Object JavaDoc[]{sUserId});
150
151     String JavaDoc sIdMsg = "<"+oDraft.getMessageGuid()+"."+oUsr.getStringNull(DB.tx_nickname,"")+"@"+sMailHost+">";
152
153     DBMimeMessage oOrMsg = new DBMimeMessage(oOriginalFldr, sGuOriginalMsg);
154     DBInetAddr oFrom = (DBInetAddr) oOrMsg.getFromRecipient();
155
156     String JavaDoc sText;
157     if (sContentType.equals("html"))
158       sText = oOrMsg.tagBodyHtml();
159     else
160       sText = oOrMsg.tagBodyPlain();
161
162     MimeBodyPart JavaDoc oText = new MimeBodyPart JavaDoc();
163     oText.setContent(sText, "text/html");
164     java.io.ByteArrayOutputStream JavaDoc oBaStrm = new java.io.ByteArrayOutputStream JavaDoc(sText.length()*2+2);
165     oText.writeTo(oBaStrm);
166
167     oStmt = oConn.prepareStatement("UPDATE "+DB.k_mime_msgs+" SET "+DB.len_mimemsg+"=?"+","+DB.tx_subject+"=?,"+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"=?");
168     oStmt.setInt(1, oBaStrm.size());
169     oStmt.setString(2, oOrMsg.getSubject());
170     oStmt.setBinaryStream(3, new java.io.ByteArrayInputStream JavaDoc(oBaStrm.toByteArray()), oBaStrm.size());
171     oStmt.setString(4, oDraft.getMessageGuid());
172     oStmt.executeUpdate();
173     oStmt.close();
174
175     oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',"+DB.tx_email+",'to',"+DB.tx_personal+" FROM "+DB.k_inet_addrs+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.tp_recipient+"='from')");
176     oStmt.setString (1,sGuOriginalMsg);
177     oStmt.executeUpdate();
178     oStmt.close();
179
180     if (bReplyAll) {
181       oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',"+DB.tx_email+",'to',"+DB.tx_personal+" FROM "+DB.k_inet_addrs+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.tp_recipient+"='to')");
182       oStmt.setString (1,sGuOriginalMsg);
183       oStmt.executeUpdate();
184       oStmt.close();
185       oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',"+DB.tx_email+",'cc',"+DB.tx_personal+" FROM "+DB.k_inet_addrs+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.tp_recipient+"='cc')");
186       oStmt.setString (1,sGuOriginalMsg);
187       oStmt.executeUpdate();
188       oStmt.close();
189     }
190
191     oConn.commit();
192
193     if (DebugFile.trace) {
194       DebugFile.decIdent();
195       DebugFile.writeln("End DraftsHelper.draftMessageForReply()");
196     }
197
198     return oDraft;
199   } // draftMessageForReply
200

201   // ----------------------------------------------------------------------------------------
202

203   public static DBMimeMessage draftMessageForForward(DBFolder oDraftsFldr,
204                                               String JavaDoc sMailHost, String JavaDoc sGuWorkArea,
205                                               String JavaDoc sUserId, DBFolder oOriginalFldr,
206                                               String JavaDoc sGuOriginalMsg, String JavaDoc sContentType)
207     throws SQLException JavaDoc,MessagingException JavaDoc,IOException JavaDoc {
208
209     if (DebugFile.trace) {
210       DebugFile.writeln("Begin DraftsHelper.draftMessageForForward([DBStore],"+sMailHost+","+sGuWorkArea+","+sUserId+",[DBFolder],"+sGuOriginalMsg+","+sContentType+")");
211       DebugFile.incIdent();
212     }
213
214     PreparedStatement JavaDoc oStmt;
215     ResultSet JavaDoc oRSet;
216
217     JDCConnection oConn = oDraftsFldr.getConnection();
218
219     DBMimeMessage oDraft = draftMessage(oDraftsFldr, sMailHost, sGuWorkArea, sUserId, sContentType);
220
221     // Compose message id by concatenating guid, user nickname and mail host
222
com.knowgate.acl.ACLUser oUsr = new com.knowgate.acl.ACLUser();
223     oUsr.load(oConn, new Object JavaDoc[]{sUserId});
224
225     String JavaDoc sIdMsg = "<"+oDraft.getMessageGuid()+"."+oUsr.getStringNull(DB.tx_nickname,"")+"@"+sMailHost+">";
226
227     DBMimeMessage oOrMsg = new DBMimeMessage(oOriginalFldr, sGuOriginalMsg);
228     DBInetAddr oFrom = (DBInetAddr) oOrMsg.getFromRecipient();
229
230     String JavaDoc sText;
231     if (sContentType.equals("html"))
232       sText = oOrMsg.tagBodyHtml();
233     else
234       sText = oOrMsg.tagBodyPlain();
235
236     MimeBodyPart JavaDoc oText = new MimeBodyPart JavaDoc();
237     oText.setContent(sText, "text/html");
238     java.io.ByteArrayOutputStream JavaDoc oBaStrm = new java.io.ByteArrayOutputStream JavaDoc(sText.length()*2+2);
239     oText.writeTo(oBaStrm);
240
241     java.math.BigDecimal JavaDoc oPosition;
242     oStmt = oConn.prepareStatement("SELECT "+DB.nu_position+" FROM "+DB.k_mime_msgs+" WHERE "+DB.gu_mimemsg+"=?");
243     oStmt.setString(1, sGuOriginalMsg);
244     oRSet = oStmt.executeQuery();
245     if (oRSet.next())
246       oPosition = oRSet.getBigDecimal(1);
247     else
248       oPosition = null;
249     oRSet.close();
250     oRSet = null;
251     oStmt.close();
252     oStmt = null;
253
254     if (com.knowgate.debug.DebugFile.trace)
255       com.knowgate.debug.DebugFile.writeln("Connection.prepareStatement(UPDATE "+DB.k_mime_msgs+" SET "+DB.nu_position+"=?,"+DB.len_mimemsg+"=?"+","+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"='"+oDraft.getMessageGuid()+"')");
256
257     oStmt = oConn.prepareStatement("UPDATE "+DB.k_mime_msgs+" SET "+DB.nu_position+"=?,"+DB.len_mimemsg+"=?,"+DB.tx_subject+"=?,"+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"=?");
258     oStmt.setBigDecimal(1, oPosition);
259     oStmt.setInt(2, oBaStrm.size());
260     oStmt.setString(3, oOrMsg.getSubject());
261     oStmt.setBinaryStream(4, new java.io.ByteArrayInputStream JavaDoc(oBaStrm.toByteArray()), oBaStrm.size());
262     oStmt.setString(5, oDraft.getMessageGuid());
263     oStmt.executeUpdate();
264     oStmt.close();
265
266     if (com.knowgate.debug.DebugFile.trace)
267       com.knowgate.debug.DebugFile.writeln("Connection.prepareStatement(INSERT INTO "+DB.k_mime_parts+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.pg_message+","+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+","+DB.id_disposition+","+DB.id_encoding+","+DB.len_part+","+DB.de_part+","+DB.tx_md5+","+DB.file_name+","+DB.id_compression+","+DB.by_content+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',NULL,"+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+",'pointer',"+DB.id_encoding+","+DB.len_part+","+DB.file_name+","+DB.tx_md5+",'"+oOriginalFldr.getFilePath()+"',"+DB.id_compression+",NULL FROM "+DB.k_mime_parts+" WHERE "+DB.gu_mimemsg+"='"+sGuOriginalMsg+"'))");
268
269     oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_mime_parts+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.pg_message+","+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+","+DB.id_disposition+","+DB.id_encoding+","+DB.len_part+","+DB.de_part+","+DB.tx_md5+","+DB.file_name+","+DB.id_compression+","+DB.by_content+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',NULL,"+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+",'pointer',"+DB.id_encoding+","+DB.len_part+","+DB.file_name+","+DB.tx_md5+",'"+oOriginalFldr.getFilePath()+"',"+DB.id_compression+",NULL FROM "+DB.k_mime_parts+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.id_disposition+"='attachment')");
270     oStmt.setString (1,sGuOriginalMsg);
271     oStmt.executeUpdate();
272     oStmt.close();
273
274     oConn.commit();
275
276     if (DebugFile.trace) {
277       DebugFile.decIdent();
278       DebugFile.writeln("End DraftsHelper.draftMessageForForward()");
279     }
280
281     return oDraft;
282   } // draftMessageForForward
283

284   // ----------------------------------------------------------------------------------------
285

286   /**
287    *
288    * @param oConn JDCConnection
289    * @param iIdDomain int
290    * @param sGuWorkarea String
291    * @param sGuMsg String
292    * @param sIdMsg String
293    * @param sTxMailFrom String
294    * @param sTxMailReply String
295    * @param sNmFrom String
296    * @param sTxSubject String
297    * @param sContentType String
298    * @param sBody String
299    * @param aTo String[]
300    * @param aCc String[]
301    * @param aBcc String[]
302    * @throws UnsupportedDataTypeException
303    * @throws SQLException
304    * @throws MessagingException
305    * @throws IOException
306    */

307   public static void draftUpdate(JDCConnection oConn,
308                           int iIdDomain, String JavaDoc sGuWorkarea,
309                           String JavaDoc sGuMsg, String JavaDoc sIdMsg,
310                           String JavaDoc sTxMailFrom, String JavaDoc sTxMailReply, String JavaDoc sNmFrom,
311                           String JavaDoc sTxSubject, String JavaDoc sContentType, String JavaDoc sBody,
312                           String JavaDoc[] aTo, String JavaDoc[] aCc, String JavaDoc[] aBcc)
313     throws SQLException JavaDoc, MessagingException JavaDoc, IOException JavaDoc {
314
315     if (DebugFile.trace) {
316       DebugFile.writeln("Begin DraftsHelper.draftUpdate([JDCConnection],"+
317                         String.valueOf(iIdDomain)+","+sGuWorkarea+","+
318                         sGuMsg+","+sIdMsg+","+sTxMailFrom+","+sTxMailReply+","+
319                         sNmFrom+","+sTxSubject+","+sContentType+","+
320                         Gadgets.left(sBody,100)+", String[], String[], String[])");
321       DebugFile.incIdent();
322     }
323
324     String JavaDoc sAddr;
325     String JavaDoc sSQL = "UPDATE "+DB.k_mime_msgs+" SET "+DB.bo_draft+"=1,"+
326                   DB.tx_email_from+"=?,"+DB.tx_email_reply+"=?,"+DB.nm_from+"=?,"+
327                   DB.tx_subject+"=?,"+DB.id_type+"=?,"+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"=?";
328
329     if (DebugFile.trace) DebugFile.writeln("Connection.prepareStatement("+sSQL+")");
330
331     PreparedStatement JavaDoc oStmt = oConn.prepareStatement(sSQL);
332
333     oStmt.setString(1, sTxMailFrom);
334     oStmt.setString(2, sTxMailReply);
335     oStmt.setString(3, sNmFrom);
336     oStmt.setString(4, sTxSubject);
337     oStmt.setString(5, "text/"+sContentType+"; charset=utf-8");
338     MimeBodyPart JavaDoc oBody = new MimeBodyPart JavaDoc();
339     if (DebugFile.trace) DebugFile.writeln("MimeBodyPart.setContent(\""+Gadgets.left(sBody,255)+"\",\"text/"+sContentType+"; charset=utf-8\")");
340     if (sContentType.toLowerCase().startsWith("text/"))
341       oBody.setContent(sBody, sContentType+"; charset=utf-8");
342     else
343       oBody.setContent(sBody, "text/"+sContentType+"; charset=utf-8");
344     ByteArrayOutputStream JavaDoc oBodyStrm = new ByteArrayOutputStream JavaDoc((sBody.length()*2)+2);
345     oBody.writeTo(oBodyStrm);
346     oStmt.setBytes(6, oBodyStrm.toByteArray());
347     oStmt.setString(7, sGuMsg);
348     if (DebugFile.trace) DebugFile.writeln("PreparedStatement.executeUpdate()");
349     oStmt.executeUpdate();
350     oStmt.close();
351
352     RecipientsHelper.clearRecipientsForMessage(oConn, sGuMsg);
353
354     if (aTo!=null) {
355       if (DebugFile.trace) DebugFile.writeln("to recipients count is " + String.valueOf(aTo.length));
356       for (int t=0; t<aTo.length; t++) {
357         sAddr = aTo[t].trim();
358         if (sAddr.length()>0) {
359           DBInetAddr.write(oConn, iIdDomain, sGuWorkarea, sGuMsg, sIdMsg, aTo[t].trim(), "to", null);
360         }
361       } // next
362
} // fi
363
if (aCc!=null) {
364       if (DebugFile.trace) DebugFile.writeln("cc recipients count is " + String.valueOf(aCc.length));
365       for (int t=0; t<aCc.length; t++) {
366         sAddr = aCc[t].trim();
367         if (sAddr.length()>0) {
368           DBInetAddr.write(oConn, iIdDomain, sGuWorkarea, sGuMsg, sIdMsg, aCc[t].trim(), "cc", null);
369         }
370       } // next
371
} // fi
372
if (aBcc!=null) {
373       if (DebugFile.trace) DebugFile.writeln("bcc recipients count is " + String.valueOf(aBcc.length));
374       for (int t=0; t<aBcc.length; t++) {
375         sAddr = aBcc[t].trim();
376         if (sAddr.length()>0) {
377           DBInetAddr.write(oConn, iIdDomain, sGuWorkarea, sGuMsg, sIdMsg, aBcc[t].trim(), "bcc", null);
378         }
379       } // next
380
} // fi
381
if (DebugFile.trace) {
382       DebugFile.decIdent();
383       DebugFile.writeln("End DraftsHelper.draftUpdate");
384     }
385   } // draftUpdate
386
}
387
Popular Tags