1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package cz.hobrasoft.pdfmu.error;
18
19 import cz.hobrasoft.pdfmu.IntProperties;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.util.Arrays;
23 import java.util.Collection;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.MissingResourceException;
27 import java.util.ResourceBundle;
28 import java.util.Set;
29 import java.util.logging.Logger;
30 import org.apache.commons.collections4.CollectionUtils;
31 import org.apache.commons.collections4.functors.StringValueTransformer;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public enum ErrorType {
59 PARSER_UNKNOWN,
60 PARSER_UNRECOGNIZED_COMMAND,
61 PARSER_UNRECOGNIZED_ARGUMENT,
62 PARSER_INVALID_CHOICE,
63 PARSER_TOO_FEW_ARGUMENTS,
64 PARSER_EXPECTED_ONE_ARGUMENT,
65 INPUT_NOT_VALID_PDF,
66 INPUT_NOT_FOUND,
67 INPUT_CLOSE,
68 OUTPUT_NOT_SPECIFIED,
69 OUTPUT_EXISTS_FORCE_NOT_SET,
70 OUTPUT_OPEN,
71 OUTPUT_STAMPER_OPEN,
72 OUTPUT_STAMPER_CLOSE,
73 OUTPUT_CLOSE,
74 OUTPUT_WRITE,
75 SIGNATURE_ADD_KEYSTORE_TYPE_UNSUPPORTED,
76 SIGNATURE_ADD_KEYSTORE_FILE_NOT_SPECIFIED,
77 SIGNATURE_ADD_KEYSTORE_FILE_OPEN,
78 SIGNATURE_ADD_KEYSTORE_LOAD,
79 SIGNATURE_ADD_KEYSTORE_FILE_CLOSE,
80 SIGNATURE_ADD_KEYSTORE_ALIASES,
81 SIGNATURE_ADD_KEYSTORE_EMPTY,
82 SIGNATURE_ADD_KEYSTORE_ALIAS_MISSING,
83 SIGNATURE_ADD_KEYSTORE_ALIAS_EXCEPTION,
84 SIGNATURE_ADD_KEYSTORE_ALIAS_NOT_KEY,
85 SIGNATURE_ADD_KEYSTORE_ALIAS_KEY_EXCEPTION,
86 SIGNATURE_ADD_KEYSTORE_PRIVATE_KEY,
87 SIGNATURE_ADD_KEYSTORE_CERTIFICATE_CHAIN,
88 SIGNATURE_ADD_UNSUPPORTED_DIGEST_ALGORITHM,
89 SIGNATURE_ADD_FAIL,
90 SIGNATURE_ADD_TSA_UNTRUSTED,
91 SIGNATURE_ADD_TSA_UNAUTHORIZED,
92 SIGNATURE_ADD_TSA_LOGIN_FAIL,
93 SIGNATURE_ADD_TSA_UNREACHABLE,
94 SIGNATURE_ADD_TSA_BAD_CERTIFICATE,
95 SIGNATURE_ADD_TSA_HANDSHAKE_FAILURE,
96 SIGNATURE_ADD_TSA_SSL_HANDSHAKE_EXCEPTION,
97 SIGNATURE_ADD_TSA_SSL_FATAL_ALERT,
98 SIGNATURE_ADD_TSA_INVALID_URL,
99 SIGNATURE_ADD_SIGNATURE_EXCEPTION,
100 ATTACH_FAIL,
101 ATTACH_ATTACHMENT_EQUALS_OUTPUT,
102 SSL_TRUSTSTORE_NOT_FOUND,
103 SSL_TRUSTSTORE_INCORRECT_TYPE,
104 SSL_TRUSTSTORE_EMPTY,
105 SSL_KEYSTORE_NOT_FOUND;
106
107
108
109
110
111
112
113
114 public static final int DEFAULT_ERROR_CODE = -1;
115
116
117
118
119
120
121
122
123
124
125 public static final String CODES_RESOURCE_NAME = "cz/hobrasoft/pdfmu/error/ErrorCodes.properties";
126
127
128
129
130
131
132
133
134
135 public static final String MESSAGES_RESOURCE_BUNDLE_BASE_NAME = "cz.hobrasoft.pdfmu.error.ErrorMessages";
136
137 private static final Logger LOGGER = Logger.getLogger(ErrorType.class.getName());
138
139 private static final IntProperties CODES = new IntProperties(DEFAULT_ERROR_CODE);
140 private static ResourceBundle messages = null;
141
142
143
144
145
146 private static boolean codesAndMessagesAvailable() {
147 ErrorType[] enumKeyArray = ErrorType.values();
148 List<ErrorType> enumKeyList = Arrays.asList(enumKeyArray);
149 Collection<String> enumKeyStrings = CollectionUtils.collect(enumKeyList, StringValueTransformer.stringValueTransformer());
150
151 Set<String> codeKeySet = CODES.stringPropertyNames();
152 assert messages != null;
153 Set<String> messageKeySet = messages.keySet();
154
155 return codeKeySet.containsAll(enumKeyStrings) && messageKeySet.containsAll(enumKeyStrings);
156 }
157
158
159
160
161
162 private static boolean codesUnique() {
163 Collection<Integer> codes = CODES.intPropertyValues();
164 Set<Integer> codesUnique = new HashSet<>(codes);
165 assert codes.size() >= codesUnique.size();
166 return codes.size() == codesUnique.size();
167 }
168
169
170
171
172
173 private static void loadErrorCodes() {
174 ClassLoader classLoader = ErrorType.class.getClassLoader();
175 InputStream in = classLoader.getResourceAsStream(CODES_RESOURCE_NAME);
176 if (in != null) {
177 try {
178 CODES.load(in);
179 } catch (IOException ex) {
180 LOGGER.severe(String.format("Could not load the error codes properties file: %s", ex));
181 }
182 try {
183 in.close();
184 } catch (IOException ex) {
185 LOGGER.severe(String.format("Could not close the error codes properties file: %s", ex));
186 }
187 } else {
188 LOGGER.severe("Could not open the error codes properties file.");
189 }
190 }
191
192
193
194
195
196
197 private static void loadErrorMessages() {
198 try {
199 messages = ResourceBundle.getBundle(MESSAGES_RESOURCE_BUNDLE_BASE_NAME);
200 } catch (MissingResourceException ex) {
201 LOGGER.severe(String.format("Could not load the error messages resource bundle: %s", ex));
202 }
203 }
204
205 static {
206
207 loadErrorCodes();
208 loadErrorMessages();
209 assert messages != null;
210
211
212 assert codesAndMessagesAvailable();
213
214
215 assert codesUnique();
216 }
217
218
219
220
221
222
223
224
225
226
227
228 public int getCode() {
229 return CODES.getIntProperty(toString());
230 }
231
232
233
234
235
236
237
238
239
240
241 public String getMessagePattern() {
242 String key = toString();
243 assert messages != null;
244 if (messages.containsKey(key)) {
245 return messages.getString(key);
246 } else {
247 return null;
248 }
249 }
250 }