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

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: Storage.java,v 1.5 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.server;
  3. import net.wastl.webmail.config.*;
  4. import net.wastl.webmail.xml.*;
  5. import java.io.*;
  6. import java.util.*;
  7. import org.apache.xalan.xslt.*;
  8. /*
  9.  * Storage.java
  10.  *
  11.  * Created: Feb 1999
  12.  *
  13.  * Copyright (C) 1999-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.  * This provides a generic interface for getting and setting stored
  33.  * data in WebMail.
  34.  * 
  35.  * @see SimpleStorage
  36.  * @author Sebastian Schaffert
  37.  * @versin $Revision: 1.5 $
  38. */
  39. public abstract class Storage {
  40.     public static final int LOG_DEBUG=10;
  41.     public static final int LOG_INFO=5;
  42.     public static final int LOG_WARN=3;
  43.     public static final int LOG_ERR=1;
  44.     public static final int LOG_CRIT=0;
  45.     protected static boolean debug;
  46.     protected WebMailServer parent;
  47.     protected ConfigScheme cs;
  48.     protected XMLSystemData sysdata;
  49.     protected XMLGenericModel generic_model;
  50.     public Storage(WebMailServer parent) {
  51. debug=WebMailServer.getDebug();
  52. this.parent=parent;
  53. cs=parent.getConfigScheme();
  54. cs.configRegisterYesNoKey("FOLDER TRY LOGIN PASSWORD","Try to connect folders with the user's login password if authentication fails");
  55.     }
  56.     public void initConfigKeys() {
  57. // Initialize the configuration file with the default or set parameters
  58. // needed to complete the XML file
  59. Enumeration enum=cs.getPossibleKeys();
  60. while(enum.hasMoreElements()) {
  61.     String key=(String)enum.nextElement();
  62.     if(!sysdata.isConfigSet(key)) {
  63. // We must use the raw method so the input doesn't get filtered.
  64. sysdata.setConfig(key,(String)cs.getDefaultValue(key),false,false);
  65.     }
  66. }
  67. saveXMLSysData();
  68.     }
  69.     public void setDebug(boolean b) {
  70. debug=b;
  71.     }
  72.     public boolean getDebug() {
  73. return debug;
  74.     }
  75.     /**
  76.      * Fetch all keys of the current configuration.
  77.      */
  78.     public Enumeration getConfigKeys() {
  79. return cs.getPossibleKeys();
  80.     }
  81.     /**
  82.      * Fetch the configuration associated with the specified key.
  83.      * @param key Identifier for the configuration
  84.      */
  85.     public String getConfig(String key) {
  86. return sysdata.getConfig(key);
  87.     }
  88.     /**
  89.      * Set a configuration "key" to the specified value.
  90.      * @param key Identifier for the configuration
  91.      * @param value value to set
  92.       */
  93.     public void setConfig(String key, String value) throws IllegalArgumentException {
  94. if(!value.equals(getConfig(key))) {
  95.     log(LOG_DEBUG,"Storage API: Setting configuration for '"+key+"' to '"+value+"'.");
  96.     sysdata.setConfig(key,value);
  97.     saveXMLSysData();
  98. }
  99.     }
  100.     /**
  101.      * Get the String for key and the specified locale.
  102.      * @param key Identifier for the String
  103.      * @param locale locale of the String to fetch
  104.      */
  105.     public abstract String getStringResource(String key, Locale locale);
  106.    /** 
  107.      * Get a xsl stylesheet for the specified locale and theme.
  108.      * @param key Identifier for the String
  109.      * @param locale locale of the String to fetch
  110.      * @param theme theme where to look for the file
  111.      */
  112.     public abstract StylesheetRoot getStylesheet(String name, Locale locale, String theme) throws StylesheetNotFoundException;
  113.    /** 
  114.      * Get a binary file (most likely an image) for the specified locale and theme.
  115.      * @param key Identifier for the String
  116.      * @param locale locale of the String to fetch
  117.      * @param theme theme where to look for the file
  118.      */
  119.     public abstract byte[] getBinaryFile(String name, Locale locale, String theme) throws BinaryNotFoundException;
  120.     /**
  121.      * Calculate the document base path for a given locale and theme
  122.      */
  123.     public String getBasePath(Locale locale, String theme) {
  124. String language_path=(parent.getProperty("webmail.template.path")+
  125.       System.getProperty("file.separator")+locale.getLanguage());
  126. File f=new File(language_path);
  127. if(!f.exists()) {
  128.     language_path=(parent.getProperty("webmail.template.path")+
  129.    System.getProperty("file.separator")+"default");
  130. }
  131. String theme_path=language_path+System.getProperty("file.separator")+theme;
  132. f=new File(theme_path);
  133. if(!f.exists()) {
  134.     theme_path=language_path+System.getProperty("file.separator")+"default";
  135. }
  136. String basepath=theme_path+System.getProperty("file.separator");
  137. return basepath;
  138.     }
  139.     public XMLSystemData getSystemData() {
  140. return sysdata;
  141.     }
  142.     public XMLUserModel createXMLUserModel(XMLUserData data) {
  143. return new XMLUserModel(parent,sysdata.getSysData(),data.getUserData());
  144.     }
  145.     /**
  146.      * Return a XML model that contains state and system information for administrator use   
  147.      */
  148.     public XMLAdminModel createXMLAdminModel() {
  149. XMLAdminModel model=new XMLAdminModel(parent,sysdata.getSysData());
  150. model.init();
  151. model.update();
  152. return model;
  153.     }
  154.     /**
  155.      * Return a generic XML model that only contains some state and system information.
  156.      * This cannot be changed by a single session.
  157.      */
  158.     public XMLGenericModel createXMLGenericModel() {
  159. XMLGenericModel model=new XMLGenericModel(parent,sysdata.getSysData());
  160. model.init();
  161. model.update();
  162. return model;
  163.     }
  164.     /**
  165.      * Return userlist for a given domain.
  166.      */
  167.     public abstract Enumeration getUsers(String domain);
  168.     /**
  169.      * @deprecated Use getUsers(String domain) instead
  170.      */
  171.     public Enumeration getUsers() {
  172. final Enumeration domains=getVirtualDomains();
  173. return new Enumeration() {
  174. Enumeration enum=null;
  175. public boolean hasMoreElements() {
  176.     return (domains.hasMoreElements() || (enum != null && enum.hasMoreElements()));
  177. }
  178. public Object nextElement() {
  179.     if(enum == null || !enum.hasMoreElements()) {
  180. if(domains.hasMoreElements()) {
  181.     enum=getUsers((String)domains.nextElement());
  182. } else {
  183.     return null;
  184. }
  185.     }
  186.     return enum.nextElement();
  187. }
  188.     };
  189.     }
  190.     /**
  191.      * Get the userdata for the specified user.
  192.      * @param user Name of the user
  193.      */
  194.     public XMLUserData getUserData(String user, String domain,String passwd) throws InvalidPasswordException {
  195. return getUserData(user,domain,passwd,true);
  196.     }
  197.     /**
  198.      * get the userdata for the specified user. 
  199.      * Should do some sort of authentication if authentication is set. See Authenticator class for example.
  200.      */
  201.     public abstract XMLUserData getUserData(String user, String domain, String password, boolean authenticate) 
  202. throws InvalidPasswordException;
  203.     /**
  204.      * Compatibility wrapper for WebMail before 0.7
  205.      * @deprecated use new domain-aware method instead
  206.      */
  207. //     public UserData getUserData(String user, String passwd, boolean authenticate) 
  208. //  throws InvalidPasswordException {
  209. //  StringTokenizer tok=new StringTokenizer(user,"@");
  210. //  String login=tok.nextToken();
  211. //  String domain="nodomain";
  212. //  if(tok.hasMoreTokens()) {
  213. //      domain=tok.nextToken();
  214. //  }
  215. //  return (UserData)getUserData(login,domain,passwd,authenticate);
  216.     //    }
  217.     /**
  218.      * Save the userdata for the given user.
  219.      * @param user Username of this user
  220.      * @param domain Domain of this user
  221.      */
  222.     public abstract void saveUserData(String user, String domain);
  223.     /**
  224.      * Set the userdata for the specified user.
  225.      * @param user Name of the user
  226.      * @param userdata Data to store
  227.      * @deprecated use saveUserData instead.
  228.      */
  229.     public void setUserData(String user, UserData userdata) {
  230. // Call saveUserData, do nothing with "userdata"
  231. StringTokenizer tok=new StringTokenizer(user,"@");
  232. String login=tok.nextToken();
  233. String domain="nodomain";
  234. if(tok.hasMoreTokens()) {
  235.     domain=tok.nextToken();
  236. }
  237. saveUserData(login,domain);
  238.     }
  239.     /**
  240.      * Delete a WebMail user
  241.      * @param user Name of the user to delete
  242.      * @param domain Domain of that user
  243.      */
  244.     public abstract void deleteUserData(String user, String domain);
  245.     /**
  246.      * Delete a WebMail user
  247.      * @param user Name of the user to delete
  248.      * @deprecated use deleteUserData(String user, String domain) instead.
  249.      */
  250.     public void deleteUserData(String user) {
  251. StringTokenizer tok=new StringTokenizer(user,"@");
  252. String login=tok.nextToken();
  253. String domain="nodomain";
  254. if(tok.hasMoreTokens()) {
  255.     domain=tok.nextToken();
  256. }
  257. deleteUserData(user,domain);
  258.     }
  259.     /**
  260.      * Set/add a WebMail virtual domain
  261.      */
  262.     public void setVirtualDomain(String name,WebMailVirtualDomain v) {
  263. sysdata.setVirtualDomain(name,v);
  264. saveXMLSysData();
  265.     }
  266.     /**
  267.      * Get a WebMail virtual domain
  268.      */
  269.     public WebMailVirtualDomain getVirtualDomain(String name) {
  270. return sysdata.getVirtualDomain(name);
  271.     }
  272.     public WebMailVirtualDomain createVirtualDomain(String name) throws Exception {
  273. sysdata.createVirtualDomain(name);
  274. return sysdata.getVirtualDomain(name);
  275.     }
  276.     /**
  277.      * Delete a WebMail virtual domain
  278.      */
  279.     public void deleteVirtualDomain(String name) {
  280. sysdata.deleteVirtualDomain(name);
  281.     }
  282.     /**
  283.      * Return a list of virtual domains
  284.      */
  285.     public Enumeration getVirtualDomains() {
  286. return sysdata.getVirtualDomains();
  287.     }
  288.     /**
  289.      * Return this Storage's Authenticator.
  290.      * This is necessary for changing passwords or re-checking authentication.
  291.      */
  292.     public abstract Authenticator getAuthenticator();
  293.     /**
  294.      * Send a message to the logging facility.
  295.      * @param level severity level of the message
  296.      * @param message the message
  297.      */
  298.     public abstract void log(int level, String message);
  299.     public abstract void shutdown();
  300.     public void save() {
  301. saveXMLSysData();
  302.     }
  303.     protected abstract void loadXMLSysData();
  304.     protected abstract void saveXMLSysData();
  305.     public String getMimeType(String name) {
  306. String content_type;
  307. if(name != null && (name.toLowerCase().endsWith("jpg") || name.toLowerCase().endsWith("jpeg"))) {
  308.     content_type="IMAGE/JPEG";
  309. } else if(name != null && name.toLowerCase().endsWith("gif")) {
  310.     content_type="IMAGE/GIF";
  311. } else if(name != null && name.toLowerCase().endsWith("png")) {
  312.     content_type="IMAGE/PNG";
  313. } else if(name != null && name.toLowerCase().endsWith("txt")) {
  314.     content_type="TEXT/PLAIN";
  315. } else if(name != null && (name.toLowerCase().endsWith("htm") || name.toLowerCase().endsWith("html"))) {
  316.     content_type="TEXT/HTML";
  317. } else {
  318.     content_type="APPLICATION/OCTET-STREAM";
  319. }
  320. return content_type;
  321.     }
  322. }