Skip to content

Commit ae6196a

Browse files
committed
DefaultSearchOperation: report errors via results
If an exception happens while searching, report that as a single result called "<error>" with the stack trace as its sole property. Hopefully this sheds some light on those mysterious empty results.
1 parent 243aa3a commit ae6196a

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

src/main/java/org/scijava/search/DefaultSearchOperation.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@
3232
import java.util.ArrayList;
3333
import java.util.Collections;
3434
import java.util.List;
35+
import java.util.Map;
3536
import java.util.Optional;
37+
import java.util.regex.PatternSyntaxException;
3638

3739
import org.scijava.Context;
3840
import org.scijava.log.LogService;
3941
import org.scijava.plugin.Parameter;
4042
import org.scijava.plugin.PluginService;
4143
import org.scijava.thread.ThreadService;
44+
import org.scijava.util.DebugUtils;
4245

4346
/**
4447
* Default implementation of {@link SearchOperation}.
@@ -164,8 +167,46 @@ public void run() {
164167
final boolean supported = searcher.supports(query);
165168
final boolean enabled = searchService.enabled(searcher);
166169
if (!valid) return;
167-
final List<SearchResult> results = supported ? (enabled ? //
168-
searcher.search(query, fuzzy) : Collections.emptyList()) : null;
170+
List<SearchResult> results;
171+
try {
172+
if (!supported) results = null;
173+
else if (!enabled) results = Collections.emptyList();
174+
else results = searcher.search(query, fuzzy);
175+
}
176+
catch (final Throwable t) {
177+
// NB: Be defensive about errors.
178+
results = Collections.singletonList(new SearchResult() {
179+
180+
private final Map<String, String> props = //
181+
Collections.singletonMap(null, errorMessage());
182+
183+
@Override
184+
public String name() {
185+
return "<error>";
186+
}
187+
188+
@Override
189+
public String iconPath() {
190+
return null;
191+
}
192+
193+
@Override
194+
public Map<String, String> properties() {
195+
return props;
196+
}
197+
198+
private String errorMessage() {
199+
if (t instanceof PatternSyntaxException) {
200+
return pre(t.getMessage());
201+
}
202+
return pre(DebugUtils.getStackTrace(t));
203+
}
204+
205+
private String pre(final String s) {
206+
return "<pre style=\"font-size: 0.9em\">" + s + "</pre>";
207+
}
208+
});
209+
}
169210
if (!valid) return;
170211
for (final SearchListener l : listeners) {
171212
l.searchCompleted(new SearchEvent(searcher, results, exclusive));

0 commit comments

Comments
 (0)