1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.extensions.validator.core.validation.message.resolver;
20
21 import org.apache.myfaces.extensions.validator.core.ExtValContext;
22 import org.apache.myfaces.extensions.validator.core.CustomInformation;
23 import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
24 import org.apache.myfaces.extensions.validator.core.el.ELHelper;
25 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
26 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
27 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
28
29 import java.util.Locale;
30 import java.util.MissingResourceException;
31 import java.util.ResourceBundle;
32 import java.util.logging.Logger;
33 import java.util.logging.Level;
34
35
36
37
38
39
40
41
42 @UsageInformation({UsageCategory.INTERNAL, UsageCategory.CUSTOMIZABLE})
43 public abstract class AbstractValidationErrorMessageResolver implements MessageResolver
44 {
45 public static final String MISSING_RESOURCE_MARKER = "???";
46
47 protected final Logger logger = Logger.getLogger(getClass().getName());
48
49 private static boolean deactivateDefaultConvention = ExtValCoreConfiguration.get().deactivateDefaultConvention();
50 private static ResourceBundle defaultBundle = null;
51 private String messageBundleBaseName;
52
53 private String messageBundleVarName;
54
55 private ELHelper elHelper = ExtValUtils.getELHelper();
56
57 protected AbstractValidationErrorMessageResolver()
58 {
59 logger.fine(getClass().getName() + " instantiated");
60 }
61
62 public String getMessage(String key, Locale locale)
63 {
64 if (key == null || key.equals(""))
65 {
66 return null;
67 }
68
69 if(key.contains(" "))
70 {
71 if(key.endsWith("_detail"))
72 {
73 key = key.substring(0, key.length() - 7);
74 }
75 return key;
76 }
77
78 String customMessage = null;
79
80 try
81 {
82 customMessage = tryToFindCustomMessage(key, locale);
83 }
84 catch (Exception e)
85 {
86
87 }
88
89 if (customMessage != null)
90 {
91 return customMessage;
92 }
93
94
95
96
97 try
98 {
99 customMessage = tryToUseMessageBundleConvention(key, locale);
100 }
101 catch (Exception e)
102 {
103
104 }
105
106 if (customMessage != null)
107 {
108 return customMessage;
109 }
110
111
112
113
114
115
116 try
117 {
118 customMessage = tryToFindCustomMessageInCustomResourceBundle(key, locale);
119 }
120 catch (Exception e)
121 {
122
123 }
124
125 return determineMessage(key, locale, customMessage);
126 }
127
128 private String tryToFindCustomMessage(String key, Locale locale)
129 {
130 ResourceBundle resourceBundle;
131 String customMessage = null;
132
133
134 if (this.messageBundleBaseName != null)
135 {
136 resourceBundle = ResourceBundle.getBundle(this.messageBundleBaseName, locale);
137 if (resourceBundle != null)
138 {
139 customMessage = resourceBundle.getString(key);
140 }
141 else
142 {
143 logger.warning("message bundle " + this.messageBundleBaseName + " not found");
144 }
145 }
146
147
148 if (this.messageBundleVarName != null && customMessage == null)
149 {
150 resourceBundle = (ResourceBundle) this.elHelper.getBean(messageBundleVarName);
151
152 if (resourceBundle != null)
153 {
154 customMessage = resourceBundle.getString(key);
155 }
156 else
157 {
158 logger.warning("message bundle var name " + this.messageBundleVarName + " not found");
159 }
160 }
161
162 return customMessage;
163 }
164
165 private String tryToUseMessageBundleConvention(String key, Locale locale)
166 {
167 if (!deactivateDefaultConvention && isDefaultMessageBundleConventionActive())
168 {
169 if (defaultBundle == null)
170 {
171 try
172 {
173 defaultBundle = ResourceBundle.getBundle(ExtValContext.getContext().getInformationProviderBean()
174 .get(CustomInformation.MESSAGE_BUNDLE_NAME), locale);
175 }
176 catch (Exception e)
177 {
178
179 deactivateDefaultConvention = true;
180 }
181 }
182
183 if (defaultBundle != null)
184 {
185 return defaultBundle.getString(key);
186 }
187 }
188
189 return null;
190 }
191
192 private String tryToFindCustomMessageInCustomResourceBundle(String key, Locale locale)
193 {
194 ResourceBundle resourceBundle = tryToLoadCustomResourceBundle(locale);
195
196 if (resourceBundle != null)
197 {
198 try
199 {
200 return resourceBundle.getString(key);
201 }
202 catch (MissingResourceException e)
203 {
204 logger.log(Level.FINEST, "no custom message for " + key + " within " + getCustomBaseName(), e);
205 }
206 }
207 return null;
208 }
209
210 private ResourceBundle tryToLoadCustomResourceBundle(Locale locale)
211 {
212 String customBaseName = getCustomBaseName();
213
214 if(customBaseName != null)
215 {
216 return ResourceBundle.getBundle(customBaseName, locale);
217 }
218 return null;
219 }
220
221 private String determineMessage(String key, Locale locale, String customMessage)
222 {
223
224 try
225 {
226 return (customMessage != null) ? customMessage
227 : (getBaseName() != null) ? ResourceBundle.getBundle(getBaseName(), locale).getString(key) : null;
228 }
229 catch (MissingResourceException e)
230 {
231 return MISSING_RESOURCE_MARKER + key + MISSING_RESOURCE_MARKER;
232 }
233 }
234
235 protected boolean isDefaultMessageBundleConventionActive()
236 {
237 return true;
238 }
239
240 protected abstract String getBaseName();
241
242 protected String getCustomBaseName()
243 {
244 return null;
245 }
246
247 public void setMessageBundleBaseName(String messageBundleBaseName)
248 {
249 this.messageBundleBaseName = messageBundleBaseName;
250 }
251
252 public void setMessageBundleVarName(String messageBundleVarName)
253 {
254 this.messageBundleVarName = messageBundleVarName;
255 }
256 }