diff --git a/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/RuleSet.java b/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/RuleSet.java index c311aee0..d4441913 100644 --- a/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/RuleSet.java +++ b/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/RuleSet.java @@ -20,7 +20,7 @@ public RuleSet() { public void add(Long origin, TrustedOrigins scope, Rule rule) { if (!rules.containsKey(scope)) { - rules.put(scope, List.of(new Pair<>(origin, rule))); + rules.put(scope, new ArrayList<>(List.of(new Pair<>(origin, rule)))); } else { rules.get(scope).add(new Pair<>(origin, rule)); } diff --git a/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/TrustedOrigins.java b/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/TrustedOrigins.java index f5a74255..e6a4864d 100644 --- a/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/TrustedOrigins.java +++ b/biscuit-core/src/main/java/org/eclipse/biscuit/datalog/TrustedOrigins.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; +import java.util.Objects; public final class TrustedOrigins { private final Origin origin; @@ -91,6 +92,25 @@ public String toString() { return "TrustedOrigins{inner=" + origin + '}'; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + TrustedOrigins trustedOrigin = (TrustedOrigins) o; + + return Objects.equals(origin, trustedOrigin.origin); + } + + @Override + public int hashCode() { + return origin.hashCode(); + } + public Origin getOrigin() { return origin; } diff --git a/biscuit/src/test/java/org/eclipse/biscuit/datalog/WorldTest.java b/biscuit/src/test/java/org/eclipse/biscuit/datalog/WorldTest.java index 844a0bef..354e5fbc 100644 --- a/biscuit/src/test/java/org/eclipse/biscuit/datalog/WorldTest.java +++ b/biscuit/src/test/java/org/eclipse/biscuit/datalog/WorldTest.java @@ -5,6 +5,7 @@ package org.eclipse.biscuit.datalog; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -762,4 +763,38 @@ public void testResource() throws Error { } assertTrue(res.size() == 0); } + + @Test + public void testAddRuleEqualButDistinctTrustedOriginsDoesNotThrow() { + final World w = new World(); + final SymbolTable syms = new SymbolTable(); + + final long left = syms.insert("left"); + final long straight = syms.insert("straight"); + final long right = syms.insert("right"); + final Term.Variable a = new Term.Variable(syms.insert("a")); + final Term.Variable b = new Term.Variable(syms.insert("b")); + + final Rule r1 = + new Rule( + new Predicate(left, Arrays.asList(a, b)), + Arrays.asList(new Predicate(right, Arrays.asList(a, b))), + new ArrayList<>()); + final Rule r2 = + new Rule( + new Predicate(straight, Arrays.asList(a, b)), + Arrays.asList(new Predicate(right, Arrays.asList(a, b))), + new ArrayList<>()); + + System.out.println("adding r1: " + syms.formatRule(r1)); + System.out.println( + "adding r2 under an equal but distinct TrustedOrigins instance: " + syms.formatRule(r2)); + + assertDoesNotThrow( + () -> { + w.addRule(1L, TrustedOrigins.defaultOrigins(), r1); + w.addRule(1L, TrustedOrigins.defaultOrigins(), r2); + }); + assertEquals(1, w.getRules().getRules().size()); + } }