/** * Returns true iff any of the given {@code communityCandidates} is matched by this {@link * CommunitySetExpr} under the provided {@code environment}. */ public boolean matchAnyCommunity(Environment environment, Set<Long> communityCandidates) { return communityCandidates.stream() .anyMatch(communityCandidate -> matchCommunity(environment, communityCandidate)); }
public static @Nonnull RegexCommunitySet convert(@Nonnull CommunitySetExpr communitySetExpr) { return communitySetExpr.accept(INSTANCE); }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } else if (!(obj instanceof SetCommunity)) { return false; } SetCommunity other = (SetCommunity) obj; return _expr.equals(other._expr); }
@Override public SortedSet<Long> asLiteralCommunities(Environment environment) { return resolve(environment).asLiteralCommunities(environment); }
@Override public SortedSet<Long> matchedCommunities( Environment environment, Set<Long> communityCandidates) { return resolve(environment).matchedCommunities(environment, communityCandidates); }
@Override public boolean matchAnyCommunity(Environment environment, Set<Long> communityCandidates) { return resolve(environment).matchAnyCommunity(environment, communityCandidates); }
@Override public boolean matchCommunities(Environment environment, Set<Long> communitySetCandidate) { return resolve(environment).matchCommunities(environment, communitySetCandidate); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_expr == null) ? 0 : _expr.hashCode()); return result; }
@Override @Nonnull public SortedSet<Long> asLiteralCommunities(Environment environment) throws UnsupportedOperationException { if (_literalCommunities != null) { return _literalCommunities; } _literalCommunities = _lines.stream() .map(CommunityListLine::getMatchCondition) .map(lineMatchCondition -> lineMatchCondition.asLiteralCommunities(null)) .flatMap(Collection::stream) .collect(ImmutableSortedSet.toImmutableSortedSet(Comparator.naturalOrder())); return _literalCommunities; }
@Override protected boolean matchesSafely(CommunitySetExpr item, Description mismatchDescription) { Set<Long> matchedCommunities = item.matchedCommunities(_environment, _communityCandidates); if (!_subMatcher.matches(matchedCommunities)) { mismatchDescription.appendText( String.format( "CommunitySetExpr: '%s' matched the subset: %s", item, CommunitySetExprMatchers.toString(matchedCommunities))); return false; } return true; } }
@Override protected boolean matchesSafely(CommunitySetExpr item, Description mismatchDescription) { if (!item.matchAnyCommunity(_environment, _communityCandidates)) { mismatchDescription.appendText( String.format( "CommunitySetExpr: '%s' did not match any community in: %s", item, CommunitySetExprMatchers.toString(_communityCandidates))); return false; } return true; } }
@Override public boolean matchCommunities(Environment environment, Set<Long> communitySetCandidate) { if (reducible()) { return communitySetCandidate.stream() .anyMatch(community -> matchCommunity(environment, community)); } Optional<CommunityListLine> matchingLine = _lines.stream() .filter( line -> line.getMatchCondition().matchCommunities(environment, communitySetCandidate)) .findFirst(); // "invert != condition" is a concise way of inverting a boolean return matchingLine.isPresent() && _invertMatch != (matchingLine.get().getAction() == LineAction.PERMIT); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_expr == null) ? 0 : _expr.hashCode()); return result; }
@Override protected boolean matchesSafely(CommunitySetExpr item, Description mismatchDescription) { Set<Long> asLiteralCommunities = item.asLiteralCommunities(_environment); if (!_subMatcher.matches(asLiteralCommunities)) { mismatchDescription.appendText( String.format( "CommunitySetExpr: '%s' as literal communities was: %s", item, CommunitySetExprMatchers.toString(asLiteralCommunities))); return false; } return true; } }
/** * Returns the subset of the given {@code communityCandidates} matched by this {@link * CommunitySetExpr} under the provided {@code environment}. */ public SortedSet<Long> matchedCommunities( @Nullable Environment environment, Set<Long> communityCandidates) { return communityCandidates.stream() .filter(communityCandidate -> matchCommunity(environment, communityCandidate)) .collect(ImmutableSortedSet.toImmutableSortedSet(Comparator.naturalOrder())); }
@Override public Result execute(Environment environment) { BgpRoute.Builder outputRouteBuilder = (BgpRoute.Builder) environment.getOutputRoute(); SortedSet<Long> currentCommunities = outputRouteBuilder.getCommunities(); SortedSet<Long> matchingCommunities = _expr.matchedCommunities(environment, currentCommunities); outputRouteBuilder.removeCommunities(matchingCommunities); Result result = new Result(); return result; }
@Override public Result evaluate(Environment environment) { Result result = new Result(); boolean match = false; SortedSet<Long> inputCommunities = null; if (environment.getUseOutputAttributes() && environment.getOutputRoute() instanceof BgpRoute.Builder) { BgpRoute.Builder bgpRouteBuilder = (BgpRoute.Builder) environment.getOutputRoute(); inputCommunities = bgpRouteBuilder.getCommunities(); } else if (environment.getReadFromIntermediateBgpAttributes()) { inputCommunities = environment.getIntermediateBgpAttributes().getCommunities(); } else if (environment.getOriginalRoute() instanceof BgpRoute) { BgpRoute bgpRoute = (BgpRoute) environment.getOriginalRoute(); inputCommunities = bgpRoute.getCommunities(); } if (inputCommunities != null) { match = _expr.matchAnyCommunity(environment, inputCommunities); } result.setBooleanValue(match); return result; }
@Override protected boolean matchesSafely(CommunitySetExpr item, Description mismatchDescription) { boolean match = item.matchCommunities(_environment, _communitySetCandidate); if (!match) { mismatchDescription.appendText( String.format( "CommunitySetExpr: '%s' did not match the community-set: '%s'", item, CommunitySetExprMatchers.toString(_communitySetCandidate))); return false; } return true; } }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } else if (!(obj instanceof DeleteCommunity)) { return false; } DeleteCommunity other = (DeleteCommunity) obj; return _expr.equals(other._expr); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _expr.hashCode(); return result; } }