View Javadoc

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                  ifong>(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  }