⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 storage.java

📁 java 开发的一个电子邮局,挺实用的
💻 JAVA
字号:
/* CVS ID: $Id: Storage.java,v 1.7 2000/12/30 10:39:09 wastl Exp $ */
package net.wastl.webmail.server;

import net.wastl.webmail.config.*;
import net.wastl.webmail.xml.*;
import net.wastl.webmail.exceptions.*;
import java.io.*;
import java.util.*;

import org.apache.xalan.xslt.*;

/*
 * Storage.java
 *
 * Created: Feb 1999
 *
 * Copyright (C) 1999-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 provides a generic interface for getting and setting stored
 * data in WebMail.
 * 
 * @see net.wastl.webmail.storage.simple.SimpleStorage
 * @author Sebastian Schaffert
 * @version $Revision: 1.7 $
*/
/* 9/24/2000 devink - updated for new challenge/response authentication */
public abstract class Storage {

    public static final int LOG_DEBUG=10;
    public static final int LOG_INFO=5;
    public static final int LOG_WARN=3;
    public static final int LOG_ERR=1;
    public static final int LOG_CRIT=0;

    protected static boolean debug;

    protected WebMailServer parent;

    protected ConfigScheme cs;

    protected XMLSystemData sysdata;

    protected XMLGenericModel generic_model;

    public Storage(WebMailServer parent) {
	debug=WebMailServer.getDebug();
	this.parent=parent;
	cs=parent.getConfigScheme();
	cs.configRegisterYesNoKey("FOLDER TRY LOGIN PASSWORD","Try to connect folders with the user's login password if authentication fails");

    }

    public void initConfigKeys() {
	// Initialize the configuration file with the default or set parameters
	// needed to complete the XML file
	Enumeration enum=cs.getPossibleKeys();
	while(enum.hasMoreElements()) {
	    String key=(String)enum.nextElement();
	    if(!sysdata.isConfigSet(key)) {
		// We must use the raw method so the input doesn't get filtered.
		sysdata.setConfig(key,(String)cs.getDefaultValue(key),false,false);
	    }
	}
	saveXMLSysData();
    }


    public void setDebug(boolean b) {
	debug=b;
    }

    public boolean getDebug() {
	return debug;
    }

    /**
     * Fetch all keys of the current configuration.
     */
    public Enumeration getConfigKeys() {
	return cs.getPossibleKeys();
    }

    /**
     * Fetch the configuration associated with the specified key.
     * @param key Identifier for the configuration
     */
    public String getConfig(String key) {	
	return sysdata.getConfig(key);
    }

    /**
     * Set a configuration "key" to the specified value.
     * @param key Identifier for the configuration
     * @param value value to set
      */
    public void setConfig(String key, String value) throws IllegalArgumentException {
    // Modified by exce, start
    /**
     * Maybe here is a bug.
     *
     * Consider that if administrator happens to delete the value of certain
     * key, that is, the key is an empty tag.
     * FileStorage.java:272 call ConfigScheme.configRegister???Key() to set
     * value first, which becomes a default value, then call this function.
     * However, ConfigStore.getConfig() returns default value 
     * if the key is an empty tag in configuration file that getConfigRaw() 
     * returns null/empty value. That means the value passing in here is always
     * equals to the value returned by ConfigStore.getConfig().
     *
     * The simplest way to enforce saving config data is to comment out the 
     * if statement. However, this may be a performance issue, so I don't 
     * modify the code.
     */
    // Modified by exce, end
	if(!value.equals(getConfig(key))) {
	    log(LOG_DEBUG,"Storage API: Setting configuration for '"+key+"' to '"+value+"'.");
	    sysdata.setConfig(key,value);
	    saveXMLSysData();
	}
    }

    /**
     * Get the String for key and the specified locale.
     * @param key Identifier for the String
     * @param locale locale of the String to fetch
     */
    public abstract String getStringResource(String key, Locale locale);


