1
2
3
4
5
6
7
8
9
10
11 package org.mule.config.builders;
12
13 import org.mule.MuleManager;
14 import org.mule.config.ConfigurationException;
15 import org.mule.config.MuleDtdResolver;
16 import org.mule.config.MuleProperties;
17 import org.mule.config.ReaderResource;
18 import org.mule.config.builders.i18n.BuildersMessages;
19 import org.mule.impl.container.MuleContainerContext;
20 import org.mule.umo.UMOFilter;
21
22 import java.io.Reader;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.commons.digester.Digester;
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.xml.sax.ErrorHandler;
30 import org.xml.sax.SAXException;
31 import org.xml.sax.SAXParseException;
32
33
34
35
36 public abstract class AbstractDigesterConfiguration
37 {
38 public static final String DEFAULT_CONTAINER_CONTEXT = MuleContainerContext.class.getName();
39 public static final String FILTER_INTERFACE = UMOFilter.class.getName();
40
41
42
43
44 protected transient final Log logger = LogFactory.getLog(getClass());
45
46 protected Digester digester;
47 protected List containerReferences = new ArrayList();
48 protected String configEncoding;
49
50 protected AbstractDigesterConfiguration(boolean validate, String dtd)
51 {
52
53
54 digester = new Digester()
55 {
56 public void warning(SAXParseException e) throws SAXException
57 {
58 if (errorHandler != null)
59 {
60 errorHandler.warning(e);
61 }
62 }
63 };
64
65 configEncoding = System.getProperty(MuleProperties.MULE_ENCODING_SYSTEM_PROPERTY,
66 MuleManager.getConfiguration().getEncoding());
67
68 digester.setValidating(validate);
69 digester.setEntityResolver(new MuleDtdResolver(dtd));
70
71 digester.setErrorHandler(new ErrorHandler()
72 {
73 public void error(SAXParseException exception) throws SAXException
74 {
75 logger.error(exception.getMessage(), exception);
76 throw new SAXException(exception);
77 }
78
79 public void fatalError(SAXParseException exception) throws SAXException
80 {
81 logger.fatal(exception.getMessage(), exception);
82 throw new SAXException(exception);
83 }
84
85 public void warning(SAXParseException exception)
86 {
87 logger.warn(exception.getMessage());
88 }
89 });
90 }
91
92 protected Object process(ReaderResource[] configResources) throws ConfigurationException
93 {
94 Object result = null;
95 Reader configResource;
96 for (int i = 0; i < configResources.length; i++)
97 {
98 try
99 {
100 configResource = configResources[i].getReader();
101 result = digester.parse(configResource);
102 }
103 catch (Exception e)
104 {
105 throw new ConfigurationException(
106 BuildersMessages.failedToParseConfigResource(configResources[i].getDescription()), e);
107 }
108 }
109
110 return result;
111 }
112
113 public abstract String getRootName();
114
115 protected void addContainerContextRules(String path, String setterMethod, int parentIndex)
116 throws ConfigurationException
117 {
118
119 digester.addObjectCreate(path, DEFAULT_CONTAINER_CONTEXT, "className");
120 digester.addSetProperties(path, "name", "name");
121 addMulePropertiesRule(path, digester);
122
123
124 digester.addSetNext(path, setterMethod);
125 }
126
127 protected void addServerPropertiesRules(String path, String setterMethod, int parentIndex)
128 {
129
130 int i = path.lastIndexOf("/");
131 addMulePropertiesRule(path.substring(0, i), digester, setterMethod, path.substring(i + 1));
132 }
133
134 protected void addSetPropertiesRule(String path, Digester digester)
135 {
136 digester.addRule(path, new MuleSetPropertiesRule());
137 }
138
139 protected void addSetPropertiesRule(String path, Digester digester, String[] s1, String[] s2)
140 {
141 digester.addRule(path, new MuleSetPropertiesRule(s1, s2));
142 }
143
144 protected void addMulePropertiesRule(String path, Digester digester)
145 {
146 digester.addRuleSet(new MulePropertiesRuleSet(path, containerReferences));
147 }
148
149 protected void addMulePropertiesRule(String path, Digester digester, String propertiesSetter)
150 {
151 digester.addRuleSet(new MulePropertiesRuleSet(path, propertiesSetter, containerReferences));
152 }
153
154 protected void addMulePropertiesRule(String path,
155 Digester digester,
156 String propertiesSetter,
157 String parentElement)
158 {
159 digester.addRuleSet(new MulePropertiesRuleSet(path, propertiesSetter, containerReferences,
160 parentElement));
161 }
162
163 protected void addFilterRules(Digester digester, String path) throws ConfigurationException
164 {
165
166 addSingleFilterRule(digester, path);
167 path += "/filter";
168 addFilterGroupRule(digester, path);
169
170 addFilterGroupRule(digester, path + "/left-filter");
171 addFilterGroupRule(digester, path + "/right-filter");
172 addFilterGroupRule(digester, path + "/filter");
173
174 addFilterGroupRule(digester, path + "/left-filter/left-filter");
175 addFilterGroupRule(digester, path + "/left-filter/right-filter");
176 addFilterGroupRule(digester, path + "/left-filter/filter");
177
178 addFilterGroupRule(digester, path + "/right-filter/left-filter");
179 addFilterGroupRule(digester, path + "/right-filter/right-filter");
180 addFilterGroupRule(digester, path + "/right-filter/filter");
181
182 addFilterGroupRule(digester, path + "/filter/left-filter");
183 addFilterGroupRule(digester, path + "/filter/right-filter");
184 addFilterGroupRule(digester, path + "/filter/filter");
185
186
187 }
188
189 protected void addFilterGroupRule(Digester digester, String path) throws ConfigurationException
190 {
191 addLeftFilterRule(digester, path);
192 addRightFilterRule(digester, path);
193 addSingleFilterRule(digester, path);
194 }
195
196 protected void addLeftFilterRule(Digester digester, String path) throws ConfigurationException
197 {
198 path += "/left-filter";
199 digester.addObjectCreate(path, FILTER_INTERFACE, "className");
200 addSetPropertiesRule(path, digester);
201 addMulePropertiesRule(path, digester);
202 digester.addSetNext(path, "setLeftFilter");
203 }
204
205 protected void addRightFilterRule(Digester digester, String path) throws ConfigurationException
206 {
207 path += "/right-filter";
208 digester.addObjectCreate(path, FILTER_INTERFACE, "className");
209 addSetPropertiesRule(path, digester);
210 addMulePropertiesRule(path, digester);
211 digester.addSetNext(path, "setRightFilter");
212 }
213
214 protected void addSingleFilterRule(Digester digester, String path) throws ConfigurationException
215 {
216 path += "/filter";
217 digester.addObjectCreate(path, FILTER_INTERFACE, "className");
218 addSetPropertiesRule(path, digester);
219 addMulePropertiesRule(path, digester);
220 digester.addSetNext(path, "setFilter");
221 }
222 }