Skip to content

Commit 27618a8

Browse files
gselzerctrueden
authored andcommitted
Refactor discovery to add in tags
1 parent d1192fc commit 27618a8

9 files changed

Lines changed: 217 additions & 102 deletions

File tree

scijava/scijava-discovery/src/main/java/org/scijava/discovery/Discoverer.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,52 @@
22
package org.scijava.discovery;
33

44
import java.lang.reflect.AnnotatedElement;
5+
import java.lang.reflect.Type;
56
import java.util.Collections;
67
import java.util.List;
8+
import java.util.stream.Collectors;
79

10+
/**
11+
* Discovers {@link Discovery}s
12+
*
13+
* @author Gabriel Selzer
14+
*/
815
public interface Discoverer {
916

17+
/**
18+
* Discovers implementations of some {@link Class} {@code c}.
19+
*
20+
* @param <T> the {@link Type} of the {@link Class} being searched for
21+
* @param c the {@link Class} being searched for
22+
* @return a {@link List} of implementations of {@code c}, each wrapped up
23+
* into a {@link Discovery}
24+
*/
1025
@SuppressWarnings("unused")
11-
default <T> List<Class<T>> implsOfType(Class<T> c) {
26+
default <T> List<Discovery<Class<T>>> discoveriesOfType(Class<T> c) {
1227
return Collections.emptyList();
1328
}
1429

30+
/**
31+
* Discovers implementations of some {@link Class} {@code c}.
32+
*
33+
* @param <T> the {@link Type} of the {@link Class} being searched for
34+
* @param c the {@link Class} being searched for
35+
* @return a {@link List} of implementations of {@code c}
36+
*/
37+
default <T> List<Class<T>> implsOfType(Class<T> c) {
38+
return discoveriesOfType(c).parallelStream() //
39+
.map(d -> d.discovery()) //
40+
.collect(Collectors.toList());
41+
}
42+
43+
/**
44+
* Discovers {@link AnnotatedElement}s tagged with the tag {@code tag}.
45+
* @param tag the tag type of interest
46+
* @return a {@link List} of {@link AnnotatedElement}s
47+
*/
48+
1549
@SuppressWarnings("unused")
16-
default List<AnnotatedElement> elementsTaggedWith(String... tags) {
50+
default List<Discovery<AnnotatedElement>> elementsTaggedWith(String tag) {
1751
return Collections.emptyList();
1852
}
1953

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
package org.scijava.discovery;
3+
4+
import java.lang.reflect.Type;
5+
6+
/**
7+
* A container for {@link Object}s returned by a {@link Discoverer}, grouping
8+
* differentiating metadata.
9+
*
10+
* @author Gabriel Selzer
11+
* @param <T> the generic {@link Type} of this discovery.
12+
*/
13+
public class Discovery<T> {
14+
15+
private final T discovery;
16+
17+
private final String tag;
18+
19+
public Discovery(T discovery, String tag) {
20+
this.discovery = discovery;
21+
this.tag = tag;
22+
}
23+
24+
25+
public T discovery() {
26+
return discovery;
27+
}
28+
29+
public String tag() {
30+
return tag;
31+
}
32+
33+
}

scijava/scijava-discovery/src/main/java/org/scijava/discovery/Implementation.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

scijava/scijava-discovery/src/main/java/org/scijava/discovery/StaticDiscoverer.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,26 @@
88

99
public class StaticDiscoverer implements Discoverer {
1010

11-
Map<Class<?>, String> names;
11+
Map<Class<?>, String> tags;
1212

1313
public StaticDiscoverer() {
14-
names = new HashMap<>();
14+
tags = new HashMap<>();
1515
}
1616

17-
public void register(Class<?> c, String name) {
18-
names.put(c, name);
17+
public void register(Class<?> c, String tag) {
18+
tags.put(c, tag);
19+
}
20+
21+
public void register(Class<?> c, String tagType, String tagData) {
22+
tags.put(c, String.join(" ", tagType, tagData));
1923
}
2024

2125
@SuppressWarnings("unchecked")
2226
@Override
23-
public <T> List<Class<T>> implsOfType(Class<T> c) {
24-
return names.keySet().stream() //
27+
public <T> List<Discovery<Class<T>>> discoveriesOfType(Class<T> c) {
28+
return tags.keySet().stream() //
2529
.filter(cls -> cls.isAssignableFrom(c)) //
26-
.map(cls -> (Class<T>) cls) //
30+
.map(cls -> new Discovery<>((Class<T>) cls, tags.get(cls))) //
2731
.collect(Collectors.toList());
2832
}
2933

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/impl/DefaultOpService.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@
3131

3232
import java.util.Arrays;
3333
import java.util.List;
34+
import java.util.Objects;
3435
import java.util.stream.Collectors;
3536

3637
import org.scijava.Context;
3738
import org.scijava.InstantiableException;
3839
import org.scijava.discovery.Discoverer;
40+
import org.scijava.discovery.Discovery;
3941
import org.scijava.log.LogService;
4042
import org.scijava.ops.api.OpBuilder;
4143
import org.scijava.ops.api.OpEnvironment;
@@ -125,28 +127,36 @@ public PluginBasedDiscoverer(Context ctx) {
125127

126128
@Override
127129
@SuppressWarnings("unchecked")
128-
public <T> List<Class<T>> implsOfType(Class<T> c) {
130+
public <T> List<Discovery<Class<T>>> discoveriesOfType(Class<T> c) {
129131
if (!SciJavaPlugin.class.isAssignableFrom(c)) {
130132
throw new UnsupportedOperationException(
131133
"Current discovery mechanism tied to SciJava Context; only able to search for SciJavaPlugins");
132134
}
133135
List<PluginInfo<SciJavaPlugin>> infos = p.getPluginsOfType(
134136
(Class<SciJavaPlugin>) c);
135137
return infos.stream() //
136-
.map(info -> makeClassOrNull(c, info)) //
137-
.filter(cls -> cls != null).collect(Collectors.toList());
138+
.map(info -> makeDiscoveryOrNull(c, info)) //
139+
.filter(Objects::nonNull).collect(Collectors.toList());
138140
}
139141

140142
@SuppressWarnings("unchecked")
141-
private <T> Class<T> makeClassOrNull(@SuppressWarnings("unused") Class<T> type,
143+
private <T> Discovery<Class<T>> makeDiscoveryOrNull(@SuppressWarnings("unused") Class<T> type,
142144
PluginInfo<SciJavaPlugin> instance)
143145
{
144146
try {
145-
return (Class<T>) instance.loadClass();
147+
Class<T> c = (Class<T>) instance.loadClass();
148+
String tag = getTag(instance.getAnnotation());
149+
return new Discovery<>(c, tag);
146150
}
147151
catch (InstantiableException exc) {
148152
return null;
149153
}
150154
}
151155

156+
private String getTag(Plugin annotation) {
157+
String tagType = annotation.type().getTypeName().toLowerCase();
158+
String priority = "priority " + annotation.priority();
159+
return String.join(" ", tagType, priority);
160+
}
161+
152162
}

0 commit comments

Comments
 (0)