ref #6719 fixing bug releated to sorting
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / vaadin / util / CdmVaadinOperation.java
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 }