XMLUserModel.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:8k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: XMLUserModel.java,v 1.3 2000/04/18 13:13:38 wastl Exp $ */
  2. package net.wastl.webmail.xml;
  3. import java.util.*;
  4. import org.w3c.dom.*;
  5. import org.apache.xerces.dom.*;
  6. import org.apache.xerces.parsers.*;
  7. import net.wastl.webmail.server.*;
  8. /*
  9.  * XMLUserModel.java
  10.  *
  11.  * Created: Tue Mar 21 15:08:18 2000
  12.  *
  13.  * Copyright (C) 2000 Sebastian Schaffert
  14.  * 
  15.  * This program is free software; you can redistribute it and/or
  16.  * modify it under the terms of the GNU General Public License
  17.  * as published by the Free Software Foundation; either version 2
  18.  * of the License, or (at your option) any later version.
  19.  * 
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  * 
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the Free Software
  27.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  28.  *
  29.  */
  30. /**
  31.  *
  32.  * Mainly consists of a DOM that represents all of the data in the user's session.
  33.  * On subtrees, there are the SYSDATA and the USERDATA DOM trees (among other stuff like folder list,
  34.  * message list, etc)
  35.  *
  36.  *
  37.  * @author Sebastian Schaffert
  38.  * @version
  39.  */
  40. public class XMLUserModel extends XMLGenericModel {
  41.     
  42.     protected Element usermodel;
  43.     protected Element userdata;
  44.     public XMLUserModel(WebMailServer parent, Element rsysdata, Element ruserdata) {
  45. super(parent,rsysdata);
  46. usermodel=root.getDocumentElement();
  47. this.userdata=ruserdata;
  48. update();
  49.     }
  50.     protected void initRoot() {
  51. // Create a new usermodel from the template file
  52. try {
  53.     parser.parse(parent.getProperty("webmail.xml.path")+
  54.  System.getProperty("file.separator")+"usermodel_template.xml");
  55. } catch(Exception ex) {
  56.     System.err.println("Error parsing WebMail UserModel template "+ex.getMessage());
  57.     ex.printStackTrace();
  58. }
  59. root=parser.getDocument();
  60.     }
  61.     
  62.     public void update() {
  63. // Insert the sysdata and userdata objects into the usermodel tree
  64. super.update();
  65. try {
  66.     NodeList nl=root.getElementsByTagName("USERDATA");
  67.     usermodel.replaceChild(root.importNode(userdata,true),nl.item(0));
  68. } catch(ArrayIndexOutOfBoundsException ex) {
  69.     System.err.println("The WebMail UserModel template file didn't contain a USERDATA tag.");
  70. } catch(DOMException ex) {
  71.     System.err.println("Something went wrong with the XML user model.");
  72. }
  73.     }
  74.     public Element createFolder(String id,String name,boolean holds_folders, boolean holds_messages) {
  75. Element folder=root.createElement("FOLDER");
  76. folder.setAttribute("id",id);
  77. folder.setAttribute("name",name);
  78. folder.setAttribute("holds_folders",holds_folders+"");
  79. folder.setAttribute("holds_messages",holds_messages+"");
  80. return folder;
  81.     }
  82.     public Element getFolder(String id) {
  83. return XMLCommon.getElementByAttribute(usermodel,"FOLDER","id",id);
  84.     }
  85.     public Element createMessageList() {
  86. Element messagelist = root.createElement("MESSAGELIST");
  87. return messagelist;
  88.     }
  89.     /**
  90.      * Get messagelist for folder. Create if necessary.
  91.      */
  92.     public Element getMessageList(Element folder) {
  93. NodeList nl=folder.getChildNodes();
  94. Element messagelist=null;
  95. for(int i=0;i<nl.getLength();i++) {
  96.     Element tmp=(Element)nl.item(i);
  97.     if(tmp.getTagName().equals("MESSAGELIST")) {
  98. messagelist=tmp;
  99. break;
  100.     }
  101. }
  102. if(messagelist == null) {
  103.     messagelist=createMessageList();
  104.     folder.appendChild(messagelist);
  105. }
  106. return messagelist;
  107.     }
  108.     public void removeMessageList(Element folder) {
  109. XMLCommon.genericRemoveAll(folder,"MESSAGELIST");
  110.     }
  111.     /**
  112.      * Check whether we already fetched this message. This can save a lot of time and CPU.
  113.      */
  114.     public boolean messageCached(Element folder, String msgid) {
  115. NodeList nl=folder.getElementsByTagName("MESSAGE");
  116. Element message=null;
  117. for(int i=0;i<nl.getLength();i++) {
  118.     Element test=(Element)nl.item(i);
  119.     if(test.getAttribute("msgid").equals(msgid)) {
  120. message=test;
  121. break;
  122.     }
  123. }
  124. return message!=null;
  125.     }
  126.     public XMLMessage getMessage(Element folder,String msgnr, String msgid) {
  127. NodeList nl=folder.getElementsByTagName("MESSAGE");
  128. Element message=null;
  129. for(int i=0;i<nl.getLength();i++) {
  130.     Element test=(Element)nl.item(i);
  131.     if(test.getAttribute("msgid").equals(msgid)) {
  132. message=test;
  133. break;
  134.     }
  135. }
  136. if(message == null) {
  137.     message=root.createElement("MESSAGE");
  138.     message.setAttribute("msgid",msgid);
  139.     Element msglist=getMessageList(folder);
  140.     msglist.appendChild(message);
  141. }
  142. message.setAttribute("msgnr",msgnr);
  143. return new XMLMessage(message);
  144.     }
  145.     /**
  146.      * Return the WORK element that stores messages that are currently edited.
  147.      */
  148.     public XMLMessage getWorkMessage() {
  149. NodeList nl=usermodel.getElementsByTagName("WORK");
  150. Element work;
  151. if(nl.getLength()>0) {
  152.     work=(Element)nl.item(0);
  153. } else {
  154.     work=root.createElement("WORK");
  155.     usermodel.appendChild(work);
  156. }
  157. nl=work.getElementsByTagName("MESSAGE");
  158. XMLMessage message;
  159. if(nl.getLength() > 0) {
  160.     message = new XMLMessage((Element)nl.item(0));
  161. } else {
  162.     message=new XMLMessage(root.createElement("MESSAGE"));
  163.     work.appendChild(message.getMessageElement());
  164.     message.setAttribute("msgnr","0");
  165.     message.setAttribute("msgid",WebMailServer.generateMessageID("webmailuser"));
  166.     XMLMessagePart multipart=message.createPart("multi");
  167.     multipart.createPart("text");
  168. }
  169. return message;
  170.     }
  171.     public void clearWork() {
  172. NodeList nl=usermodel.getElementsByTagName("WORK");
  173. if(nl.getLength() > 0) {
  174.     Element work=(Element)nl.item(0);
  175.     NodeList nl2=work.getChildNodes();
  176.     Vector v=new Vector();
  177.     for(int i=0;i<nl2.getLength();i++) {
  178. v.addElement(nl2.item(i));
  179.     }
  180.     Enumeration enum=v.elements();
  181.     while(enum.hasMoreElements()) {
  182. work.removeChild((Node)enum.nextElement());
  183.     }
  184. }
  185.     }
  186.     /**
  187.      * Set the current work message (for forwarding and replying).
  188.      * Note that this method uses importNode, therefore the newly
  189.      * cloned message element is returned by this method.
  190.      */
  191.     public XMLMessage setWorkMessage(XMLMessage message) {
  192. clearWork();
  193. NodeList nl=usermodel.getElementsByTagName("WORK");
  194. Element work;
  195. if(nl.getLength()>0) {
  196.     work=(Element)nl.item(0);
  197. } else {
  198.     work=root.createElement("WORK");
  199.     usermodel.appendChild(work);
  200. }
  201. Element newmessage=(Element)root.importNode(message.getMessageElement(),true);
  202. work.appendChild(newmessage);
  203. return new XMLMessage(newmessage);
  204.     }
  205.     public Element createMailhost(String name, String id,String url) {
  206. Element mh=root.createElement("MAILHOST_MODEL");
  207. mh.setAttribute("name",name);
  208. mh.setAttribute("id",id);
  209. if(url != null) {
  210.     mh.setAttribute("url",url);
  211. }
  212. return mh;
  213.     }
  214.     /**
  215.      * Add a previously created Mailhost to the DOM.
  216.      * The Mailhost should already contain all the subfolders.:-)
  217.      */
  218.     public void addMailhost(Element mh) {
  219. String name=mh.getAttribute("name");
  220. Element elem=XMLCommon.getElementByAttribute(usermodel,"MAILHOST_MODEL","name",name);
  221. if(elem == null) {
  222.     usermodel.appendChild(mh);
  223. } else {
  224.     usermodel.replaceChild(mh,elem);
  225. }
  226.     }
  227.     protected Element setCurrent(String type, String id) {
  228. NodeList nl=usermodel.getElementsByTagName("CURRENT");
  229. Element current=null;
  230. for(int i=0;i<nl.getLength();i++) {
  231.     if(((Element)nl.item(i)).getAttribute("type").equals(type)) {
  232. current=(Element)nl.item(i);
  233. break;
  234.     }
  235. }
  236. if(current == null) {
  237.     current = root.createElement("CURRENT");
  238.     current.setAttribute("type",type);
  239.     usermodel.appendChild(current);
  240. }
  241. current.setAttribute("id",id);
  242. return current;
  243.     }
  244.     protected Element getCurrent(String type, String id) {
  245. NodeList nl=usermodel.getElementsByTagName("CURRENT");
  246. Element current=null;
  247. for(int i=0;i<nl.getLength();i++) {
  248.     if(((Element)nl.item(i)).getAttribute("type").equals(type)) {
  249. current=(Element)nl.item(i);
  250. break;
  251.     }
  252. }
  253. return current;
  254.     }
  255.     public Element setCurrentMessage(String id) {
  256. return setCurrent("message",id);
  257.     }
  258.     public Element setCurrentFolder(String id) {
  259. return setCurrent("folder",id);
  260.     }
  261.     public Element getCurrentMessage(String id) {
  262. return getCurrent("message",id);
  263.     }
  264.     public Element getCurrentFolder(String id) {
  265. return getCurrent("folder",id);
  266.     }
  267. } // XMLUserModel