Project

General

Profile

Download (5.49 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2015 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9
package eu.etaxonomy.cdm.vaadin.util;
10

    
11
import java.util.ArrayList;
12
import java.util.Date;
13
import java.util.List;
14

    
15
import org.apache.log4j.Logger;
16

    
17
import com.vaadin.server.Page;
18
import com.vaadin.ui.Notification;
19
import com.vaadin.ui.Notification.Type;
20
import com.vaadin.ui.UI;
21

    
22
import eu.etaxonomy.cdm.vaadin.component.CdmProgressComponent;
23
import eu.etaxonomy.cdm.vaadin.session.CdmChangeEvent;
24

    
25
/**
26
 * @author cmathew
27
 * @date 14 Apr 2015
28
 *
29
 */
30
public abstract class CdmVaadinOperation implements Runnable {
31
    private static final Logger logger = Logger.getLogger(CdmVaadinOperation.class);
32

    
33
    private int pollInterval = -1;
34
    private CdmProgressComponent progressComponent;
35

    
36
    private boolean opDone = false;
37

    
38
    List<CdmChangeEvent> events = new ArrayList<CdmChangeEvent>();
39

    
40
    private Date now = new java.util.Date();
41

    
42
    private Exception exception;
43

    
44

    
45

    
46
    public CdmVaadinOperation(int pollInterval, CdmProgressComponent progressComponent) {
47
        this.pollInterval = pollInterval;
48
        this.progressComponent = progressComponent;
49

    
50
        UI.getCurrent().setPollInterval(pollInterval);
51

    
52
        // comment out below for debugging
53
//        logger.warn(new Timestamp(now.getTime()) + " : set polling interval to " + pollInterval);
54
//        UI.getCurrent().addPollListener(new UIEvents.PollListener() {
55
//            @Override
56
//            public void poll(UIEvents.PollEvent event) {
57
//                logger.warn( new Timestamp(now.getTime()) + " : polling");
58
//            }
59
//        });
60
    }
61

    
62
    public CdmVaadinOperation() {
63

    
64
    }
65

    
66

    
67

    
68
    public void setProgress(final String progressText) {
69
        if(progressComponent == null) {
70
            return;
71
        }
72
        if(isAsync()) {
73
            UI.getCurrent().access(new Runnable() {
74
                @Override
75
                public void run() {
76
                    progressComponent.setProgress(progressText);
77
                    //logger.warn("set progress spinner");
78
                }
79
            });
80
        } else {
81
            progressComponent.setProgress(progressText);
82
        }
83

    
84

    
85
    }
86

    
87
    public void setProgress(final String progressText, final float progress) {
88
        if(progressComponent == null) {
89
            return;
90
        }
91
        if(isAsync()) {
92
            UI.getCurrent().access(new Runnable() {
93
                @Override
94
                public void run() {
95
                    progressComponent.setProgress(progressText, progress);
96
                }
97
            });
98
        } else {
99
            progressComponent.setProgress(progressText, progress);
100
        }
101
    }
102

    
103
    public void endProgress() {
104
        if(progressComponent == null) {
105
            return;
106
        }
107
        if(isAsync()) {
108
            UI.getCurrent().access(new Runnable() {
109
                @Override
110
                public void run() {
111
                    progressComponent.setVisible(false);
112
                }
113
            });
114
        } else {
115
            progressComponent.setVisible(false);
116
        }
117
    }
118

    
119
    /* (non-Javadoc)
120
     * @see java.lang.Runnable#run()
121
     */
122
    @Override
123
    public void run() {
124
        try {
125
            final boolean success = execute();
126
            //logger.warn(new Timestamp(now.getTime()) + " : ran execute");
127

    
128
            if(isAsync()) {
129
                UI.getCurrent().access(new Runnable() {
130
                    @Override
131
                    public void run() {
132
                        try {
133
                            if(success) {
134
                                fireDelayedEvents();
135
                            }
136
                            if(exception != null) {
137
                                Notification notification = new Notification(exception.getMessage(), "", Type.WARNING_MESSAGE);
138
                                notification.show(Page.getCurrent());
139
                                exception = null;
140
                            }
141
                            postOpUIUpdate(success);
142
                            //logger.warn(new Timestamp(now.getTime()) + " : ran postOpUIUpdate ");
143
                        } finally {
144
                            UI.getCurrent().setPollInterval(-1);
145
                            opDone = true;
146
                            //logger.warn(new Timestamp(now.getTime()) + " : switched off pollling");
147
                        }
148
                    }
149
                });
150
            } else {
151
                postOpUIUpdate(success);
152
            }
153
        } finally {
154
            endProgress();
155
        }
156
    }
157

    
158
    public abstract  boolean execute();
159

    
160
    public void postOpUIUpdate(boolean isOpSuccess) {}
161

    
162
    public void fireEvent(CdmChangeEvent event, boolean async) {
163
        CdmVaadinSessionUtilities.getCurrentCdmDataChangeService().fireChangeEvent(event, async);
164
    }
165

    
166
    public void registerDelayedEvent(CdmChangeEvent event) {
167
        events.add(event);
168
    }
169

    
170
    private void fireDelayedEvents() {
171
        for(CdmChangeEvent event : events) {
172
            fireEvent(event, false);
173
        }
174
        events.clear();
175
    }
176

    
177
    public boolean isAsync() {
178
        return pollInterval > 0;
179
    }
180

    
181
    /**
182
     * @return the exception
183
     */
184
    public Exception getException() {
185
        return exception;
186
    }
187

    
188
    /**
189
     * @param exception the exception to set
190
     */
191
    public void setException(Exception exception) {
192
        this.exception = exception;
193
    }
194

    
195

    
196
}
(5-5/10)