View Javadoc

1   /*
2    * $Id: WeekDaysConverter.java,v 1.18 2011/06/16 09:29:40 jbmeslin Exp $
3    * 
4    */
5   package org.rcfaces.core.internal.converter;
6   
7   import java.text.DateFormatSymbols;
8   import java.util.HashMap;
9   import java.util.Locale;
10  import java.util.Map;
11  import java.util.StringTokenizer;
12  
13  import javax.faces.FacesException;
14  import javax.faces.component.UIComponent;
15  import javax.faces.context.FacesContext;
16  import javax.faces.convert.Converter;
17  
18  import org.rcfaces.core.component.capability.ILiteralLocaleCapability;
19  import org.rcfaces.core.internal.lang.StringAppender;
20  import org.rcfaces.core.model.AbstractConverter;
21  
22  /**
23   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
24   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
25   */
26  public class WeekDaysConverter extends AbstractConverter {
27      private static final String REVISION = "$Revision: 1.18 $";
28  
29      public static final Converter SINGLETON = new WeekDaysConverter();
30  
31      private static final Integer ZERO = new Integer(0);
32  
33      private static final Map namesOfDayOfWeek = new HashMap(8);
34  
35      /*
36       * (non-Javadoc)
37       * 
38       * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext,
39       *      javax.faces.component.UIComponent, java.lang.String)
40       */
41      public Object getAsObject(FacesContext context, UIComponent component,
42              String value) {
43  
44          if (value == null || value.length() < 1) {
45              return ZERO;
46          }
47          StringTokenizer st = new StringTokenizer(value, ";, \t\r\n");
48          if (st.hasMoreTokens() == false) {
49              return ZERO;
50          }
51  
52          Locale locale = null;
53          if (component instanceof ILiteralLocaleCapability) {
54              ILiteralLocaleCapability localizedAttributesCapability = (ILiteralLocaleCapability) component;
55  
56              locale = localizedAttributesCapability.getLiteralLocale();
57          }
58  
59          if (locale == null) {
60              locale = Locale.getDefault();
61          }
62  
63          Map names;
64          synchronized (namesOfDayOfWeek) {
65              names = (Map) namesOfDayOfWeek.get(locale);
66  
67              if (names == null) {
68  
69                  names = new HashMap(14 * 3);
70  
71                  // Machine par défaut
72                  Locale defaultLocale = Locale.getDefault();
73                  if (defaultLocale.equals(Locale.ENGLISH) == false
74                          && defaultLocale.equals(locale) == false) {
75                      computeNamesOfDayOfWeek(names, defaultLocale);
76                  }
77  
78                  // English par défaut
79                  computeNamesOfDayOfWeek(names, Locale.ENGLISH);
80  
81                  computeNamesOfDayOfWeek(names, locale);
82  
83                  namesOfDayOfWeek.put(locale, names);
84              }
85          }
86  
87          int mask = 0;
88          for (; st.hasMoreTokens();) {
89              String name = st.nextToken().toLowerCase();
90  
91              Integer idxOfDay = (Integer) names.get(name);
92              if (idxOfDay == null) {
93                  throw new FacesException("Can not understand day of week '"
94                          + name + "'. (current locale=" + locale + ")");
95              }
96  
97              mask |= idxOfDay.intValue();
98          }
99  
100         if (mask == 0) {
101             return ZERO;
102         }
103 
104         return new Integer(mask);
105     }
106 
107     private void computeNamesOfDayOfWeek(Map map, Locale locale) {
108         DateFormatSymbols dfs = new DateFormatSymbols(locale);
109 
110         String swd[] = dfs.getShortWeekdays();
111         if (swd != null) {
112             for (int i = 1; i < swd.length; i++) {
113                 String s = swd[i];
114                 if (s == null || s.length() < 1) {
115                     continue;
116                 }
117 
118                 map.put(s.toLowerCase(), new Integer(1 << (i - 1)));
119             }
120         }
121 
122         swd = dfs.getWeekdays();
123         if (swd != null) {
124             for (int i = 1; i < swd.length; i++) {
125                 String s = swd[i];
126                 if (s == null || s.length() < 1) {
127                     continue;
128                 }
129 
130                 map.put(s.toLowerCase(), new Integer(1 << (i - 1)));
131             }
132         }
133     }
134 
135     /*
136      * (non-Javadoc)
137      * 
138      * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext,
139      *      javax.faces.component.UIComponent, java.lang.Object)
140      */
141     public String getAsString(FacesContext context, UIComponent component,
142             Object value) {
143 
144         int i = ((Number) value).intValue();
145         if (i < 1) {
146             return "";
147         }
148 
149         Locale locale = null;
150         if (component instanceof ILiteralLocaleCapability) {
151             ILiteralLocaleCapability localizedAttributesCapability = (ILiteralLocaleCapability) component;
152 
153             locale = localizedAttributesCapability.getLiteralLocale();
154         }
155 
156         if (locale == null) {
157             locale = Locale.getDefault();
158         }
159 
160         DateFormatSymbols dfs = new DateFormatSymbols(locale);
161         String sws[] = dfs.getWeekdays();
162         if (sws == null || sws.length < 1) {
163             return "*** unknown locale ***";
164         }
165 
166         StringAppender sb = new StringAppender(128);
167         int idx = 0;
168         for (; i > 0; i >>= 1, idx++) {
169             if ((i & 1) == 0) {
170                 continue;
171             }
172 
173             if (sb.length() > 0) {
174                 sb.append(", ");
175             }
176 
177             if (sws.length >= idx) {
178                 sb.append("?");
179                 continue;
180             }
181 
182             sb.append(sws[idx]);
183         }
184 
185         return sb.toString();
186     }
187 }