|
33 | 33 |
|
34 | 34 | import java.util.Collection; |
35 | 35 | import java.util.HashMap; |
| 36 | +import java.util.HashSet; |
36 | 37 | import java.util.List; |
37 | 38 | import java.util.Map; |
| 39 | +import java.util.Set; |
38 | 40 | import java.util.concurrent.Callable; |
39 | 41 | import java.util.concurrent.ExecutionException; |
40 | 42 | import java.util.concurrent.Future; |
@@ -252,14 +254,24 @@ public <M extends Module> M waitFor(final Future<M> future) { |
252 | 254 | public <T> ModuleItem<T> getSingleInput(final Module module, |
253 | 255 | final Class<T> type) |
254 | 256 | { |
255 | | - return getSingleItem(module, type, module.getInfo().inputs()); |
| 257 | + return getTypedSingleItem(module, type, module.getInfo().inputs()); |
256 | 258 | } |
257 | 259 |
|
258 | 260 | @Override |
259 | 261 | public <T> ModuleItem<T> getSingleOutput(final Module module, |
260 | 262 | final Class<T> type) |
261 | 263 | { |
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()); |
263 | 275 | } |
264 | 276 |
|
265 | 277 | @Override |
@@ -431,20 +443,35 @@ private void assignInputs(final Module module, |
431 | 443 | } |
432 | 444 | } |
433 | 445 |
|
434 | | - private <T> ModuleItem<T> getSingleItem(final Module module, |
| 446 | + private <T> ModuleItem<T> getTypedSingleItem(final Module module, |
435 | 447 | final Class<T> type, final Iterable<ModuleItem<?>> items) |
436 | 448 | { |
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 | + |
438 | 461 | for (final ModuleItem<?> item : items) { |
439 | 462 | final String name = item.getName(); |
440 | 463 | final boolean resolved = module.isResolved(name); |
441 | 464 | if (resolved) continue; // skip resolved inputs |
442 | 465 | 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 | + } |
448 | 475 | } |
449 | 476 | return result; |
450 | 477 | } |
|
0 commit comments