Skip to content

Commit acec388

Browse files
authored
Merge pull request #51 from scijava/scijava/scijava-discovery/simplification
Improve Discovery Framework for use in Ops API
2 parents c893de5 + 0dca4e4 commit acec388

87 files changed

Lines changed: 1307 additions & 1310 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

scijava/scijava-discovery-plugin/src/main/java/module-info.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55

66
requires org.scijava.discovery;
77
requires transitive org.scijava;
8+
9+
provides org.scijava.discovery.Discoverer with org.scijava.discovery.plugin.PluginBasedDiscoverer;
810
}

scijava/scijava-discovery-plugin/src/main/java/org/scijava/discovery/plugin/PluginBasedDiscoverer.java

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,18 @@
77

88
import org.scijava.InstantiableException;
99
import org.scijava.discovery.Discoverer;
10-
import org.scijava.discovery.Discovery;
1110
import org.scijava.plugin.Plugin;
11+
import org.scijava.plugin.PluginIndex;
1212
import org.scijava.plugin.PluginInfo;
13-
import org.scijava.plugin.PluginService;
1413
import org.scijava.plugin.SciJavaPlugin;
1514

1615
public class PluginBasedDiscoverer implements Discoverer {
1716

18-
private final PluginService p;
17+
private final PluginIndex index;
1918

20-
public PluginBasedDiscoverer(PluginService p) {
21-
this.p = p;
22-
}
23-
24-
@Override
25-
@SuppressWarnings("unchecked")
26-
public <T> List<Discovery<Class<T>>> discoveriesOfType(Class<T> c) {
27-
if (!SciJavaPlugin.class.isAssignableFrom(c)) {
28-
return Collections.emptyList();
29-
}
30-
List<PluginInfo<SciJavaPlugin>> infos = p.getPluginsOfType(
31-
(Class<SciJavaPlugin>) c);
32-
return infos.stream() //
33-
.map(info -> makeDiscoveryOrNull(c, info)) //
34-
.filter(Objects::nonNull).collect(Collectors.toList());
35-
}
36-
37-
@SuppressWarnings("unchecked")
38-
private <T> Discovery<Class<T>> makeDiscoveryOrNull(@SuppressWarnings("unused") Class<T> type,
39-
PluginInfo<SciJavaPlugin> instance)
40-
{
41-
try {
42-
Class<T> c = (Class<T>) instance.loadClass();
43-
String tag = getTag(instance.getAnnotation());
44-
return new Discovery<>(c, tag);
45-
}
46-
catch (InstantiableException exc) {
47-
return null;
48-
}
19+
public PluginBasedDiscoverer() {
20+
this.index = new PluginIndex();
21+
this.index.discover();
4922
}
5023

5124
private String getTag(Plugin annotation) {
@@ -54,4 +27,21 @@ private String getTag(Plugin annotation) {
5427
return String.join(" ", tagType, priority);
5528
}
5629

57-
}
30+
@Override
31+
public <T> List<T> discover(Class<T> c) {
32+
if (!SciJavaPlugin.class.isAssignableFrom(c))
33+
return Collections.emptyList();
34+
return discoverFrom((Class<? extends SciJavaPlugin>) c).stream().map(o -> (T) o).collect(Collectors.toList());
35+
}
36+
37+
private <PT extends SciJavaPlugin> List<PT> discoverFrom(Class<PT> c) {
38+
List<PluginInfo<PT>> infos = index.getPlugins(c);
39+
return infos.parallelStream().map(info -> {
40+
try {
41+
return info.createInstance();
42+
} catch (InstantiableException e) {
43+
return null;
44+
}
45+
}).filter(Objects::nonNull).collect(Collectors.toList());
46+
}
47+
}

scijava/scijava-discovery-plugin/src/test/java/org/scijava/discovery/plugin/PluginDiscovererTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ public static void tearDown() throws Exception {
3030

3131
@Test
3232
public void testPluginDiscovery() {
33-
Discoverer d = new PluginBasedDiscoverer(plugins);
34-
List<Class<TestPlugin>> implsOfType = d.implsOfType(TestPlugin.class);
35-
Assert.assertTrue(implsOfType.contains(TestPluginImpl.class));
33+
Discoverer d = new PluginBasedDiscoverer();
34+
List<TestPlugin> discoveries = d.discover(TestPlugin.class);
35+
Assert.assertTrue(discoveries.stream().anyMatch(o -> o.getClass() == TestPluginImpl.class));
3636
}
3737

3838
}

scijava/scijava-discovery-test/src/test/java/org/scijava/discovery/test/ServiceLoaderDiscovererTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import java.util.List;
55
import java.util.ServiceLoader;
6+
import java.util.stream.Collectors;
67

78
import org.junit.Assert;
89
import org.junit.Test;
@@ -21,7 +22,8 @@ public void testServiceLoaderWithBoth() {
2122

2223
@SafeVarargs
2324
private static <T> void assertDiscoveryRequirements(Discoverer d, Class<T> discovery, Class<? extends T>... impls) {
24-
List<Class<T>> implementingClasses = d.implsOfType(discovery);
25+
List<Class<T>> implementingClasses = d.discover(discovery).stream().map(o -> (Class<T>) o.getClass()).collect(
26+
Collectors.toList());
2527
for(Class<? extends T> cls : impls)
2628
Assert.assertTrue(implementingClasses.contains(cls));
2729

scijava/scijava-discovery/src/main/java/org/scijava/discovery/Discovery.java renamed to scijava/scijava-discovery-therapi/src/main/java/org/scijava/discovery/therapi/TaggedElement.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

2-
package org.scijava.discovery;
2+
package org.scijava.discovery.therapi;
33

4+
import org.scijava.discovery.Discoverer;
5+
6+
import java.lang.reflect.AnnotatedElement;
47
import java.lang.reflect.Type;
58
import java.util.Collections;
69
import java.util.Map;
@@ -11,34 +14,33 @@
1114
* differentiating metadata.
1215
*
1316
* @author Gabriel Selzer
14-
* @param <T> the generic {@link Type} of this discovery.
1517
*/
16-
public class Discovery<T> {
18+
public class TaggedElement {
1719

18-
private final T discovery;
20+
private final AnnotatedElement discovery;
1921

2022
private final String tagType;
2123

2224
private final Supplier<Map<String, ?>> optionGenerator;
2325

2426
private Map<String, ?> tagOptions = null;
2527

26-
public Discovery(T discovery, String tagType) {
28+
public TaggedElement(AnnotatedElement discovery, String tagType) {
2729
this(discovery, tagType, () -> Collections.emptyMap());
2830
}
2931

30-
public Discovery(T discovery, String tagType, Map<String, ?> tagOptions) {
32+
public TaggedElement(AnnotatedElement discovery, String tagType, Map<String, ?> tagOptions) {
3133
this(discovery, tagType, () -> tagOptions);
3234
this.tagOptions = tagOptions;
3335
}
3436

35-
public Discovery(T discovery, String tagType, Supplier<Map<String, ?>> optionGenerator) {
37+
public TaggedElement(AnnotatedElement discovery, String tagType, Supplier<Map<String, ?>> optionGenerator) {
3638
this.discovery = discovery;
3739
this.tagType = tagType;
3840
this.optionGenerator = optionGenerator;
3941
}
4042

41-
public T discovery() {
43+
public AnnotatedElement discovery() {
4244
return discovery;
4345
}
4446

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.scijava.discovery.therapi;
2+
3+
import org.scijava.parse2.Parser;
4+
5+
import java.util.Optional;
6+
import java.util.ServiceLoader;
7+
8+
public class TaggedElementDiscoverer extends TherapiDiscoverer {
9+
10+
private final String tagType;
11+
12+
public TaggedElementDiscoverer(String tagType) {
13+
super(ServiceLoader.load(Parser.class).findFirst().get());
14+
this.tagType = tagType;
15+
}
16+
17+
@Override public boolean canDiscover(Class<?> cls) {
18+
return cls == TaggedElement.class;
19+
}
20+
21+
@Override public String tagType() {
22+
return tagType;
23+
}
24+
25+
@Override protected <U> Optional<U> convert(TaggedElement e, Class<U> c) {
26+
return (Optional<U>) Optional.of(e);
27+
}
28+
}

0 commit comments

Comments
 (0)