1 package br.com.ibnetwork.guara.modules.impl; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import org.apache.avalon.framework.configuration.Configurable; 9 import org.apache.avalon.framework.configuration.Configuration; 10 import org.apache.avalon.framework.configuration.ConfigurationException; 11 import org.apache.avalon.framework.service.ServiceException; 12 import org.apache.avalon.framework.service.ServiceManager; 13 import org.apache.avalon.framework.service.Serviceable; 14 import org.apache.commons.logging.Log; 15 import org.apache.commons.logging.LogFactory; 16 17 import br.com.ibnetwork.xingu.factory.Factory; 18 import br.com.ibnetwork.guara.modules.Module; 19 import br.com.ibnetwork.guara.modules.ModuleLoader; 20 import br.com.ibnetwork.guara.modules.ModuleLoaderException; 21 22 /*** 23 * @author <a href="mailto:leandro@ibnetwork.com.br">leandro</a> 24 */ 25 public class ModuleLoaderImpl 26 implements ModuleLoader, Serviceable, Configurable 27 { 28 private Log logger; 29 30 private Factory factory; 31 32 private Map registry; 33 34 35 36 public void service(ServiceManager manager) 37 throws ServiceException 38 { 39 logger = LogFactory.getLog(ModuleLoaderImpl.class); 40 factory = (Factory) manager.lookup(Factory.ROLE); 41 } 42 43 public void configure(Configuration conf) 44 throws ConfigurationException 45 { 46 Configuration[] loaders = conf.getChildren("loader"); 47 registry = new HashMap(loaders.length); 48 for (int i = 0; i < loaders.length; i++) 49 { 50 Configuration loaderConf = loaders[i]; 51 String type = loaderConf.getAttribute("type"); 52 boolean recurse = loaderConf.getAttributeAsBoolean("recurse",true); 53 String defaultModuleName = loaderConf.getAttribute("defaultModuleName","Default"); 54 logger.info("Creating loader for type["+type+"]"); 55 Loader loader = new Loader(type,recurse,defaultModuleName); 56 Configuration[] packages = loaderConf.getChild("packages").getChildren("package"); 57 List packageList = new ArrayList(packages.length); 58 for (int j = 0; j < packages.length; j++) 59 { 60 String packageName = packages[j].getAttribute("name"); 61 if(packageName != null)/package-summary.html">ong>(packageName != null) 62 { 63 logger.info("package["+packageName+"] added"); 64 packageList.add(packageName + "."); 65 } 66 } 67 loader.setPackageList(packageList); 68 loader.setFactory(factory); 69 registry.put(type,loader); 70 } 71 } 72 73 public Module loadModule(String name, String type) 74 throws ModuleLoaderException 75 { 76 Loader loader = (Loader) registry.get(type); 77 if(loader == null) 78 { 79 throw new ModuleLoaderException("No loader found for type ["+type+"]"); 80 } 81 try 82 { 83 Module module = loader.load(name); 84 if(module == null) 85 { 86 throw new ModuleLoaderException("Loader can't find module name["+name+"] type["+type+"] or the default module"); 87 } 88 return module; 89 } 90 catch(Exception e) 91 { 92 throw new ModuleLoaderException("Error loading module name["+name+"] type["+type+"]",e); 93 } 94 } 95 }