|
What this is
Other links
The source code
/* CVS ID $Id: XMLSystemData.java,v 1.1.1.1 2002/10/02 18:42:54 wastl Exp $ */
package net.wastl.webmail.xml;
import net.wastl.webmail.config.*;
import net.wastl.webmail.server.*;
import java.util.*;
import org.w3c.dom.*;
/*
* XMLSystemData.java
*
* Created: Sat Mar 4 16:07:30 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.
*/
/**
*
*
* This class represents methods for accessing WebMail's system configuration in a
* XML tree.
*
*
* @author Sebastian Schaffert
* @version $Revision: 1.1.1.1 $
*/
public class XMLSystemData extends ConfigStore {
protected Document root;
protected Element sysdata;
/* Save the time when this document has been loaded. Might be used to reload
a document with a higher modification time
*/
protected long loadtime;
public XMLSystemData(Document d, ConfigScheme cs) {
super(cs);
root=d;
sysdata=root.getDocumentElement();
if(sysdata==null) {
sysdata=root.createElement("SYSDATA");
root.appendChild(sysdata);
}
loadtime=System.currentTimeMillis();
}
public long getLoadTime() {
return loadtime;
}
public void setLoadTime(long time) {
loadtime=time;
}
public Document getRoot() {
return root;
}
public Element getSysData() {
return sysdata;
}
public DocumentFragment getDocumentFragment() {
DocumentFragment df=root.createDocumentFragment();
df.appendChild(sysdata);
return df;
}
protected String getConfigRaw(String key) {
NodeList nl=sysdata.getElementsByTagName("KEY");
for(int i=0;i<nl.getLength();i++) {
Element e=(Element)nl.item(i);
if(XMLCommon.getElementTextValue(e).equals(key)) {
Element p=(Element)e.getParentNode();
NodeList valuel=p.getElementsByTagName("VALUE");
if(valuel.getLength()>=0) {
return XMLCommon.getElementTextValue((Element)valuel.item(0));
}
}
}
return null;
}
public void setConfigRaw(String groupname,String key, String value, String type) {
String curval=getConfigRaw(key);
if(curval == null || !curval.equals(value)) {
// System.err.println("XMLSystemData: "+groupname+"/"+key+" = "+value);
/* Find all GROUP elements */
NodeList groupl=sysdata.getElementsByTagName("GROUP");
int i=0;
for(i=0; i<groupl.getLength();i++) {
Element group=(Element)groupl.item(i);
if(group.getAttribute("name").equals(groupname)) {
/* If the group name matches, find all keys */
NodeList keyl=group.getElementsByTagName("KEY");
int j=0;
for(j=0;j<keyl.getLength();j++) {
Element keyelem=(Element)keyl.item(j);
if(key.equals(XMLCommon.getElementTextValue(keyelem))) {
/* If the key already exists, replace it */
Element conf=(Element)keyelem.getParentNode();
group.replaceChild(createConfigElement(key,value,type),conf);
return;
}
}
/* If the key was not found, append it */
if(j>=keyl.getLength()) {
group.appendChild(createConfigElement(key,value,type));
return;
}
}
}
if(i>=groupl.getLength()) {
Element group=createConfigGroup(groupname);
group.appendChild(createConfigElement(key,value,type));
}
}
}
protected Element createConfigGroup(String groupname) {
Element group=root.createElement("GROUP");
group.setAttribute("name",groupname);
sysdata.appendChild(group);
return group;
}
protected void deleteConfigGroup(String groupname) {
NodeList nl=sysdata.getElementsByTagName("GROUP");
for(int i=0;i<nl.getLength();i++) {
if(((Element)nl.item(i)).getAttribute("name").equals(groupname)) {
sysdata.removeChild(nl.item(i));
}
}
}
protected Element getConfigElementByKey(String key) {
NodeList nl=sysdata.getElementsByTagName("KEY");
Element config=null;
for(int i=0;i<nl.getLength();i++) {
Element keyelem=(Element)nl.item(i);
Element parent=(Element)keyelem.getParentNode();
if(XMLCommon.getElementTextValue(keyelem).equals(key) &&
parent.getTagName().equals("CONFIG")) {
config=parent;
break;
}
}
return config;
}
public void initChoices() {
Enumeration enum=getConfigKeys();
while(enum.hasMoreElements()) {
initChoices((String)enum.nextElement());
}
}
public void initChoices(String key) {
Element config=getConfigElementByKey(key);
XMLCommon.genericRemoveAll(config,"CHOICE");
ConfigParameter param=scheme.getConfigParameter(key);
if(param instanceof ChoiceConfigParameter) {
Enumeration enum=((ChoiceConfigParameter)param).choices();
while(enum.hasMoreElements()) {
Element choice=root.createElement("CHOICE");
choice.appendChild(root.createTextNode((String)enum.nextElement()));
config.appendChild(choice);
}
}
}
protected Element createConfigElement(String key, String value, String type) {
Element config=root.createElement("CONFIG");
Element keyelem=root.createElement("KEY");
Element desc=root.createElement("DESCRIPTION");
Element valueelem=root.createElement("VALUE");
keyelem.appendChild(root.createTextNode(key));
desc.appendChild(root.createTextNode(scheme.getDescription(key)));
valueelem.appendChild(root.createTextNode(value));
config.appendChild(keyelem);
config.appendChild(desc);
config.appendChild(valueelem);
config.setAttribute("type",type);
ConfigParameter param=scheme.getConfigParameter(key);
if(param instanceof ChoiceConfigParameter) {
Enumeration enum=((ChoiceConfigParameter)param).choices();
while(enum.hasMoreElements()) {
Element choice=root.createElement("CHOICE");
choice.appendChild(root.createTextNode((String)enum.nextElement()));
config.appendChild(choice);
}
}
return config;
}
public Enumeration getVirtualDomains() {
final NodeList nl=sysdata.getElementsByTagName("DOMAIN");
return new Enumeration() {
int i=0;
public boolean hasMoreElements() {
return i<nl.getLength();
}
public Object nextElement() {
Element elem=(Element)nl.item(i++);
String value=XMLCommon.getTagValue(elem,"NAME");
return value==null?"unknown"+(i-1):value;
}
};
}
public WebMailVirtualDomain getVirtualDomain(String domname) {
NodeList nodel=sysdata.getElementsByTagName("DOMAIN");
Element elem=null;
int j;
for(j=0;j<nodel.getLength();j++) {
elem=(Element)nodel.item(j);
elem.normalize();
NodeList namel=elem.getElementsByTagName("NAME");
if(namel.getLength()>0) {
if(XMLCommon.getElementTextValue((Element)namel.item(0)).equals(domname)) {
break;
}
}
}
if(j<nodel.getLength() && elem != null) {
final Element domain=elem;
return new WebMailVirtualDomain() {
public String getDomainName() {
String value=XMLCommon.getTagValue(domain,"NAME");
return value==null?"unknown":value;
}
public void setDomainName(String name) throws Exception {
XMLCommon.setTagValue(domain,"NAME",name,true,"Virtual Domain names must be unique!");
}
public String getDefaultServer() {
String value=XMLCommon.getTagValue(domain,"DEFAULT_HOST");
return value==null?"unknown":value;
}
public void setDefaultServer(String name) {
XMLCommon.setTagValue(domain,"DEFAULT_HOST",name);
}
public String getAuthenticationHost() {
String value=XMLCommon.getTagValue(domain,"AUTHENTICATION_HOST");
return value==null?"unknown":value;
}
public void setAuthenticationHost(String name) {
XMLCommon.setTagValue(domain,"AUTHENTICATION_HOST",name);
}
public boolean isAllowedHost(String host) {
if(getHostsRestricted()) {
Vector v=new Vector();
v.addElement(getDefaultServer());
Enumeration e=getAllowedHosts();
while(e.hasMoreElements()) {
v.addElement(e.nextElement());
}
Enumeration enum=v.elements();
while(enum.hasMoreElements()) {
String next=(String)enum.nextElement();
if(host.toUpperCase().endsWith(next.toUpperCase())) {
return true;
}
}
return false;
} else {
return true;
}
}
public void setAllowedHosts(String hosts) {
NodeList nl=domain.getElementsByTagName("ALLOWED_HOST");
for(int i=0;i<nl.getLength();i++) {
domain.removeChild(nl.item(i));
}
StringTokenizer tok=new StringTokenizer(hosts,", ");
while(tok.hasMoreElements()) {
Element ahost=root.createElement("ALLOWED_HOST");
XMLCommon.setElementTextValue(ahost,tok.nextToken());
domain.appendChild(ahost);
}
}
public Enumeration getAllowedHosts() {
final NodeList nl=domain.getElementsByTagName("ALLOWED_HOST");
return new Enumeration() {
int i=0;
public boolean hasMoreElements() {
return i<nl.getLength();
}
public Object nextElement() {
String value=XMLCommon.getElementTextValue((Element)nl.item(i++));
return value==null?"error":value;
}
};
}
public void setHostsRestricted(boolean b) {
NodeList nl=domain.getElementsByTagName("RESTRICTED");
for(int i=0;i<nl.getLength();i++) {
domain.removeChild(nl.item(i));
}
if(b) {
domain.appendChild(root.createElement("RESTRICTED"));
}
}
public boolean getHostsRestricted() {
NodeList nl=domain.getElementsByTagName("RESTRICTED");
return nl.getLength()>0;
}
};
} else {
return null;
}
}
/**
* This is just completely useless, since you can change virtual domains directly.
* It should be removed ASAP
*/
public void setVirtualDomain(String name,WebMailVirtualDomain domain) {
System.err.println("Called useless net.wastl.webmail.xml.XMLSystemData::setVirtualDomain/2");
}
public void deleteVirtualDomain(String name) {
NodeList nl=sysdata.getElementsByTagName("NAME");
for(int i=0;i<nl.getLength();i++) {
if(nl.item(i).getParentNode().getNodeName().equals("DOMAIN") &&
XMLCommon.getElementTextValue((Element)nl.item(i)).equals(name)) {
sysdata.removeChild(nl.item(i).getParentNode());
}
}
WebMailServer.getStorage().log(Storage.LOG_INFO,"XMLSystemData: Deleted WebMail virtual domain "+name);
}
public void createVirtualDomain(String name) throws Exception {
WebMailVirtualDomain dom=getVirtualDomain(name);
if(dom!=null) {
throw new Exception("Domain names must be unique!");
}
Element domain=root.createElement("DOMAIN");
sysdata.appendChild(domain);
domain.appendChild(root.createElement("NAME"));
domain.appendChild(root.createElement("DEFAULT_HOST"));
domain.appendChild(root.createElement("AUTHENTICATION_HOST"));
domain.appendChild(root.createElement("ALLOWED_HOST"));
XMLCommon.setTagValue(domain,"NAME",name);
XMLCommon.setTagValue(domain,"DEFAULT_HOST","localhost");
XMLCommon.setTagValue(domain,"AUTHENTICATION_HOST","localhost");
XMLCommon.setTagValue(domain,"ALLOWED_HOST","localhost");
WebMailServer.getStorage().log(Storage.LOG_INFO,"XMLSystemData: Created WebMail virtual domain "+name);
}
} // XMLSystemData
|
| ... 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.