blob: 07b2a59958ca1e5cb3eb5b3e6d514be92bc3bbd0 (
plain)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
package com.vaadin.tests.components.ui;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.vaadin.server.DefaultErrorHandler;
import com.vaadin.server.ErrorHandler;
import com.vaadin.server.ErrorHandlingRunnable;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinService;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.Button;
import com.vaadin.ui.UI;
import com.vaadin.util.CurrentInstance;
public class UIAccessExceptionHandling extends AbstractTestUIWithLog
implements ErrorHandler {
private Future<Void> future;
@Override
protected void setup(VaadinRequest request) {
getSession().setErrorHandler(this);
addComponent(
new Button("Throw RuntimeException on UI.access", event -> {
log.clear();
// Ensure beforeClientResponse is invoked
markAsDirty();
future = access(() -> {
throw new RuntimeException();
});
}));
addComponent(new Button("Throw RuntimeException on Session.access",
event -> {
log.clear();
// Ensure beforeClientResponse is invoked
markAsDirty();
VaadinService service = VaadinService.getCurrent();
future = service.accessSession(getSession(), () -> {
throw new RuntimeException();
});
}));
addComponent(new Button(
"Throw RuntimeException after removing instances", event -> {
log.clear();
// Ensure beforeClientResponse is invoked
markAsDirty();
assert UI.getCurrent() == UIAccessExceptionHandling.this;
Map<Class<?>, CurrentInstance> instances = CurrentInstance
.getInstances();
CurrentInstance.clearAll();
assert UI.getCurrent() == null;
future = access(() -> {
throw new RuntimeException();
});
CurrentInstance.restoreInstances(instances);
}));
addComponent(
new Button("Throw through ErrorHandlingRunnable", event -> {
access(new ErrorHandlingRunnable() {
@Override
public void run() {
log.clear();
throw new NullPointerException();
}
@Override
public void handleError(Exception exception) {
// "Handle" other exceptions, but leave NPE for
// default handler
if (exception instanceof NullPointerException) {
NullPointerException npe = (NullPointerException) exception;
throw npe;
}
}
});
}));
addComponent(new Button("Clear", event -> log.clear()));
}
@Override
public void beforeClientResponse(boolean initial) {
if (future != null) {
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
log("Exception caught on get: " + e.getClass().getName());
} finally {
future = null;
}
}
}
@Override
public void error(com.vaadin.server.ErrorEvent event) {
log("Exception caught on execution with "
+ event.getClass().getSimpleName() + " : "
+ event.getThrowable().getClass().getName());
DefaultErrorHandler.doDefault(event);
}
@Override
protected String getTestDescription() {
return "Test for handling exceptions in UI.access and Session.access";
}
@Override
protected Integer getTicketNumber() {
return Integer.valueOf(12703);
}
}
|