1
2
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
24
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
37
38
39
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
72 Locale defaultLocale = Locale.getDefault();
73 if (defaultLocale.equals(Locale.ENGLISH) == false
74 && defaultLocale.equals(locale) == false) {
75 computeNamesOfDayOfWeek(names, defaultLocale);
76 }
77
78
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
137
138
139
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 }