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 }