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

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID $Id: XMLSystemData.java,v 1.4 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.xml;
  3. import net.wastl.webmail.config.*;
  4. import net.wastl.webmail.server.*;
  5. import java.util.*;
  6. import org.apache.xerces.framework.*;
  7. import org.apache.xerces.parsers.*;
  8. import org.apache.xalan.xslt.*;
  9. import org.apache.xml.serialize.*;
  10. import org.w3c.dom.*;
  11. /*
  12.  * XMLSystemData.java
  13.  *
  14.  * Created: Sat Mar  4 16:07:30 2000
  15.  *
  16.  * Copyright (C) 2000 Sebastian Schaffert
  17.  * 
  18.  * This program is free software; you can redistribute it and/or
  19.  * modify it under the terms of the GNU General Public License
  20.  * as published by the Free Software Foundation; either version 2
  21.  * of the License, or (at your option) 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. /**
  33.  *
  34.  *
  35.  * This class represents methods for accessing WebMail's system configuration in a
  36.  * XML tree.
  37.  *
  38.  *
  39.  * @author Sebastian Schaffert
  40.  * @version $Revision: 1.4 $
  41.  */
  42. public class XMLSystemData extends ConfigStore {
  43.     
  44.     protected Document root;
  45.     protected Element sysdata;
  46.     /* Save the time when this document has been loaded. Might be used to reload
  47.        a document with a higher modification time
  48.     */
  49.     protected long loadtime;
  50.     public XMLSystemData(Document d, ConfigScheme cs) {
  51. super(cs);
  52. root=d;
  53. sysdata=root.getDocumentElement();
  54. if(sysdata==null) {
  55.     sysdata=root.createElement("SYSDATA");
  56.     root.appendChild(sysdata);
  57. }
  58. loadtime=System.currentTimeMillis();
  59.     }
  60.     public long getLoadTime() {
  61. return loadtime;
  62.     }
  63.     public void setLoadTime(long time) {
  64. loadtime=time;
  65.     }
  66.     public Document getRoot() {
  67. return root;
  68.     }
  69.     public Element getSysData() {
  70. return sysdata;
  71.     }
  72.     public DocumentFragment getDocumentFragment() {
  73. DocumentFragment df=root.createDocumentFragment();
  74. df.appendChild(sysdata);
  75. return df;
  76.     }
  77.     protected String getConfigRaw(String key) {
  78. NodeList nl=sysdata.getElementsByTagName("KEY");
  79. for(int i=0;i<nl.getLength();i++) {
  80.     Element e=(Element)nl.item(i);
  81.     if(XMLCommon.getElementTextValue(e).equals(key)) {
  82. Element p=(Element)e.getParentNode();
  83. NodeList valuel=p.getElementsByTagName("VALUE");
  84. if(valuel.getLength()>=0) {
  85.     return XMLCommon.getElementTextValue((Element)valuel.item(0));
  86. }
  87.     }
  88. }
  89. return null;
  90.     }
  91.     
  92.     public void setConfigRaw(String groupname,String key, String value, String type) {
  93. String curval=getConfigRaw(key);
  94. if(curval == null || !curval.equals(value)) {
  95. //      System.err.println("XMLSystemData: "+groupname+"/"+key+" = "+value);
  96.     /* Find all GROUP elements */
  97.     NodeList groupl=sysdata.getElementsByTagName("GROUP");
  98.     int i=0;
  99.     for(i=0; i<groupl.getLength();i++) {
  100. Element group=(Element)groupl.item(i);
  101. if(group.getAttribute("name").equals(groupname)) {
  102.     /* If the group name matches, find all keys */
  103.     NodeList keyl=group.getElementsByTagName("KEY");
  104.     int j=0;
  105.     for(j=0;j<keyl.getLength();j++) {
  106. Element keyelem=(Element)keyl.item(j);
  107. if(key.equals(XMLCommon.getElementTextValue(keyelem))) {
  108.     /* If the key already exists, replace it */
  109.     Element conf=(Element)keyelem.getParentNode();
  110.     group.replaceChild(createConfigElement(key,value,type),conf);
  111.     return;
  112. }
  113.     }
  114.     /* If the key was not found, append it */
  115.     if(j>=keyl.getLength()) {
  116. group.appendChild(createConfigElement(key,value,type));
  117. return;
  118.     }
  119. }
  120.     }
  121.     if(i>=groupl.getLength()) {
  122. Element group=createConfigGroup(groupname);
  123. group.appendChild(createConfigElement(key,value,type));
  124.     }
  125. }
  126.     }
  127.     protected Element createConfigGroup(String groupname) {
  128. Element group=root.createElement("GROUP");
  129. group.setAttribute("name",groupname);
  130. sysdata.appendChild(group);
  131. return group;
  132.     }
  133.     protected void deleteConfigGroup(String groupname) {
  134. NodeList nl=sysdata.getElementsByTagName("GROUP");
  135. for(int i=0;i<nl.getLength();i++) {
  136.     if(((Element)nl.item(i)).getAttribute("name").equals(groupname)) {
  137. sysdata.removeChild(nl.item(i));
  138.     }
  139. }
  140.     }
  141.     protected Element getConfigElementByKey(String key) {
  142. NodeList nl=sysdata.getElementsByTagName("KEY");
  143. Element config=null;
  144. for(int i=0;i<nl.getLength();i++) {
  145.     Element keyelem=(Element)nl.item(i);
  146.     Element parent=(Element)keyelem.getParentNode();
  147.     if(XMLCommon.getElementTextValue(keyelem).equals(key) &&
  148.        parent.getTagName().equals("CONFIG")) {
  149. config=parent;
  150. break;
  151.     }
  152. }
  153. return config;
  154.     }
  155.     public void initChoices() {
  156. Enumeration enum=getConfigKeys();
  157. while(enum.hasMoreElements()) {
  158.     initChoices((String)enum.nextElement());
  159. }
  160.     }
  161.     public void initChoices(String key) {
  162. Element config=getConfigElementByKey(key);
  163. XMLCommon.genericRemoveAll(config,"CHOICE");
  164. ConfigParameter param=scheme.getConfigParameter(key);
  165. if(param instanceof ChoiceConfigParameter) {
  166.     Enumeration enum=((ChoiceConfigParameter)param).choices();
  167.     while(enum.hasMoreElements()) {
  168. Element choice=root.createElement("CHOICE");
  169. choice.appendChild(root.createTextNode((String)enum.nextElement()));
  170. config.appendChild(choice);
  171.     }
  172. }
  173.     }
  174.     protected Element createConfigElement(String key, String value, String type) {        
  175. Element config=root.createElement("CONFIG");
  176. Element keyelem=root.createElement("KEY");
  177. Element desc=root.createElement("DESCRIPTION");
  178. Element valueelem=root.createElement("VALUE");
  179. keyelem.appendChild(root.createTextNode(key));
  180. desc.appendChild(root.createTextNode(scheme.getDescription(key)));
  181. valueelem.appendChild(root.createTextNode(value));
  182. config.appendChild(keyelem);
  183. config.appendChild(desc);
  184. config.appendChild(valueelem);
  185. config.setAttribute("type",type);
  186. ConfigParameter param=scheme.getConfigParameter(key);
  187. if(param instanceof ChoiceConfigParameter) {
  188.     Enumeration enum=((ChoiceConfigParameter)param).choices();
  189.     while(enum.hasMoreElements()) {
  190. Element choice=root.createElement("CHOICE");
  191. choice.appendChild(root.createTextNode((String)enum.nextElement()));
  192. config.appendChild(choice);
  193.     }
  194. }
  195. return config;
  196.     }
  197.     public Enumeration getVirtualDomains() {
  198. final NodeList nl=sysdata.getElementsByTagName("DOMAIN");
  199. return new Enumeration() {
  200. int i=0;
  201. public boolean hasMoreElements() {
  202.     return i<nl.getLength();
  203. }
  204. public Object nextElement() {
  205.     Element elem=(Element)nl.item(i++);
  206.     String value=XMLCommon.getTagValue(elem,"NAME");
  207.     return value==null?"unknown"+(i-1):value;
  208. }
  209.     };
  210.     }
  211.     public WebMailVirtualDomain getVirtualDomain(String domname) {
  212. NodeList nodel=sysdata.getElementsByTagName("DOMAIN");
  213. Element elem=null;
  214. int j;
  215. for(j=0;j<nodel.getLength();j++) {
  216.     elem=(Element)nodel.item(j);
  217.     elem.normalize();
  218.     NodeList namel=elem.getElementsByTagName("NAME");
  219.     if(namel.getLength()>0) {
  220. if(XMLCommon.getElementTextValue((Element)namel.item(0)).equals(domname)) {
  221.     break;
  222. }
  223.     }
  224. }
  225. if(j<nodel.getLength() && elem != null) {
  226.     final Element domain=elem;
  227.     return new WebMailVirtualDomain() {
  228.     public String getDomainName() {
  229. String value=XMLCommon.getTagValue(domain,"NAME");
  230. return value==null?"unknown":value;
  231.     }
  232.     public void setDomainName(String name) throws Exception {
  233. XMLCommon.setTagValue(domain,"NAME",name,true,"Virtual Domain names must be unique!");
  234.     }
  235.     public String getDefaultServer() {
  236. String value=XMLCommon.getTagValue(domain,"DEFAULT_HOST");
  237. return value==null?"unknown":value;
  238.     }
  239.     public void setDefaultServer(String name) {
  240. XMLCommon.setTagValue(domain,"DEFAULT_HOST",name);
  241.     }
  242.     public String getAuthenticationHost() {
  243. String value=XMLCommon.getTagValue(domain,"AUTHENTICATION_HOST");
  244. return value==null?"unknown":value;
  245.     }
  246.     public void setAuthenticationHost(String name) {
  247. XMLCommon.setTagValue(domain,"AUTHENTICATION_HOST",name);
  248.     }
  249.     public boolean isAllowedHost(String host) {
  250. if(getHostsRestricted()) {
  251.     Vector v=new Vector();
  252.     v.addElement(getDefaultServer());
  253.     Enumeration e=getAllowedHosts();
  254.     while(e.hasMoreElements()) {
  255. v.addElement(e.nextElement());
  256.     }
  257.     Enumeration enum=v.elements();
  258.     while(enum.hasMoreElements()) {
  259. String next=(String)enum.nextElement();
  260. if(host.toUpperCase().endsWith(next.toUpperCase())) {
  261.     return true;
  262. }
  263.     }
  264.     return false;
  265. } else {
  266.     return true;
  267. }
  268.     }
  269.     public void setAllowedHosts(String hosts) {
  270. NodeList nl=domain.getElementsByTagName("ALLOWED_HOST");
  271. for(int i=0;i<nl.getLength();i++) {
  272.     domain.removeChild(nl.item(i));
  273. }
  274. StringTokenizer tok=new StringTokenizer(hosts,", ");
  275. while(tok.hasMoreElements()) {
  276.     Element ahost=root.createElement("ALLOWED_HOST");
  277.     XMLCommon.setElementTextValue(ahost,tok.nextToken());
  278.     domain.appendChild(ahost);
  279. }
  280.     }
  281.     
  282.     public Enumeration getAllowedHosts() {
  283. final NodeList nl=domain.getElementsByTagName("ALLOWED_HOST");
  284. return new Enumeration() {
  285. int i=0;
  286. public boolean hasMoreElements() {
  287.     return i<nl.getLength();
  288. }
  289. public Object nextElement() {
  290.     String value=XMLCommon.getElementTextValue((Element)nl.item(i++));
  291.     return value==null?"error":value;
  292. }
  293.     };
  294.     }
  295.     public void setHostsRestricted(boolean b) {
  296. NodeList nl=domain.getElementsByTagName("RESTRICTED");
  297. for(int i=0;i<nl.getLength();i++) {
  298.     domain.removeChild(nl.item(i));
  299. }
  300. if(b) {
  301.     domain.appendChild(root.createElement("RESTRICTED"));
  302. }      
  303.     }
  304.     public boolean getHostsRestricted() {
  305. NodeList nl=domain.getElementsByTagName("RESTRICTED");
  306. return nl.getLength()>0;
  307.     }
  308. };     
  309. } else {
  310.     return null;
  311. }
  312.     }
  313.     /**
  314.      * This is just completely useless, since you can change virtual domains directly.
  315.      * It should be removed ASAP
  316.      */
  317.     public void setVirtualDomain(String name,WebMailVirtualDomain domain) {
  318. System.err.println("Called useless net.wastl.webmail.xml.XMLSystemData::setVirtualDomain/2");
  319.     }
  320.     public void deleteVirtualDomain(String name) {
  321. NodeList nl=sysdata.getElementsByTagName("NAME");
  322. for(int i=0;i<nl.getLength();i++) {
  323.     if(nl.item(i).getParentNode().getNodeName().equals("DOMAIN") && 
  324.        XMLCommon.getElementTextValue((Element)nl.item(i)).equals(name)) {
  325. sysdata.removeChild(nl.item(i).getParentNode());
  326.     }
  327. }
  328. WebMailServer.getStorage().log(Storage.LOG_INFO,"XMLSystemData: Deleted WebMail virtual domain "+name);
  329.     }
  330.     public void createVirtualDomain(String name) throws Exception {
  331. WebMailVirtualDomain dom=getVirtualDomain(name);
  332. if(dom!=null) {
  333.     throw new Exception("Domain names must be unique!");
  334. }
  335. Element domain=root.createElement("DOMAIN");
  336. sysdata.appendChild(domain);
  337. domain.appendChild(root.createElement("NAME"));
  338. domain.appendChild(root.createElement("DEFAULT_HOST"));
  339. domain.appendChild(root.createElement("AUTHENTICATION_HOST"));
  340. domain.appendChild(root.createElement("ALLOWED_HOST"));
  341. XMLCommon.setTagValue(domain,"NAME",name);
  342. XMLCommon.setTagValue(domain,"DEFAULT_HOST","localhost");
  343. XMLCommon.setTagValue(domain,"AUTHENTICATION_HOST","localhost");
  344. XMLCommon.setTagValue(domain,"ALLOWED_HOST","localhost");
  345. WebMailServer.getStorage().log(Storage.LOG_INFO,"XMLSystemData: Created WebMail virtual domain "+name);
  346.     }
  347.     public static void main(String[] args) {
  348. String test="file:///home/wastl/work/WebMail/webmail/data/webmail.xml";
  349. DOMParser parser = new DOMParser();
  350.         try {
  351.             parser.parse(test);
  352.         } catch(Exception ex) {
  353.             ex.printStackTrace();
  354.             System.exit(0);
  355.         }
  356.         Document d = parser.getDocument(); 
  357. ConfigScheme cs=new ConfigScheme();
  358. cs.configRegisterStringKey("TEST","test","Ein Testparameter");
  359. XMLSystemData xsd=new XMLSystemData(d,cs);
  360. xsd.setConfig("TEST","Test Test Test");
  361. System.err.println("TEST = "+xsd.getConfig("TEST"));
  362. d.getDocumentElement().normalize();
  363. Enumeration enum=xsd.getVirtualDomains();
  364. while(enum.hasMoreElements()) {
  365.     String domname=(String)enum.nextElement();
  366.     System.err.println("Virtual Domain: "+domname);
  367.     WebMailVirtualDomain dom=xsd.getVirtualDomain(domname);
  368.     System.err.println("Default Host: "+dom.getDefaultServer());
  369.     System.err.println("Setting default host to 'mail.test.net'");
  370.     System.err.println("Setting restricted to false");
  371.     System.err.println("Setting allowed hosts to localhost, mail.test.net");
  372.     dom.setHostsRestricted(false);
  373.     dom.setDefaultServer("mail.test.net");
  374.     dom.setAllowedHosts("localhost, mail.test.net");
  375.     System.err.println("Default Host: "+dom.getDefaultServer());
  376. }
  377. System.err.println("XML Document Type: "+d.getDoctype().getName());
  378. System.err.println("nXML Dokument:n");
  379. try {
  380.     System.err.println("Doctype sys for document: "+OutputFormat.whichDoctypeSystem(d));
  381.     XMLCommon.writeXML(d,System.out,"/home/wastl/work/WebMail/webmail/lib/xml/sysdata.dtd");
  382. } catch(Exception ex) {
  383.     ex.printStackTrace();
  384. }
  385.     }
  386. } // XMLSystemData