View Javadoc

1   package br.com.ibnetwork.guara.modules.impl;
2   
3   import java.util.HashMap;
4   import java.util.Iterator;
5   import java.util.List;
6   import java.util.Map;
7   
8   import org.apache.commons.lang.StringUtils;
9   import org.apache.commons.logging.Log;
10  import org.apache.commons.logging.LogFactory;
11  
12  import br.com.ibnetwork.xingu.factory.Factory;
13  import br.com.ibnetwork.guara.modules.Module;
14  
15  /***
16   * @author <a href="mailto:leandro@ibnetwork.com.br">leandro</a>
17   */
18  public class Loader
19  {
20      private Log logger = LogFactory.getLog(Loader.class);
21      
22      privateong> List packages;
23      
24      private boolean recurse;
25      
26      private String type;
27      
28      private Factory factory;
29      
30      private Map cache;
31  
32      private String defaultModuleName;
33      
34      public Loader(String type, boolean recurse, String defaultModuleName)
35      {
36          this.type = type;
37          this.recurse = recurse;
38          this.defaultModuleName = defaultModuleName;
39          this.cache = new HashMap();
40      }
41  
42      publicong> void setPackageList(List packageList)
43      {
44          packages = packageList;
45      }
46  
47      public void setFactory(Factory factory)
48      {
49          this.factory = factory;
50      }
51      
52      public boolean isRecursive()
53      {
54          return recurse;
55      }
56      
57      public Module load(String name)
58      {
59          Module module = (Module) cache.get(name);
60          if(module != null)
61          {
62              if(logger.isDebugEnabled()) logger.debug("Module ["+name+"] cached");
63              return module;
64          }
65          module = serachOnConfiguredPackages(name);
66          if(module == null && recurse)
67          {
68              module = recurse(name);
69          }
70          logger.info("Module ["+name+"] found ["+module.getClass().getName()+"]");
71          module.setName(name);
72          cache.put(name,module);
73          return module;
74      }
75  
76      private Module serachOnConfiguredPackages(String name)
77      {
78          if(logger.isDebugEnabled()) logger.debug("searching for module ["+name+"]");
79          for (Iterator iter = packages.iterator(); iter.hasNext();)
80          {
81              String packageName = (String) iter.next();
82              String className = packageName + name;
83              if(logger.isDebugEnabled()) logger.debug("className is ["+className+"]");
84              try
85              {
86              	Class clazz = Class.forName(className);
87              	Module module = (Module) factory.create(clazz);
88              	return module;
89              }
90              catch(ClassNotFoundException e)
91              {
92                  //ignore. move to next package
93              }
94          }
95          return null;
96  
97      }
98      
99      private Module recurse(String name)
100     {
101         String[] packageNamesInModule = StringUtils.split(name,".");
102         if(packageNamesInModule.length == 1)
103         {
104             //no subpackages
105             Module module = serachOnConfiguredPackages(defaultModuleName);
106             return module;
107         }
108         else
109         {
110             int slots = packageNamesInModule.length;
111             String discarded = "";
112             for(int i = slots-1; i >= 0; i--)
113             {
114                 discarded = "." + packageNamesInModule[i] + discarded;
115                 int index = name.indexOf(discarded);
116                 if(index >= 0)
117                 {
118                     String newName = name.substring(0,index) + "." + defaultModuleName;
119                     Module module = serachOnConfiguredPackages(newName);
120                     if(module != null)
121                     {
122                         return module;
123                     }
124                 }
125                 else
126                 {
127                     return serachOnConfiguredPackages(defaultModuleName);   
128                 }
129             }
130         }
131         return null;
132     }
133 }