Skip to content

Commit 482c170

Browse files
committed
Migrate module input persistence to ModuleService
This makes the LoadInputsPreprocessor and SaveInputsPreprocessor much simpler, since they can now simply lean on the ModuleService directly. This also makes the DynamicCommand's internal saveInputs() method no longer need to instantiate and run a SaveInputsPreprocessor, but rather instead it can call that same service method in ModuleService.
1 parent 0e2ff6f commit 482c170

File tree

6 files changed

+51
-64
lines changed

6 files changed

+51
-64
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111

1212
<artifactId>scijava-common</artifactId>
13-
<version>2.78.1-SNAPSHOT</version>
13+
<version>2.79.0-SNAPSHOT</version>
1414

1515
<name>SciJava Common</name>
1616
<description>SciJava Common is a shared library for SciJava software. It provides a plugin framework, with an extensible mechanism for service discovery, backed by its own annotation processor, so that plugins can be loaded dynamically. It is used by downstream projects in the SciJava ecosystem, such as ImageJ and SCIFIO.</description>

src/main/java/org/scijava/command/DynamicCommand.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,8 @@
3939
import org.scijava.Contextual;
4040
import org.scijava.NullContextException;
4141
import org.scijava.module.DefaultMutableModule;
42-
import org.scijava.module.process.PreprocessorPlugin;
43-
import org.scijava.module.process.SaveInputsPreprocessor;
42+
import org.scijava.module.ModuleService;
4443
import org.scijava.plugin.Parameter;
45-
import org.scijava.plugin.PluginInfo;
4644
import org.scijava.plugin.PluginService;
4745
import org.scijava.util.ClassUtils;
4846

@@ -67,6 +65,9 @@ public abstract class DynamicCommand extends DefaultMutableModule implements
6765
@Parameter
6866
private PluginService pluginService;
6967

68+
@Parameter
69+
private ModuleService moduleService;
70+
7071
private DynamicCommandInfo info;
7172

