|
What this is
Other links
The source code
/* CVS ID: $Id: XMLUserModel.java,v 1.1.1.1 2002/10/02 18:42:55 wastl Exp $ */
package net.wastl.webmail.xml;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.ParserConfigurationException;
import net.wastl.webmail.server.*;
import net.wastl.webmail.exceptions.*;
/*
* XMLUserModel.java
*
* Created: Tue Mar 21 15:08:18 2000
*
* Copyright (C) 2000 Sebastian Schaffert
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/**
*
* Mainly consists of a DOM that represents all of the data in the user's session.
* On subtrees, there are the SYSDATA and the USERDATA DOM trees (among other stuff like folder list,
* message list, etc)
*
* Many methods here are synchronized but that shouldn't hurt performance too much since the cases where several
* Threads access the model are rare anyway
*
* @author Sebastian Schaffert
* @version
*/
public class XMLUserModel extends XMLGenericModel {
protected Element usermodel;
protected Element userdata;
public XMLUserModel(WebMailServer parent, Element rsysdata, Element ruserdata)
throws ParserConfigurationException {
super(parent,rsysdata);
usermodel=root.getDocumentElement();
this.userdata=ruserdata;
update();
}
protected void initRoot() {
// Create a new usermodel from the template file
try {
root = parser.parse("file://"+parent.getProperty("webmail.xml.path")+
System.getProperty("file.separator")+"usermodel_template.xml");
} catch(Exception ex) {
System.err.println("Error parsing WebMail UserModel template "+ex.getMessage());
ex.printStackTrace();
}
}
public synchronized void update() {
// Insert the sysdata and userdata objects into the usermodel tree
super.update();
try {
NodeList nl=root.getElementsByTagName("USERDATA");
usermodel.replaceChild(root.importNode(userdata,true),nl.item(0));
} catch(ArrayIndexOutOfBoundsException ex) {
System.err.println("The WebMail UserModel template file didn't contain a USERDATA tag.");
} catch(DOMException ex) {
System.err.println("Something went wrong with the XML user model.");
}
}
public synchronized Element createFolder(String id,String name,boolean holds_folders, boolean holds_messages) {
Element folder=root.createElement("FOLDER");
folder.setAttribute("id",id);
folder.setAttribute("name",name);
folder.setAttribute("holds_folders",holds_folders+"");
folder.setAttribute("holds_messages",holds_messages+"");
return folder;
}
public synchronized Element getFolder(String id) {
return XMLCommon.getElementByAttribute(usermodel,"FOLDER","id",id);
}
public synchronized Element createMessageList() {
Element messagelist = root.createElement("MESSAGELIST");
return messagelist;
}
/**
* Get messagelist for folder. Create if necessary.
*/
public synchronized Element getMessageList(Element folder) {
NodeList nl=folder.getChildNodes();
Element messagelist=null;
for(int i=0;i<nl.getLength();i++) {
Element tmp=(Element)nl.item(i);
if(tmp.getTagName().equals("MESSAGELIST")) {
messagelist=tmp;
break;
}
}
if(messagelist == null) {
messagelist=createMessageList();
folder.appendChild(messagelist);
}
return messagelist;
}
public synchronized void removeMessageList(Element folder) {
XMLCommon.genericRemoveAll(folder,"MESSAGELIST");
}
/**
* Check whether we already fetched this message. This can save a lot of time and CPU.
*/
public synchronized boolean messageCached(Element folder, String msgid) {
NodeList nl=folder.getElementsByTagName("MESSAGE");
Element message=null;
for(int i=0;i<nl.getLength();i++) {
Element test=(Element)nl.item(i);
if(test.getAttribute("msgid").equals(msgid)) {
message=test;
break;
}
}
return message!=null;
}
public synchronized XMLMessage getMessage(Element folder,String msgnr, String msgid) {
NodeList nl=folder.getElementsByTagName("MESSAGE");
Element message=null;
for(int i=0;i<nl.getLength();i++) {
Element test=(Element)nl.item(i);
if(test.getAttribute("msgid").equals(msgid)) {
message=test;
break;
}
}
if(message == null) {
message=root.createElement("MESSAGE");
message.setAttribute("msgid",msgid);
Element msglist=getMessageList(folder);
msglist.appendChild(message);
}
message.setAttribute("msgnr",msgnr);
return new XMLMessage(message);
}
/**
* Return the WORK element that stores messages that are currently edited.
*/
public synchronized XMLMessage getWorkMessage() {
NodeList nl=usermodel.getElementsByTagName("WORK");
Element work;
if(nl.getLength()>0) {
work=(Element)nl.item(0);
} else {
work=root.createElement("WORK");
usermodel.appendChild(work);
}
nl=work.getElementsByTagName("MESSAGE");
XMLMessage message;
if(nl.getLength() > 0) {
message = new XMLMessage((Element)nl.item(0));
} else {
message=new XMLMessage(root.createElement("MESSAGE"));
work.appendChild(message.getMessageElement());
message.setAttribute("msgnr","0");
message.setAttribute("msgid",WebMailServer.generateMessageID("webmailuser"));
XMLMessagePart multipart=message.createPart("multi");
multipart.createPart("text");
}
return message;
}
public synchronized void clearWork() {
NodeList nl=usermodel.getElementsByTagName("WORK");
if(nl.getLength() > 0) {
Element work=(Element)nl.item(0);
NodeList nl2=work.getChildNodes();
Vector v=new Vector();
for(int i=0;i<nl2.getLength();i++) {
v.addElement(nl2.item(i));
}
Enumeration enum=v.elements();
while(enum.hasMoreElements()) {
work.removeChild((Node)enum.nextElement());
}
}
}
/**
* Set the current work message (for forwarding and replying).
* Note that this method uses importNode, therefore the newly
* cloned message element is returned by this method.
*/
public synchronized XMLMessage setWorkMessage(XMLMessage message) {
clearWork();
NodeList nl=usermodel.getElementsByTagName("WORK");
Element work;
if(nl.getLength()>0) {
work=(Element)nl.item(0);
} else {
work=root.createElement("WORK");
usermodel.appendChild(work);
}
Element newmessage=(Element)root.importNode(message.getMessageElement(),true);
work.appendChild(newmessage);
return new XMLMessage(newmessage);
}
public synchronized Element createMailhost(String name, String id,String url) {
Element mh=root.createElement("MAILHOST_MODEL");
mh.setAttribute("name",name);
mh.setAttribute("id",id);
if(url != null) {
mh.setAttribute("url",url);
}
return mh;
}
/**
* Add a previously created Mailhost to the DOM.
* The Mailhost should already contain all the subfolders.:-)
*/
public synchronized void addMailhost(Element mh) {
String name=mh.getAttribute("name");
Element elem=XMLCommon.getElementByAttribute(usermodel,"MAILHOST_MODEL","name",name);
if(elem == null) {
usermodel.appendChild(mh);
} else {
usermodel.replaceChild(mh,elem);
}
}
protected synchronized Element setCurrent(String type, String id) {
NodeList nl=usermodel.getElementsByTagName("CURRENT");
Element current=null;
for(int i=0;i<nl.getLength();i++) {
if(((Element)nl.item(i)).getAttribute("type").equals(type)) {
current=(Element)nl.item(i);
break;
}
}
if(current == null) {
current = root.createElement("CURRENT");
current.setAttribute("type",type);
usermodel.appendChild(current);
}
current.setAttribute("id",id);
return current;
}
protected synchronized Element getCurrent(String type, String id) {
NodeList nl=usermodel.getElementsByTagName("CURRENT");
Element current=null;
for(int i=0;i<nl.getLength();i++) {
if(((Element)nl.item(i)).getAttribute("type").equals(type)) {
current=(Element)nl.item(i);
break;
}
}
return current;
}
public Element setCurrentMessage(String id) {
return setCurrent("message",id);
}
public Element setCurrentFolder(String id) {
return setCurrent("folder",id);
}
public Element getCurrentMessage(String id) {
return getCurrent("message",id);
}
public Element getCurrentFolder(String id) {
return getCurrent("folder",id);
}
} // XMLUserModel
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.