/
TraversingVisitor.java
63 lines (53 loc) · 2.14 KB
/
TraversingVisitor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package software.amazon.awssdk.services.rules;
import java.util.List;
import java.util.stream.Stream;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Condition;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Expr;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Fn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Rule;
public abstract class TraversingVisitor<R> extends DefaultVisitor<Stream<R>> {
public Stream<R> visitRuleset(EndpointRuleset ruleset) {
return ruleset.getRules()
.stream()
.flatMap(this::handleRule);
}
private Stream<R> handleRule(Rule rule) {
Stream<R> fromConditions = visitConditions(rule.getConditions());
return Stream.concat(fromConditions, rule.accept(this));
}
@Override
public Stream<R> visitFn(Fn fn) {
return fn.acceptFnVisitor(this);
}
@Override
public Stream<R> getDefault() {
return Stream.empty();
}
@Override
public Stream<R> visitEndpointRule(EndpointResult endpoint) {
return visitEndpoint(endpoint);
}
@Override
public Stream<R> visitErrorRule(Expr error) {
return error.accept(this);
}
@Override
public Stream<R> visitTreeRule(List<Rule> rules) {
return rules.stream().flatMap(subrule -> subrule.accept(this));
}
public Stream<R> visitEndpoint(EndpointResult endpoint) {
return Stream.concat(
endpoint.getUrl()
.accept(this),
endpoint.getProperties()
.entrySet()
.stream()
.flatMap(map -> map.getValue().accept(this))
);
}
public Stream<R> visitConditions(List<Condition> conditions) {
return conditions.stream().flatMap(c -> c.getFn().accept(this));
}
}