public static AclLineMatchExpr or(AclLineMatchExpr... exprs) { return or( Arrays.stream(exprs).collect(ImmutableSortedSet.toImmutableSortedSet(Ordering.natural()))); }
/** * This method is the public API of the class. It normalizes the input {@link AclLineMatchExpr}. */ public static AclLineMatchExpr normalize(IpAccessListToBDD toBDD, AclLineMatchExpr expr) { AclLineMatchExprNormalizer normalizer = new AclLineMatchExprNormalizer(toBDD); expr.accept(normalizer); Set<AclLineMatchExpr> disjuncts = normalizer._conjunctsBuilders.stream() .filter(conjunctsBuilder -> !conjunctsBuilder.unsat()) .map(ConjunctsBuilder::build) .collect(ImmutableSortedSet.toImmutableSortedSet(Ordering.natural())); return disjuncts.contains(TRUE) ? TRUE : or(disjuncts); }
@Override public AclLineMatchExpr visitOrMatchExpr(OrMatchExpr orMatchExpr) { return or( orMatchExpr.getDisjuncts().stream() .map(this::visit) .collect(ImmutableSortedSet.toImmutableSortedSet(Comparator.naturalOrder()))); }
@Override public AclLineMatchExpr build() { return getBdd().isOne() ? TRUE : or(getExprs()); }
@Test public void testOr() { MatcherAssert.assertThat(_toBdd.getMemoizedBdd(MATCH_DST_IP), equalTo(Optional.empty())); MatcherAssert.assertThat(_toBdd.getMemoizedBdd(MATCH_SRC_IP), equalTo(Optional.empty())); BDD bdd = _toBdd.visit(or(MATCH_DST_IP, MATCH_SRC_IP)); Optional<BDD> dstBdd = _toBdd.getMemoizedBdd(MATCH_DST_IP); Optional<BDD> srcBdd = _toBdd.getMemoizedBdd(MATCH_SRC_IP); assertThat("MATCH_DST_IP should be memoized", dstBdd.isPresent()); assertThat("MATCH_SRC_IP should be memoized", srcBdd.isPresent()); assertThat(dstBdd.get().or(srcBdd.get()), equalTo(bdd)); } }
@Test public void testExprs() { Map<String, IpAccessList> namedAcls = ImmutableMap.of(); assertThat(referencedSources(namedAcls, TRUE), equalTo(ImmutableSet.of())); assertThat(referencedSources(namedAcls, FALSE), equalTo(ImmutableSet.of())); assertThat( referencedSources(namedAcls, ORIGINATING_FROM_DEVICE), equalTo(ImmutableSet.of(SOURCE_ORIGINATING_FROM_DEVICE))); assertThat(referencedSources(namedAcls, matchDst(Ip.AUTO)), equalTo(ImmutableSet.of())); assertThat( referencedSources(namedAcls, matchSrcInterface("a", "b", "c")), equalTo(ImmutableSet.of("a", "b", "c"))); assertThat( referencedSources(namedAcls, and(matchSrcInterface("a"), matchSrcInterface("b", "c"))), equalTo(ImmutableSet.of("a", "b", "c"))); assertThat( referencedSources(namedAcls, not(matchSrcInterface("a", "b", "c"))), equalTo(ImmutableSet.of("a", "b", "c"))); assertThat( referencedSources(namedAcls, or(matchSrcInterface("a"), matchSrcInterface("b", "c"))), equalTo(ImmutableSet.of("a", "b", "c"))); }
@Test public void visitAndMatchExpr() { assertThat( negate(and(ORIGINATING_FROM_DEVICE, TRUE, FALSE)), equalTo(or(not(ORIGINATING_FROM_DEVICE), FALSE, TRUE))); }
@Test public void visitOrMatchExpr() { assertThat( negate(or(ORIGINATING_FROM_DEVICE, TRUE, FALSE)), equalTo(and(not(ORIGINATING_FROM_DEVICE), FALSE, TRUE))); }