Skip to content

Commit 4dc33c1

Browse files
gselzerctrueden
authored andcommitted
remove InfoChainGenerator.priority
1 parent ab18221 commit 4dc33c1

11 files changed

Lines changed: 68 additions & 95 deletions

File tree

scijava/scijava-ops-api/src/main/java/org/scijava/ops/api/InfoChainGenerator.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,27 @@ InfoChain generate(String signature, Map<String, OpInfo> idMap,
3838
* @param generators the list of {@link InfoChainGenerator}s
3939
* @return the {@link InfoChainGenerator} best suited to the task
4040
*/
41-
static Optional<InfoChainGenerator> findSuitableGenerator(String signature,
41+
static InfoChainGenerator findSuitableGenerator(String signature,
4242
Collection<InfoChainGenerator> generators)
4343
{
44-
Optional<InfoChainGenerator> gen = generators.stream() //
44+
List<InfoChainGenerator> suitableGenerators = generators.stream() //
4545
.filter(g -> g.canGenerate(signature)) //
46-
.max((i1, i2) -> (int) (i1.priority() - i2.priority()));
47-
return gen;
46+
.collect(Collectors.toList());
47+
if (suitableGenerators.size() == 0) throw new IllegalArgumentException(
48+
"No InfoChainGenerator in given collection " + generators +
49+
" is able to reify signature " + signature);
50+
if (suitableGenerators.size() > 1) throw new IllegalArgumentException(
51+
"Signature " + signature +
52+
" is able to be reified by multiple generators: " + suitableGenerators);
53+
return suitableGenerators.get(0);
4854
}
4955

5056
static InfoChain generateDependencyChain(String subsignature,
5157
Map<String, OpInfo> idMap, Collection<InfoChainGenerator> generators)
5258
{
53-
Optional<InfoChainGenerator> genOpt = InfoChainGenerator
59+
InfoChainGenerator genOpt = InfoChainGenerator
5460
.findSuitableGenerator(subsignature, generators);
55-
if (genOpt.isEmpty()) throw new IllegalArgumentException(
56-
"Could not find an InfoChainGenerator able to handle id" + subsignature);
57-
return genOpt.get().generate(subsignature, idMap, generators);
61+
return genOpt.generate(subsignature, idMap, generators);
5862
}
5963

6064
/**
@@ -95,10 +99,4 @@ else if (ch == DEP_END_DELIM) {
9599
*/
96100
boolean canGenerate(String signature);
97101

98-
/**
99-
* Returns the priority of this {@link InfoChainGenerator}
100-
* @return the priority
101-
*/
102-
double priority();
103-
104102
}

scijava/scijava-ops-api/src/main/java/org/scijava/ops/api/OpInfo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
*/
2222
public interface OpInfo extends Comparable<OpInfo> {
2323

24+
static final String IMPL_DECLARATION = "|Vanilla:";
25+
2426
/** name(s) of the op. */
2527
List<String> names();
2628

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.util.Collection;
66
import java.util.List;
77
import java.util.Map;
8-
import java.util.Optional;
98

109
import org.scijava.ops.api.InfoChain;
1110
import org.scijava.ops.api.InfoChainGenerator;
@@ -58,12 +57,7 @@ else if (ch == DEP_END_DELIM) {
5857

5958
@Override
6059
public boolean canGenerate(String signature) {
61-
return true;
62-
}
63-
64-
@Override
65-
public double priority() {
66-
return -(1e10);
60+
return signature.startsWith(OpInfo.IMPL_DECLARATION);
6761
}
6862

6963
}

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import java.util.HashSet;
4141
import java.util.List;
4242
import java.util.Map;
43-
import java.util.Optional;
4443
import java.util.Set;
4544
import java.util.TreeSet;
4645
import java.util.function.Consumer;
@@ -298,11 +297,9 @@ public InfoChain chainFromID(String signature) {
298297
if (idDirectory == null) initIdDirectory();
299298
if (infoChainGenerators == null) initInfoChainGenerators();
300299

301-
Optional<InfoChainGenerator> genOpt = InfoChainGenerator
302-
.findSuitableGenerator(signature, infoChainGenerators);
303-
if (genOpt.isEmpty()) throw new IllegalArgumentException(
304-
"Could not find an InfoChainGenerator able to handle id" + signature);
305-
return genOpt.get().generate(signature, idDirectory, infoChainGenerators);
300+
InfoChainGenerator genOpt = InfoChainGenerator.findSuitableGenerator(
301+
signature, infoChainGenerators);
302+
return genOpt.generate(signature, idDirectory, infoChainGenerators);
306303
}
307304

308305
@Override

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/matcher/impl/AdaptationInfoChainGenerator.java

Lines changed: 40 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
import java.lang.reflect.Type;
55
import java.lang.reflect.TypeVariable;
6+
import java.util.ArrayList;
67
import java.util.Collection;
78
import java.util.HashMap;
9+
import java.util.List;
810
import java.util.Map;
9-
import java.util.Optional;
1011

1112
import org.scijava.ops.api.InfoChain;
1213
import org.scijava.ops.api.InfoChainGenerator;
@@ -21,75 +22,58 @@ public class AdaptationInfoChainGenerator implements InfoChainGenerator {
2122
public InfoChain generate(String signature, Map<String, OpInfo> idMap,
2223
Collection<InfoChainGenerator> generators)
2324
{
25+
2426
// Resolve adaptor
25-
int start = 0;
26-
int end = matchingCurlyBrace(signature, signature.indexOf('{'));
27-
String adaptorSignature = signature.substring(start, end + 1);
28-
Optional<InfoChainGenerator> adaptorGenOpt = InfoChainGenerator.findSuitableGenerator(adaptorSignature, generators);
29-
if (adaptorGenOpt == null) throw new IllegalArgumentException("Could not find an InfoChainGenerator able to handle id" + adaptorSignature);
30-
InfoChain adaptorChain = adaptorGenOpt.get().generate(adaptorSignature, idMap, generators);
31-
32-
// Resolve adapted Op
33-
int delim_start = signature.indexOf(OpAdaptationInfo.IMPL_DELIMITER);
34-
if (delim_start == -1) throw new IllegalStateException("Op signature " +
35-
signature + " must have signature delimiter " +
36-
OpAdaptationInfo.IMPL_DELIMITER +
37-
", but does not! Was InfoChainGenerator.canGenerate() called?");
38-
int originalOpStart = delim_start + OpAdaptationInfo.IMPL_DELIMITER.length();
39-
String originalSignature = signature.substring(originalOpStart);
40-
Optional<InfoChainGenerator> originalGenOpt = InfoChainGenerator.findSuitableGenerator(originalSignature, generators);
41-
if (originalGenOpt == null) throw new IllegalArgumentException("Could not find an InfoChainGenerator able to handle id" + originalSignature);
42-
InfoChain originalChain = originalGenOpt.get().generate(originalSignature, idMap, generators);
27+
String adaptorComponent = signature.substring(signature.indexOf(OpAdaptationInfo.ADAPTOR), signature.indexOf(OpAdaptationInfo.ORIGINAL));
28+
if (!adaptorComponent.startsWith(OpAdaptationInfo.ADAPTOR))
29+
throw new IllegalArgumentException("Adaptor component " +
30+
adaptorComponent + " must begin with prefix " +
31+
OpAdaptationInfo.ADAPTOR);
32+
String adaptorSignature = adaptorComponent.substring(
33+
OpAdaptationInfo.ADAPTOR.length());
34+
InfoChain adaptorChain = InfoChainGenerator.generateDependencyChain(
35+
adaptorSignature, idMap, generators);
36+
37+
// Resolve original op
38+
String originalComponent = signature.substring(signature.indexOf(OpAdaptationInfo.ORIGINAL));
39+
if (!originalComponent.startsWith(OpAdaptationInfo.ORIGINAL))
40+
throw new IllegalArgumentException("Original Op component " +
41+
originalComponent + " must begin with prefix " +
42+
OpAdaptationInfo.ORIGINAL);
43+
String originalSignature = originalComponent.substring(
44+
OpAdaptationInfo.ORIGINAL.length());
45+
InfoChain originalChain = InfoChainGenerator.generateDependencyChain(
46+
originalSignature, idMap, generators);
4347

4448
// Rebuild original chain with an OpAdaptationInfo
4549
OpInfo originalInfo = originalChain.info();
4650
// TODO: The op type is wrong!
4751
Map<TypeVariable<?>, Type> typeVarAssigns = new HashMap<>();
48-
if (!Types.isAssignable(originalInfo.opType(), adaptorChain.info().inputs().get(0).getType(), typeVarAssigns)) throw new IllegalArgumentException("The adaptor cannot be used on Op " + originalInfo);
49-
Type adaptedOpType = Types.substituteTypeVariables(adaptorChain.info().output().getType(), typeVarAssigns);
50-
OpInfo adaptedInfo = new OpAdaptationInfo(originalInfo, adaptedOpType, adaptorChain);
52+
if (!Types.isAssignable(originalInfo.opType(), adaptorChain.info().inputs()
53+
.get(0).getType(), typeVarAssigns)) throw new IllegalArgumentException(
54+
"The adaptor cannot be used on Op " + originalInfo);
55+
Type adaptedOpType = Types.substituteTypeVariables(adaptorChain.info()
56+
.output().getType(), typeVarAssigns);
57+
OpInfo adaptedInfo = new OpAdaptationInfo(originalInfo, adaptedOpType,
58+
adaptorChain);
5159
return new InfoChain(adaptedInfo, originalChain.dependencies());
5260

5361
}
5462

55-
/**
56-
* To prevent intensive signature validation, we do two passes:
57-
* <ol>
58-
* <li>If there is no adaptation delimiter, return false fast
59-
* <li>If there is an adaptation delimiter, return true iff it is the
60-
* outermost piece
61-
* </ol>
62-
*/
63-
@Override
64-
public boolean canGenerate(String signature) {
65-
// Pass 1 - fail fast iff no adapted Ops
66-
if (!signature.contains(OpAdaptationInfo.IMPL_DELIMITER)) return false;
67-
68-
// Pass 2 - return true iff adaptor delimiter directly follows adaptor
69-
// signature.
70-
int adaptorDepsStart = signature.indexOf('{');
71-
int adaptorDepsEnd = matchingCurlyBrace(signature, adaptorDepsStart);
72-
return signature.indexOf(
73-
OpAdaptationInfo.IMPL_DELIMITER) == adaptorDepsEnd + 1;
74-
}
75-
76-
private int matchingCurlyBrace(String s, int startBraceIndex) {
77-
int braceCount = 0;
78-
for (int i = startBraceIndex; i < s.length(); i++) {
79-
if (s.charAt(i) == DEP_START_DELIM) braceCount++;
80-
else if (s.charAt(i) == DEP_END_DELIM) {
81-
braceCount--;
82-
if (braceCount == 0) return i;
83-
}
63+
List<String> parseComponents(String signature) {
64+
List<String> components = new ArrayList<>();
65+
String s = signature;
66+
while (s.length() > 0) {
67+
String subSignatureFrom = InfoChainGenerator.subSignatureFrom(s, 0);
68+
components.add(subSignatureFrom);
69+
s = s.substring(subSignatureFrom.length());
8470
}
85-
throw new IllegalArgumentException("Signature" + s +
86-
" does not have a curly brace matching the one at index " +
87-
startBraceIndex);
71+
return components;
8872
}
8973

9074
@Override
91-
public double priority() {
92-
return 0;
75+
public boolean canGenerate(String signature) {
76+
return signature.startsWith(OpAdaptationInfo.IMPL_DECLARATION);
9377
}
9478

9579
}

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/matcher/impl/OpAdaptationInfo.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
*/
3434
public class OpAdaptationInfo implements OpInfo {
3535

36-
protected static final String IMPL_DELIMITER = "|Adaptation|";
36+
protected static final String IMPL_DECLARATION = "|Adaptation:";
37+
protected static final String ADAPTOR = "|Adaptor:";
38+
protected static final String ORIGINAL = "|OriginalOp:";
3739

3840
private final OpInfo srcInfo;
3941
private final InfoChain adaptorChain;
@@ -103,7 +105,7 @@ public double priority() {
103105

104106
@Override
105107
public String implementationName() {
106-
return srcInfo.implementationName() + IMPL_DELIMITER + adaptorChain.signature();
108+
return srcInfo.implementationName() + ADAPTOR + adaptorChain.signature();
107109
}
108110

109111
/**
@@ -166,7 +168,7 @@ public String version() {
166168
*/
167169
@Override
168170
public String id() {
169-
return adaptorChain.signature() + IMPL_DELIMITER + srcInfo.id();
171+
return IMPL_DECLARATION + ADAPTOR + adaptorChain.signature() + ORIGINAL + srcInfo.id();
170172
}
171173

172174
}

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/matcher/impl/OpClassInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public String version() {
220220
*/
221221
@Override
222222
public String id() {
223-
return implementationName() + "@" + version();
223+
return OpInfo.IMPL_DECLARATION + implementationName() + "@" + version();
224224
}
225225

226226
// -- Helper methods

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/matcher/impl/OpFieldInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public String version() {
206206
*/
207207
@Override
208208
public String id() {
209-
return implementationName() + "@" + version();
209+
return OpInfo.IMPL_DECLARATION + implementationName() + "@" + version();
210210
}
211211

212212
// -- Object methods --

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/matcher/impl/OpMethodInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ public String version() {
382382
*/
383383
@Override
384384
public String id() {
385-
return implementationName() + "@" + version();
385+
return OpInfo.IMPL_DECLARATION + implementationName() + "@" + version();
386386
}
387387

388388
// -- Object methods --

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/simplify/SimplificationInfoChainGenerator.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,4 @@ public boolean canGenerate(String signature) {
126126
return signature.startsWith(SimplifiedOpInfo.IMPL_DECLARATION);
127127
}
128128

129-
@Override
130-
public double priority() {
131-
return 0;
132-
}
133-
134129
}

0 commit comments

Comments
 (0)