1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package ch.qos.cal10n;
24
25 import java.text.MessageFormat;
26 import java.util.Locale;
27 import java.util.Map;
28 import java.util.concurrent.ConcurrentHashMap;
29
30 import ch.qos.cal10n.util.AnnotationExtractor;
31 import ch.qos.cal10n.util.CAL10NResourceBundle;
32 import ch.qos.cal10n.util.CAL10NResourceBundleFinder;
33
34
35
36
37
38
39
40
41
42
43 public class MessageConveyor implements IMessageConveyor {
44
45 final Locale locale;
46
47 final Map<String, CAL10NResourceBundle> cache = new ConcurrentHashMap<String, CAL10NResourceBundle>();
48
49
50
51
52
53
54 public MessageConveyor(Locale locale) {
55 this.locale = locale;
56 }
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 public <E extends Enum<?>> String getMessage(E key, Object... args)
72 throws MessageConveyorException {
73
74 String declararingClassName = key.getDeclaringClass().getName();
75 CAL10NResourceBundle rb = cache.get(declararingClassName);
76 if (rb == null || rb.hasChanged()) {
77 rb = lookup(key);
78 cache.put(declararingClassName, rb);
79 }
80
81 String keyAsStr = key.toString();
82 String value = rb.getString(keyAsStr);
83 if (value == null) {
84 return "No key found for " + keyAsStr;
85 } else {
86 if (args == null || args.length == 0) {
87 return value;
88 } else {
89 return MessageFormat.format(value, args);
90 }
91 }
92 }
93
94 private <E extends Enum<?>> CAL10NResourceBundle lookup(E key)
95 throws MessageConveyorException {
96 Class<?> declaringClass = key.getDeclaringClass();
97
98 String baseName = AnnotationExtractor.getBaseName(key
99 .getDeclaringClass());
100 if (baseName == null) {
101 throw new MessageConveyorException(
102 "Missing @BaseName annotation in enum type ["
103 + key.getClass().getName() + "]. See also "
104 + Cal10nConstants.MISSING_BN_ANNOTATION_URL);
105 }
106
107 String charset = AnnotationExtractor.getCharset(declaringClass, locale);
108
109
110
111 CAL10NResourceBundle rb = CAL10NResourceBundleFinder.getBundle(
112 declaringClass.getClassLoader(), baseName, locale, charset);
113
114 if (rb == null) {
115 throw new MessageConveyorException(
116 "Failed to locate resource bundle [" + baseName
117 + "] for locale [" + locale + "] for enum type ["
118 + key.getDeclaringClass().getName() + "]");
119 }
120 return rb;
121 }
122
123 public String getMessage(MessageParameterObj mpo)
124 throws MessageConveyorException {
125 if (mpo == null) {
126 throw new IllegalArgumentException(
127 "MessageParameterObj argumument cannot be null");
128 }
129 return getMessage(mpo.getKey(), mpo.getArgs());
130 }
131 }