1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.config.impl.digester;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.util.List;
24 import javax.faces.context.ExternalContext;
25
26 import org.apache.myfaces.config.FacesConfigUnmarshaller;
27 import org.apache.myfaces.config.element.ElementBase;
28 import org.apache.myfaces.config.impl.digester.elements.*;
29 import org.apache.myfaces.config.impl.FacesConfigEntityResolver;
30 import org.apache.commons.digester.Digester;
31 import org.apache.commons.digester.Rule;
32 import org.apache.commons.digester.ExtendedBaseRules;
33 import org.apache.commons.digester.RulesBase;
34 import org.xml.sax.InputSource;
35 import org.xml.sax.SAXException;
36 import org.xml.sax.Attributes;
37
38
39
40
41
42 public class DigesterFacesConfigUnmarshallerImpl implements FacesConfigUnmarshaller
43 {
44
45 private String systemId;
46 private Digester digester;
47
48
49 public DigesterFacesConfigUnmarshallerImpl(ExternalContext externalContext)
50 {
51 digester = new Digester();
52 digester.setValidating(true);
53 digester.setNamespaceAware(true);
54 digester.setEntityResolver(new FacesConfigEntityResolver(externalContext));
55 digester.setUseContextClassLoader(true);
56
57 Rule rule = new GlobalRule(digester);
58 digester.setRules(new GlobalRulesBase(rule));
59
60
61 digester.addObjectCreate("faces-config", FacesConfig.class);
62 digester.addObjectCreate("faces-config/application", Application.class);
63 digester.addSetNext("faces-config/application", "addApplication");
64 digester.addCallMethod("faces-config/application/action-listener", "addActionListener", 0);
65 digester.addCallMethod("faces-config/application/default-render-kit-id", "addDefaultRenderkitId", 0);
66 digester.addCallMethod("faces-config/application/message-bundle", "addMessageBundle", 0);
67 digester.addCallMethod("faces-config/application/navigation-handler", "addNavigationHandler", 0);
68 digester.addCallMethod("faces-config/application/view-handler", "addViewHandler", 0);
69 digester.addCallMethod("faces-config/application/state-manager", "addStateManager", 0);
70 digester.addCallMethod("faces-config/application/property-resolver", "addPropertyResolver", 0);
71 digester.addCallMethod("faces-config/application/variable-resolver", "addVariableResolver", 0);
72 digester.addObjectCreate("faces-config/application/locale-config", LocaleConfig.class);
73 digester.addSetNext("faces-config/application/locale-config", "addLocaleConfig");
74 digester.addCallMethod("faces-config/application/locale-config/default-locale", "setDefaultLocale", 0);
75 digester.addCallMethod("faces-config/application/locale-config/supported-locale", "addSupportedLocale", 0);
76
77 digester.addObjectCreate("faces-config/factory", Factory.class);
78 digester.addSetNext("faces-config/factory", "addFactory");
79 digester.addCallMethod("faces-config/factory/application-factory", "addApplicationFactory", 0);
80 digester.addCallMethod("faces-config/factory/faces-context-factory", "addFacesContextFactory", 0);
81 digester.addCallMethod("faces-config/factory/lifecycle-factory", "addLifecycleFactory", 0);
82 digester.addCallMethod("faces-config/factory/render-kit-factory", "addRenderkitFactory", 0);
83
84 digester.addCallMethod("faces-config/component", "addComponent", 2);
85 digester.addCallParam("faces-config/component/component-type", 0);
86 digester.addCallParam("faces-config/component/component-class", 1);
87
88 digester.addObjectCreate("faces-config/converter", Converter.class);
89 digester.addSetNext("faces-config/converter", "addConverter");
90 digester.addCallMethod("faces-config/converter/converter-id", "setConverterId", 0);
91 digester.addCallMethod("faces-config/converter/converter-for-class", "setForClass", 0);
92 digester.addCallMethod("faces-config/converter/converter-class", "setConverterClass", 0);
93 digester.addObjectCreate("faces-config/converter/attribute",Attribute.class);
94 digester.addSetNext("faces-config/converter/attribute","addAttribute");
95 digester.addCallMethod("faces-config/converter/attribute/description", "addDescription", 0);
96 digester.addCallMethod("faces-config/converter/attribute/display-name", "addDisplayName", 0);
97 digester.addCallMethod("faces-config/converter/attribute/icon", "addIcon", 0);
98 digester.addCallMethod("faces-config/converter/attribute/attribute-name", "setAttributeName", 0);
99 digester.addCallMethod("faces-config/converter/attribute/attribute-class", "setAttributeClass", 0);
100 digester.addCallMethod("faces-config/converter/attribute/default-value", "setDefaultValue", 0);
101 digester.addCallMethod("faces-config/converter/attribute/suggested-value", "setSuggestedValue", 0);
102 digester.addCallMethod("faces-config/converter/attribute/attribute-extension", "addAttributeExtension", 0);
103 digester.addObjectCreate("faces-config/converter/property",Property.class);
104 digester.addSetNext("faces-config/converter/property","addProperty");
105 digester.addCallMethod("faces-config/converter/property/description", "addDescription", 0);
106 digester.addCallMethod("faces-config/converter/property/display-name", "addDisplayName", 0);
107 digester.addCallMethod("faces-config/converter/property/icon", "addIcon", 0);
108 digester.addCallMethod("faces-config/converter/property/property-name", "setPropertyName", 0);
109 digester.addCallMethod("faces-config/converter/property/property-class", "setPropertyClass", 0);
110 digester.addCallMethod("faces-config/converter/property/default-value", "setDefaultValue", 0);
111 digester.addCallMethod("faces-config/converter/property/suggested-value", "setSuggestedValue", 0);
112 digester.addCallMethod("faces-config/converter/property/property-extension", "addPropertyExtension", 0);
113
114 digester.addObjectCreate("faces-config/managed-bean", ManagedBean.class);
115 digester.addSetNext("faces-config/managed-bean", "addManagedBean");
116 digester.addCallMethod("faces-config/managed-bean/managed-bean-name", "setName", 0);
117 digester.addCallMethod("faces-config/managed-bean/managed-bean-class", "setBeanClass", 0);
118 digester.addCallMethod("faces-config/managed-bean/managed-bean-scope", "setScope", 0);
119 digester.addObjectCreate("faces-config/managed-bean/managed-property", ManagedProperty.class);
120 digester.addSetNext("faces-config/managed-bean/managed-property", "addProperty");
121 digester.addCallMethod("faces-config/managed-bean/managed-property/property-name", "setPropertyName", 0);
122 digester.addCallMethod("faces-config/managed-bean/managed-property/property-class", "setPropertyClass", 0);
123 digester.addCallMethod("faces-config/managed-bean/managed-property/null-value", "setNullValue");
124 digester.addCallMethod("faces-config/managed-bean/managed-property/value", "setValue", 0);
125 digester.addObjectCreate("faces-config/managed-bean/managed-property/map-entries", MapEntries.class);
126 digester.addSetNext("faces-config/managed-bean/managed-property/map-entries", "setMapEntries");
127 digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/key-class", "setKeyClass", 0);
128 digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/value-class", "setValueClass", 0);
129 digester.addObjectCreate("faces-config/managed-bean/managed-property/map-entries/map-entry", MapEntries.Entry.class);
130 digester.addSetNext("faces-config/managed-bean/managed-property/map-entries/map-entry", "addEntry");
131 digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/key", "setKey", 0);
132 digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/null-value", "setNullValue");
133 digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/value", "setValue", 0);
134 digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries", ListEntries.class);
135 digester.addSetNext("faces-config/managed-bean/managed-property/list-entries", "setListEntries");
136 digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/value-class", "setValueClass", 0);
137 digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries/null-value", ListEntries.Entry.class);
138 digester.addSetNext("faces-config/managed-bean/managed-property/list-entries/null-value", "addEntry");
139 digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/null-value", "setNullValue");
140 digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries/value", ListEntries.Entry.class);
141 digester.addSetNext("faces-config/managed-bean/managed-property/list-entries/value", "addEntry");
142 digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/value", "setValue", 0);
143 digester.addObjectCreate("faces-config/managed-bean/map-entries", MapEntries.class);
144 digester.addSetNext("faces-config/managed-bean/map-entries", "setMapEntries");
145 digester.addCallMethod("faces-config/managed-bean/map-entries/key-class", "setKeyClass", 0);
146 digester.addCallMethod("faces-config/managed-bean/map-entries/value-class", "setValueClass", 0);
147 digester.addObjectCreate("faces-config/managed-bean/map-entries/map-entry", MapEntries.Entry.class);
148 digester.addSetNext("faces-config/managed-bean/map-entries/map-entry", "addEntry");
149 digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/key", "setKey", 0);
150 digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/null-value", "setNullValue");
151 digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/value", "setValue", 0);
152 digester.addObjectCreate("faces-config/managed-bean/list-entries", ListEntries.class);
153 digester.addSetNext("faces-config/managed-bean/list-entries", "setListEntries");
154 digester.addCallMethod("faces-config/managed-bean/list-entries/value-class", "setValueClass", 0);
155 digester.addObjectCreate("faces-config/managed-bean/list-entries/null-value", ListEntries.Entry.class);
156 digester.addSetNext("faces-config/managed-bean/list-entries/null-value", "addEntry");
157 digester.addCallMethod("faces-config/managed-bean/list-entries/null-value", "setNullValue");
158 digester.addObjectCreate("faces-config/managed-bean/list-entries/value", ListEntries.Entry.class);
159 digester.addSetNext("faces-config/managed-bean/list-entries/value", "addEntry");
160 digester.addCallMethod("faces-config/managed-bean/list-entries/value", "setValue", 0);
161
162 digester.addObjectCreate("faces-config/navigation-rule", NavigationRule.class);
163 digester.addSetNext("faces-config/navigation-rule", "addNavigationRule");
164 digester.addCallMethod("faces-config/navigation-rule/from-view-id", "setFromViewId", 0);
165 digester.addObjectCreate("faces-config/navigation-rule/navigation-case", NavigationCase.class);
166 digester.addSetNext("faces-config/navigation-rule/navigation-case", "addNavigationCase");
167 digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-action", "setFromAction", 0);
168 digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-outcome", "setFromOutcome", 0);
169 digester.addCallMethod("faces-config/navigation-rule/navigation-case/to-view-id", "setToViewId", 0);
170 digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect", "setRedirect");
171
172 digester.addObjectCreate("faces-config/render-kit", RenderKit.class);
173 digester.addSetNext("faces-config/render-kit", "addRenderKit");
174 digester.addCallMethod("faces-config/render-kit/render-kit-id", "setId", 0);
175 digester.addCallMethod("faces-config/render-kit/render-kit-class", "setRenderKitClass", 0);
176 digester.addObjectCreate("faces-config/render-kit/renderer", Renderer.class);
177 digester.addSetNext("faces-config/render-kit/renderer", "addRenderer");
178 digester.addCallMethod("faces-config/render-kit/renderer/component-family", "setComponentFamily", 0);
179 digester.addCallMethod("faces-config/render-kit/renderer/renderer-type", "setRendererType", 0);
180 digester.addCallMethod("faces-config/render-kit/renderer/renderer-class", "setRendererClass", 0);
181
182 digester.addCallMethod("faces-config/lifecycle/phase-listener", "addLifecyclePhaseListener", 0);
183
184 digester.addCallMethod("faces-config/validator", "addValidator", 2);
185 digester.addCallParam("faces-config/validator/validator-id", 0);
186 digester.addCallParam("faces-config/validator/validator-class", 1);
187 }
188
189
190 public Object getFacesConfig(InputStream in, String systemId) throws IOException, SAXException
191 {
192 InputSource is = new InputSource(in);
193 is.setSystemId(systemId);
194 this.systemId = systemId;
195
196
197 FacesConfig config = (FacesConfig) digester.parse(is);
198
199 List li =config.getApplications();
200
201 for (int i = 0; i < li.size(); i++)
202 {
203 Application application = (Application) li.get(i);
204 List localeList = application.getLocaleConfig();
205
206 for (int j = 0; j < localeList.size(); j++)
207 {
208 LocaleConfig localeConfig = (LocaleConfig) localeList.get(j);
209
210 if(!localeConfig.getSupportedLocales().contains(localeConfig.getDefaultLocale()))
211 localeConfig.getSupportedLocales().add(localeConfig.getDefaultLocale());
212 }
213 }
214
215 return config;
216 }
217
218
219 private class GlobalRule extends Rule {
220
221 private Digester digester;
222
223 public GlobalRule(Digester digester) {
224 this.digester = digester;
225 }
226
227 public void begin(String s, String s1, Attributes attributes) throws Exception {
228 ElementBaseImpl base = (ElementBaseImpl) digester.peek();
229 base.setConfigLocation(systemId);
230 }
231 }
232
233 private static class GlobalRulesBase extends RulesBase {
234 private final Rule globalRule;
235
236 public GlobalRulesBase(Rule globalRule) {
237 this.globalRule = globalRule;
238 }
239
240 public List match(String s, String s1) {
241 List li = super.match(s, s1);
242 li.add(globalRule);
243
244 return li;
245 }
246 }
247 }