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