Skip to content

Commit 62bb345

Browse files
author
Lee Kamentsky
committed
Asynchronous status reporting - keeps workers from blocking on UI status reporting
1 parent 6b611c6 commit 62bb345

File tree

2 files changed

+170
-6
lines changed

2 files changed

+170
-6
lines changed

src/main/java/org/scijava/app/DefaultStatusService.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,36 +62,36 @@ public class DefaultStatusService extends AbstractService implements
6262

6363
@Override
6464
public void showProgress(final int value, final int maximum) {
65-
eventService.publish(new StatusEvent(value, maximum));
65+
publish(new StatusEvent(value, maximum));
6666
}
6767

6868
@Override
6969
public void showStatus(final String message) {
70-
eventService.publish(new StatusEvent(message));
70+
publish(new StatusEvent(message));
7171
}
7272

7373
@Override
7474
public void showStatus(final int progress, final int maximum,
7575
final String message)
7676
{
77-
eventService.publish(new StatusEvent(progress, maximum, message));
77+
publish(new StatusEvent(progress, maximum, message));
7878
}
7979

8080
@Override
8181
public void warn(final String message) {
82-
eventService.publish(new StatusEvent(message, true));
82+
publish(new StatusEvent(message, true));
8383
}
8484

8585
@Override
8686
public void showStatus(final int progress, final int maximum,
8787
final String message, final boolean warn)
8888
{
89-
eventService.publish(new StatusEvent(progress, maximum, message, warn));
89+
publish(new StatusEvent(progress, maximum, message, warn));
9090
}
9191

9292
@Override
9393
public void clearStatus() {
94-
eventService.publish(new StatusEvent(""));
94+
publish(new StatusEvent(""));
9595
}
9696

9797
@Override
@@ -102,5 +102,18 @@ public String getStatusMessage(final String appName,
102102
if (!"".equals(message)) return message;
103103
return appService.getApp(appName).getInfo(false);
104104
}
105+
106+
/**
107+
* Publish the status event to the event service.
108+
* The default behavior is to publish status asynchronously.
109+
* You can change this behavior by overriding this method
110+
* in a derived class.
111+
*
112+
* @param statusEvent the event to send to status listeners.
113+
*/
114+
protected void publish(final StatusEvent statusEvent)
115+
{
116+
eventService.publishLater(statusEvent);
117+
}
105118

106119
}
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package org.scijava.app;
2+
3+
import static org.junit.Assert.*;
4+
5+
import java.util.Queue;
6+
import java.util.concurrent.ArrayBlockingQueue;
7+
import java.util.concurrent.BlockingQueue;
8+
import java.util.concurrent.TimeUnit;
9+
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
import org.scijava.Context;
13+
import org.scijava.Contextual;
14+
import org.scijava.app.event.StatusEvent;
15+
import org.scijava.event.EventHandler;
16+
import org.scijava.plugin.Parameter;
17+
18+
public class DefaultStatusServiceTest {
19+
Context context;
20+
StatusListener statusListener;
21+
BlockingQueue<StatusEvent> queue;
22+
StatusService statusService;
23+
class StatusListener implements Contextual {
24+
int progress;
25+
int maximum;
26+
String status;
27+
boolean warning;
28+
@Parameter
29+
StatusService statusService;
30+
31+
@Override
32+
public Context getContext() {
33+
return context;
34+
}
35+
36+
@Override
37+
public void setContext(Context context) {
38+
context.inject(this);
39+
}
40+
@EventHandler
41+
void eventHandler(StatusEvent e) {
42+
try {
43+
queue.put(new StatusEvent(
44+
e.getProgressValue(),
45+
e.getProgressMaximum(),
46+
e.getStatusMessage(),
47+
e.isWarning()));
48+
} catch (InterruptedException e1) {
49+
e1.printStackTrace();
50+
fail();
51+
}
52+
}
53+
}
54+
55+
@Before
56+
public void setUp() throws Exception {
57+
context = new Context();
58+
queue = new ArrayBlockingQueue<StatusEvent>(10);
59+
statusListener = new StatusListener();
60+
statusListener.setContext(context);
61+
statusService = statusListener.statusService;
62+
}
63+
64+
@Test
65+
public void testShowProgress() {
66+
statusService.showProgress(15, 45);
67+
try {
68+
final StatusEvent event = queue.poll(10, TimeUnit.SECONDS);
69+
assertEquals(event.getProgressValue(), 15);
70+
assertEquals(event.getProgressMaximum(), 45);
71+
assertFalse(event.isWarning());
72+
} catch (InterruptedException e) {
73+
e.printStackTrace();
74+
fail();
75+
}
76+
}
77+
78+
@Test
79+
public void testShowStatusString() {
80+
final String text = "Hello, world";
81+
statusService.showStatus(text);
82+
try {
83+
final StatusEvent event = queue.poll(10, TimeUnit.SECONDS);
84+
assertEquals(event.getStatusMessage(), text);
85+
assertFalse(event.isWarning());
86+
} catch (InterruptedException e) {
87+
e.printStackTrace();
88+
fail();
89+
}
90+
}
91+
92+
@Test
93+
public void testShowStatusIntIntString() {
94+
final String text = "Working...";
95+
statusService.showStatus(25, 55, text);
96+
try {
97+
final StatusEvent event = queue.poll(10, TimeUnit.SECONDS);
98+
assertEquals(event.getProgressValue(), 25);
99+
assertEquals(event.getProgressMaximum(), 55);
100+
assertEquals(event.getStatusMessage(), text);
101+
assertFalse(event.isWarning());
102+
} catch (InterruptedException e) {
103+
e.printStackTrace();
104+
fail();
105+
}
106+
}
107+
108+
@Test
109+
public void testWarn() {
110+
final String text = "Totally hosed";
111+
statusService.warn(text);
112+
try {
113+
final StatusEvent event = queue.poll(10, TimeUnit.SECONDS);
114+
assertEquals(event.getStatusMessage(), text);
115+
assertTrue(event.isWarning());
116+
} catch (InterruptedException e) {
117+
e.printStackTrace();
118+
fail();
119+
}
120+
}
121+
122+
@Test
123+
public void testShowStatusIntIntStringBoolean() {
124+
final String text = "Working and hosed...";
125+
statusService.showStatus(33, 44, text, true);
126+
try {
127+
final StatusEvent event = queue.poll(10, TimeUnit.SECONDS);
128+
assertEquals(event.getStatusMessage(), text);
129+
assertEquals(event.getProgressValue(), 33);
130+
assertEquals(event.getProgressMaximum(), 44);
131+
assertTrue(event.isWarning());
132+
} catch (InterruptedException e) {
133+
e.printStackTrace();
134+
fail();
135+
}
136+
}
137+
138+
@Test
139+
public void testClearStatus() {
140+
statusService.clearStatus();
141+
try {
142+
final StatusEvent event = queue.poll(10, TimeUnit.SECONDS);
143+
assertEquals(event.getStatusMessage(), "");
144+
assertFalse(event.isWarning());
145+
} catch (InterruptedException e) {
146+
e.printStackTrace();
147+
fail();
148+
}
149+
}
150+
151+
}

0 commit comments

Comments
 (0)