From b221539b4999658c9d6eb6f926529f5ae1544b11 Mon Sep 17 00:00:00 2001 From: Daniel Roberts ddanielr Date: Thu, 16 Apr 2026 15:52:01 +0000 Subject: [PATCH 1/3] Support a java-11 compile target Users looking to migrate away from ColumnVisibility class usage in accumulo 2.1.x need a version of accumulo-access that supports java-11. --- .../accumulo/access/antlr4/Antlr4Tests.java | 12 +++++------ .../accumulo/access/AccessEvaluator.java | 5 +---- .../accumulo/access/AccessExpression.java | 9 +++------ .../access/ParsedAccessExpression.java | 5 +---- .../access/impl/AccessEvaluatorImpl.java | 2 +- .../accumulo/access/impl/AccessImpl.java | 2 +- .../accumulo/access/impl/CharsWrapper.java | 5 +++-- .../access/impl/AccessEvaluatorTest.java | 12 +++++------ .../access/examples/ParseExamples.java | 20 ++++++++++++------- pom.xml | 4 ++-- 10 files changed, 37 insertions(+), 39 deletions(-) diff --git a/modules/antlr4-example/src/test/java/org/apache/accumulo/access/antlr4/Antlr4Tests.java b/modules/antlr4-example/src/test/java/org/apache/accumulo/access/antlr4/Antlr4Tests.java index 1eecfd1..f3bd662 100644 --- a/modules/antlr4-example/src/test/java/org/apache/accumulo/access/antlr4/Antlr4Tests.java +++ b/modules/antlr4-example/src/test/java/org/apache/accumulo/access/antlr4/Antlr4Tests.java @@ -152,20 +152,20 @@ public void testCompareAntlrEvaluationAgainstAccessEvaluatorImpl() throws Except assertNotEquals(0, test.getExpressions().length); for (String expression : test.getExpressions()) { switch (test.getExpectedResult()) { - case ACCESSIBLE -> { + case ACCESSIBLE: assertTrue(evaluator.canAccess(expression), expression); assertTrue(antlr.canAccess(expression), expression); - } - case INACCESSIBLE -> { + break; + case INACCESSIBLE: assertFalse(evaluator.canAccess(expression), expression); assertFalse(antlr.canAccess(expression), expression); - } - case ERROR -> { + break; + case ERROR: assertThrows(InvalidAccessExpressionException.class, () -> evaluator.canAccess(expression), expression); assertThrows(InvalidAccessExpressionException.class, () -> antlr.canAccess(expression), expression); - } + break; } } } diff --git a/modules/core/src/main/java/org/apache/accumulo/access/AccessEvaluator.java b/modules/core/src/main/java/org/apache/accumulo/access/AccessEvaluator.java index bc447bc..ab2fbd7 100644 --- a/modules/core/src/main/java/org/apache/accumulo/access/AccessEvaluator.java +++ b/modules/core/src/main/java/org/apache/accumulo/access/AccessEvaluator.java @@ -18,9 +18,6 @@ */ package org.apache.accumulo.access; -import org.apache.accumulo.access.impl.AccessEvaluatorImpl; -import org.apache.accumulo.access.impl.MultiAccessEvaluatorImpl; - /** * This class is used to decide if an entity with a given set of authorizations can access * subsequent access expressions. @@ -53,7 +50,7 @@ * @see Accumulo Access Documentation * @since 1.0.0 */ -public sealed interface AccessEvaluator permits AccessEvaluatorImpl, MultiAccessEvaluatorImpl { +public interface AccessEvaluator { /** * Evaluates an expression. diff --git a/modules/core/src/main/java/org/apache/accumulo/access/AccessExpression.java b/modules/core/src/main/java/org/apache/accumulo/access/AccessExpression.java index 7c1d68e..61f97f9 100644 --- a/modules/core/src/main/java/org/apache/accumulo/access/AccessExpression.java +++ b/modules/core/src/main/java/org/apache/accumulo/access/AccessExpression.java @@ -21,15 +21,12 @@ import java.io.Serializable; import java.util.Objects; -import org.apache.accumulo.access.impl.AccessExpressionImpl; - /** * An immutable wrapper for a validated access expression. * * @since 1.0.0 */ -public sealed abstract class AccessExpression implements Serializable - permits AccessExpressionImpl, ParsedAccessExpression { +public abstract class AccessExpression implements Serializable { private static final long serialVersionUID = 1L; @@ -53,8 +50,8 @@ protected AccessExpression() {} @Override public boolean equals(Object o) { - return this == o - || (o instanceof AccessExpression a && Objects.equals(getExpression(), a.getExpression())); + return this == o || (o instanceof AccessExpression + && Objects.equals(getExpression(), ((AccessExpression) o).getExpression())); } @Override diff --git a/modules/core/src/main/java/org/apache/accumulo/access/ParsedAccessExpression.java b/modules/core/src/main/java/org/apache/accumulo/access/ParsedAccessExpression.java index 4e53a16..c098e77 100644 --- a/modules/core/src/main/java/org/apache/accumulo/access/ParsedAccessExpression.java +++ b/modules/core/src/main/java/org/apache/accumulo/access/ParsedAccessExpression.java @@ -20,8 +20,6 @@ import java.util.List; -import org.apache.accumulo.access.impl.ParsedAccessExpressionImpl; - /** * Instances of this class are immutable and wrap a verified access expression and a parse tree for * the access expression. To create an instance of this class call @@ -30,8 +28,7 @@ * * @since 1.0.0 */ -public sealed abstract class ParsedAccessExpression extends AccessExpression - permits ParsedAccessExpressionImpl { +public abstract class ParsedAccessExpression extends AccessExpression { private static final long serialVersionUID = 1L; diff --git a/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessEvaluatorImpl.java b/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessEvaluatorImpl.java index a568b4b..f1c7477 100644 --- a/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessEvaluatorImpl.java +++ b/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessEvaluatorImpl.java @@ -52,7 +52,7 @@ public final class AccessEvaluatorImpl implements AccessEvaluator { .andThen(auth -> wrappedAuths.add(new CharsWrapper(auth.toCharArray())))); this.authorizedPredicate = - auth -> auth instanceof CharsWrapper wrapped ? wrappedAuths.contains(wrapped) + auth -> auth instanceof CharsWrapper ? wrappedAuths.contains((CharsWrapper) auth) : wrappedAuths.contains(new CharsWrapper(auth.toString().toCharArray())); this.authorizationValidator = authorizationValidator; } diff --git a/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessImpl.java b/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessImpl.java index 037dad5..355dacc 100644 --- a/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessImpl.java +++ b/modules/core/src/main/java/org/apache/accumulo/access/impl/AccessImpl.java @@ -40,7 +40,7 @@ public class AccessImpl implements Access { private final AuthorizationValidator authValidator; private void validateAuthArgument(CharSequence auth) { - if (auth.isEmpty()) { + if (auth.length() == 0) { throw InvalidAuthorizationException.emptyString(); } if (!authValidator.test(auth, ANY)) { diff --git a/modules/core/src/main/java/org/apache/accumulo/access/impl/CharsWrapper.java b/modules/core/src/main/java/org/apache/accumulo/access/impl/CharsWrapper.java index a58554b..a65c21b 100644 --- a/modules/core/src/main/java/org/apache/accumulo/access/impl/CharsWrapper.java +++ b/modules/core/src/main/java/org/apache/accumulo/access/impl/CharsWrapper.java @@ -69,8 +69,9 @@ public int hashCode() { @Override public boolean equals(Object o) { - return this == o || (o instanceof CharsWrapper obs && length() == obs.length() && Arrays - .equals(wrapped, offset, offset + len, obs.wrapped, obs.offset, obs.offset + obs.len)); + return this == o || (o instanceof CharsWrapper && length() == ((CharsWrapper) o).length() + && Arrays.equals(wrapped, offset, offset + len, ((CharsWrapper) o).wrapped, + ((CharsWrapper) o).offset, ((CharsWrapper) o).offset + ((CharsWrapper) o).len)); } @Override diff --git a/modules/core/src/test/java/org/apache/accumulo/access/impl/AccessEvaluatorTest.java b/modules/core/src/test/java/org/apache/accumulo/access/impl/AccessEvaluatorTest.java index c170c95..6910ac2 100644 --- a/modules/core/src/test/java/org/apache/accumulo/access/impl/AccessEvaluatorTest.java +++ b/modules/core/src/test/java/org/apache/accumulo/access/impl/AccessEvaluatorTest.java @@ -93,7 +93,7 @@ private static void runTestCases(Access accumuloAccess, TestDataSet testSet, } switch (tests.getExpectedResult()) { - case ACCESSIBLE -> { + case ACCESSIBLE: assertTrue(evaluator.canAccess(expression), expression); assertTrue(evaluator.canAccess(accumuloAccess.newExpression(expression)), expression); assertTrue(evaluator.canAccess(accumuloAccess.newParsedExpression(expression)), @@ -101,8 +101,8 @@ private static void runTestCases(Access accumuloAccess, TestDataSet testSet, assertTrue( evaluator.canAccess(accumuloAccess.newParsedExpression(expression).getExpression()), expression); - } - case INACCESSIBLE -> { + break; + case INACCESSIBLE: assertFalse(evaluator.canAccess(expression), expression); assertFalse(evaluator.canAccess(accumuloAccess.newExpression(expression)), expression); assertFalse(evaluator.canAccess(accumuloAccess.newParsedExpression(expression)), @@ -110,8 +110,8 @@ private static void runTestCases(Access accumuloAccess, TestDataSet testSet, assertFalse( evaluator.canAccess(accumuloAccess.newParsedExpression(expression).getExpression()), expression); - } - case ERROR -> { + break; + case ERROR: assertThrows(InvalidAccessExpressionException.class, () -> evaluator.canAccess(expression), expression); assertThrows(InvalidAccessExpressionException.class, @@ -120,7 +120,7 @@ private static void runTestCases(Access accumuloAccess, TestDataSet testSet, () -> accumuloAccess.newExpression(expression), expression); assertThrows(InvalidAccessExpressionException.class, () -> accumuloAccess.newParsedExpression(expression), expression); - } + break; } } } diff --git a/modules/examples/src/main/java/org/apache/accumulo/access/examples/ParseExamples.java b/modules/examples/src/main/java/org/apache/accumulo/access/examples/ParseExamples.java index 8dd0b3e..d36402d 100644 --- a/modules/examples/src/main/java/org/apache/accumulo/access/examples/ParseExamples.java +++ b/modules/examples/src/main/java/org/apache/accumulo/access/examples/ParseExamples.java @@ -85,12 +85,17 @@ public static class NormalizedExpression implements Comparable 1; - case OR -> 2; - case AND -> 3; - case EMPTY -> throw new IllegalArgumentException("Unexpected type " + type); - }; + switch (type) { + case AUTHORIZATION: + return 1; + case OR: + return 2; + case AND: + return 3; + case EMPTY: + default: + throw new IllegalArgumentException("Unexpected type " + type); + } } @Override @@ -111,7 +116,8 @@ public int compareTo(NormalizedExpression o) { @Override public boolean equals(Object o) { - return this == o || (o instanceof NormalizedExpression n && compareTo(n) == 0); + return this == o + || (o instanceof NormalizedExpression && compareTo((NormalizedExpression) o) == 0); } @Override diff --git a/pom.xml b/pom.xml index be1fa40..8ba0a63 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ specific language governing permissions and limitations under the License. ]]> false - 17 + 11 true true @@ -134,7 +134,7 @@ under the License. true source-release-tar false - 3.0.0 + 2.1.4 0.18 2.47.0 2.13.2 From 3987ff09f52039852c28f9cd935de4bdaee674b7 Mon Sep 17 00:00:00 2001 From: Christopher Tubbs Date: Tue, 21 Apr 2026 17:20:43 -0400 Subject: [PATCH 2/3] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8ba0a63..3c25350 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ under the License. true source-release-tar false - 2.1.4 + 3.0.0 0.18 2.47.0 2.13.2 From fa2e620cbfec3c8fdf5e2994396ef7822230a23c Mon Sep 17 00:00:00 2001 From: Christopher Tubbs Date: Tue, 21 Apr 2026 17:33:08 -0400 Subject: [PATCH 3/3] Add README note about sealing --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 1aa81db..b6d4136 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,11 @@ are package private and are not part of the public API. * [ExpressionType](modules/core/src/main/java/org/apache/accumulo/access/ParsedAccessExpression.java). * [Authorizations](modules/core/src/main/java/org/apache/accumulo/access/Authorizations.java). +`AccessEvaluator`, `AccessExpression`, and `ParsedAccessExpression` will be +sealed interfaces or classes in future releases that support class sealing. So, +users should not create their own implementations of these. Their +implementations are expected to be provided by this library only. + ## Getting Started Add the library to your CLASSPATH. For Maven, use: