1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.admincentral;
35
36 import info.magnolia.i18nsystem.SimpleTranslator;
37 import info.magnolia.ui.api.message.Message;
38 import info.magnolia.ui.api.message.MessageType;
39 import info.magnolia.ui.framework.message.MessagesManager;
40
41 import java.lang.reflect.InvocationTargetException;
42
43 import javax.inject.Inject;
44
45 import org.apache.commons.lang3.StringUtils;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 import com.vaadin.event.ListenerMethod;
50 import com.vaadin.server.ErrorEvent;
51 import com.vaadin.server.ErrorHandler;
52 import com.vaadin.server.ServerRpcManager;
53
54
55
56
57
58
59 public class AdmincentralErrorHandler implements ErrorHandler {
60
61 private static final Logger log = LoggerFactory.getLogger(AdmincentralErrorHandler.class);
62
63 private static final String DEFAULT_MESSAGE = "ui.error.default";
64
65 private final MessagesManager messagesManager;
66
67 private final SimpleTranslator i18n;
68
69 @Inject
70 public AdmincentralErrorHandler(MessagesManager messagesManager, SimpleTranslator i18n) {
71 this.messagesManager = messagesManager;
72 this.i18n = i18n;
73 }
74
75 @Override
76 public void error(ErrorEvent event) {
77 log.error(i18n.translate(DEFAULT_MESSAGE), event.getThrowable());
78
79 Message message = getErrorMessage(event.getThrowable());
80 messagesManager.sendLocalMessage(message);
81 }
82
83 private Message getErrorMessage(Throwable e) {
84
85 Message message = new Message();
86 message.setType(MessageType.ERROR);
87
88 addMessageDetails(message, e);
89
90
91 if (e instanceof ServerRpcManager.RpcInvocationException) {
92 e = e.getCause();
93 addMessageDetails(message, e);
94 }
95 if (e instanceof InvocationTargetException) {
96 e = ((InvocationTargetException) e).getTargetException();
97 addMessageDetails(message, e);
98 }
99 if (e instanceof ListenerMethod.MethodException) {
100 e = e.getCause();
101 addMessageDetails(message, e);
102 }
103
104
105 while (e != null && e != e.getCause()) {
106 e = e.getCause();
107 addMessageDetails(message, e);
108 }
109
110 if (StringUtils.isBlank(message.getSubject())) {
111 message.setSubject(i18n.translate(DEFAULT_MESSAGE));
112 }
113
114 return message;
115 }
116
117 private void addMessageDetails(Message message, Throwable e) {
118 if (e != null) {
119
120
121 String content = message.getMessage();
122 if (content == null) {
123 content = "";
124 } else {
125 content += "\n" + i18n.translate("ui.error.causedby") + " ";
126 }
127 content += e.getClass().getSimpleName();
128 if (StringUtils.isNotBlank(e.getMessage())) {
129 content += ": " + e.getMessage();
130
131
132 message.setSubject(e.getMessage());
133 }
134 message.setMessage(content);
135 }
136 }
137 }