Skip to content

Commit 6c2b116

Browse files
committed
ModuleService: getSingleIn/Output for classes
Add getSingleInput and getSingleOutput methods that can take a collection of classes to match. If there is a single unresolved input that matches any of these classes it will be identified. This enables generalized preprocessors that may want to handle multiple classes with similar logic (e.g. classes that can be easily converted).
1 parent 284e1be commit 6c2b116

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

src/main/java/org/scijava/module/DefaultModuleService.java

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333

3434
import java.util.Collection;
3535
import java.util.HashMap;
36+
import java.util.HashSet;
3637
import java.util.List;
3738
import java.util.Map;
39+
import java.util.Set;
3840
import java.util.concurrent.Callable;
3941
import java.util.concurrent.ExecutionException;
4042
import java.util.concurrent.Future;
@@ -252,14 +254,24 @@ public <M extends Module> M waitFor(final Future<M> future) {
252254
public <T> ModuleItem<T> getSingleInput(final Module module,
253255
final Class<T> type)
254256
{
255-
return getSingleItem(module, type, module.getInfo().inputs());
257+
return getTypedSingleItem(module, type, module.getInfo().inputs());
256258
}
257259

258260
@Override
259261
public <T> ModuleItem<T> getSingleOutput(final Module module,
260262
final Class<T> type)
261263
{
262-
return getSingleItem(module, type, module.getInfo().outputs());
264+
return getTypedSingleItem(module, type, module.getInfo().outputs());
265+
}
266+
267+
@Override
268+
public ModuleItem<?> getSingleInput(Module module, Collection<Class<?>> types) {
269+
return getSingleItem(module, types, module.getInfo().inputs());
270+
}
271+
272+
@Override
273+
public ModuleItem<?> getSingleOutput(Module module, Collection<Class<?>> types) {
274+
return getSingleItem(module, types, module.getInfo().outputs());
263275
}
264276

265277
@Override
@@ -431,20 +443,35 @@ private void assignInputs(final Module module,
431443
}
432444
}
433445

434-
private <T> ModuleItem<T> getSingleItem(final Module module,
446+
private <T> ModuleItem<T> getTypedSingleItem(final Module module,
435447
final Class<T> type, final Iterable<ModuleItem<?>> items)
436448
{
437-
ModuleItem<T> result = null;
449+
Set<Class<?>> types = new HashSet<Class<?>>();
450+
types.add(type);
451+
@SuppressWarnings("unchecked")
452+
ModuleItem<T> result = (ModuleItem<T>) getSingleItem(module, types, items);
453+
return result;
454+
}
455+
456+
private ModuleItem<?> getSingleItem(final Module module,
457+
final Collection<Class<?>> types, final Iterable<ModuleItem<?>> items)
458+
{
459+
ModuleItem<?> result = null;
460+
438461
for (final ModuleItem<?> item : items) {
439462
final String name = item.getName();
440463
final boolean resolved = module.isResolved(name);
441464
if (resolved) continue; // skip resolved inputs
442465
if (!item.isAutoFill()) continue; // skip unfillable inputs
443-
if (!type.isAssignableFrom(item.getType())) continue;
444-
if (result != null) return null; // multiple matching items
445-
@SuppressWarnings("unchecked")
446-
final ModuleItem<T> typedItem = (ModuleItem<T>) item;
447-
result = typedItem;
466+
final Class<?> itemType = item.getType();
467+
for (final Class<?> type : types) {
468+
if (type.isAssignableFrom(itemType)) {
469+
if (result != null) return null; // multiple matching module items
470+
result = item;
471+
// This module item matches, so no need to check more classes.
472+
break;
473+
}
474+
}
448475
}
449476
return result;
450477
}

src/main/java/org/scijava/module/ModuleService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,18 @@ <M extends Module> Future<M> run(M module,
274274
*/
275275
<T> ModuleItem<T> getSingleOutput(Module module, Class<T> type);
276276

277+
/**
278+
* As {@link #getSingleInput(Module, Class)} but will match with a set of
279+
* potential classes, at the cost of generic parameter safety.
280+
*/
281+
ModuleItem<?> getSingleInput(Module module, Collection<Class<?>> types);
282+
283+
/**
284+
* As {@link #getSingleOutput(Module, Class)} but will match with a set of
285+
* potential classes, at the cost of generic parameter safety.
286+
*/
287+
ModuleItem<?> getSingleOutput(Module module, Collection<Class<?>> types);
288+
277289
/**
278290
* Registers the given value for the given {@link ModuleItem} using the
279291
* {@link PrefService}.

0 commit comments

Comments
 (0)