aboutsummaryrefslogtreecommitdiffstats
path: root/uitest/src/main/java/com/vaadin/tests/components/ui/UIAccessExceptionHandling.java
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);
    }

}