1 package org.ocltf.common;
2
3 import java.net.URL;
4
5 import org.apache.commons.digester.xmlrules.DigesterLoader;
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8 import org.ocltf.utils.ExceptionUtils;
9 import org.ocltf.utils.XmlResourceUtils;
10
11 /***
12 * Creates and returns Objects based on the a set of
13 * Apache Digester rules.
14 *
15 * @author Chad Brandon
16 */
17 public class XmlObjectFactory {
18
19 private static final Log logger = LogFactory.getLog(XmlObjectFactory.class);
20
21 private static final String RULES_SUFFIX = "-Rules";
22
23 /***
24 * Returns a new instance of the object specified in
25 * the rulesXml
26 *
27 * @param objectClass - the class for the object we are instantiating
28 * (the expected rules will be passed on this objectClass name)
29 * @param objectXml - the digester XML that configures the object.
30 * @return
31 */
32 public static Object getInstance(Class objectClass, URL objectXml) {
33 String methodName = "getInstance";
34 if (logger.isDebugEnabled()) {
35 logger.debug("performing " + methodName
36 + " with objectXml (" + objectXml+ ")");
37 }
38 ExceptionUtils.checkNull(methodName, "objectXml", objectXml);
39 ExceptionUtils.checkNull(methodName, "objectClass", objectClass);
40
41 ClassLoader loader = Thread.currentThread().getContextClassLoader();
42
43 URL objectRulesXml =
44 XmlResourceUtils.getResource(objectClass.getName() + RULES_SUFFIX);
45
46 Object object = null;
47 try {
48 object = getObject(objectRulesXml, objectXml, loader);
49 } catch (Exception ex) {
50 String errMsg = "Could not load XmlOjbect from configuration file --> '"
51 + objectXml + "'";
52 logger.error(errMsg, ex);
53 throw new XmlObjectFactoryException(errMsg, ex);
54 }
55 return object;
56 }
57
58 /***
59 * Returns a configured Object based on the objectXml configuration file
60 *
61 * @param objectRulesXml the path to the XML resource config file that contains
62 * the rules about the Object configuration file
63 * @param objectXml the path to the Object XML config file.
64 * @param loader the ClassLoader to use with Digester.
65 * @return Object the created instance.
66 */
67 private static Object getObject(URL objectRulesXml, URL objectXml, ClassLoader loader) {
68 String methodName = "getObject";
69 if (logger.isDebugEnabled()) {
70 logger.debug("performing "+ methodName
71 + " with objectRulesXml ("
72 + objectRulesXml + ") and objectXml ("
73 + objectXml + ") and loader (" + loader + ")");
74 }
75 ExceptionUtils.checkNull(methodName, "objectRulesXml", objectRulesXml);
76 ExceptionUtils.checkNull(methodName, "objectXml", objectXml);
77
78 Object object = null;
79 try {
80 object =
81 (Object) DigesterLoader.load(objectRulesXml, loader, objectXml);
82 } catch (Exception ex) {
83 String errMsg = "Error performing " + methodName;
84 logger.error(errMsg, ex);
85 throw new XmlObjectFactoryException(errMsg, ex);
86 }
87 return object;
88 }
89 }