1
2
3
4 package org.rcfaces.core.internal.config;
5
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import javax.faces.FacesException;
10 import javax.faces.context.FacesContext;
11
12 import org.apache.commons.digester.Digester;
13 import org.apache.commons.digester.Rule;
14 import org.rcfaces.core.internal.renderkit.border.IBorderRenderer;
15 import org.rcfaces.core.internal.renderkit.border.IBorderRenderersRegistry;
16 import org.rcfaces.core.internal.util.ClassLocator;
17 import org.xml.sax.Attributes;
18
19
20
21
22
23
24 public class BorderRenderersRegistryImpl extends AbstractRenderKitRegistryImpl
25 implements IBorderRenderersRegistry {
26
27 protected AbstractRenderKitRegistryImpl.RenderKit createRenderKit() {
28 return new RenderKit();
29 }
30
31 public IBorderRenderer getBorderRenderer(FacesContext facesContext,
32 String renderKitId, String family, String componentRenderType,
33 String borderType) {
34
35 RenderKit renderKit = (RenderKit) getRenderKit(facesContext,
36 renderKitId);
37 if (renderKit == null) {
38 throw new FacesException("No renderKit '" + renderKitId
39 + "' defined !");
40
41 }
42
43 BorderRendererFacade borderRenderer = renderKit
44 .getBorderRendererFacade(family, componentRenderType,
45 borderType);
46 if (borderRenderer == null) {
47 if (borderType == null) {
48 return null;
49 }
50
51 throw new FacesException("Border '" + borderType
52 + "' is not defined ! (family=" + family
53 + ", rendererType=" + componentRenderType + ")");
54 }
55
56 return borderRenderer.getBorderRenderer(facesContext);
57 }
58
59
60
61
62
63
64 public static class RenderKit extends
65 AbstractRenderKitRegistryImpl.RenderKit {
66 private static final String REVISION = "$Revision: 1.18 $";
67
68 private final Map bordersById = new HashMap();
69
70 private final Map families = new HashMap(4);
71
72 private final Family defaultFamily = new Family();
73
74 public BorderRendererFacade getBorderRendererFacade(String familyId,
75 String componentType, String borderId) {
76
77 if (borderId != null) {
78 return (BorderRendererFacade) bordersById.get(borderId);
79 }
80
81 if (familyId != null) {
82 Family family = (Family) families.get(familyId);
83 if (family != null) {
84 BorderRendererFacade facade = family
85 .getBorderRendererFacade(this, componentType,
86 borderId);
87 if (facade != null) {
88 return facade;
89 }
90 }
91 }
92
93 return defaultFamily.getBorderRendererFacade(this, componentType,
94 borderId);
95 }
96
97 public void addBorder(BorderRendererFacade facade) {
98 bordersById.put(facade.getId(), facade);
99 }
100
101 public BorderRendererFacade getBorderById(String borderId) {
102 return (BorderRendererFacade) bordersById.get(borderId);
103 }
104
105 public void addDefaultBorder(DefaultBorder defaultBorder) {
106 Family f = defaultFamily;
107
108 String fm = defaultBorder.getFamily();
109 if (fm != null) {
110 f = (Family) families.get(fm);
111 if (f == null) {
112 f = new Family();
113
114 families.put(fm, f);
115 }
116 }
117
118 f.addDefaultBorder(defaultBorder);
119 }
120 }
121
122
123
124
125
126
127 public static class Family {
128
129 private static final String REVISION = "$Revision: 1.18 $";
130
131 private final Map componentTypes = new HashMap(32);
132
133 public synchronized BorderRendererFacade getBorderRendererFacade(
134 RenderKit renderKit, String componentType, String borderId) {
135
136 Object obj = componentTypes.get(componentType);
137 if (obj == null) {
138 return null;
139 }
140
141 if (obj instanceof BorderRendererFacade) {
142 return (BorderRendererFacade) obj;
143 }
144
145 BorderRendererFacade brf = renderKit.getBorderById((String) obj);
146 if (brf == null) {
147 componentTypes.remove(componentType);
148 return null;
149 }
150
151 componentTypes.put(componentType, brf);
152 return brf;
153 }
154
155 public void addDefaultBorder(DefaultBorder defaultBorder) {
156 String fm = defaultBorder.getRenderType();
157 if (fm != null) {
158 componentTypes.put(fm, defaultBorder.getBorderId());
159 }
160 }
161
162 }
163
164
165
166
167
168
169 public static class BorderRendererFacade {
170 private static final String REVISION = "$Revision: 1.18 $";
171
172 private IBorderRenderer threadSafeObject;
173
174 private boolean threadSafe;
175
176 private String id;
177
178 private String className;
179
180 private Class borderClass;
181
182 public final String getId() {
183 return id;
184 }
185
186 public final void setId(String id) {
187 this.id = id;
188 }
189
190 public final String getClassName() {
191 return className;
192 }
193
194 public final void setClassName(String className) {
195 this.className = className;
196 }
197
198 public final boolean isThreadSafe() {
199 return threadSafe;
200 }
201
202 public final void setThreadSafe(boolean threadSafe) {
203 this.threadSafe = threadSafe;
204 }
205
206 public synchronized IBorderRenderer getBorderRenderer(
207 FacesContext facesContext) {
208
209 if (threadSafeObject != null) {
210 return threadSafeObject;
211 }
212
213 if (className != null) {
214 String cls = className;
215 className = null;
216
217 try {
218 borderClass = ClassLocator.load(cls, this, facesContext);
219
220 } catch (Throwable th) {
221 throw new FacesException("Can not load border class '"
222 + cls + "'.", th);
223 }
224
225 if (threadSafe) {
226 threadSafeObject = getBorderRenderer(facesContext);
227
228 return threadSafeObject;
229 }
230 }
231
232 IBorderRenderer borderRenderer;
233 try {
234 borderRenderer = (IBorderRenderer) borderClass.newInstance();
235
236 } catch (FacesException ex) {
237 throw ex;
238
239 } catch (Throwable th) {
240 throw new FacesException(th);
241 }
242
243 return borderRenderer;
244 }
245 }
246
247
248
249
250
251
252 public static final class DefaultBorder {
253 private static final String REVISION = "$Revision: 1.18 $";
254
255 private String borderId;
256
257 private String family;
258
259 private String renderType;
260
261 public final String getBorderId() {
262 return borderId;
263 }
264
265 public final void setBorderId(String borderId) {
266 this.borderId = borderId;
267 }
268
269 public final String getFamily() {
270 return family;
271 }
272
273 public final void setFamily(String family) {
274 this.family = family;
275 }
276
277 public final String getRenderType() {
278 return renderType;
279 }
280
281 public final void setRenderType(String renderType) {
282 this.renderType = renderType;
283 }
284
285 }
286
287 public void configureRules(Digester digester) {
288
289 digester.addRule("rcfaces-config/borders/render-kit", new Rule() {
290 private static final String REVISION = "$Revision: 1.18 $";
291
292 public void begin(String namespace, String name,
293 Attributes attributes) throws Exception {
294
295 String renderKitId = attributes.getValue("render-kit-id");
296
297 RenderKit renderKit = (RenderKit) allocate(renderKitId);
298
299 super.digester.push(renderKit);
300 }
301
302 public void end(String namespace, String name) throws Exception {
303 super.digester.pop();
304 }
305 });
306
307 digester.addObjectCreate(
308 "rcfaces-config/borders/render-kit/border-renderer",
309 BorderRendererFacade.class);
310
311 digester.addBeanPropertySetter(
312 "rcfaces-config/borders/render-kit/border-renderer/border-id",
313 "id");
314
315 digester
316 .addSetProperties(
317 "rcfaces-config/borders/render-kit/border-renderer/renderer-class",
318 "threadSafe", "threadSafe");
319
320 digester
321 .addBeanPropertySetter(
322 "rcfaces-config/borders/render-kit/border-renderer/renderer-class",
323 "className");
324
325 digester.addSetNext(
326 "rcfaces-config/borders/render-kit/border-renderer",
327 "addBorder");
328
329 digester.addObjectCreate(
330 "rcfaces-config/borders/render-kit/default-border",
331 DefaultBorder.class);
332
333 digester.addBeanPropertySetter(
334 "rcfaces-config/borders/render-kit/default-border/border-id",
335 "borderId");
336
337 digester
338 .addBeanPropertySetter(
339 "rcfaces-config/borders/render-kit/default-border/component-family",
340 "family");
341
342 digester
343 .addBeanPropertySetter(
344 "rcfaces-config/borders/render-kit/default-border/renderer-type",
345 "renderType");
346
347 digester.addSetNext("rcfaces-config/borders/render-kit/default-border",
348 "addDefaultBorder");
349 }
350
351 }