   /** 
     * Get a xsl stylesheet for the specified locale and theme.
     * @param key Identifier for the String
     * @param locale locale of the String to fetch
     * @param theme theme where to look for the file
     */
    public abstract StylesheetRoot getStylesheet(String name, Locale locale, String theme) throws WebMailException;

   /** 
     * Get a binary file (most likely an image) for the specified locale and theme.
     * @param key Identifier for the String
     * @param locale locale of the String to fetch
     * @param theme theme where to look for the file
     */
    public abstract byte[] getBinaryFile(String name, Locale locale, String theme) throws BinaryNotFoundException;


    /**
     * Calculate the document base path for a given locale and theme
     */
    public String getBasePath(Locale locale, String theme) {
	String language_path=(parent.getProperty("webmail.template.path")+
			      System.getProperty("file.separator")+locale.getLanguage());
	File f=new File(language_path);
	if(!f.exists()) {
	    language_path=(parent.getProperty("webmail.template.path")+
			   System.getProperty("file.separator")+parent.getDefaultLocale().getLanguage());
	    f=new File(language_path);
	    if(!f.exists()) {
		System.err.println("Storage::getBasePath: Default Language templates not found \n(tried path: "+language_path+")");
	    }
	}
	String theme_path=language_path+System.getProperty("file.separator")+theme;
	f=new File(theme_path);
	if(!f.exists()) {
	    if(parent.getProperty("webmail.default.theme") != null) {
		theme_path=language_path+System.getProperty("file.separator")+
		    parent.getProperty("webmail.default.theme");
	    } else {
		theme_path=language_path+System.getProperty("file.separator")+
		    "bibop";
	    }
	    f=new File(theme_path);
	    if(!f.exists()) {
		System.err.println("Storage::getBasePath: Theme could not be found; probably a problem with your\n installation. Please check the lib/templates/bibop directory and the \nwebmail.default.theme property");
	    }
	}
	String basepath=theme_path+System.getProperty("file.separator");
	return basepath;
    }	

    public XMLSystemData getSystemData() {
	return sysdata;
    }

    public XMLUserModel createXMLUserModel(XMLUserData data) {
	return new XMLUserModel(parent,sysdata.getSysData(),data.getUserData());
    }

    /**
     * Return a XML model that contains state and system information for administrator use   
     */
    public XMLAdminModel createXMLAdminModel() {
	XMLAdminModel model=new XMLAdminModel(parent,sysdata.getSysData());
	model.init();
	model.update();
	return model;
    }

    /**
     * Return a generic XML model that only contains some state and system information.
     * This cannot be changed by a single session.
     */
    public XMLGenericModel createXMLGenericModel() {
	XMLGenericModel model=new XMLGenericModel(parent,sysdata.getSysData());
	model.init();
	model.update();
	return model;
    }

    /**
     * Return userlist for a given domain.
     */
    public abstract Enumeration getUsers(String domain);

    /**
     * @deprecated Use getUsers(String domain) instead
     */
    public Enumeration getUsers() {
	final Enumeration domains=getVirtualDomains();
	return new Enumeration() {
		Enumeration enum=null;
		public boolean hasMoreElements() {
		    return (domains.hasMoreElements() || (enum != null && enum.hasMoreElements()));
		}
		public Object nextElement() {
		    if(enum == null || !enum.hasMoreElements()) {
			if(domains.hasMoreElements()) {
			    enum=getUsers((String)domains.nextElement());
			} else {
			    return null;
			}
		    }
		    return enum.nextElement();
		}
	    };
    }

    /**
     * Get the userdata for the specified user.
     * @param user Name of the user
     * @param domain Virtual Domain name of the user
     * @param passwd Password that the user provided
     *
     * devink 7/15/2000 - deprecated, but left in for backwards compat.
     * devink 9/24/2000 - not deprecated any more
     * XXX should passwd be a parameter?
     */
    public XMLUserData getUserData(String user, String domain,String passwd) 
	 throws UserDataException, InvalidPasswordException {
	    return getUserData(user,domain,passwd,false);
    }

