View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.config.impl.digester;
20  
21  import org.apache.commons.digester.Digester;
22  import org.apache.myfaces.config.FacesConfigUnmarshaller;
23  import org.apache.myfaces.config.impl.FacesConfigEntityResolver;
24  import org.apache.myfaces.config.impl.digester.elements.*;
25  import org.apache.myfaces.shared.util.ClassUtils;
26  import org.xml.sax.InputSource;
27  import org.xml.sax.SAXException;
28  
29  import javax.faces.context.ExternalContext;
30  import java.io.IOException;
31  import java.io.InputStream;
32  import java.io.Reader;
33  import org.apache.myfaces.config.element.FacesFlowDefinition;
34  
35  /**
36   * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
37   */
38  public class DigesterFacesConfigUnmarshallerImpl implements FacesConfigUnmarshaller<FacesConfigImpl>
39  {
40      private Digester digester;
41  
42      public DigesterFacesConfigUnmarshallerImpl(ExternalContext externalContext)
43      {
44          digester = new Digester();
45          // TODO: validation set to false during implementation of 1.2
46          digester.setValidating(false);
47          digester.setNamespaceAware(true);
48          digester.setEntityResolver(new FacesConfigEntityResolver(externalContext));
49          //digester.setUseContextClassLoader(true);
50          digester.setClassLoader(ClassUtils.getContextClassLoader());
51  
52          digester.addObjectCreate("faces-config", FacesConfigImpl.class);
53          // 2.0 specific start
54          digester.addSetProperties("faces-config", "metadata-complete", "metadataComplete");
55          digester.addSetProperties("faces-config", "version", "version");
56          // 2.0 specific end
57          // 2.0 config ordering name start
58          
59          digester.addCallMethod("faces-config/protected-views/url-pattern", "addProtectedViewUrlPattern", 0);
60          
61          digester.addCallMethod("faces-config/name", "setName", 0);
62          digester.addObjectCreate("faces-config/ordering", OrderingImpl.class);
63          digester.addSetNext("faces-config/ordering", "setOrdering");
64          digester.addObjectCreate("faces-config/ordering/before/name", FacesConfigNameSlotImpl.class);
65          digester.addSetNext("faces-config/ordering/before/name", "addBeforeSlot");
66          digester.addCallMethod("faces-config/ordering/before/name", "setName",0);        
67          digester.addObjectCreate("faces-config/ordering/before/others", ConfigOthersSlotImpl.class);
68          digester.addSetNext("faces-config/ordering/before/others", "addBeforeSlot");
69          
70          digester.addObjectCreate("faces-config/ordering/after/name", FacesConfigNameSlotImpl.class);
71          digester.addSetNext("faces-config/ordering/after/name", "addAfterSlot");
72          digester.addCallMethod("faces-config/ordering/after/name", "setName",0);        
73          digester.addObjectCreate("faces-config/ordering/after/others", ConfigOthersSlotImpl.class);
74          digester.addSetNext("faces-config/ordering/after/others", "addAfterSlot");        
75          
76          digester.addObjectCreate("faces-config/absolute-ordering", AbsoluteOrderingImpl.class);
77          digester.addSetNext("faces-config/absolute-ordering", "setAbsoluteOrdering");
78          digester.addObjectCreate("faces-config/absolute-ordering/name", FacesConfigNameSlotImpl.class);
79          digester.addSetNext("faces-config/absolute-ordering/name", "addOrderSlot");
80          digester.addCallMethod("faces-config/absolute-ordering/name", "setName",0);        
81          digester.addObjectCreate("faces-config/absolute-ordering/others", ConfigOthersSlotImpl.class);
82          digester.addSetNext("faces-config/absolute-ordering/others", "addOrderSlot");
83          // 2.0 config ordering name end
84          
85          digester.addObjectCreate("faces-config/application", ApplicationImpl.class);
86          digester.addSetNext("faces-config/application", "addApplication");
87          digester.addCallMethod("faces-config/application/action-listener", "addActionListener", 0);
88          digester.addCallMethod("faces-config/application/default-render-kit-id", "addDefaultRenderkitId", 0);
89          digester.addCallMethod("faces-config/application/default-validators", "setDefaultValidatorsPresent");
90          digester.addCallMethod("faces-config/application/default-validators/validator-id", "addDefaultValidatorId", 0);
91          digester.addCallMethod("faces-config/application/message-bundle", "addMessageBundle", 0);
92          digester.addCallMethod("faces-config/application/navigation-handler", "addNavigationHandler", 0);
93          digester.addCallMethod("faces-config/application/partial-traversal", "addPartialTraversal", 0);
94          digester.addCallMethod("faces-config/application/view-handler", "addViewHandler", 0);
95          digester.addCallMethod("faces-config/application/state-manager", "addStateManager", 0);
96          digester.addCallMethod("faces-config/application/property-resolver", "addPropertyResolver", 0);
97          digester.addCallMethod("faces-config/application/variable-resolver", "addVariableResolver", 0);
98          digester.addObjectCreate("faces-config/application/locale-config", LocaleConfigImpl.class);
99          digester.addSetNext("faces-config/application/locale-config", "addLocaleConfig");
100         digester.addCallMethod("faces-config/application/locale-config/default-locale", "setDefaultLocale", 0);
101         digester.addCallMethod("faces-config/application/locale-config/supported-locale", "addSupportedLocale", 0);
102 
103         // 1.2 specific start
104         digester.addCallMethod("faces-config/application/el-resolver", "addElResolver", 0);
105         digester.addObjectCreate("faces-config/application/resource-bundle", ResourceBundleImpl.class);
106         digester.addSetNext("faces-config/application/resource-bundle", "addResourceBundle");
107         digester.addCallMethod("faces-config/application/resource-bundle/base-name", "setBaseName", 0);
108         digester.addCallMethod("faces-config/application/resource-bundle/var", "setVar", 0);
109         digester.addCallMethod("faces-config/application/resource-bundle/display-name", "setDisplayName", 0);
110         // 1.2 specific end
111 
112         // 2.0 specific start
113         digester.addObjectCreate("faces-config/application/system-event-listener", SystemEventListenerImpl.class);
114         digester.addSetNext("faces-config/application/system-event-listener", "addSystemEventListener");
115         digester.addCallMethod("faces-config/application/system-event-listener/system-event-listener-class",
116                                "setSystemEventListenerClass",0);
117         digester.addCallMethod("faces-config/application/system-event-listener/system-event-class",
118                                "setSystemEventClass",0);
119         digester.addCallMethod("faces-config/application/system-event-listener/source-class", "setSourceClass",0);
120         digester.addCallMethod("faces-config/application/resource-handler", "addResourceHandler", 0);
121         digester.addCallMethod("faces-config/factory/exception-handler-factory", "addExceptionHandlerFactory", 0);
122         digester.addCallMethod("faces-config/factory/external-context-factory", "addExternalContextFactory", 0);
123         digester.addCallMethod("faces-config/factory/view-declaration-language-factory",
124                                "addViewDeclarationLanguageFactory", 0);
125         digester.addCallMethod("faces-config/factory/partial-view-context-factory", "addPartialViewContextFactory", 0);
126         digester.addCallMethod("faces-config/factory/tag-handler-delegate-factory", "addTagHandlerDelegateFactory", 0);
127         digester.addCallMethod("faces-config/factory/visit-context-factory", "addVisitContextFactory", 0);
128         // 2.0 specific end
129         
130         digester.addObjectCreate("faces-config/application/resource-library-contracts/contract-mapping", 
131             ContractMappingImpl.class);
132         digester.addSetNext("faces-config/application/resource-library-contracts/contract-mapping", 
133             "addResourceLibraryContractMapping");
134         digester.addCallMethod(
135             "faces-config/application/resource-library-contracts/contract-mapping/url-pattern", "addUrlPattern", 0);
136         digester.addCallMethod(
137             "faces-config/application/resource-library-contracts/contract-mapping/contracts", "addContract", 0);
138         
139         // 2.1 specific start
140         digester.addCallMethod("faces-config/factory/facelet-cache-factory", "addFaceletCacheFactory", 0);
141         // 2.1 specific end
142         // 2.2 specific start
143         digester.addCallMethod("faces-config/factory/flash-factory", "addFlashFactory", 0);
144         // Note there is no client-window-factory, this factory can be set only using SPI.
145         digester.addCallMethod("faces-config/factory/flow-handler-factory", "addFlowHandlerFactory", 0);
146         // 2.2 specific end
147 
148         digester.addObjectCreate("faces-config/factory", FactoryImpl.class);
149         digester.addSetNext("faces-config/factory", "addFactory");
150         digester.addCallMethod("faces-config/factory/application-factory", "addApplicationFactory", 0);
151         digester.addCallMethod("faces-config/factory/faces-context-factory", "addFacesContextFactory", 0);
152         digester.addCallMethod("faces-config/factory/lifecycle-factory", "addLifecycleFactory", 0);
153         digester.addCallMethod("faces-config/factory/render-kit-factory", "addRenderkitFactory", 0);
154 
155         digester.addCallMethod("faces-config/component", "addComponent", 2);
156         digester.addCallParam("faces-config/component/component-type", 0);
157         digester.addCallParam("faces-config/component/component-class", 1);
158 
159         digester.addObjectCreate("faces-config/converter", ConverterImpl.class);
160         digester.addSetNext("faces-config/converter", "addConverter");
161         digester.addCallMethod("faces-config/converter/converter-id", "setConverterId", 0);
162         digester.addCallMethod("faces-config/converter/converter-for-class", "setForClass", 0);
163         digester.addCallMethod("faces-config/converter/converter-class", "setConverterClass", 0);
164         digester.addObjectCreate("faces-config/converter/attribute", AttributeImpl.class);
165         digester.addSetNext("faces-config/converter/attribute", "addAttribute");
166         digester.addCallMethod("faces-config/converter/attribute/description", "addDescription", 0);
167         digester.addCallMethod("faces-config/converter/attribute/display-name", "addDisplayName", 0);
168         digester.addCallMethod("faces-config/converter/attribute/icon", "addIcon", 0);
169         digester.addCallMethod("faces-config/converter/attribute/attribute-name", "setAttributeName", 0);
170         digester.addCallMethod("faces-config/converter/attribute/attribute-class", "setAttributeClass", 0);
171         digester.addCallMethod("faces-config/converter/attribute/default-value", "setDefaultValue", 0);
172         digester.addCallMethod("faces-config/converter/attribute/suggested-value", "setSuggestedValue", 0);
173         digester.addCallMethod("faces-config/converter/attribute/attribute-extension", "addAttributeExtension", 0);
174         digester.addObjectCreate("faces-config/converter/property", PropertyImpl.class);
175         digester.addSetNext("faces-config/converter/property", "addProperty");
176         digester.addCallMethod("faces-config/converter/property/description", "addDescription", 0);
177         digester.addCallMethod("faces-config/converter/property/display-name", "addDisplayName", 0);
178         digester.addCallMethod("faces-config/converter/property/icon", "addIcon", 0);
179         digester.addCallMethod("faces-config/converter/property/property-name", "setPropertyName", 0);
180         digester.addCallMethod("faces-config/converter/property/property-class", "setPropertyClass", 0);
181         digester.addCallMethod("faces-config/converter/property/default-value", "setDefaultValue", 0);
182         digester.addCallMethod("faces-config/converter/property/suggested-value", "setSuggestedValue", 0);
183         digester.addCallMethod("faces-config/converter/property/property-extension", "addPropertyExtension", 0);
184 
185         digester.addObjectCreate("faces-config/managed-bean", ManagedBeanImpl.class);
186         digester.addSetProperties("faces-config/managed-bean", "eager", "eager");
187         digester.addSetNext("faces-config/managed-bean", "addManagedBean");
188         digester.addCallMethod("faces-config/managed-bean/description", "setDescription", 0);
189         digester.addCallMethod("faces-config/managed-bean/managed-bean-name", "setName", 0);
190         digester.addCallMethod("faces-config/managed-bean/managed-bean-class", "setBeanClass", 0);
191         digester.addCallMethod("faces-config/managed-bean/managed-bean-scope", "setScope", 0);
192         digester.addObjectCreate("faces-config/managed-bean/managed-property", ManagedPropertyImpl.class);
193         digester.addSetNext("faces-config/managed-bean/managed-property", "addProperty");
194         digester.addCallMethod("faces-config/managed-bean/managed-property/property-name", "setPropertyName", 0);
195         digester.addCallMethod("faces-config/managed-bean/managed-property/property-class", "setPropertyClass", 0);
196         digester.addCallMethod("faces-config/managed-bean/managed-property/null-value", "setNullValue");
197         digester.addCallMethod("faces-config/managed-bean/managed-property/value", "setValue", 0);
198         digester.addObjectCreate("faces-config/managed-bean/managed-property/map-entries", MapEntriesImpl.class);
199         digester.addSetNext("faces-config/managed-bean/managed-property/map-entries", "setMapEntries");
200         digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/key-class", "setKeyClass", 0);
201         digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/value-class",
202                                "setValueClass", 0);
203         digester.addObjectCreate("faces-config/managed-bean/managed-property/map-entries/map-entry",
204                                  MapEntriesImpl.Entry.class);
205         digester.addSetNext("faces-config/managed-bean/managed-property/map-entries/map-entry", "addEntry");
206         digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/key", "setKey", 0);
207         digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/null-value",
208                                "setNullValue");
209         digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/value", "setValue", 0);
210         digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries", ListEntriesImpl.class);
211         digester.addSetNext("faces-config/managed-bean/managed-property/list-entries", "setListEntries");
212         digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/value-class", "setValueClass",
213                                0);
214         digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries/null-value",
215                                  ListEntriesImpl.Entry.class);
216         digester.addSetNext("faces-config/managed-bean/managed-property/list-entries/null-value", "addEntry");
217         digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/null-value", "setNullValue");
218         digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries/value",
219                                  ListEntriesImpl.Entry.class);
220         digester.addSetNext("faces-config/managed-bean/managed-property/list-entries/value", "addEntry");
221         digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/value", "setValue", 0);
222         digester.addObjectCreate("faces-config/managed-bean/map-entries", MapEntriesImpl.class);
223         digester.addSetNext("faces-config/managed-bean/map-entries", "setMapEntries");
224         digester.addCallMethod("faces-config/managed-bean/map-entries/key-class", "setKeyClass", 0);
225         digester.addCallMethod("faces-config/managed-bean/map-entries/value-class", "setValueClass", 0);
226         digester.addObjectCreate("faces-config/managed-bean/map-entries/map-entry", MapEntriesImpl.Entry.class);
227         digester.addSetNext("faces-config/managed-bean/map-entries/map-entry", "addEntry");
228         digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/key", "setKey", 0);
229         digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/null-value", "setNullValue");
230         digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/value", "setValue", 0);
231         digester.addObjectCreate("faces-config/managed-bean/list-entries", ListEntriesImpl.class);
232         digester.addSetNext("faces-config/managed-bean/list-entries", "setListEntries");
233         digester.addCallMethod("faces-config/managed-bean/list-entries/value-class", "setValueClass", 0);
234         digester.addObjectCreate("faces-config/managed-bean/list-entries/null-value", ListEntriesImpl.Entry.class);
235         digester.addSetNext("faces-config/managed-bean/list-entries/null-value", "addEntry");
236         digester.addCallMethod("faces-config/managed-bean/list-entries/null-value", "setNullValue");
237         digester.addObjectCreate("faces-config/managed-bean/list-entries/value", ListEntriesImpl.Entry.class);
238         digester.addSetNext("faces-config/managed-bean/list-entries/value", "addEntry");
239         digester.addCallMethod("faces-config/managed-bean/list-entries/value", "setValue", 0);
240 
241         digester.addObjectCreate("faces-config/navigation-rule", NavigationRuleImpl.class);
242         digester.addSetNext("faces-config/navigation-rule", "addNavigationRule");
243         digester.addCallMethod("faces-config/navigation-rule/from-view-id", "setFromViewId", 0);
244         digester.addObjectCreate("faces-config/navigation-rule/navigation-case", NavigationCaseImpl.class);
245         digester.addSetNext("faces-config/navigation-rule/navigation-case", "addNavigationCase");
246         digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-action", "setFromAction", 0);
247         digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-outcome", "setFromOutcome", 0);
248         digester.addCallMethod("faces-config/navigation-rule/navigation-case/if", "setIf", 0);
249         digester.addCallMethod("faces-config/navigation-rule/navigation-case/to-view-id", "setToViewId", 0);
250         digester.addObjectCreate("faces-config/navigation-rule/navigation-case/redirect", RedirectImpl.class);
251         digester.addSetProperties("faces-config/navigation-rule/navigation-case/redirect", "include-view-params",
252                                   "includeViewParams");
253         digester.addSetNext("faces-config/navigation-rule/navigation-case/redirect", "setRedirect");
254         digester.addObjectCreate("faces-config/navigation-rule/navigation-case/redirect/view-param", 
255             ViewParamImpl.class);
256         digester.addSetNext("faces-config/navigation-rule/navigation-case/redirect/view-param", "addViewParam");
257         digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/view-param/name", "setName",0);
258         digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/view-param/value", "setValue",0);
259 
260         digester.addObjectCreate("faces-config/navigation-rule/navigation-case/redirect/redirect-param", 
261             ViewParamImpl.class);
262         digester.addSetNext("faces-config/navigation-rule/navigation-case/redirect/redirect-param", 
263             "addViewParam");
264         digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/redirect-param/name", 
265             "setName",0);
266         digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/redirect-param/value", 
267             "setValue",0);
268 
269         digester.addObjectCreate("faces-config/render-kit", RenderKitImpl.class);
270         digester.addSetNext("faces-config/render-kit", "addRenderKit");
271         digester.addCallMethod("faces-config/render-kit/render-kit-id", "setId", 0);
272         //digester.addCallMethod("faces-config/render-kit/render-kit-class", "setRenderKitClass", 0);
273         digester.addCallMethod("faces-config/render-kit/render-kit-class", "addRenderKitClass", 0);
274         digester.addObjectCreate("faces-config/render-kit/renderer", RendererImpl.class);
275         digester.addSetNext("faces-config/render-kit/renderer", "addRenderer");
276         digester.addCallMethod("faces-config/render-kit/renderer/component-family", "setComponentFamily", 0);
277         digester.addCallMethod("faces-config/render-kit/renderer/renderer-type", "setRendererType", 0);
278         digester.addCallMethod("faces-config/render-kit/renderer/renderer-class", "setRendererClass", 0);
279         digester.addObjectCreate("faces-config/render-kit/client-behavior-renderer", ClientBehaviorRendererImpl.class);
280         digester.addSetNext("faces-config/render-kit/client-behavior-renderer", "addClientBehaviorRenderer");
281         digester.addCallMethod("faces-config/render-kit/client-behavior-renderer/client-behavior-renderer-type",
282                                "setRendererType", 0);
283         digester.addCallMethod("faces-config/render-kit/client-behavior-renderer/client-behavior-renderer-class",
284                                "setRendererClass", 0);
285         
286         // 2.0 behavior start
287         digester.addObjectCreate("faces-config/behavior", BehaviorImpl.class);
288         digester.addSetNext("faces-config/behavior", "addBehavior");
289         digester.addCallMethod("faces-config/behavior/behavior-id", "setBehaviorId", 0);
290         digester.addCallMethod("faces-config/behavior/behavior-class", "setBehaviorClass", 0);
291         digester.addObjectCreate("faces-config/behavior/attribute", AttributeImpl.class);
292         digester.addSetNext("faces-config/behavior/attribute", "addAttribute");
293         digester.addCallMethod("faces-config/behavior/attribute/description", "addDescription", 0);
294         digester.addCallMethod("faces-config/behavior/attribute/display-name", "addDisplayName", 0);
295         digester.addCallMethod("faces-config/behavior/attribute/icon", "addIcon", 0);
296         digester.addCallMethod("faces-config/behavior/attribute/attribute-name", "setAttributeName", 0);
297         digester.addCallMethod("faces-config/behavior/attribute/attribute-class", "setAttributeClass", 0);
298         digester.addCallMethod("faces-config/behavior/attribute/default-value", "setDefaultValue", 0);
299         digester.addCallMethod("faces-config/behavior/attribute/suggested-value", "setSuggestedValue", 0);
300         digester.addCallMethod("faces-config/behavior/attribute/attribute-extension", "addAttributeExtension", 0);
301         digester.addObjectCreate("faces-config/behavior/property", PropertyImpl.class);
302         digester.addSetNext("faces-config/behavior/property", "addProperty");
303         digester.addCallMethod("faces-config/behavior/property/description", "addDescription", 0);
304         digester.addCallMethod("faces-config/behavior/property/display-name", "addDisplayName", 0);
305         digester.addCallMethod("faces-config/behavior/property/icon", "addIcon", 0);
306         digester.addCallMethod("faces-config/behavior/property/property-name", "setPropertyName", 0);
307         digester.addCallMethod("faces-config/behavior/property/property-class", "setPropertyClass", 0);
308         digester.addCallMethod("faces-config/behavior/property/default-value", "setDefaultValue", 0);
309         digester.addCallMethod("faces-config/behavior/property/suggested-value", "setSuggestedValue", 0);
310         digester.addCallMethod("faces-config/behavior/property/property-extension", "addPropertyExtension", 0);
311         // 2.0 behavior end
312         
313         digester.addCallMethod("faces-config/lifecycle/phase-listener", "addLifecyclePhaseListener", 0);
314 
315         digester.addCallMethod("faces-config/validator", "addValidator", 2);
316         digester.addCallParam("faces-config/validator/validator-id", 0);
317         digester.addCallParam("faces-config/validator/validator-class", 1);
318         
319         // 2.1 facelets-processing start
320         digester.addObjectCreate("faces-config/faces-config-extension", FacesConfigExtensionImpl.class);
321         digester.addSetNext("faces-config/faces-config-extension", "addFacesConfigExtension");
322         digester.addObjectCreate("faces-config/faces-config-extension/facelets-processing", 
323             FaceletsProcessingImpl.class);
324         digester.addSetNext("faces-config/faces-config-extension/facelets-processing", "addFaceletsProcessing");
325         digester.addCallMethod("faces-config/faces-config-extension/facelets-processing/file-extension",
326                                "setFileExtension", 0);
327         digester.addCallMethod("faces-config/faces-config-extension/facelets-processing/process-as", "setProcessAs", 0);
328 
329         // 2.1 facelets-processing end
330         
331         //MyFaces specific facelets-processing instruction.
332         digester.addCallMethod("faces-config/faces-config-extension/facelets-processing/oam-compress-spaces", 
333                 "setOamCompressSpaces", 0);
334         
335         addFacesFlowRules(externalContext);
336         
337         
338     }
339     
340     private void addNavigationRules(ExternalContext externalContext, String prefix, String method)
341     {
342         digester.addObjectCreate(prefix, NavigationRuleImpl.class);
343         digester.addSetNext(prefix, method);
344         digester.addCallMethod(prefix+"/from-view-id", "setFromViewId", 0);
345         addNavigationCases(externalContext, prefix+"/navigation-case", "addNavigationCase");
346     }
347     
348     private void addNavigationCases(ExternalContext externalContext, String prefix, String method)
349     {
350         digester.addObjectCreate(prefix, NavigationCaseImpl.class);
351         digester.addSetNext(prefix, method);
352         digester.addCallMethod(prefix+"/from-action", "setFromAction", 0);
353         digester.addCallMethod(prefix+"/from-outcome", "setFromOutcome", 0);
354         digester.addCallMethod(prefix+"/if", "setIf", 0);
355         digester.addCallMethod(prefix+"/to-view-id", "setToViewId", 0);
356         digester.addObjectCreate(prefix+"/redirect", RedirectImpl.class);
357         digester.addSetProperties(prefix+"/redirect", "include-view-params",
358                                   "includeViewParams");
359         digester.addSetNext(prefix+"/redirect", "setRedirect");
360         digester.addObjectCreate(prefix+"/redirect/view-param", ViewParamImpl.class);
361         digester.addSetNext(prefix+"/redirect/view-param", "addViewParam");
362         digester.addCallMethod(prefix+"/redirect/view-param/name", "setName",0);
363         digester.addCallMethod(prefix+"/redirect/view-param/value", "setValue",0);
364 
365         digester.addObjectCreate(prefix+"/redirect/redirect-param", ViewParamImpl.class);
366         digester.addSetNext(prefix+"/redirect/redirect-param", "addViewParam");
367         digester.addCallMethod(prefix+"/redirect/redirect-param/name", "setName",0);
368         digester.addCallMethod(prefix+"/redirect/redirect-param/value", "setValue",0);
369     }
370     
371     private void addFacesFlowRules(ExternalContext externalContext)
372     {
373         digester.addObjectCreate("faces-config/flow-definition", FacesFlowDefinitionImpl.class);
374         
375         digester.addSetNext("faces-config/flow-definition", "addFacesFlowDefinition");
376         digester.addSetProperties("faces-config/flow-definition", "id", "id");
377         
378         digester.addCallMethod("faces-config/flow-definition/start-node", "setStartNode", 0);
379         digester.addCallMethod("faces-config/flow-definition/initializer", "setInitializer", 0);
380         digester.addCallMethod("faces-config/flow-definition/finalizer", "setFinalizer", 0);
381         
382         digester.addObjectCreate("faces-config/flow-definition/view", FacesFlowViewImpl.class);
383         digester.addSetNext("faces-config/flow-definition/view", "addView");
384         digester.addSetProperties("faces-config/flow-definition/view", "id", "id");
385         digester.addCallMethod("faces-config/flow-definition/view/vdl-document", "setVdlDocument", 0);
386         
387         digester.addObjectCreate("faces-config/flow-definition/switch", FacesFlowSwitchImpl.class);
388         digester.addSetNext("faces-config/flow-definition/switch", "addSwitch");
389         digester.addSetProperties("faces-config/flow-definition/switch", "id", "id");
390         
391         digester.addObjectCreate("faces-config/flow-definition/switch/default-outcome", 
392             NavigationCaseImpl.class);
393         digester.addSetNext("faces-config/flow-definition/switch/default-outcome", 
394             "setDefaultOutcome");
395         digester.addCallMethod("faces-config/flow-definition/switch/default-outcome", 
396             "setFromOutcome", 0);
397         
398         addNavigationCases(externalContext, "faces-config/flow-definition/switch/case",
399             "addNavigationCase");
400         
401         digester.addObjectCreate("faces-config/flow-definition/flow-return", FacesFlowReturnImpl.class);
402         digester.addSetNext("faces-config/flow-definition/flow-return", "addReturn");
403         digester.addSetProperties("faces-config/flow-definition/flow-return", "id", "id");
404         digester.addObjectCreate("faces-config/flow-definition/flow-return/from-outcome", 
405             NavigationCaseImpl.class);
406         digester.addSetNext("faces-config/flow-definition/flow-return/from-outcome", 
407             "setNavigationCase");
408         digester.addCallMethod("faces-config/flow-definition/flow-return/from-outcome", 
409             "setFromOutcome", 0);
410         
411         addNavigationRules(externalContext, "faces-config/flow-definition/navigation-rule", "addNavigationRule");
412         
413         digester.addObjectCreate("faces-config/flow-definition/flow-call", FacesFlowCallImpl.class);
414         digester.addSetNext("faces-config/flow-definition/flow-call", "addFlowCall");
415         digester.addSetProperties("faces-config/flow-definition/flow-call", "id", "id");
416         digester.addObjectCreate("faces-config/flow-definition/flow-call/flow-reference", FacesFlowReferenceImpl.class);
417         digester.addSetNext("faces-config/flow-definition/flow-call/flow-reference", "setFlowReference");        
418         digester.addCallMethod("faces-config/flow-definition/flow-call/flow-reference/flow-document-id", 
419                 "setFlowDocumentId", 0);
420         digester.addCallMethod("faces-config/flow-definition/flow-call/flow-reference/flow-id", "setFlowId", 0);
421         
422         digester.addObjectCreate("faces-config/flow-definition/flow-call/outbound-parameter", 
423             FacesFlowParameterImpl.class);
424         digester.addSetNext("faces-config/flow-definition/flow-call/outbound-parameter", 
425             "addOutboundParameter");
426         digester.addCallMethod("faces-config/flow-definition/flow-call/outbound-parameter/name", "setName", 0);
427         digester.addCallMethod("faces-config/flow-definition/flow-call/outbound-parameter/value", "setValue", 0);
428         
429         digester.addObjectCreate("faces-config/flow-definition/method-call", FacesFlowMethodCallImpl.class);
430         digester.addSetNext("faces-config/flow-definition/method-call", "addMethodCall");
431         digester.addSetProperties("faces-config/flow-definition/method-call", "id", "id");
432         digester.addCallMethod("faces-config/flow-definition/method-call/method", "setMethod", 0);
433         digester.addCallMethod("faces-config/flow-definition/method-call/default-outcome", 
434             "setDefaultOutcome", 0);
435         digester.addObjectCreate("faces-config/flow-definition/method-call/parameter", 
436             FacesFlowMethodParameterImpl.class);
437         digester.addSetNext("faces-config/flow-definition/method-call/parameter", "addParameter");
438         digester.addCallMethod("faces-config/flow-definition/method-call/parameter/class", "setClassName", 0);
439         digester.addCallMethod("faces-config/flow-definition/method-call/parameter/value", "setValue", 0);
440         
441         digester.addObjectCreate("faces-config/flow-definition/inbound-parameter", 
442             FacesFlowParameterImpl.class);
443         digester.addSetNext("faces-config/flow-definition/inbound-parameter", "addInboundParameter");
444         digester.addCallMethod("faces-config/flow-definition/inbound-parameter/name", "setName", 0);
445         digester.addCallMethod("faces-config/flow-definition/inbound-parameter/value", "setValue", 0);
446         
447         //View Pool config
448         digester.addObjectCreate("faces-config/faces-config-extension/view-pool-mapping", 
449             ViewPoolMappingImpl.class);
450         digester.addSetNext("faces-config/faces-config-extension/view-pool-mapping", 
451             "addViewPoolMapping");
452         digester.addCallMethod(
453                         "faces-config/faces-config-extension/view-pool-mapping/url-pattern", "setUrlPattern", 0);
454         digester.addObjectCreate("faces-config/faces-config-extension/view-pool-mapping/parameter", 
455             ViewPoolParameterImpl.class);
456         digester.addSetNext("faces-config/faces-config-extension/view-pool-mapping/parameter", "addParameter");
457         digester.addCallMethod("faces-config/faces-config-extension/view-pool-mapping/parameter/name", "setName", 0);
458         digester.addCallMethod("faces-config/faces-config-extension/view-pool-mapping/parameter/value", "setValue", 0);
459     }
460 
461     private void postProcessFacesConfig(String systemId, FacesConfigImpl config)
462     {
463         for (org.apache.myfaces.config.element.Application application : config.getApplications())
464         {
465             for (org.apache.myfaces.config.element.LocaleConfig localeConfig : application.getLocaleConfig())
466             {
467                 if (!localeConfig.getSupportedLocales().contains(localeConfig.getDefaultLocale()))
468                 {
469                     localeConfig.getSupportedLocales().add(localeConfig.getDefaultLocale());
470                 }
471             }
472         }
473         
474         for (FacesFlowDefinition facesFlowDefinition : config.getFacesFlowDefinitions())
475         {
476             // JSF 2.2 section 11.4.3.1 says this: "... Flows are defined using the 
477             // <flow-definition> element. This element must have an id attribute which uniquely 
478             // identifies the flow within the scope of the Application Configuration Resource 
479             // file in which the element appears. To enable multiple flows with the same id to 
480             // exist in an application, the <faces-config><name> element is taken to 
481             // be the definingDocumentId of the flow. If no <name> element is specified, 
482             // the empty string is taken as the value for definingDocumentId. ..."
483             if (config.getName() != null)
484             {
485                 ((FacesFlowDefinitionImpl)facesFlowDefinition).setDefiningDocumentId(
486                     config.getName());
487             }
488             else
489             {
490                 ((FacesFlowDefinitionImpl)facesFlowDefinition).setDefiningDocumentId("");
491             }
492         }
493     }
494     
495     public FacesConfigImpl getFacesConfig(InputStream in, String systemId) throws IOException, SAXException
496     {
497         InputSource is = new InputSource(in);
498         is.setSystemId(systemId);
499 
500         // Fix for http://issues.apache.org/jira/browse/MYFACES-236
501         FacesConfigImpl config = (FacesConfigImpl) digester.parse(is);
502 
503         postProcessFacesConfig(systemId, config);
504 
505         return config;
506     }
507     
508     public FacesConfigImpl getFacesConfig(Reader r) throws IOException, SAXException
509     {
510         //InputSource is = new InputSource(in);
511         //is.setSystemId(systemId);
512 
513         // Fix for http://issues.apache.org/jira/browse/MYFACES-236
514         FacesConfigImpl config = (FacesConfigImpl) digester.parse(r);
515 
516         postProcessFacesConfig(null, config);
517 
518         return config;
519     }
520 
521 }