KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mvnforum > admin > importexport > mvnforum > ImportMvnForum


1 /*
2  * $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/admin/importexport/mvnforum/ImportMvnForum.java,v 1.12 2006/04/14 17:36:29 minhnn Exp $
3  * $Author: minhnn $
4  * $Revision: 1.12 $
5  * $Date: 2006/04/14 17:36:29 $
6  *
7  * ====================================================================
8  *
9  * Copyright (C) 2002-2006 by MyVietnam.net
10  *
11  * All copyright notices regarding mvnForum MUST remain
12  * intact in the scripts and in the outputted HTML.
13  * The "powered by" text/logo with a link back to
14  * http://www.mvnForum.com and http://www.MyVietnam.net in
15  * the footer of the pages MUST remain visible when the pages
16  * are viewed on the internet or intranet.
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 2 of the License, or
21  * any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program; if not, write to the Free Software
30  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31  *
32  * Support can be obtained from support forums at:
33  * http://www.mvnForum.com/mvnforum/index
34  *
35  * Correspondence and Marketing Questions can be sent to:
36  * info at MyVietnam net
37  *
38  * @author: Igor Manic
39  */

40 package com.mvnforum.admin.importexport.mvnforum;
41
42 import java.io.*;
43 import java.util.Calendar JavaDoc;
44 import java.util.zip.ZipEntry JavaDoc;
45 import java.util.zip.ZipInputStream JavaDoc;
46
47 import javax.servlet.http.HttpServletRequest JavaDoc;
48 import javax.servlet.http.HttpServletResponse JavaDoc;
49
50 import com.mvnforum.MVNForumConfig;
51 import com.mvnforum.MVNForumGlobal;
52 import com.mvnforum.admin.ImportWebHelper;
53 import com.mvnforum.admin.importexport.SetParentRule;
54 import net.myvietnam.mvncore.exception.*;
55 import org.apache.commons.digester.Digester;
56 import org.apache.commons.logging.Log;
57 import org.apache.commons.logging.LogFactory;
58 import org.xml.sax.SAXException JavaDoc;
59
60 /**
61  * @author Igor Manic
62  * @version $Revision: 1.12 $, $Date: 2006/04/14 17:36:29 $
63  * <br/>
64  * <code>ImportMvnForum</code> class encapsulates processing
65  * of MVN Forum's XML or ZIP backups, and imports all the data into MVN Forum.
66  * For details see {@link #importXml(File, HttpServletRequest, HttpServletResponse, int, String, Calendar, String, boolean, int)}
67  * and {@link #importZip(File, HttpServletRequest, HttpServletResponse, int, String, Calendar, String, boolean, int)}
68  * <br/>
69  * This class cannot be instantiated.
70  */

