View Javadoc

1   /*
2    * $Id: AbstractDigesterConfiguration.java 7976 2007-08-21 14:26:13Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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   * A base classs for configuration schemes that use digester to parse the documents.
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       * logger used by this class
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          // This is a hack to stop Digester spitting out unnecessary warnings
53          // when there is a customer error handler registered
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         // Create container Context
119         digester.addObjectCreate(path, DEFAULT_CONTAINER_CONTEXT, "className");
120         digester.addSetProperties(path, "name", "name");
121         addMulePropertiesRule(path, digester);
122 
123         // Set the container on the parent object
124         digester.addSetNext(path, setterMethod);
125     }
126 
127     protected void addServerPropertiesRules(String path, String setterMethod, int parentIndex)
128     {
129         // Set environment properties
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         // three levels
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         // digester.addSetNext(path, "setFilter");
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 }