1 /************************************************************************ 2 * Copyright (c) 2000-2006 The Apache Software Foundation. * 3 * All rights reserved. * 4 * ------------------------------------------------------------------- * 5 * Licensed under the Apache License, Version 2.0 (the "License"); you * 6 * may not use this file except in compliance with the License. You * 7 * may obtain a copy of the License at: * 8 * * 9 * http://www.apache.org/licenses/LICENSE-2.0 * 10 * * 11 * Unless required by applicable law or agreed to in writing, software * 12 * distributed under the License is distributed on an "AS IS" BASIS, * 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * 14 * implied. See the License for the specific language governing * 15 * permissions and limitations under the License. * 16 ***********************************************************************/ 17 18 package org.apache.james.core; 19 20 import org.apache.avalon.framework.activity.Initializable; 21 import org.apache.avalon.framework.component.Composable; 22 import org.apache.avalon.framework.configuration.Configurable; 23 import org.apache.avalon.framework.configuration.Configuration; 24 import org.apache.avalon.framework.configuration.ConfigurationException; 25 import org.apache.avalon.framework.container.ContainerUtil; 26 import org.apache.avalon.framework.context.Context; 27 import org.apache.avalon.framework.context.ContextException; 28 import org.apache.avalon.framework.context.Contextualizable; 29 import org.apache.avalon.framework.logger.AbstractLogEnabled; 30 import org.apache.avalon.framework.service.ServiceException; 31 import org.apache.avalon.framework.service.ServiceManager; 32 import org.apache.avalon.framework.service.Serviceable; 33 import org.apache.james.services.UsersRepository; 34 import org.apache.james.services.UsersStore; 35 36 import java.util.HashMap; 37 import java.util.Iterator; 38 39 /*** 40 * Provides a registry of user repositories. 41 * 42 */ 43 public class AvalonUsersStore 44 extends AbstractLogEnabled 45 implements Contextualizable, Serviceable, Configurable, Initializable, UsersStore { 46 47 /*** 48 * A mapping of respository identifiers to actual repositories 49 * This mapping is obtained from the component configuration 50 */ 51 private HashMap repositories; 52 53 /*** 54 * The Avalon context used by the instance 55 */ 56 protected Context context; 57 58 /*** 59 * The Avalon configuration used by the instance 60 */ 61 protected Configuration configuration; 62 63 /*** 64 * The Avalon component manager used by the instance 65 */ 66 protected ServiceManager manager; 67 68 /*** 69 * @see org.apache.avalon.framework.context.Contextualizable#contextualize(Context) 70 */ 71 public void contextualize(final Context context) 72 throws ContextException { 73 this.context = context; 74 } 75 76 /*** 77 * @see org.apache.avalon.framework.service.Serviceable#compose(ServiceManager) 78 */ 79 public void service( final ServiceManager manager ) 80 throws ServiceException { 81 this.manager = manager; 82 } 83 84 /*** 85 * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) 86 */ 87 public void configure( final Configuration configuration ) 88 throws ConfigurationException { 89 this.configuration = configuration; 90 } 91 92 /*** 93 * @see org.apache.avalon.framework.activity.Initializable#initialize() 94 */ 95 public void initialize() 96 throws Exception { 97 98 getLogger().info("AvalonUsersStore init..."); 99 repositories = new HashMap(); 100 101 Configuration[] repConfs = configuration.getChildren("repository"); 102 ClassLoader theClassLoader = null; 103 for ( int i = 0; i < repConfs.length; i++ ) 104 { 105 Configuration repConf = repConfs[i]; 106 String repName = repConf.getAttribute("name"); 107 String repClass = repConf.getAttribute("class"); 108 109 if (getLogger().isDebugEnabled()) { 110 getLogger().debug("Starting " + repClass); 111 } 112 113 if (theClassLoader == null) { 114 theClassLoader = this.getClass().getClassLoader(); 115 } 116 117 UsersRepository rep = (UsersRepository) theClassLoader.loadClass(repClass).newInstance(); 118 119 setupLogger(rep); 120 121 ContainerUtil.contextualize(rep,context); 122 ContainerUtil.service(rep,manager); 123 if (rep instanceof Composable) { 124 final String error = "no implementation in place to support Composable"; 125 getLogger().error( error ); 126 throw new IllegalArgumentException( error ); 127 } 128 ContainerUtil.configure(rep,repConf); 129 ContainerUtil.initialize(rep); 130 131 repositories.put(repName, rep); 132 if (getLogger().isInfoEnabled()) { 133 StringBuffer logBuffer = 134 new StringBuffer(64) 135 .append("UsersRepository ") 136 .append(repName) 137 .append(" started."); 138 getLogger().info(logBuffer.toString()); 139 } 140 } 141 getLogger().info("AvalonUsersStore ...init"); 142 } 143 144 145 /*** 146 * Get the repository, if any, whose name corresponds to 147 * the argument parameter 148 * 149 * @param name the name of the desired repository 150 * 151 * @return the UsersRepository corresponding to the name parameter 152 */ 153 public UsersRepository getRepository(String name) { 154 UsersRepository response = (UsersRepository) repositories.get(name); 155 if ((response == null) && (getLogger().isWarnEnabled())) { 156 getLogger().warn("No users repository called: " + name); 157 } 158 return response; 159 } 160 161 /*** 162 * Yield an <code>Iterator</code> over the set of repository 163 * names managed internally by this store. 164 * 165 * @return an Iterator over the set of repository names 166 * for this store 167 */ 168 public Iterator getRepositoryNames() { 169 return this.repositories.keySet().iterator(); 170 } 171 }