7273
/** Reason for cancelation, or null if not canceled. */
@@ -160,12 +161,6 @@ public void uncancel() {
160161
* not complete the module execution lifecycle normally.
161162
*/
162163
protected void saveInputs() {
163-
// https://forum.image.sc/t/how-to-save-interactivecommand-parameter-values/26645/5
164-
final PluginInfo<PreprocessorPlugin> saveInputsPreprocessorInfo =
165-
pluginService.getPlugin(SaveInputsPreprocessor.class,
166-
PreprocessorPlugin.class);
167-
final PreprocessorPlugin saveInputsPreprocessor = //
168-
pluginService.createInstance(saveInputsPreprocessorInfo);
169-
saveInputsPreprocessor.process(this);
164+
moduleService.saveInputs(this);
170165
}
171166
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,16 @@ public <T> T getDefaultValue(final ModuleItem<T> item) {
339339
return null;
340340
}
341341

342+
@Override
343+
public void saveInputs(final Module module) {
344+
module.getInfo().inputs().forEach(item -> saveInput(module, item));
345+
}
346+
347+
@Override
348+
public void loadInputs(final Module module) {
349+
module.getInfo().inputs().forEach(item -> loadInput(module, item));
350+
}
351+
342352
// -- Service methods --
343353

344354
@Override
@@ -523,4 +533,32 @@ private String prefKey(final ModuleItem<?> item) {
523533
return persistKey == null || persistKey.isEmpty() ? //
524534
item.getName() : persistKey;
525535
}
536+
537+
/** Saves the value of the given module item to persistent storage. */
538+
private <T> void saveInput(final Module module, final ModuleItem<T> item) {
539+
final T value = item.getValue(module);
540+
save(item, value);
541+
}
542+
543+
/** Loads the value of the given module item from persistent storage. */
544+
private <T> void loadInput(final Module module, final ModuleItem<T> item) {
545+
// skip input that has already been resolved
546+
if (module.isInputResolved(item.getName())) return;
547+
548+
final T prefValue = load(item);
549+
final Class<T> type = item.getType();
550+
final T defaultValue = item.getValue(module);
551+
final T value = getBestValue(prefValue, defaultValue, type);
552+
item.setValue(module, value);
553+
}
554+
555+
private <T> T getBestValue(final Object prefValue,
556+
final Object defaultValue, final Class<T> type)
557+
{
558+
if (prefValue != null) return convertService.convert(prefValue, type);
559+
if (defaultValue != null) {
560+
return convertService.convert(defaultValue, type);
561+
}
562+
return Types.nullValue(type);
563+
}
526564
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,4 +311,9 @@ <M extends Module> Future<M> run(M module,
311311
/** Gets the default value of the given {@link ModuleItem}. */
312312
<T> T getDefaultValue(final ModuleItem<T> item);
313313

314+
/** Saves values to persistent storage from the given {@link Module}. */
315+
void saveInputs(final Module module);
316+
317+
/** Loads values from persistent storage into the given {@link Module}. */
318+
void loadInputs(final Module module);
314319
}

src/main/java/org/scijava/module/process/LoadInputsPreprocessor.java

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,10 @@
3232

3333
package org.scijava.module.process;
3434

35-
import org.scijava.convert.ConvertService;
3635
import org.scijava.module.Module;
37-
import org.scijava.module.ModuleItem;
3836
import org.scijava.module.ModuleService;
3937
import org.scijava.plugin.Parameter;
4038
import org.scijava.plugin.Plugin;
41-
import org.scijava.util.Types;
4239
import org.scijava.widget.InputHarvester;
4340

4441
/**
@@ -59,41 +56,8 @@ public class LoadInputsPreprocessor extends AbstractPreprocessorPlugin {
5956
@Parameter
6057
private ModuleService moduleService;
6158

62-
@Parameter
63-
private ConvertService conversionService;
64-
65-
// -- ModuleProcessor methods --
66-
6759
@Override
6860
public void process(final Module module) {
69-
final Iterable<ModuleItem<?>> inputs = module.getInfo().inputs();
70-
for (final ModuleItem<?> item : inputs) {
71-
loadValue(module, item);
72-
}
73-
}
74-
75-
// -- Helper methods --
76-
77-
/** Loads the value of the given module item from persistent storage. */
78-
private <T> void loadValue(final Module module, final ModuleItem<T> item) {
79-
// skip input that has already been resolved
80-
if (module.isInputResolved(item.getName())) return;
81-
82-
final T prefValue = moduleService.load(item);
83-
final Class<T> type = item.getType();
84-
final T defaultValue = item.getValue(module);
85-
final T value = getBestValue(prefValue, defaultValue, type);
86-
item.setValue(module, value);
61+
moduleService.loadInputs(module);
8762
}
88-
89-
private <T> T getBestValue(final Object prefValue,
90-
final Object defaultValue, final Class<T> type)
91-
{
92-
if (prefValue != null) return conversionService.convert(prefValue, type);
93-
if (defaultValue != null) {
94-
return conversionService.convert(defaultValue, type);
95-
}
96-
return Types.nullValue(type);
97-
}
98-
9963
}

src/main/java/org/scijava/module/process/SaveInputsPreprocessor.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434

3535
import org.scijava.Priority;
3636
import org.scijava.module.Module;
37-
import org.scijava.module.ModuleItem;
3837
import org.scijava.module.ModuleService;
3938
import org.scijava.plugin.Parameter;
4039
import org.scijava.plugin.Plugin;
@@ -59,22 +58,8 @@ public class SaveInputsPreprocessor extends AbstractPreprocessorPlugin {
5958
@Parameter
6059
private ModuleService moduleService;
6160

62-
// -- ModuleProcessor methods --
63-
6461
@Override
6562
public void process(final Module module) {
66-
final Iterable<ModuleItem<?>> inputs = module.getInfo().inputs();
67-
for (final ModuleItem<?> item : inputs) {
68-
saveValue(module, item);
69-
}
63+
moduleService.saveInputs(module);
7064
}
71-
72-
// -- Helper methods --
73-
74-
/** Saves the value of the given module item to persistent storage. */
75-
private <T> void saveValue(final Module module, final ModuleItem<T> item) {
76-
final T value = item.getValue(module);
77-
moduleService.save(item, value);
78-
}
79-
8065
}

0 commit comments

Comments
 (0)