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 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.commons.lang.StringUtils;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31
32 import org.apache.turbine.Turbine;
33 import org.apache.turbine.TurbineConstants;
34 import org.apache.turbine.modules.Assembler;
35 import org.apache.turbine.modules.GenericLoader;
36 import org.apache.turbine.services.assemblerbroker.util.AssemblerFactory;
37 import org.apache.turbine.util.ObjectUtils;
38
39 /***
40 * A screen factory that attempts to load a java class from
41 * the module packages defined in the TurbineResource.properties.
42 *
43 * @author <a href="mailto:leon@opticode.co.za">Leon Messerschmidt</a>
44 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
45 * @version $Id: JavaBaseFactory.java 534527 2007-05-02 16:10:59Z tv $
46 */
47 public abstract class JavaBaseFactory
48 implements AssemblerFactory
49 {
50 /**</package-summary/html">A vector of packages/ *//package-summary.html">em>* A vector of packages. */
51 private static List packages =/package-summary.html">ong> static List packages =
52 Turbine.getConfiguration().getList(TurbineConstants.MODULE_PACKAGES);
53
54 /*** Logging */
55 protected Log log = LogFactory.getLog(this.getClass());
56
57 /***
58 * A cache for previously obtained Class instances, which we keep in order
59 * to reduce the Class.forName() overhead (which can be sizable).
60 */
61 private Map classCache = Collections.synchronizedMap(new HashMap());
62
63 static
64 {
65 ObjectUtils.addOnce(packages, GenericLoader.getBasePackage());
66 }
67
68 /***
69 * Get an Assembler.
70 *
71 * @param packageName java package name
72 * @param name name of the requested Assembler
73 * @return an Assembler
74 */
75 public Assembler getAssembler(String packageName, String name)/package-summary.html">ong> Assembler getAssembler(String packageName, String name)
76 {
77 Assembler assembler = null;
78
79 log.debug("Class Fragment is " + name);
80
81 if (StringUtils.isNotEmpty(name))
82 {
83 for (Iterator it = packages.iterator(); it.hasNext();)
84 {
85 StringBuffer className = new StringBuffer();
86
87 className.append(it.next());
88 className.append('.');
89 className.append(packageName);
90 className.append('.');
91 className.append(name);
92
93 log.debug("Trying " + className);
94
95 try
96 {
97 Class servClass = (Class) classCache.get(className);
98 if(servClass == null)
99 {
100 servClass = Class.forName(className.toString());
101 classCache.put(className, servClass);
102 }
103 assembler = (Assembler) servClass.newInstance();
104 break;
105 }
106 catch (ClassNotFoundException cnfe)
107 {
108
109 log.debug(className + ": Not found");
110 }
111 catch (NoClassDefFoundError ncdfe)
112 {
113
114 log.debug(className + ": No Class Definition found");
115 }
116 catch (ClassCastException cce)
117 {
118
119
120
121 log.error("Could not load "+className, cce);
122 break;
123 }
124 catch (InstantiationException ine)
125 {
126
127
128
129 log.error("Could not load "+className, ine);
130 break;
131 }
132 catch (IllegalAccessException ilae)
133 {
134
135
136
137 log.error("Could not load "+className, ilae);
138 break;
139 }
140
141 }
142 }
143 log.debug("Returning: " + assembler);
144
145 return assembler;
146 }
147 }