Skip to content

Commit 6470e08

Browse files
committed
PrefService: Provide an API for Iterables
The most generic way to provide a bunch of Strings to persist is by passing an Iterable<String> for writing and handling an Iterable<String> when reading. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent b321573 commit 6470e08

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

src/main/java/org/scijava/prefs/DefaultPrefService.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,28 @@ public List<String> getList(final Class<?> prefClass) {
378378
return getList(preferences);
379379
}
380380

381+
@Override
382+
public Iterable<String> getIterable(final String key) {
383+
return getIterable((Class<?>) null, key);
384+
}
385+
386+
@Override
387+
public Iterable<String> getIterable(final Class<?> prefClass, final String key) {
388+
final Preferences preferences = prefs(prefClass);
389+
return getIterable(preferences.node(key));
390+
}
391+
392+
@Override
393+
public void putIterable(final Iterable<String> iterable, final String key) {
394+
putIterable((Class<?>) null, iterable, key);
395+
}
396+
397+
@Override
398+
public void putIterable(final Class<?> prefClass, final Iterable<String> iterable, final String key) {
399+
final Preferences preferences = prefs(prefClass);
400+
putIterable(preferences.node(key), iterable);
401+
}
402+
381403
// -- Helper methods --
382404

383405
private void clear(final Preferences preferences, final String key) {
@@ -460,6 +482,60 @@ private List<String> getList(final Preferences preferences) {
460482
return list;
461483
}
462484

485+
private void putIterable(final Preferences preferences,
486+
final Iterable<String> iterable)
487+
{
488+
if (preferences == null) {
489+
throw new IllegalArgumentException("Preferences not set.");
490+
}
491+
int index = 0;
492+
for (final String value : iterable) {
493+
preferences.put("" + index++, value == null ? null : value.toString());
494+
}
495+
}
496+
497+
private Iterable<String> getIterable(final Preferences preferences)
498+
{
499+
if (preferences == null) {
500+
throw new IllegalArgumentException("Preferences not set.");
501+
}
502+
return new Iterable<String>() {
503+
@Override
504+
public Iterator<String> iterator() {
505+
return new Iterator<String>() {
506+
private String value;
507+
private int index;
508+
{
509+
findNext();
510+
}
511+
512+
@Override
513+
public String next() {
514+
final String result = value;
515+
findNext();
516+
return result;
517+
}
518+
519+
@Override
520+
public boolean hasNext() {
521+
return value != null;
522+
}
523+
524+
@Override
525+
public void remove() {
526+
throw new UnsupportedOperationException();
527+
}
528+
529+
private void findNext() {
530+
if (index < 0) return;
531+
value = preferences.get("" + index, null);
532+
index = value == null ? -1 : index + 1;
533+
}
534+
};
535+
}
536+
};
537+
}
538+
463539
private Preferences prefs(final Class<?> c) {
464540
return Preferences.userNodeForPackage(c == null ? PrefService.class : c);
465541
}

src/main/java/org/scijava/prefs/PrefService.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,24 @@ public interface PrefService extends SciJavaService {
194194
* prefs.
195195
*/
196196
List<String> getList(Class<?> prefClass);
197+
198+
/**
199+
* Puts an iterable into the preferences.
200+
*/
201+
void putIterable(Iterable<String> iterable, String key);
202+
203+
/**
204+
* Puts an iterable into the preferences.
205+
*/
206+
void putIterable(Class<?> prefClass, Iterable<String> iterable, String key);
207+
208+
/**
209+
* Gets an iterable from the preferences.
210+
*/
211+
Iterable<String> getIterable(String key);
212+
213+
/**
214+
* Gets an iterable from the preferences.
215+
*/
216+
Iterable<String> getIterable(Class<?> prefClass, String key);
197217
}

0 commit comments

Comments
 (0)