    /**
     * get the userdata for the specified user. 
     * Should do some sort of authentication if authentication is set. See 
     * Authenticator class for example.
     *
     * devink 7/15/2000 - depreciated, and is no longer abstract, so there is
     * no requirement to implement it.
     * devink 9/24/2000 - not depreciated, and is now abstract
     */
    public abstract XMLUserData getUserData(String user, String domain, 
     String password, boolean authenticate) 
     throws UserDataException, InvalidPasswordException; 

    /**
     * Create a userdata for the specified user
     */
    public abstract XMLUserData createUserData(String user, String domain, String password) 
	throws CreateUserDataException;

    /**
     * Save the userdata for the given user.
     * @param user Username of this user
     * @param domain Domain of this user
     */
    public abstract void saveUserData(String user, String domain);

    /**
     * Set the userdata for the specified user.
     * @param user Name of the user
     * @param userdata Data to store
     * @deprecated use saveUserData instead.
     */
    public void setUserData(String user, UserData userdata) {
	// Call saveUserData, do nothing with "userdata"
	StringTokenizer tok=new StringTokenizer(user,"@");
	String login=tok.nextToken();
	String domain="nodomain";
	if(tok.hasMoreTokens()) {
	    domain=tok.nextToken();
	}
	saveUserData(login,domain);
    }

    /**
     * Delete a WebMail user
     * @param user Name of the user to delete
     * @param domain Domain of that user
     */
    public abstract void deleteUserData(String user, String domain);

    /**
     * Delete a WebMail user
     * @param user Name of the user to delete
     * @deprecated use deleteUserData(String user, String domain) instead.
     */
    public void deleteUserData(String user) {
	StringTokenizer tok=new StringTokenizer(user,"@");
	String login=tok.nextToken();
	String domain="nodomain";
	if(tok.hasMoreTokens()) {
	    domain=tok.nextToken();
	}
	deleteUserData(user,domain);
    }	

    /**
     * Set/add a WebMail virtual domain
     */
    public void setVirtualDomain(String name,WebMailVirtualDomain v) {
	sysdata.setVirtualDomain(name,v);
	saveXMLSysData();
    }

    /**
     * Get a WebMail virtual domain
     */
    public WebMailVirtualDomain getVirtualDomain(String name) {
	return sysdata.getVirtualDomain(name);
    }

    public WebMailVirtualDomain createVirtualDomain(String name) throws Exception {
	sysdata.createVirtualDomain(name);
	return sysdata.getVirtualDomain(name);
    }

    /**
     * Delete a WebMail virtual domain
     */
    public void deleteVirtualDomain(String name) {
	sysdata.deleteVirtualDomain(name);
    }

    /**
     * Return a list of virtual domains
     */
    public Enumeration getVirtualDomains() {
	return sysdata.getVirtualDomains();
    }

    /**
     * Return this Storage's Authenticator.
     * This is necessary for changing passwords or re-checking authentication.
     */
    public abstract Authenticator getAuthenticator();

    /**
     * Send a message to the logging facility.
     * @param level severity level of the message
     * @param message the message
     */
    public abstract void log(int level, String message);

    public abstract void shutdown();

    public void save() {
	saveXMLSysData();
    }


    protected abstract void loadXMLSysData();

    protected abstract void saveXMLSysData();

    public String getMimeType(String name) {
	String content_type;
	if(name != null && (name.toLowerCase().endsWith("jpg") || name.toLowerCase().endsWith("jpeg"))) {
	    content_type="IMAGE/JPEG";
	} else if(name != null && name.toLowerCase().endsWith("gif")) {
	    content_type="IMAGE/GIF";
	} else if(name != null && name.toLowerCase().endsWith("png")) {
	    content_type="IMAGE/PNG";
	} else if(name != null && name.toLowerCase().endsWith("txt")) {
	    content_type="TEXT/PLAIN";
	} else if(name != null && (name.toLowerCase().endsWith("htm") || name.toLowerCase().endsWith("html"))) {
	    content_type="TEXT/HTML";
	} else {
	    content_type="APPLICATION/OCTET-STREAM";
	}
	return content_type;
    }
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -