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.verifier;
24
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.Locale;
28 import java.util.ResourceBundle;
29 import java.util.Set;
30
31 import ch.qos.cal10n.util.AnnotationExtractor;
32 import ch.qos.cal10n.verifier.Cal10nError.ErrorType;
33
34
35
36
37
38
39
40 public class MessageCodeVerifier implements IMessageCodeVerifier {
41
42 Class<? extends Enum<?>> enumType;
43 String enumTypeAsStr;
44
45 public MessageCodeVerifier(Class<? extends Enum<?>> enumClass) {
46 this.enumType = enumClass;
47 this.enumTypeAsStr = enumClass.getName();
48 }
49
50 @SuppressWarnings("unchecked")
51 public MessageCodeVerifier(String enumTypeAsStr) {
52 this.enumTypeAsStr = enumTypeAsStr;
53 String errMsg = "Failed to find enum class [" + enumTypeAsStr + "]";
54 try {
55 this.enumType = (Class<? extends Enum<?>>) Class.forName(enumTypeAsStr);
56 } catch (ClassNotFoundException e) {
57 throw new IllegalStateException(errMsg, e);
58 } catch (NoClassDefFoundError e) {
59 throw new IllegalStateException(errMsg, e);
60 }
61 }
62
63
64
65
66
67 public Class<? extends Enum<?>> getEnumType() {
68 return enumType;
69 }
70
71
72
73
74 public String getEnumTypeAsStr() {
75 return enumTypeAsStr;
76 }
77
78
79
80
81 public List<Cal10nError> verify(Locale locale) {
82 List<Cal10nError> errorList = new ArrayList<Cal10nError>();
83
84 String resouceBundleName = AnnotationExtractor
85 .getResourceBundleName(enumType);
86
87 if (resouceBundleName == null) {
88 errorList.add(new Cal10nError(ErrorType.MISSING_RBN_ANNOTATION, "",
89 enumType, locale, ""));
90
91 return errorList;
92 }
93
94 ResourceBundle rb = ResourceBundle.getBundle(resouceBundleName, locale);
95
96 ErrorFactory errorFactory = new ErrorFactory(enumType, locale,
97 resouceBundleName);
98
99 if (rb == null) {
100 errorList.add(errorFactory.buildError(ErrorType.FAILED_TO_FIND_RB, ""));
101 }
102
103 Set<String> rbKeySet = rb.keySet();
104 if (rbKeySet.size() == 0) {
105 errorList.add(errorFactory.buildError(ErrorType.EMPTY_RB, ""));
106 }
107
108 Enum<?>[] enumArray = enumType.getEnumConstants();
109 if (enumArray == null || enumArray.length == 0) {
110 errorList.add(errorFactory.buildError(ErrorType.EMPTY_ENUM, ""));
111 }
112
113 if (errorList.size() != 0) {
114 return errorList;
115 }
116
117 for (Enum<?> e : enumArray) {
118 String enumKey = e.toString();
119 if (rbKeySet.contains(enumKey)) {
120 rbKeySet.remove(enumKey);
121 } else {
122 errorList.add(errorFactory.buildError(ErrorType.ABSENT_IN_RB, enumKey));
123 }
124 }
125
126 for (String rbKey : rbKeySet) {
127 errorList.add(errorFactory.buildError(ErrorType.ABSENT_IN_ENUM, rbKey));
128 }
129 return errorList;
130 }
131
132
133
134
135 public List<String> typeIsolatedVerify(Locale locale) {
136 List<Cal10nError> errorList = verify(locale);
137 List<String> strList = new ArrayList<String>();
138 for (Cal10nError error : errorList) {
139 strList.add(error.toString());
140 }
141 return strList;
142 }
143
144
145
146
147 public List<Cal10nError> verifyAllLocales() {
148 List<Cal10nError> errorList = new ArrayList<Cal10nError>();
149
150 String[] localeNameArray = getLocaleNames();
151
152 if (localeNameArray == null || localeNameArray.length == 0) {
153 String errMsg = "Missing @LocaleNames annotation in enum type ["
154 + enumTypeAsStr + "]";
155 throw new IllegalStateException(errMsg);
156 }
157 for (String localeName : localeNameArray) {
158 Locale locale = new Locale(localeName);
159 List<Cal10nError> tmpList = verify(locale);
160 errorList.addAll(tmpList);
161 }
162
163 return errorList;
164 }
165
166
167
168
169
170 public String[] getLocaleNames() {
171 String[] localeNameArray = AnnotationExtractor.getLocaleNames(enumType);
172 return localeNameArray;
173 }
174
175 public String getResourceBundleName() {
176 String rbName = AnnotationExtractor.getResourceBundleName(enumType);
177 return rbName;
178 }
179
180
181
182 }