1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kew.plugin;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.jdom.Document;
20 import org.jdom.Element;
21 import org.jdom.JDOMException;
22 import org.jdom.input.SAXBuilder;
23 import org.kuali.rice.core.api.config.property.Config;
24 import org.kuali.rice.core.api.util.xml.XmlException;
25
26 import java.io.File;
27 import java.io.IOException;
28 import java.net.URL;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.List;
32 import java.util.Map;
33
34
35
36
37
38
39
40 public class PluginConfigParser {
41
42 private static final String PARAMETER_TAG = "parameter";
43 private static final String LISTENER_TAG = "listener";
44 private static final String LISTENER_CLASS_TAG = "listener-class";
45 private static final String RESOURCE_LOADER_TAG = "resourceLoader";
46
47 private static final String NAME_ATTRIBUTE = "name";
48 private static final String VALUE_ATTRIBUTE = "value";
49 private static final String CLASS_ATTRIBUTE = "class";
50
51 public PluginConfig parse(File configFile, Config parentConfig) throws IOException, XmlException {
52 return parse(configFile.toURI().toURL(), parentConfig);
53 }
54
55 public PluginConfig parse(URL url, Config parentConfig) throws IOException, XmlException {
56 SAXBuilder builder = new SAXBuilder(false);
57 try {
58
59
60 Document doc = builder.build(url);
61 Element root = doc.getRootElement();
62 PluginConfig pluginConfig = new PluginConfig(url, parentConfig);
63 parseResourceLoader(root, pluginConfig);
64 parseListeners(root, pluginConfig);
65 return pluginConfig;
66 } catch (JDOMException e) {
67 throw new PluginException("Error when parsing the plugin config file.", e);
68 }
69 }
70
71 public void parseResourceLoader(Element element, PluginConfig pluginConfig) throws XmlException {
72 List loaderElements = element.getChildren(RESOURCE_LOADER_TAG);
73 if (loaderElements.size() > 1) {
74 throw new XmlException("Only one <resourceLoader> tag may be defined.");
75 } else if (!loaderElements.isEmpty()) {
76 Element loaderElement = (Element)loaderElements.get(0);
77 String attributeClass = loaderElement.getAttributeValue(CLASS_ATTRIBUTE);
78 if (StringUtils.isEmpty(attributeClass)) {
79 throw new XmlException("<resourceLoader> element must define a 'class' attribute.");
80 }
81 pluginConfig.setResourceLoaderClassname(attributeClass);
82 }
83 }
84
85 public void parseListeners(Element element, PluginConfig pluginConfig) throws XmlException {
86 List listeners = element.getChildren(LISTENER_TAG);
87 for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
88 pluginConfig.addListener(parseListenerProperties((Element)iterator.next()));
89 }
90 }
91
92 private String parseListenerProperties(Element element) throws XmlException {
93 String listenerClass = element.getChildText(LISTENER_CLASS_TAG);
94 if (org.apache.commons.lang.StringUtils.isEmpty(listenerClass)) {
95 throw new XmlException("Listener Class tag must have a class property defined");
96 }
97 return listenerClass;
98 }
99
100 public Map parseParameters(Element element) throws XmlException {
101 Map parsedParms = new HashMap();
102 List parameters = element.getChildren(PARAMETER_TAG);
103 for (Iterator iterator = parameters.iterator(); iterator.hasNext();) {
104 String [] parm = parseParameter((Element)iterator.next());
105 parsedParms.put(parm[0], parm[1]);
106 }
107 return parsedParms;
108 }
109
110 private String [] parseParameter(Element element) throws XmlException {
111 String name = element.getAttributeValue(NAME_ATTRIBUTE);
112 String value = element.getAttributeValue(VALUE_ATTRIBUTE);
113 if (org.apache.commons.lang.StringUtils.isEmpty(name)) {
114 throw new XmlException("Parameter tag must have a name attribute defined");
115 }
116 if (org.apache.commons.lang.StringUtils.isEmpty(value)) {
117 throw new XmlException("Parameter tag must have a value attribute defined");
118 }
119 return new String [] {name, value};
120 }
121
122
123 }