diff --git a/pom.xml b/pom.xml
index 9868b80ee..35e36da1e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
scijava-common
- 2.41.1-SNAPSHOT
+ 3.0.0-SNAPSHOTSciJava CommonSciJava 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 both ImageJ and SCIFIO.
diff --git a/src/main/java/org/scijava/object/LazyObjects.java b/src/main/java/org/scijava/object/LazyObjects.java
index 975efa89b..bd2e2b2d5 100644
--- a/src/main/java/org/scijava/object/LazyObjects.java
+++ b/src/main/java/org/scijava/object/LazyObjects.java
@@ -45,4 +45,11 @@ public interface LazyObjects {
/** Gets the collection of objects. */
Collection get();
+ /**
+ * The type of the objects which will be resolved from a call to
+ * {@link #get()}. This information is used to determine whether to resolve
+ * the objects in response to an {@link ObjectIndex#get(Class)} call.
+ */
+ Class> getType();
+
}
diff --git a/src/main/java/org/scijava/object/ObjectIndex.java b/src/main/java/org/scijava/object/ObjectIndex.java
index 1baee99ff..2d18b682e 100644
--- a/src/main/java/org/scijava/object/ObjectIndex.java
+++ b/src/main/java/org/scijava/object/ObjectIndex.java
@@ -129,7 +129,7 @@ public List getAll() {
*/
public List get(final Class> type) {
// lazily register any pending objects
- if (!pending.isEmpty()) resolvePending();
+ if (!pending.isEmpty()) resolvePending(type);
List list = retrieveList(type);
// NB: Return a copy of the data, to facilitate thread safety.
@@ -380,15 +380,32 @@ protected List retrieveList(final Class> type) {
return list;
}
- private void resolvePending() {
+ private void resolvePending(final Class> type) {
synchronized (pending) {
- while (!pending.isEmpty()) {
- final LazyObjects extends E> c = pending.remove(0);
+ for (int p = pending.size() - 1; p >= 0; p--) {
+ final LazyObjects extends E> c = pending.get(p);
+
+ // NB: If this pending callback returns objects of a different
+ // type than the one we are interested in, it can be skipped.
+ if (!isCompatibleType(c, type)) continue;
+
+ // trigger the callback and add the results
+ pending.remove(p);
addAll(c.get());
}
}
}
+ // -- Helper methods --
+
+ private boolean isCompatibleType(final LazyObjects extends E> c,
+ final Class> type)
+ {
+ if (type == All.class) return true;
+ final Class> cType = c.getType();
+ return cType.isAssignableFrom(type) || type.isAssignableFrom(cType);
+ }
+
// -- Helper classes --
private static class All {
diff --git a/src/main/java/org/scijava/platform/DefaultPlatformService.java b/src/main/java/org/scijava/platform/DefaultPlatformService.java
index d399caad3..19887566d 100644
--- a/src/main/java/org/scijava/platform/DefaultPlatformService.java
+++ b/src/main/java/org/scijava/platform/DefaultPlatformService.java
@@ -134,7 +134,7 @@ public boolean registerAppMenus(final Object menus) {
}
@Override
- public List extends Platform> filterInstances(final List list) {
+ public List filterInstances(final List list) {
final Iterator iter = list.iterator();
while (iter.hasNext()) {
if (!iter.next().isTarget()) {
diff --git a/src/main/java/org/scijava/plugin/AbstractSingletonService.java b/src/main/java/org/scijava/plugin/AbstractSingletonService.java
index 83852fa8a..88b5262e2 100644
--- a/src/main/java/org/scijava/plugin/AbstractSingletonService.java
+++ b/src/main/java/org/scijava/plugin/AbstractSingletonService.java
@@ -31,7 +31,6 @@
package org.scijava.plugin;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -58,10 +57,7 @@ public abstract class AbstractSingletonService
private ObjectService objectService;
// TODO: Listen for PluginsAddedEvent and PluginsRemovedEvent
- // and update the list of singletons accordingly.
-
- /** List of singleton plugin instances. */
- private List instances;
+ // and update the map of singletons accordingly.
private Map, PT> instanceMap;
@@ -69,8 +65,8 @@ public abstract class AbstractSingletonService
@Override
public List getInstances() {
- if (instances == null) initInstances();
- return instances;
+ final List plugins = objectService.getObjects(getPluginType());
+ return Collections.unmodifiableList(plugins);
}
@SuppressWarnings("unchecked")
@@ -85,12 +81,18 @@ public
P getInstance(final Class
pluginClass) {
@Override
public void initialize() {
// add singleton instances to the object index... IN THE FUTURE!
- objectService.getIndex().addLater(new LazyObjects