Skip to content

Commit 992f0b8

Browse files
committed
ModuleService: add save/load item methods
Added API to save/load ModuleItems. This will allow Contextual classes to move away from ModuleItem#loadValue and ModuleItem#saveValue, which are not Contextual and go directly through the Prefs utility class. Adds a default implementation in DefaultModuleService, using the PrefService if able (which requires an AbstractModuleItem). If necessary, still falls back to ModuleItem's saveValue and loadValue methods.
1 parent 4ef6f00 commit 992f0b8

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.scijava.plugin.Parameter;
5555
import org.scijava.plugin.Plugin;
5656
import org.scijava.plugin.PluginService;
57+
import org.scijava.preferences.PrefService;
5758
import org.scijava.service.AbstractService;
5859
import org.scijava.service.Service;
5960
import org.scijava.thread.ThreadService;
@@ -87,6 +88,9 @@ public class DefaultModuleService extends AbstractService implements
8788
@Parameter
8889
private ThreadService threadService;
8990

91+
@Parameter
92+
private PrefService prefService;
93+
9094
/** Index of registered modules. */
9195
private ModuleIndex moduleIndex;
9296

@@ -255,6 +259,54 @@ public <T> ModuleItem<T> getSingleOutput(final Module module,
255259
return getSingleItem(module, type, module.getInfo().outputs());
256260
}
257261

262+
@Override
263+
public <T> void save(final ModuleItem<T> item, final T value) {
264+
if (!item.isPersisted()) return;
265+
266+
final String sValue = value == null ? "" : value.toString();
267+
268+
// do not persist if object cannot be converted back from a string
269+
if (!ConversionUtils.canConvert(sValue, item.getType())) return;
270+
271+
final String persistKey = item.getPersistKey();
272+
if (persistKey == null || persistKey.isEmpty()) {
273+
// Attempt to use prefService
274+
if (AbstractModuleItem.class.isAssignableFrom(item.getClass())) {
275+
final Class<?> prefClass = ((AbstractModuleItem<T>)item).getDelegateClass();
276+
final String prefKey = item.getName();
277+
prefService.put(prefClass, prefKey, sValue);
278+
}
279+
// Have to use ModuleItem#saveValue
280+
else item.saveValue(value);
281+
}
282+
else prefService.put(persistKey, sValue);
283+
}
284+
285+
@Override
286+
public <T> T load(final ModuleItem<T> item) {
287+
// if there is nothing to load from persistence return nothing
288+
if (!item.isPersisted()) return null;
289+
290+
final String sValue;
291+
final String persistKey = item.getPersistKey();
292+
if (persistKey == null || persistKey.isEmpty()) {
293+
// Attempt to use prefService
294+
if (AbstractModuleItem.class.isAssignableFrom(item.getClass())) {
295+
final Class<?> prefClass = ((AbstractModuleItem<T>)item).getDelegateClass();
296+
final String prefKey = item.getName();
297+
sValue = prefService.get(prefClass, prefKey);
298+
}
299+
// Have to use ModuleItem#loadValue
300+
else return item.loadValue();
301+
}
302+
else sValue = prefService.get(persistKey);
303+
304+
// if persisted value has never been set before return null
305+
if (sValue == null) return null;
306+
307+
return ConversionUtils.convert(sValue, item.getType());
308+
}
309+
258310
// -- Service methods --
259311

260312
@Override
@@ -383,5 +435,4 @@ private <T> ModuleItem<T> getSingleItem(final Module module,
383435
}
384436
return result;
385437
}
386-
387438
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.scijava.module.process.ModulePreprocessor;
4343
import org.scijava.module.process.PostprocessorPlugin;
4444
import org.scijava.module.process.PreprocessorPlugin;
45+
import org.scijava.preferences.PrefService;
4546
import org.scijava.service.SciJavaService;
4647

4748
/**
@@ -273,4 +274,15 @@ <M extends Module> Future<M> run(M module,
273274
*/
274275
<T> ModuleItem<T> getSingleOutput(Module module, Class<T> type);
275276

277+
/**
278+
* Registers the given value for the given {@link ModuleItem} using the
279+
* {@link PrefService}.
280+
*/
281+
<T> void save(ModuleItem<T> item, T value);
282+
283+
/**
284+
* Returns the value, if any, stored in the {@link PrefService} for the given
285+
* {@link ModuleItem}.
286+
*/
287+
<T> T load(ModuleItem<T> item);
276288
}

0 commit comments

Comments
 (0)