View Javadoc

1   /*
2    * $Id: ContentAccessorsRegistryImpl.java,v 1.3 2008/09/17 16:38:17 oeuillot Exp $
3    */
4   package org.rcfaces.core.internal.contentAccessor;
5   
6   import java.util.ArrayList;
7   import java.util.Arrays;
8   import java.util.HashMap;
9   import java.util.Iterator;
10  import java.util.List;
11  import java.util.Map;
12  
13  import org.apache.commons.digester.Digester;
14  import org.rcfaces.core.internal.RcfacesContext;
15  import org.rcfaces.core.lang.IContentFamily;
16  import org.rcfaces.core.provider.AbstractProvider;
17  
18  /**
19   * 
20   * @author Olivier Oeuillot (latest modification by $Author: oeuillot $)
21   * @version $Revision: 1.3 $ $Date: 2008/09/17 16:38:17 $
22   */
23  public class ContentAccessorsRegistryImpl extends AbstractProvider implements
24          IContentAccessorRegistry {
25      private static final String REVISION = "$Revision: 1.3 $";
26  
27      private static final IContentAccessorHandler[] CONTENT_ACCESSOR_HANDLER_EMPTY_ARRAY = new IContentAccessorHandler[0];
28  
29      private final Map contentAccessorsByType = new HashMap(8);
30  
31      private IContentAccessorHandler defaultContentAccessors[] = CONTENT_ACCESSOR_HANDLER_EMPTY_ARRAY;
32  
33      public ContentAccessorsRegistryImpl() {
34          // Dans le constructeur car celui-ci est utilisé par d'autres registry
35          RcfacesContext rcfacesContext = RcfacesContext.getCurrentInstance();
36  
37          if (rcfacesContext.getContentAccessorRegistry() == null) {
38              rcfacesContext.setContentAccessorRegistry(this);
39          }
40      }
41  
42      public String getId() {
43          return "ContentAccessorsRegistry";
44      }
45  
46      public IContentAccessorHandler[] listContentAccessorHandlers(
47              IContentFamily type) {
48          IContentAccessorHandler contentAccessorHandlers[] = (IContentAccessorHandler[]) contentAccessorsByType
49                  .get(type);
50          if (contentAccessorHandlers == null) {
51              return defaultContentAccessors;
52          }
53  
54          return contentAccessorHandlers;
55      }
56  
57      public void declareContentAccessorHandler(IContentFamily contentFamily,
58              IContentAccessorHandler contentAccessorHandler) {
59  
60          if (contentFamily == null) {
61              // On fait l'ajout
62              for (Iterator it = contentAccessorsByType.keySet().iterator(); it
63                      .hasNext();) {
64  
65                  contentFamily = (IContentFamily) it.next();
66  
67                  declareContentAccessorHandler(contentFamily,
68                          contentAccessorHandler);
69              }
70  
71              // Puis on declare les defaults
72  
73              List l = new ArrayList(Arrays.asList(defaultContentAccessors));
74              l.add(contentAccessorHandler);
75              defaultContentAccessors = (IContentAccessorHandler[]) l
76                      .toArray(new IContentAccessorHandler[l.size()]);
77  
78              return;
79          }
80  
81          List l = new ArrayList();
82          IContentAccessorHandler cah[] = listContentAccessorHandlers(contentFamily);
83          if (cah.length > 0) {
84              l.addAll(Arrays.asList(cah));
85  
86          } else if (defaultContentAccessors.length > 0) {
87              l.addAll(Arrays.asList(defaultContentAccessors));
88          }
89          l.add(contentAccessorHandler);
90  
91          contentAccessorsByType.put(contentFamily, l
92                  .toArray(new IContentAccessorHandler[l.size()]));
93  
94      }
95  
96      public void configureRules(Digester digester) {
97          super.configureRules(digester);
98  
99          // Il faut lire la config pour declarer les accesseurs
100     }
101 
102 }