1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package jp.liq.container.util;
17
18 import java.text.MessageFormat;
19 import java.util.Map;
20 import java.util.ResourceBundle;
21 import java.util.concurrent.ConcurrentHashMap;
22
23
24
25
26
27
28 public abstract class AbstractException extends RuntimeException {
29 private static final long serialVersionUID = 5718032353881037202L;
30 protected static final String LS = System.getProperty("line.separator");
31
32 private static final Map<String, String> messageCache = new ConcurrentHashMap<String, String>();
33
34 private final Enum<?> errorCode;
35 private final Object[] args;
36
37
38
39
40
41
42 public AbstractException(Enum<?> errCode, Object... args) {
43 super();
44 this.errorCode = errCode;
45 this.args = args;
46 }
47
48
49
50
51
52
53
54 public AbstractException(Throwable cause, Enum<?> errCode, Object... args) {
55 super(cause);
56 this.errorCode = errCode;
57 this.args = args;
58 }
59
60
61
62
63
64 public AbstractException(Throwable cause) {
65 super(cause);
66 this.errorCode = null;
67 this.args = null;
68 }
69
70 @Override
71 public String getLocalizedMessage() {
72 if(errorCode == null) {
73 return null;
74 }
75 ResourceBundle bundle = ResourceBundle.getBundle(this.getClass().getName());
76
77 if(!messageCache.containsKey(errorCode.name())) {
78 messageCache.put(errorCode.name(), replaceLineSeparator(bundle.getString(errorCode.name())));
79 }
80 String msg = messageCache.get(errorCode.name());
81 return MessageFormat.format(msg, args);
82 }
83
84 private static String replaceLineSeparator(String srcStr) {
85 StringBuffer sb = new StringBuffer(srcStr);
86
87 while(true) {
88 int pos = 0;
89 pos = sb.indexOf("{LS}", pos);
90 if(pos == -1) {
91 break;
92 } else {
93 sb.replace(pos, pos + 4, LS);
94 pos += LS.length();
95 }
96 }
97 return sb.toString();
98 }
99
100
101
102
103 public Enum<?> getErrorCode() {
104 return errorCode;
105 }
106 }