View Javadoc

1   /*
2    * $Id: BorderRenderersRegistryImpl.java,v 1.18 2011/06/16 09:29:40 jbmeslin Exp $
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   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
22   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
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       * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
62       * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
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      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
125      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
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      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
167      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
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      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
250      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
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 }