📄 avalonmailstore.java
字号:
/*********************************************************************** * Copyright (c) 2000-2004 The Apache Software Foundation. * * All rights reserved. * * ------------------------------------------------------------------- * * Licensed under the Apache License, Version 2.0 (the "License"); you * * may not use this file except in compliance with the License. You * * may obtain a copy of the License at: * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * * implied. See the License for the specific language governing * * permissions and limitations under the License. * ***********************************************************************/package org.apache.james.core;import org.apache.avalon.framework.activity.Initializable;import org.apache.avalon.framework.component.Component;import org.apache.avalon.framework.component.ComponentException;import org.apache.avalon.framework.component.ComponentManager;import org.apache.avalon.framework.component.Composable;import org.apache.avalon.framework.configuration.Configurable;import org.apache.avalon.framework.configuration.Configuration;import org.apache.avalon.framework.configuration.ConfigurationException;import org.apache.avalon.framework.configuration.DefaultConfiguration;import org.apache.avalon.framework.context.Context;import org.apache.avalon.framework.context.ContextException;import org.apache.avalon.framework.context.Contextualizable;import org.apache.avalon.framework.logger.AbstractLogEnabled;import org.apache.avalon.framework.logger.LogEnabled;import org.apache.james.services.MailRepository;import org.apache.james.services.MailStore;import org.apache.james.services.SpoolRepository;import java.util.HashMap;/** * Provides a registry of mail repositories. A mail repository is uniquely * identified by its destinationURL, type and model. * */public class AvalonMailStore extends AbstractLogEnabled implements Contextualizable, Composable, Configurable, Initializable, MailStore { // Prefix for repository names private static final String REPOSITORY_NAME = "Repository"; // Static variable used to name individual repositories. Should only // be accessed when a lock on the AvalonMailStore.class is held private static long id; // map of [destinationURL + type]->Repository private HashMap repositories; // map of [protocol(destinationURL) + type ]->classname of repository; private HashMap classes; // map of [protocol(destinationURL) + type ]->default config for repository. private HashMap defaultConfigs; /** * The Avalon context used by the instance */ protected Context context; /** * The Avalon configuration used by the instance */ protected Configuration configuration; /** * The Avalon component manager used by the instance */ protected ComponentManager componentManager; private SpoolRepository inboundSpool; /** * @see org.apache.avalon.framework.context.Contextualizable#contextualize(Context) */ public void contextualize(final Context context) throws ContextException { this.context = context; } /** * @see org.apache.avalon.framework.component.Composable#compose(ComponentManager) */ public void compose( final ComponentManager componentManager ) throws ComponentException { this.componentManager = componentManager; } /** * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) */ public void configure( final Configuration configuration ) throws ConfigurationException { this.configuration = configuration; } /** * @see org.apache.avalon.framework.activity.Initializable#initialize() */ public void initialize() throws Exception { getLogger().info("JamesMailStore init..."); repositories = new HashMap(); classes = new HashMap(); defaultConfigs = new HashMap(); Configuration[] registeredClasses = configuration.getChild("repositories").getChildren("repository"); for ( int i = 0; i < registeredClasses.length; i++ ) { registerRepository((Configuration) registeredClasses[i]); } Configuration spoolRepConf = configuration.getChild("spoolRepository").getChild("repository"); try { inboundSpool = (SpoolRepository) select(spoolRepConf); } catch (Exception e) { getLogger().error("Cannot open private SpoolRepository"); throw e; } if (getLogger().isInfoEnabled()) { getLogger().info("SpoolRepository inboundSpool opened: " + inboundSpool.hashCode()); getLogger().info("James MailStore ...init"); } } /** * <p>Registers a new mail repository type in the mail store's * registry based upon a passed in <code>Configuration</code> object.</p> * * <p>This is presumably synchronized to prevent corruption of the * internal registry.</p> * * @param repConf the Configuration object used to register the * repository * * @throws ConfigurationException if an error occurs accessing the * Configuration object */ public synchronized void registerRepository(Configuration repConf) throws ConfigurationException { String className = repConf.getAttribute("class"); boolean infoEnabled = getLogger().isInfoEnabled(); Configuration[] protocols = repConf.getChild("protocols").getChildren("protocol"); Configuration[] types = repConf.getChild("types").getChildren("type"); for ( int i = 0; i < protocols.length; i++ ) { String protocol = protocols[i].getValue(); // Get the default configuration for these protocol/type combinations. Configuration defConf = repConf.getChild("config"); for ( int j = 0; j < types.length; j++ ) { String type = types[j].getValue(); String key = protocol + type ; if (infoEnabled) { StringBuffer infoBuffer = new StringBuffer(128) .append("Registering Repository instance of class ") .append(className) .append(" to handle ") .append(protocol) .append(" protocol requests for repositories of type ") .append(type); getLogger().info(infoBuffer.toString()); } if (classes.get(key) != null) { throw new ConfigurationException("The combination of protocol and type comprise a unique key for repositories. This constraint has been violated. Please check your repository configuration."); } classes.put(key, className); if (defConf != null) { defaultConfigs.put(key, defConf); } } } } /** * This method accept a Configuration object as hint and return the * corresponding MailRepository. * The Configuration must be in the form of: * <repository destinationURL="[URL of this mail repository]" * type="[repository type ex. OBJECT or STREAM or MAIL etc.]" * model="[repository model ex. PERSISTENT or CACHE etc.]"> * [addition configuration] * </repository> * * @param hint the Configuration object used to look up the repository * * @return the selected repository * * @throws ComponentException if any error occurs while parsing the * Configuration or retrieving the * MailRepository */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -