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 private List packages/package-summary.html">ong> 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 public void setPackageList(List packageList)/package-summary.html">ong> 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
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
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 }