◐ Shell
reader mode source ↗
Skip to content
Open
Show file tree
Changes from all commits
File filter
Conversations
Jump to
Diff view
Apply and reload
Show whitespace
Diff view
Apply and reload
27 changes: 12 additions & 15 deletions src/main/java/org/scijava/module/DefaultModuleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -260,27 +260,23 @@ public <M extends Module> M waitFor(final Future<M> future) {
}

@Override
public <T> ModuleItem<T> getSingleInput(final Module module,
final Class<T> type)
{
return getTypedSingleItem(module, type, module.getInfo().inputs());
}

@Override
public <T> ModuleItem<T> getSingleOutput(final Module module,
final Class<T> type)
{
return getTypedSingleItem(module, type, module.getInfo().outputs());
}

@Override
public ModuleItem<?> getSingleInput(Module module, Collection<Class<?>> types) {
return getSingleItem(module, types, module.getInfo().inputs());
}

@Override
public ModuleItem<?> getSingleOutput(Module module, Collection<Class<?>> types) {
return getSingleItem(module, types, module.getInfo().outputs());
}

@Override
Expand Down Expand Up @@ -478,24 +474,25 @@ private void assignInputs(final Module module,
}

private <T> ModuleItem<T> getTypedSingleItem(final Module module,
final Class<T> type, final Iterable<ModuleItem<?>> items)
{
Set<Class<?>> types = new HashSet<>();
types.add(type);
@SuppressWarnings("unchecked")
ModuleItem<T> result = (ModuleItem<T>) getSingleItem(module, types, items);
return result;
}

private ModuleItem<?> getSingleItem(final Module module,
final Collection<Class<?>> types, final Iterable<ModuleItem<?>> items)
{
ModuleItem<?> result = null;

for (final ModuleItem<?> item : items) {
final String name = item.getName();
if (!item.isAutoFill()) continue; // skip unfillable inputs
if (module.isInputResolved(name)) continue; // skip resolved inputs
final Class<?> itemType = item.getType();
for (final Class<?> type : types) {
if (type.isAssignableFrom(itemType)) {
Expand Down
48 changes: 44 additions & 4 deletions src/main/java/org/scijava/module/ModuleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -272,26 +272,66 @@ <M extends Module> Future<M> run(M module,
* given type, returning the relevant {@link ModuleItem} if found, or null if
* not exactly one unresolved fillable input of that type.
*/
<T> ModuleItem<T> getSingleInput(Module module, Class<T> type);

/**
* Checks the given module for a solitary unresolved output of the given type,
* returning the relevant {@link ModuleItem} if found, or null if not exactly
* one unresolved output of that type.
*/
<T> ModuleItem<T> getSingleOutput(Module module, Class<T> type);

/**
* As {@link #getSingleInput(Module, Class)} but will match with a set of
* potential classes, at the cost of generic parameter safety.
*/
ModuleItem<?> getSingleInput(Module module, Collection<Class<?>> types);

/**
* As {@link #getSingleOutput(Module, Class)} but will match with a set of
* potential classes, at the cost of generic parameter safety.
*/
ModuleItem<?> getSingleOutput(Module module, Collection<Class<?>> types);

/**
* Registers the given value for the given {@link ModuleItem} using the
Expand Down
34 changes: 6 additions & 28 deletions src/main/java/org/scijava/ui/FileListPreprocessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

import org.scijava.module.Module;
import org.scijava.module.ModuleItem;
import org.scijava.module.process.AbstractPreprocessorPlugin;
import org.scijava.module.process.PreprocessorPlugin;
import org.scijava.plugin.Parameter;
Expand All @@ -44,10 +45,13 @@ public class FileListPreprocessor extends AbstractPreprocessorPlugin {
@Parameter(required = false)
private UIService uiService;

@Override
public void process(final Module module) {
if (uiService == null) return;
final ModuleItem<File[]> fileInput = getFilesInput(module);
if (fileInput == null) return;

final File[] files = fileInput.getValue(module);
Expand All @@ -65,30 +69,4 @@ public void process(final Module module) {
module.resolveInput(fileInput.getName());
}

// -- Helper methods --

/**
* Gets the single unresolved {@link File} input parameter. If there is not
* exactly one unresolved {@link File} input parameter, or if there are other
* types of unresolved parameters, this method returns null.
*/
private ModuleItem<File[]> getFilesInput(final Module module) {
ModuleItem<File[]> result = null;
for (final ModuleItem<?> input : module.getInfo().inputs()) {
if (module.isInputResolved(input.getName())) continue;
final Class<?> type = input.getType();
if (!File[].class.isAssignableFrom(type)) {
// not a File[] parameter; abort
return null;
}
if (result != null) {
// second File parameter; abort
return null;
}
@SuppressWarnings("unchecked")
final ModuleItem<File[]> fileInput = (ModuleItem<File[]>) input;
result = fileInput;
}
return result;
}
}
109 changes: 109 additions & 0 deletions src/test/java/org/scijava/ui/FileListPreprocessorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
Loading
Toggle all file notes Toggle all file annotations