71 public class ImportMvnForum extends ImportWebHelper {
72
73     /** Message log. */
74     private static Log log = LogFactory.getLog(ImportMvnForum.class);
75
76     /** Cannot instantiate. */
77     private ImportMvnForum() {
78     }
79
80
81 // =================================================================
82
// ===================== MAIN PUBLIC METHODS =======================
83
// =================================================================
84
/**
85      * This method performs processing of MVN Forum's XML backup file <code>importFile</code>
86      * and imports the data into the MVN Forum system. It clears the database
87      * and files, does neccessary setup (including startup of message output),
88      * and calls {@link #processXml(File, Calendar)} to do actual processing.<br/>
89      *
90      * @param importFile MVN Forum XML backup file to be imported.
91      * @param request Current session's <code>HttpServletRequest</code> object.
92      * @param response Current session's <code>HttpServletResponse</code> object.
93      * @param logonMemberID MemberID of user who is logged in, and who initiated import process.
94      * @param logonMemberName MemberName of user who is logged in, and who initiated import process.
95      * @param importTime The moment when import process was started.
96      * @param importIP From this IP address admin requested import.
97      * @param clearIfError Should it clear/reset the database in case of error.
98      * @param messageLevel What messages should be written to output during the process.
99      * For details see {@link com.mvnforum.MVNForumConfig#MESSAGE_LEVEL_ALL_MESSAGES},
100      * {@link com.mvnforum.MVNForumConfig#MESSAGE_LEVEL_IMPORTANT_MESSAGES} and
101      * {@link com.mvnforum.MVNForumConfig#MESSAGE_LEVEL_ONLY_ERRORS}.
102      *
103      * @exception ImportException If there is an error during the process. See {@link net.myvietnam.mvncore.exception.ImportException}.
104      */

105     public static void importXml(File importFile,
106            HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response,
107            int logonMemberID, String JavaDoc logonMemberName,
108            Calendar JavaDoc importTime, String JavaDoc importIP,
109            boolean clearIfError, int messageLevel)
110     throws ImportException {
111         try {
112             response.setContentType("text/html; charset=utf-8");
113             setOutputHtmlWriter(response.getWriter());
114             setMessageOutputLevel(messageLevel);
115             startHtml(request);
116             clearDatabase();
117             clearFiles(request.getSession().getServletContext());
118         } catch (DatabaseException e) {
119             handleFatalError("Database error while clearing previous contents.",
120                              e, clearIfError, request);
121         } catch (IOException e) {
122             handleFatalError("I/O error while clearing previous contents.",
123                              e, clearIfError, request);
124         }
125
126         try {
127             processXml(importFile, importTime);
128             handleSuccess(request);
129         } catch (ImportException e) {
130             handleFatalError(e.getMessage(), e.getException(),
131                              clearIfError, request);
132         } catch (IOException e) {
133             handleFatalError("I/O error while reading XML file.",
134                              e, clearIfError, request);
135         } catch (SAXException JavaDoc e) {
136             if (e.getException()==null) {
137                 handleFatalError("Error while parsing uploaded XML file.",
138                                  e, clearIfError, request);
139             } else {
140                 handleFatalError("Error while parsing uploaded XML file. Detail: "+
141                                  e.getException().getMessage(), e.getException(),
142                                  clearIfError, request);
143             }
144         } finally {
145             /* Don't delete this XML since this method was maybe started from the
146              * command-line, which means this file is not temporary (uploaded)
147              * //if ((importFile!=null) && (importFile.exists())) importFile.delete();
148              * Anyway, if neccessary, this XML will be deleted in calling WebHandler
149              */

150         }
151     }
152
153     /**
154      * This method performs processing of MVN Forum's ZIP backup file <code>importFile</code>
155      * and imports the data into the MVN Forum system. It clears the database
156      * and files, does neccessary setup (including startup of message output),
157      * extracts the files from ZIP, and calls {@link #processXml(File, Calendar)}
158      * to do actual processing of the main XML file (found in ZIP).<br/>
159      *
160      * @param importFile MVN Forum ZIP backup file to be imported.
161      * @param request Current session's <code>HttpServletRequest</code> object.
162      * @param response Current session's <code>HttpServletResponse</code> object.
163      * @param logonMemberID MemberID of user who is logged in, and who initiated import process.
164      * @param logonMemberName MemberName of user who is logged in, and who initiated import process.
165      * @param importTime The moment when import process was started.
166      * @param importIP From this IP address admin requested import.
167      * @param clearIfError If <code>true</code>, the database will be cleared/reset
168      * in case of error rises during the import. Default <code>Guest</code>
169      * and <code>Admin</code> users will be created.
170      * @param messageLevel What amount of messages (informational, important, error)
171      * will be written to output.
172      *
173      * @exception ImportException If there is an error during the process. See {@link net.myvietnam.mvncore.exception.ImportException}.
174      */

175     public static void importZip(File importFile,
176            HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response,
177            int logonMemberID, String JavaDoc logonMemberName,
178            Calendar JavaDoc importTime, String JavaDoc importIP,
179            boolean clearIfError, int messageLevel)
180     throws ImportException {
181         File importXml=null;
182         try {
183             response.setContentType("text/html; charset=utf-8");
184             setOutputHtmlWriter(response.getWriter());
185             setMessageOutputLevel(messageLevel);
186             startHtml(request);
187             clearDatabase();
188             clearFiles(request.getSession().getServletContext());
189         } catch (DatabaseException e) {
190             handleFatalError("Database error while clearing previous contents.",
191                              e, clearIfError, request);
192         } catch (IOException e) {
193             handleFatalError("I/O error while clearing previous contents.",
194                              e, clearIfError, request);
195         }
196
197        /* Now extract ZIP file into mvnForumHome, and give me back only XML file.
198         * IMPORTANT: DON'T CALL clearFiles() AFTER THE EXTRACTION OF THE ZIP!
199         * Otherwise, all extracted files will be deleted too
200         */

201        try {
202            addImportantMessage("Extracting the ZIP file.");
203            importXml=extractImportZip(importFile, request);
204            if (importXml==null) {
205                handleFatalError("Error while extracting the file: can't find IMPORT.xml in ZIP file.",
206                                 null/*error*/, clearIfError, request);
207            }
208        } catch (IOException e) {
209            handleFatalError("I/O error while extracting the file.",
210                             e, clearIfError, request);
211        } finally {
212            importFile.delete(); importFile=null;
213        }
214
215        //from this point on, use only importXml file (importFile is deleted)
216
try {
217            processXml(importXml, importTime);
218            handleSuccess(request);
219        } catch (ImportException e) {
220            handleFatalError(e.getMessage(), e.getException(),
221                             clearIfError, request);
222        } catch (IOException e) {
223            handleFatalError("I/O error while reading XML file.",
224                             e, clearIfError, request);
225        } catch (SAXException JavaDoc e) {
226            if (e.getException()==null) {
227                handleFatalError("Error while parsing uploaded XML file.",
228                                 e, clearIfError, request);
229            } else {
230                handleFatalError("Error while parsing uploaded XML file. Detail: "+
231                                 e.getException().getMessage(), e.getException(),
232                                 clearIfError, request);
233            }
234        } finally {
235            //now delete temporary XML file (extracted from ZIP, and already imported to database)
236
if ((importFile!=null) && (importFile.exists())) importFile.delete();
237            if ((importXml!=null) && (importXml.exists())) importXml.delete();
238        }
239     }
240
241     /**
242      * This method should unpack the zip into mvnForumHome.
243      * It should also return importXml file (which was also extracted)
244      */

245     private static File extractImportZip(File importZipFile, HttpServletRequest JavaDoc request)
246     throws IOException {
247         String JavaDoc avatarsDir = request.getSession().getServletContext().getRealPath(MVNForumGlobal.UPLOADED_AVATAR_DIR);
248         String JavaDoc attachsDir = MVNForumConfig.getAttachmentDir();
249         String JavaDoc mvnForumHomeDir = MVNForumConfig.getMVNForumHome();
250         if (! new File(avatarsDir).mkdirs()) {
251             /* Ignore, since this error will also happen when the directory
252              * already exists, which is probably the case here, since we
253              * didn't remove it in clearFiles() process.
254              */

255         }
256         if (! new File(attachsDir).mkdirs()) {
257             /* Ignore, since this error will also happen when the directory
258              * already exists, which is probably the case here, since we
259              * didn't remove it in clearFiles() process.
260              */

261         }
262         if (!avatarsDir.endsWith(File.separator)) avatarsDir+=File.separator;
263         if (!attachsDir.endsWith(File.separator)) attachsDir+=File.separator;
264         if (!mvnForumHomeDir.endsWith(File.separator)) mvnForumHomeDir+=File.separator;
265
266         ZipInputStream JavaDoc zipInputStream = new ZipInputStream JavaDoc(new FileInputStream(importZipFile));
267         File foundXmlFile = null;
268         while (true) {
269             // Get the next ZIP entry. Break out of the loop if there are no more.
270
ZipEntry JavaDoc zipEntry = zipInputStream.getNextEntry();
271             if (zipEntry==null) break;
272             // Read data from the ZIP entry. The read() method will return -1 when there are no more data to read.
273
String JavaDoc srcName=zipEntry.getName();
274             String JavaDoc destPath = mvnForumHomeDir+srcName; //temp value; it'll be changed
275
//for directory name comparisons, don't use String.startsWith() since it doesn't ignore char case (and we need that)
276
if ((srcName.length()>=MVNForumConfig.BACKUP_FILE_AvatarsDirNameInZip.length()) && (srcName.substring(0, MVNForumConfig.BACKUP_FILE_AvatarsDirNameInZip.length()).equalsIgnoreCase(MVNForumConfig.BACKUP_FILE_AvatarsDirNameInZip))) {
277                 //addImportantMessage("Extracting \""+MVNForumConfig.BACKUP_FILE_AvatarsDirNameInZip+"\" from the backup ZIP file.");
278
try {
279                     String JavaDoc thisAvatar=srcName.substring(MVNForumConfig.BACKUP_FILE_AvatarsDirNameInZip.length(), srcName.length());
280                     //now calculate destPath, but ignore avatarsDir itself, since it's already created
281
if (thisAvatar.length()<=0) destPath=null;
282                     else destPath=avatarsDir+thisAvatar.replace('/', File.separatorChar);
283                 } catch (StringIndexOutOfBoundsException JavaDoc e) {
284                     //it's probably the "AVATARS/" entry itself, so thisAvatar is empty
285
destPath=null;
286                 }
287             } else if ((srcName.length()>=MVNForumConfig.BACKUP_FILE_AttachsDirNameInZip.length()) && (srcName.substring(0, MVNForumConfig.BACKUP_FILE_AttachsDirNameInZip.length()).equalsIgnoreCase(MVNForumConfig.BACKUP_FILE_AttachsDirNameInZip))) {
288                 //addImportantMessage("Extracting \""+MVNForumConfig.BACKUP_FILE_AttachsDirNameInZip+"\" from the backup ZIP file.");
289
try {
290                     String JavaDoc thisAttach=srcName.substring(MVNForumConfig.BACKUP_FILE_AttachsDirNameInZip.length(), srcName.length());
291                     //now calculate destPath, but ignore attachsDir itself, since it's already created
292
if (thisAttach.length()<=0) destPath=null;
293                     else destPath=attachsDir+thisAttach.replace('/', File.separatorChar);
294                 } catch (StringIndexOutOfBoundsException JavaDoc e) {
295                     //it's probably the "ATTACHMENTS/" entry itself, so thisAttach is empty
296
destPath=null;
297                 }
298             } else {
299                 //it isn't neither avatar nor attachment, so don't process/replace path
300
destPath=mvnForumHomeDir+srcName.replace('/', File.separatorChar);
301             }
302             if ((destPath!=null) && (destPath.length()>0)) {
303                 File destFile=new File(destPath);
304                 if (zipEntry.isDirectory()) {
305                     addMessage("Extracting directory \"" +srcName +"\".");
306                     destFile.mkdirs();
307                 } else {
308                     addMessage("Extracting file \"" +srcName +"\", size=" +zipEntry.getSize()+".");
309                     FileOutputStream outStream = new FileOutputStream(destFile);
310                     byte[] buffer = new byte[1024];
311                     int n;
312                     while ((n = zipInputStream.read(buffer)) > 0) {
313                         outStream.write(buffer, 0, n);
314                     }
315                     outStream.close(); outStream=null;
316                     if (srcName.equalsIgnoreCase(MVNForumConfig.BACKUP_FILE_MainXmlFileNameInZip) || srcName.equalsIgnoreCase("/"+MVNForumConfig.BACKUP_FILE_MainXmlFileNameInZip)) {
317                         foundXmlFile=destFile;
318                     }
319                 }
320             }
321             zipInputStream.closeEntry();
322         }
323         zipInputStream.close();
324         return foundXmlFile;
325         //this method doesn't matter if IMPORT.xml doesn't exist - it will return null, and
326
//the caller method should decide what to do then
327
}
328
329
330 // =================================================================
331
// ================== MAIN PROCESSING XML METHOD ===================
332
// =================================================================
333
/**
334      * This method performs actual processing of MVN Forum's XML file <code>inputFile</code>
335      * and imports the data into the MVN Forum system.<br/>
336      * Don't use this method directly. Instead, you should use
337      * {@link #importXml(File, HttpServletRequest, HttpServletResponse, int, String, Calendar, String, boolean, int)}.
338      *
339      * @param inputFile MVN Forum XML file to be imported.
340      * @param importTime The moment when import process was started.
341      *
342      * @exception IOException If there is an I/O error while processing XML file.
343      * @exception SAXException If there is an error while parsing XML file.
344      * @exception ImportException If there is some other error during the import.
345      */

346     protected static void processXml(File inputFile, Calendar JavaDoc importTime)
347         throws IOException, SAXException JavaDoc, ImportException {
348         addImportantMessage("Starting importing database info...");
349
350         //SAXParserFactory factory=SAXParserFactory.newInstance();
351
Digester digester=new Digester();
352         //should try new Digester(SAXParser), or Digester(XMLReader)
353
digester.setValidating(true);
354         digester.setNamespaceAware(true);
355         //digester.setSchema("mvn.xsd");
356

357         /* =================================================================
358          * This is the main part of file - XML processing rules for Digester
359          * =================================================================
360          *
361          * NOTE: Since SetTopRule is firing the desired method at the end of
362          * the XML element matching the pattern, I had to implement my own
363          * SetParentRule which does exactly the same thing (calls desired
364          * child's method with a parent object as an argument). The difference
365          * is that it is firing the "setParent" method at the beginning of the
366          * corresponding XML element, thus leaving me the chance to, for example,
367          * create messages as they arrive from the XML parser, not waiting the
368          * end of the whole document (!!!), because I can't add a message, unless
369          * I already added it's parent messages, thread, forum and category.
370          *
371          * NOTE: In SetPropertiesRule (see attachment processing below), I had to
372          * define setAttachmentId() instead of setAttachmentID(), to avoid some
373          * strange problems that Digester has (because it tries to automatically
374          * convert all words to first letter capital, other small, and it
375          * doesn't handle well the case with "attachmentID" property, that is,
376          * it doesn't "see" setAttachmentID() method).
377          * So, I defined attachmentId property and method setAttachmentId() is
378          * then executed OK.
379          */

380
381         /* First, I'll create root object of class MvnForumXML.
382          * It's constructor will create default contents of the database, including
383          * admin member (with MemberID=1, MemberName="Admin", MemberPassword="admin").
384          * Later, if I find admin in XML, I'll just rewrite this default's admin data,
385          * except for the MemberName which has to remain "Admin" and can't be changed.
386          */

387         digester.addObjectCreate("mvnforum", MvnForumXML.class);
388         digester.addSetProperties("mvnforum", "version", "mvnForumXmlVersion");
389         digester.addSetProperties("mvnforum", "exportDate", "mvnForumExportDate");
390
391
392         digester.addCallMethod("mvnforum/MemberList", "postProcessMemberList");
393         digester.addObjectCreate("mvnforum/MemberList/Member", MvnForumMemberXML.class);
394         digester.addSetProperties("mvnforum/MemberList/Member", "class", "memberClass");
395         digester.addCallMethod("mvnforum/MemberList/Member", "addMember");
396         digester.addCallMethod("mvnforum/MemberList/Member/MemberName", "setMemberName", 0);
397         digester.addCallMethod("mvnforum/MemberList/Member/MemberPassword", "setMemberPassword", 0);
398         digester.addCallMethod("mvnforum/MemberList/Member/MemberFirstEmail", "setMemberFirstEmail", 0);
399         digester.addCallMethod("mvnforum/MemberList/Member/MemberEmail", "setMemberEmail", 0);
400         digester.addCallMethod("mvnforum/MemberList/Member/MemberEmailVisible", "setMemberEmailVisible", 0);
401         digester.addCallMethod("mvnforum/MemberList/Member/MemberNameVisible", "setMemberNameVisible", 0);
402         digester.addCallMethod("mvnforum/MemberList/Member/MemberFirstIP", "setMemberFirstIP", 0);
403         digester.addCallMethod("mvnforum/MemberList/Member/MemberLastIP", "setMemberLastIP", 0);
404         digester.addCallMethod("mvnforum/MemberList/Member/MemberViewCount", "setMemberViewCount", 0);
405         digester.addCallMethod("mvnforum/MemberList/Member/MemberPostCount", "setMemberPostCount", 0);
406         digester.addCallMethod("mvnforum/MemberList/Member/MemberCreationDate", "setMemberCreationDate", 0);
407         digester.addCallMethod("mvnforum/MemberList/Member/MemberModifiedDate", "setMemberModifiedDate", 0);
408         digester.addCallMethod("mvnforum/MemberList/Member/MemberExpireDate", "setMemberExpireDate", 0);
409         //log.debug("DIGESTER:::: [ OK ]" + "mvnforum/MemberList/Member/MemberExpireDate");
410
digester.addCallMethod("mvnforum/MemberList/Member/MemberLastLogon", "setMemberLastLogon", 0);
411         digester.addCallMethod("mvnforum/MemberList/Member/MemberOption", "setMemberOption", 0);
412         digester.addCallMethod("mvnforum/MemberList/Member/MemberStatus", "setMemberStatus", 0);
413         digester.addCallMethod("mvnforum/MemberList/Member/MemberActivateCode", "setMemberActivateCode", 0);
414         digester.addCallMethod("mvnforum/MemberList/Member/MemberTempPassword", "setMemberTempPassword", 0);
415         digester.addCallMethod("mvnforum/MemberList/Member/MemberMessageCount", "setMemberMessageCount", 0);
416         digester.addCallMethod("mvnforum/MemberList/Member/MemberMessageOption", "setMemberMessageOption", 0);
417         digester.addCallMethod("mvnforum/MemberList/Member/MemberPostsPerPage", "setMemberPostsPerPage", 0);
418         digester.addCallMethod("mvnforum/MemberList/Member/MemberWarnCount", "setMemberWarnCount", 0);
419         digester.addCallMethod("mvnforum/MemberList/Member/MemberVoteCount", "setMemberVoteCount", 0);
420         digester.addCallMethod("mvnforum/MemberList/Member/MemberVoteTotalStars", "setMemberVoteTotalStars", 0);
421         digester.addCallMethod("mvnforum/MemberList/Member/MemberRewardPoints", "setMemberRewardPoints", 0);
422         digester.addCallMethod("mvnforum/MemberList/Member/MemberTitle", "setMemberTitle", 0);
423         digester.addCallMethod("mvnforum/MemberList/Member/MemberTimeZone", "setMemberTimeZone", 0);
424         digester.addCallMethod("mvnforum/MemberList/Member/MemberSignature", "setMemberSignature", 0);
425         digester.addCallMethod("mvnforum/MemberList/Member/MemberAvatar", "setMemberAvatar", 0);
426         digester.addCallMethod("mvnforum/MemberList/Member/MemberSkin", "setMemberSkin", 0);
427         digester.addCallMethod("mvnforum/MemberList/Member/MemberLanguage", "setMemberLanguage", 0);
428         digester.addCallMethod("mvnforum/MemberList/Member/MemberFirstname", "setMemberFirstname", 0);
429         digester.addCallMethod("mvnforum/MemberList/Member/MemberLastname", "setMemberLastname", 0);
430         digester.addCallMethod("mvnforum/MemberList/Member/MemberGender", "setMemberGender", 0);
431         digester.addCallMethod("mvnforum/MemberList/Member/MemberBirthday", "setMemberBirthday", 0);
432         digester.addCallMethod("mvnforum/MemberList/Member/MemberAddress", "setMemberAddress", 0);
433         digester.addCallMethod("mvnforum/MemberList/Member/MemberCity", "setMemberCity", 0);
434         digester.addCallMethod("mvnforum/MemberList/Member/MemberState", "setMemberState", 0);
435         digester.addCallMethod("mvnforum/MemberList/Member/MemberCountry", "setMemberCountry", 0);
436         digester.addCallMethod("mvnforum/MemberList/Member/MemberPhone", "setMemberPhone", 0);
437         digester.addCallMethod("mvnforum/MemberList/Member/MemberMobile", "setMemberMobile", 0);
438         digester.addCallMethod("mvnforum/MemberList/Member/MemberFax", "setMemberFax", 0);
439         digester.addCallMethod("mvnforum/MemberList/Member/MemberCareer", "setMemberCareer", 0);
440         digester.addCallMethod("mvnforum/MemberList/Member/MemberHomepage", "setMemberHomepage", 0);
441         digester.addCallMethod("mvnforum/MemberList/Member/MemberYahoo", "setMemberYahoo", 0);
442         digester.addCallMethod("mvnforum/MemberList/Member/MemberAol", "setMemberAol", 0);
443         digester.addCallMethod("mvnforum/MemberList/Member/MemberIcq", "setMemberIcq", 0);
444         digester.addCallMethod("mvnforum/MemberList/Member/MemberMsn", "setMemberMsn", 0);
445         digester.addCallMethod("mvnforum/MemberList/Member/MemberCoolLink1", "setMemberCoolLink1", 0);
446         digester.addCallMethod("mvnforum/MemberList/Member/MemberCoolLink2", "setMemberCoolLink2", 0);
447
448         digester.addCallMethod("mvnforum/MemberList/Member/GlobalPermissionList/GlobalPermission", "addMemberPermission", 0);
449
450         digester.addCallMethod("mvnforum/MemberList/Member/MessageFolderList/MessageFolder", "addMessageFolder", 4);
451         digester.addCallParam("mvnforum/MemberList/Member/MessageFolderList/MessageFolder/FolderName", 0);
452         digester.addCallParam("mvnforum/MemberList/Member/MessageFolderList/MessageFolder/FolderOrder", 1);
453         digester.addCallParam("mvnforum/MemberList/Member/MessageFolderList/MessageFolder/FolderCreationDate", 2);
454         digester.addCallParam("mvnforum/MemberList/Member/MessageFolderList/MessageFolder/FolderModifiedDate", 3);
455
456         digester.addCallMethod("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch", "addGlobalWatch", 6);
457         digester.addCallParam("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch/WatchType", 0);
458         digester.addCallParam("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch/WatchOption", 1);
459         digester.addCallParam("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch/WatchStatus", 2);
460         digester.addCallParam("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch/WatchCreationDate", 3);
461         digester.addCallParam("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch/WatchLastSentDate", 4);
462         digester.addCallParam("mvnforum/MemberList/Member/GlobalWatchList/GlobalWatch/WatchEndDate", 5);
463
464
465         digester.addCallMethod("mvnforum/GroupList", "postProcessGroupList");
466         digester.addObjectCreate("mvnforum/GroupList/Group", MvnForumGroupXML.class);
467         digester.addSetProperties("mvnforum/GroupList/Group", "class", "groupClass");
468         digester.addCallMethod("mvnforum/GroupList/Group", "addGroup");
469         digester.addCallMethod("mvnforum/GroupList/Group/GroupOwnerName", "setGroupOwnerName", 0);
470         digester.addCallMethod("mvnforum/GroupList/Group/GroupName", "setGroupName", 0);
471         digester.addCallMethod("mvnforum/GroupList/Group/GroupDesc", "setGroupDesc", 0);
472         digester.addCallMethod("mvnforum/GroupList/Group/GroupOption", "setGroupOption", 0);
473         digester.addCallMethod("mvnforum/GroupList/Group/GroupCreationDate", "setGroupCreationDate", 0);
474         digester.addCallMethod("mvnforum/GroupList/Group/GroupModifiedDate", "setGroupModifiedDate", 0);
475
476         digester.addCallMethod("mvnforum/GroupList/Group/GlobalPermissionList/GlobalPermission", "addGroupPermission", 0);
477
478         digester.addCallMethod("mvnforum/GroupList/Group/GroupMemberList/GroupMember", "addGroupMember", 4);
479         digester.addCallParam("mvnforum/GroupList/Group/GroupMemberList/GroupMember/MemberName", 0);
480         digester.addCallParam("mvnforum/GroupList/Group/GroupMemberList/GroupMember/Privilege", 1);
481         digester.addCallParam("mvnforum/GroupList/Group/GroupMemberList/GroupMember/CreationDate", 2);
482         digester.addCallParam("mvnforum/GroupList/Group/GroupMemberList/GroupMember/ModifiedDate", 3);
483
484
485         //digester.addCallMethod("mvnforum/GuestGlobalPermissionList/GlobalPermission", "addGuestGlobalPermission", 0);
486
//digester.addCallMethod("mvnforum/RegisteredMembersGlobalPermissionList/GlobalPermission", "addRegisteredMembersGlobalPermission", 0);
487

488
489         digester.addObjectCreate("*/Category", MvnForumCategoryXML.class);
490         //digester.addSetTop("*/Category", "setParentCategoryIfHave");
491
SetParentRule categoryParentRule = new SetParentRule("setParentCategoryIfHave");
492         digester.addRule("*/Category", categoryParentRule);
493         digester.addCallMethod("*/Category", "addCategory");
494         digester.addCallMethod("*/Category/CategoryName", "setCategoryName", 0);
495         digester.addCallMethod("*/Category/CategoryDesc", "setCategoryDesc", 0);
496         digester.addCallMethod("*/Category/CategoryCreationDate", "setCategoryCreationDate", 0);
497         digester.addCallMethod("*/Category/CategoryModifiedDate", "setCategoryModifiedDate", 0);
498         digester.addCallMethod("*/Category/CategoryOrder", "setCategoryOrder", 0);
499         digester.addCallMethod("*/Category/CategoryOption", "setCategoryOption", 0);
500         digester.addCallMethod("*/Category/CategoryStatus", "setCategoryStatus", 0);
501
502         digester.addCallMethod("*/Category/CategoryWatchList/CategoryWatch", "addCategoryWatch", 7);
503         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/MemberName", 0);
504         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/WatchType", 1);
505         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/WatchOption", 2);
506         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/WatchStatus", 3);
507         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/WatchCreationDate", 4);
508         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/WatchLastSentDate", 5);
509         digester.addCallParam("*/Category/CategoryWatchList/CategoryWatch/WatchEndDate", 6);
510
511
512         digester.addObjectCreate("*/Forum", MvnForumForumXML.class);
513         digester.addCallMethod("*/Forum", "addForum");
514         //digester.addSetTop("*/Forum", "setParentCategory");
515
SetParentRule forumParentRule = new SetParentRule("setParentCategory");
516         digester.addRule("*/Forum", forumParentRule);
517         digester.addCallMethod("*/Forum/LastPostMemberName", "setForumLastPostMemberName", 0);
518         digester.addCallMethod("*/Forum/ForumName", "setForumName", 0);
519         digester.addCallMethod("*/Forum/ForumDesc", "setForumDesc", 0);
520         digester.addCallMethod("*/Forum/ForumCreationDate", "setForumCreationDate", 0);
521         digester.addCallMethod("*/Forum/ForumModifiedDate", "setForumModifiedDate", 0);
522         digester.addCallMethod("*/Forum/ForumLastPostDate", "setForumLastPostDate", 0);
523         digester.addCallMethod("*/Forum/ForumOrder", "setForumOrder", 0);
524         digester.addCallMethod("*/Forum/ForumType", "setForumType", 0);
525         digester.addCallMethod("*/Forum/ForumFormatOption", "setForumFormatOption", 0);
526         digester.addCallMethod("*/Forum/ForumOption", "setForumOption", 0);
527         digester.addCallMethod("*/Forum/ForumStatus", "setForumStatus", 0);
528         digester.addCallMethod("*/Forum/ForumModerationMode", "setForumModerationMode", 0);
529         digester.addCallMethod("*/Forum/ForumPassword", "setForumPassword", 0);
530         digester.addCallMethod("*/Forum/ForumThreadCount", "setForumThreadCount", 0);
531         digester.addCallMethod("*/Forum/ForumPostCount", "setForumPostCount", 0);
532
533         digester.addCallMethod("*/Forum/MemberForumPermissionList/MemberForumPermission", "addMemberForumPermission", 2);
534         digester.addCallParam("*/Forum/MemberForumPermissionList/MemberForumPermission/MemberName", 0);
535         digester.addCallParam("*/Forum/MemberForumPermissionList/MemberForumPermission/ForumPermission", 1);
536
537         digester.addCallMethod("*/Forum/GroupForumPermissionList/GroupForumPermission", "addGroupForumPermission", 2);
538         digester.addCallParam("*/Forum/GroupForumPermissionList/GroupForumPermission/GroupName", 0);
539         digester.addCallParam("*/Forum/GroupForumPermissionList/GroupForumPermission/ForumPermission", 1);
540
541         //digester.addCallMethod("*/Forum/GuestForumPermissionList/ForumPermission", "addGuestForumPermission", 0);
542
//digester.addCallMethod("*/Forum/RegisteredMembersForumPermissionList/ForumPermission", "addRegisteredMembersForumPermission", 0);
543

544         digester.addCallMethod("*/Forum/ForumWatchList/ForumWatch", "addForumWatch", 7);
545         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/MemberName", 0);
546         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/WatchType", 1);
547         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/WatchOption", 2);
548         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/WatchStatus", 3);
549         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/WatchCreationDate", 4);
550         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/WatchLastSentDate", 5);
551         digester.addCallParam("*/Forum/ForumWatchList/ForumWatch/WatchEndDate", 6);
552
553
554         digester.addObjectCreate("*/Thread", MvnForumThreadXML.class);
555         //digester.addSetTop("*/Thread", "setParentForum");
556
SetParentRule threadParentRule = new SetParentRule("setParentForum");
557         digester.addRule("*/Thread", threadParentRule);
558         digester.addCallMethod("*/Thread", "addThread");
559         digester.addCallMethod("*/Thread/MemberName", "setThreadMemberName", 0);
560         digester.addCallMethod("*/Thread/LastPostMemberName", "setThreadLastPostMemberName", 0);
561         digester.addCallMethod("*/Thread/ThreadTopic", "setThreadTopic", 0);
562         digester.addCallMethod("*/Thread/ThreadBody", "setThreadBody", 0);
563         digester.addCallMethod("*/Thread/ThreadVoteCount", "setThreadVoteCount", 0);
564         digester.addCallMethod("*/Thread/ThreadVoteTotalStars", "setThreadVoteTotalStars", 0);
565         digester.addCallMethod("*/Thread/ThreadCreationDate", "setThreadCreationDate", 0);
566         digester.addCallMethod("*/Thread/ThreadLastPostDate", "setThreadLastPostDate", 0);
567         digester.addCallMethod("*/Thread/ThreadType", "setThreadType", 0);
568         digester.addCallMethod("*/Thread/ThreadOption", "setThreadOption", 0);
569         digester.addCallMethod("*/Thread/ThreadStatus", "setThreadStatus", 0);
570         digester.addCallMethod("*/Thread/ThreadHasPoll", "setThreadHasPoll", 0);
571         digester.addCallMethod("*/Thread/ThreadViewCount", "setThreadViewCount", 0);
572         digester.addCallMethod("*/Thread/ThreadReplyCount", "setThreadReplyCount", 0);
573         digester.addCallMethod("*/Thread/ThreadIcon", "setThreadIcon", 0);
574         digester.addCallMethod("*/Thread/ThreadDuration", "setThreadDuration", 0);
575
576         digester.addCallMethod("*/Thread/ThreadWatchList/ThreadWatch", "addThreadWatch", 7);
577         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/MemberName", 0);
578         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/WatchType", 1);
579         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/WatchOption", 2);
580         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/WatchStatus", 3);
581         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/WatchCreationDate", 4);
582         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/WatchLastSentDate", 5);
583         digester.addCallParam("*/Thread/ThreadWatchList/ThreadWatch/WatchEndDate", 6);
584
585         digester.addCallMethod("*/Thread/FavoriteThreadList/FavoriteThread", "addFavoriteThread", 5);
586         digester.addCallParam("*/Thread/FavoriteThreadList/FavoriteThread/MemberName", 0);
587         digester.addCallParam("*/Thread/FavoriteThreadList/FavoriteThread/FavoriteCreationDate", 1);
588         digester.addCallParam("*/Thread/FavoriteThreadList/FavoriteThread/FavoriteType", 2);
589         digester.addCallParam("*/Thread/FavoriteThreadList/FavoriteThread/FavoriteOption", 3);
590         digester.addCallParam("*/Thread/FavoriteThreadList/FavoriteThread/FavoriteStatus", 4);
591
592
593         digester.addObjectCreate("*/Post", MvnForumPostXML.class);
594         //digester.addSetTop("*/Post", "setParentThreadOrPost");
595
SetParentRule postParentRule = new SetParentRule("setParentThreadOrPost");
596         digester.addRule("*/Post", postParentRule);
597         digester.addCallMethod("*/Post", "addPost");
598         digester.addCallMethod("*/Post/MemberName", "setPostMemberName", 0);
599         digester.addCallMethod("*/Post/LastEditMemberName", "setPostLastEditMemberName", 0);
600         digester.addCallMethod("*/Post/PostTopic", "setPostTopic", 0);
601         digester.addCallMethod("*/Post/PostBody", "setPostBody", 0);
602         digester.addCallMethod("*/Post/PostCreationDate", "setPostCreationDate", 0);
603         digester.addCallMethod("*/Post/PostLastEditDate", "setPostLastEditDate", 0);
604         digester.addCallMethod("*/Post/PostCreationIP", "setPostCreationIP", 0);
605         digester.addCallMethod("*/Post/PostLastEditIP", "setPostLastEditIP", 0);
606         digester.addCallMethod("*/Post/PostEditCount", "setPostEditCount", 0);
607         digester.addCallMethod("*/Post/PostFormatOption", "setPostFormatOption", 0);
608         digester.addCallMethod("*/Post/PostOption", "setPostOption", 0);
609         digester.addCallMethod("*/Post/PostStatus", "setPostStatus", 0);
610         digester.addCallMethod("*/Post/PostIcon", "setPostIcon", 0);
611         digester.addCallMethod("*/Post/PostAttachCount", "setPostAttachCount", 0);
612
613
614         digester.addObjectCreate("*/Attachment", MvnForumAttachmentXML.class);
615         digester.addSetProperties("*/Attachment", "id", "attachmentId");
616         //digester.addSetTop("*/Attachment", "setParentPost");
617
SetParentRule attachmentParentRule = new SetParentRule("setParentPost");
618         digester.addRule("*/Attachment", attachmentParentRule);
619         digester.addCallMethod("*/Attachment", "addAttachment");
620         digester.addCallMethod("*/Attachment/MemberName", "setAttachMemberName", 0);
621         digester.addCallMethod("*/Attachment/AttachFilename", "setAttachFilename", 0);
622         digester.addCallMethod("*/Attachment/AttachFileSize", "setAttachFileSize", 0);
623         digester.addCallMethod("*/Attachment/AttachMimeType", "setAttachMimeType", 0);
624         digester.addCallMethod("*/Attachment/AttachDesc", "setAttachDesc", 0);
625         digester.addCallMethod("*/Attachment/AttachCreationIP", "setAttachCreationIP", 0);
626         digester.addCallMethod("*/Attachment/AttachCreationDate", "setAttachCreationDate", 0);
627         digester.addCallMethod("*/Attachment/AttachModifiedDate", "setAttachModifiedDate", 0);
628         digester.addCallMethod("*/Attachment/AttachDownloadCount", "setAttachDownloadCount", 0);
629         digester.addCallMethod("*/Attachment/AttachOption", "setAttachOption", 0);
630         digester.addCallMethod("*/Attachment/AttachStatus", "setAttachStatus", 0);
631
632
633         /* At this point, on top of stack we have only the root MvnForumXML object */
634
635
636         digester.addCallMethod("mvnforum/RankList/Rank", "addRank", 6);
637         digester.addCallParam("mvnforum/RankList/Rank/RankMinPosts", 0);
638         digester.addCallParam("mvnforum/RankList/Rank/RankLevel", 1);
639         digester.addCallParam("mvnforum/RankList/Rank/RankTitle", 2);
640         digester.addCallParam("mvnforum/RankList/Rank/RankImage", 3);
641         digester.addCallParam("mvnforum/RankList/Rank/RankType", 4);
642         digester.addCallParam("mvnforum/RankList/Rank/RankOption", 5);
643
644
645         /* ==================================================================
646          * This was the main part of file - XML processing rules for Digester
647          * ==================================================================
648          */

649
650         digester.parse(inputFile);
651
652         try {
653             MvnForumXML.finishImport();
654         } catch (CreateException e) {
655             throw new ImportException(e.getMessage(), e); //just rethrow
656
} catch (DuplicateKeyException e) {
657             throw new ImportException(e.getMessage(), e); //just rethrow
658
} catch (ObjectNotFoundException e) {
659             throw new ImportException(e.getMessage(), e); //just rethrow
660
} catch (DatabaseException e) {
661             throw new ImportException(e.getMessage(), e); //just rethrow
662
} catch (ForeignKeyNotFoundException e) {
663             throw new ImportException(e.getMessage(), e); //just rethrow
664
} catch (BadInputException e) {
665             throw new ImportException(e.getMessage(), e); //just rethrow
666
}
667     }
668
669     /**
670      * Adds <code>message</code> to the output stream that was setup in
671      * {@link #importXml(File, HttpServletRequest, HttpServletResponse, int, String, Calendar, String, boolean, int)}.
672      * <br/>This method was made public to be available to MVN Forum XML processing classes.
673      *
674      * @param message Message to be written to output.
675      * @see com.mvnforum.admin.ImportWebHelper#addMessage(java.lang.String)
676      *
677      */

678     public static void addMessage(String JavaDoc message) {
679         ImportWebHelper.addMessage(message);
680     }
681
682     /**
683      * Adds important (bold) <code>message</code> to the output stream that was setup in
684      * {@link #importXml(File, HttpServletRequest, HttpServletResponse, int, String, Calendar, String, boolean, int)}.
685      * <br/>This method was made public to be available to MVN Forum XML processing classes.
686      *
687      * @param message Message to be written to output.
688      * @see com.mvnforum.admin.ImportWebHelper#addImportantMessage(java.lang.String)
689      *
690      */

691     public static void addImportantMessage(String JavaDoc message) {
692         ImportWebHelper.addImportantMessage(message);
693     }
694
695     /**
696      * Ensure that default entries in MVN Forum (admin and virtual guest members, rank titles,
697      * <code>Registered Members</code> group, ...) are created.<br/>
698      * This method was made public to be available to MVN Forum XML processing classes.<br/>
699      * Since these defaults will be imported from XML (they are supposed to be
700      * in the XML), this method won't do anything. At the end of import, defaults
701      * will be checked and created in case XML didn't contain them.
702      *
703      * @see com.mvnforum.admin.ImportWebHelper#addMessage(java.lang.String)
704      *
705      */

706     public static void createDefaultContents()
707         throws CreateException, DuplicateKeyException, ObjectNotFoundException,
708         DatabaseException, ForeignKeyNotFoundException {
709         //don't create any database entries now
710
/* This method overrides ImportWebHelper.createDefaultContents().
711          * It's used in MVNForumXML constructor.
712          * But, in case of error, ImportWebHandler.finalErrorHandling will be
713          * called, and it uses ImportWebHelper.createDefaultContents() version
714          * of this method (so, in that case, all neccessary default contents
715          * will be created).
716          */

717     }
718
719     private static void handleSuccess(HttpServletRequest JavaDoc request) {
720         addSuccessMessage();
721         endHtml();
722     }
723
724     //it's possible I called this method with e==null
725
private static void handleFatalError(String JavaDoc message, Exception JavaDoc e,
726              boolean clearIfError, HttpServletRequest JavaDoc request)
727         throws ImportException {
728
729         if (e==null) log.error(message);
730         else log.error(message, e);
731         if ((e==null) || (e.getMessage()==null)) addErrorMessage(message);
732         else addErrorMessage(message+"<br/>Cause: "+e.getMessage());
733         //try to clear the database and rollback to valid empty state with "admin" member
734
ImportWebHelper.addFinalErrorHandling(request, clearIfError);
735         endHtml();
736         if (e==null) throw new ImportException(message);
737         else throw new ImportException(message, e);
738     }
739 }
740
741
Popular Tags