Skip to content

Commit 140fdeb

Browse files
gselzerctrueden
authored andcommitted
Use ServiceLoader to load Ops/OpCollections
1 parent 52ca72f commit 140fdeb

13 files changed

Lines changed: 146 additions & 15 deletions

File tree

scijava/scijava-ops-engine/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@
136136
<artifactId>scijava-ops-discovery</artifactId>
137137
<version>${project.version}</version>
138138
</dependency>
139+
<dependency>
140+
<groupId>org.scijava</groupId>
141+
<artifactId>scijava-ops-serviceloader</artifactId>
142+
<version>${project.version}</version>
143+
</dependency>
139144
<dependency>
140145
<groupId>org.scijava</groupId>
141146
<artifactId>scijava-struct</artifactId>

scijava/scijava-ops-engine/src/main/java/module-info.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@
3838
requires org.scijava.struct;
3939
requires org.scijava.ops.api;
4040
requires org.scijava.ops.discovery;
41+
requires org.scijava.ops.serviceloader;
4142
requires org.scijava.ops.spi;
4243
requires org.scijava.types;
4344
requires javassist;
4445
requires java.compiler;
4546
requires therapi.runtime.javadoc;
4647

4748
uses javax.annotation.processing.Processor;
49+
provides org.scijava.ops.spi.OpCollection with org.scijava.ops.engine.copy.CopyOpCollection;
4850
}

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/copy/CopyOpCollection.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
import org.scijava.function.Computers;
55
import org.scijava.ops.spi.OpCollection;
66
import org.scijava.ops.spi.OpField;
7-
import org.scijava.plugin.Plugin;
87

