1 package org.apache.turbine.services.assemblerbroker.util.java;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import java.util.List;
24 import java.util.concurrent.ConcurrentHashMap;
25
26 import org.apache.commons.lang3.StringUtils;
27 import org.apache.logging.log4j.LogManager;
28 import org.apache.logging.log4j.Logger;
29 import org.apache.turbine.modules.Assembler;
30 import org.apache.turbine.modules.GenericLoader;
31 import org.apache.turbine.modules.Loader;
32 import org.apache.turbine.services.assemblerbroker.util.AssemblerFactory;
33
34
35
36
37
38
39
40
41
42 public abstract class JavaBaseFactory<T extends Assembler>
43 implements AssemblerFactory<T>
44 {
45
46 private static List<String> packages = GenericLoader.getPackages();
47
48
49 protected Logger log = LogManager.getLogger(this.getClass());
50
51
52
53
54
55 private final ConcurrentHashMap<String, Class<T>> classCache = new ConcurrentHashMap<>();
56
57
58
59
60
61
62
63
64 @SuppressWarnings("unchecked")
65 public T getAssembler(String packageName, String name)
66 {
67 T assembler = null;
68
69 log.debug("Class Fragment is {}", name);
70
71 if (StringUtils.isNotEmpty(name))
72 {
73 for (String p : packages)
74 {
75 StringBuilder sb = new StringBuilder();
76
77 sb.append(p).append('.').append(packageName).append('.').append(name);
78 String className = sb.toString();
79
80 log.debug("Trying {}", className);
81
82 try
83 {
84 Class<T> servClass = classCache.get(className);
85 if (servClass == null)
86 {
87 servClass = (Class<T>) Class.forName(className);
88 Class<T> _servClass = classCache.putIfAbsent(className, servClass);
89 if (_servClass != null)
90 {
91 servClass = _servClass;
92 }
93 }
94 assembler = servClass.newInstance();
95 break;
96 }
97 catch (ClassNotFoundException cnfe)
98 {
99
100 log.debug("{}: Not found", className);
101 }
102 catch (NoClassDefFoundError ncdfe)
103 {
104
105 log.debug("{}: No Class Definition found", className);
106 }
107
108 catch (ClassCastException | InstantiationException | IllegalAccessException e)
109 {
110
111
112
113 log.error("Could not load {}", className, e);
114 break;
115 }
116 }
117 }
118
119 log.debug("Returning: {}", assembler);
120
121 return assembler;
122 }
123
124
125
126
127
128
129 @Override
130 public abstract Loader<T> getLoader();
131
132
133
134
135
136
137 @Override
138 public int getCacheSize()
139 {
140 return getLoader().getCacheSize();
141 }
142 }