9-
@Plugin(type = OpCollection.class)
10-
public class CopyOpCollection <T>{
8+
public class CopyOpCollection <T> implements OpCollection{
119

1210
@OpField(names = "cp, copy", priority = Priority.LOW, params = "array, arrayCopy")
1311
public static final Computers.Arity1<double[], double[]> copyPrimitiveDoubleArray = (from, to) -> {

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.scijava.ops.discovery.Discoverer;
4343
import org.scijava.ops.engine.OpHistoryService;
4444
import org.scijava.ops.engine.OpService;
45+
import org.scijava.ops.serviceloader.ServiceLoaderDiscoverer;
4546
import org.scijava.plugin.Plugin;
4647
import org.scijava.plugin.PluginInfo;
4748
import org.scijava.plugin.PluginService;
@@ -90,11 +91,12 @@ private synchronized void initEnv() {
9091
LogService log = context().getService(LogService.class);
9192
TypeService types = context().getService(TypeService.class);
9293
OpHistoryService history = context().getService(OpHistoryService.class);
93-
Discoverer d = new PluginBasedDiscoverer(context());
94+
Discoverer d1 = new PluginBasedDiscoverer(context());
95+
Discoverer d2 = new ServiceLoaderDiscoverer();
9496
List<OpInfoGenerator> infoGenerators = Arrays.asList(
95-
new ClassOpInfoGenerator(d),
96-
new OpCollectionInfoGenerator(d));
97-
env = new DefaultOpEnvironment(types, log, history, infoGenerators, d);
97+
new PluginBasedClassOpInfoGenerator(d1, d2),
98+
new OpCollectionInfoGenerator(d1, d2));
99+
env = new DefaultOpEnvironment(types, log, history, infoGenerators, d1, d2);
98100
}
99101
}
100102

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
package org.scijava.ops.engine.impl;
3+
4+
import java.util.Arrays;
5+
import java.util.List;
6+
import java.util.stream.Collectors;
7+
8+
import org.scijava.ops.api.OpInfo;
9+
import org.scijava.ops.api.OpInfoGenerator;
10+
import org.scijava.ops.api.OpUtils;
11+
import org.scijava.ops.discovery.Discoverer;
12+
import org.scijava.ops.engine.matcher.impl.OpClassInfo;
13+
import org.scijava.ops.spi.Op;
14+
import org.scijava.ops.spi.OpClass;
15+
import org.scijava.plugin.Plugin;
16+
17+
public class OpClassBasedClassOpInfoGenerator implements OpInfoGenerator {
18+
19+
private final List<Discoverer> discoverers;
20+
21+
public OpClassBasedClassOpInfoGenerator(Discoverer... d) {
22+
this.discoverers = Arrays.asList(d);
23+
}
24+
25+
@Override
26+
public List<OpInfo> generateInfos() {
27+
List<OpInfo> infos = discoverers.stream() //
28+
.flatMap(d -> d.implementingClasses(Op.class).stream()) //
29+
.filter(cls -> cls.getAnnotation(OpClass.class) != null) //
30+
.map(cls -> {
31+
OpClass p = cls.getAnnotation(OpClass.class);
32+
String[] parsedOpNames = OpUtils.parseOpNames(p.names());
33+
return new OpClassInfo(cls, parsedOpNames);
34+
}) //
35+
.collect(Collectors.toList());
36+
return infos;
37+
}
38+
39+
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public OpCollectionInfoGenerator(Discoverer... d) {
3434
public List<OpInfo> generateInfos() {
3535
List<OpInfo> infos = discoverers.stream() //
3636
.flatMap(d -> d.implementingClasses(OpCollection.class).stream()) //
37-
.filter(cls -> cls.getAnnotation(Plugin.class) != null) //
3837
.map(cls -> {
3938
try {
4039
List<OpInfo> collectionInfos = new ArrayList<>();

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/impl/ClassOpInfoGenerator.java renamed to scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/impl/PluginBasedClassOpInfoGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
import org.scijava.ops.spi.Op;
1414
import org.scijava.plugin.Plugin;
1515

16-
public class ClassOpInfoGenerator implements OpInfoGenerator {
16+
public class PluginBasedClassOpInfoGenerator implements OpInfoGenerator {
1717

1818
private final List<Discoverer> discoverers;
1919

20-
public ClassOpInfoGenerator(Discoverer... d) {
20+
public PluginBasedClassOpInfoGenerator(Discoverer... d) {
2121
this.discoverers = Arrays.asList(d);
2222
}
2323

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* #%L
3+
* SciJava Operations: a framework for reusable algorithms.
4+
* %%
5+
* Copyright (C) 2016 - 2019 SciJava Ops developers.
6+
* %%
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright notice,
11+
* this list of conditions and the following disclaimer.
12+
* 2. Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
*
16+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
* POSSIBILITY OF SUCH DAMAGE.
27+
* #L%
28+
*/
29+
30+
package org.scijava.ops.engine.copy;
31+
32+
import org.junit.Assert;
33+
import org.junit.Test;
34+
import org.scijava.ops.engine.AbstractTestEnvironment;
35+
36+
public class CopyOpCollectionTest extends AbstractTestEnvironment {
37+
38+
@Test
39+
public void testCopyOp() {
40+
double[] input = {1, 2, 3};
41+
double[] output = {4, 5, 6};
42+
ops.op("cp").input(input).output(output).compute();
43+
44+
Assert.assertArrayEquals(input, output, 0.);
45+
}
46+
47+
}

scijava/scijava-ops-engine/templates/main/java/module-info.vm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ module org.scijava.ops.engine {
2727
requires org.scijava.struct;
2828
requires org.scijava.ops.api;
2929
requires org.scijava.ops.discovery;
30+
requires org.scijava.ops.serviceloader;
3031
requires org.scijava.ops.spi;
3132
requires org.scijava.types;
3233
requires javassist;
3334
requires java.compiler;
3435
requires therapi.runtime.javadoc;
3536

3637
uses javax.annotation.processing.Processor;
38+
provides org.scijava.ops.spi.OpCollection with org.scijava.ops.engine.copy.CopyOpCollection;
3739
}

scijava/scijava-ops-serviceloader/src/main/java/module-info.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
requires org.scijava.ops.discovery;
88

99
uses org.scijava.ops.spi.Op;
10-
provides org.scijava.ops.spi.Op with org.scijava.ops.serviceloader.ServiceBasedAdder;
10+
uses org.scijava.ops.spi.OpCollection;
11+
12+
provides org.scijava.ops.spi.Op with
13+
org.scijava.ops.serviceloader.ServiceBasedAdder;
14+
15+
provides org.scijava.ops.spi.OpCollection with
16+
org.scijava.ops.serviceloader.ServiceBasedMultipliers;
1117

1218
}

0 commit comments

Comments
 (0)