This is an automated email from the ASF dual-hosted git repository. mmiller pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/main by this push: new d3b41fc Migrate Constraints to API (#1985) d3b41fc is described below commit d3b41fc0ac5da70aab86e6fb95852353b9a167aa Author: Mike Miller <mmil...@apache.org> AuthorDate: Wed Apr 28 14:25:18 2021 -0400 Migrate Constraints to API (#1985) * Create new Constraint API and equivalent classes under the o.a.a.core.data.constraints package to become public API * Deprecated Constraint and classes under o.a.a.core.constraints package and make the old classes extend the new API * Migrate tests to go along with API changes * Create DeprecatedConstraintExtendTest to test user extending old API * Add DefaultKeySizeConstraintTest to reuseForks exceptions --- core/pom.xml | 2 + .../core/clientImpl/NamespaceOperationsImpl.java | 2 +- .../core/clientImpl/TableOperationsImpl.java | 2 +- .../apache/accumulo/core/conf/IterConfigUtil.java | 2 +- .../org/apache/accumulo/core/conf/Property.java | 2 +- .../accumulo/core/constraints/Constraint.java | 26 ++---- .../core/constraints/DefaultKeySizeConstraint.java | 13 ++- .../core/constraints/NoDeleteConstraint.java | 12 ++- .../core/constraints/VisibilityConstraint.java | 13 ++- .../core/{ => data}/constraints/Constraint.java | 19 +++-- .../constraints/DefaultKeySizeConstraint.java | 4 +- .../{ => data}/constraints/NoDeleteConstraint.java | 4 +- .../constraints/VisibilityConstraint.java | 4 +- .../constraints/DefaultKeySizeConstraintTest.java | 1 + .../DeprecatedConstraintExtendTest.java | 97 ++++++++++++++++++++++ .../core/constraints/NoDeleteConstraintTest.java | 1 + .../VisibilityConstraintTest.java | 11 +-- .../constraints/DefaultKeySizeConstraintTest.java | 7 +- .../constraints/NoDeleteConstraintTest.java | 2 +- .../constraints}/VisibilityConstraintTest.java | 7 +- .../server/constraints/MetadataConstraints.java | 2 +- .../server/constraints/SystemEnvironment.java | 2 +- .../server/metadata/RootTabletMutatorImpl.java | 15 +++- .../accumulo/tserver/TservConstraintEnv.java | 21 +++-- .../tserver/constraints/ConstraintChecker.java | 20 ++++- .../tserver/constraints/SystemConstraint.java | 2 +- .../constraints/UnsatisfiableConstraint.java | 2 +- .../tserver/constraints/ConstraintCheckerTest.java | 34 ++++---- .../accumulo/shell/commands/ConstraintCommand.java | 2 +- .../shell/commands/CreateTableCommand.java | 2 +- .../apache/accumulo/test/TableOperationsIT.java | 2 +- .../test/constraints/AlphaNumKeyConstraint.java | 2 +- .../accumulo/test/constraints/MaxMutationSize.java | 2 +- .../test/constraints/NumericValueConstraint.java | 2 +- .../accumulo/test/functional/SlowConstraint.java | 2 +- 35 files changed, 252 insertions(+), 91 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 36d9dc6..e546886 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -206,6 +206,7 @@ <exclude>**/IdleRatioScanPrioritizerTest.java</exclude> <exclude>**/TestCfCqSlice.java</exclude> <exclude>**/TestCfCqSliceSeekingFilter.java</exclude> + <exclude>**/core/constraints/DefaultKeySizeConstraintTest.java</exclude> </excludes> </configuration> <executions> @@ -223,6 +224,7 @@ <include>**/IdleRatioScanPrioritizerTest.java</include> <include>**/TestCfCqSlice.java</include> <include>**/TestCfCqSliceSeekingFilter.java</include> + <exclude>**/core/constraints/DefaultKeySizeConstraintTest.java</exclude> </includes> </configuration> </execution> diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/NamespaceOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/NamespaceOperationsImpl.java index 126b977..979d891 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/NamespaceOperationsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/NamespaceOperationsImpl.java @@ -49,8 +49,8 @@ import org.apache.accumulo.core.client.admin.TableOperations; import org.apache.accumulo.core.clientImpl.thrift.SecurityErrorCode; import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException; import org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.NamespaceId; +import org.apache.accumulo.core.data.constraints.Constraint; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.manager.thrift.FateOperation; diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java index de64166..4b630e2 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java @@ -99,11 +99,11 @@ import org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException; import org.apache.accumulo.core.conf.AccumuloConfiguration; import org.apache.accumulo.core.conf.ConfigurationCopy; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.ByteSequence; import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.data.TabletId; +import org.apache.accumulo.core.data.constraints.Constraint; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.dataImpl.TabletIdImpl; import org.apache.accumulo.core.dataImpl.thrift.TRowRange; diff --git a/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java b/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java index 605e69f..4734739 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java @@ -33,9 +33,9 @@ import java.util.TreeMap; import org.apache.accumulo.core.classloader.ClassLoaderUtil; import org.apache.accumulo.core.client.IteratorSetting; -import org.apache.accumulo.core.constraints.DefaultKeySizeConstraint; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.data.constraints.DefaultKeySizeConstraint; import org.apache.accumulo.core.dataImpl.thrift.IterInfo; import org.apache.accumulo.core.iterators.IteratorEnvironment; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index f8490d8..30b9ce1 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -26,7 +26,7 @@ import java.util.HashSet; import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.classloader.ClassLoaderUtil; import org.apache.accumulo.core.client.security.tokens.PasswordToken; -import org.apache.accumulo.core.constraints.NoDeleteConstraint; +import org.apache.accumulo.core.data.constraints.NoDeleteConstraint; import org.apache.accumulo.core.file.rfile.RFile; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iteratorsImpl.system.DeletingIterator; diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java b/core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java index c6ff5f7..3414970 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java +++ b/core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java @@ -24,30 +24,22 @@ import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.security.AuthorizationContainer; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** - * Constraint objects are used to determine if mutations will be applied to a table. - * - * <p> - * This interface expects implementers to return violation codes. The reason codes are returned - * instead of arbitrary strings to encourage conciseness. Conciseness is needed because violations - * are aggregated. If a user sends a batch of 10,000 mutations to Accumulo, only aggregated counts - * about which violations occurred are returned. If the constraint implementer were allowed to - * return arbitrary violation strings like the following: - * - * <p> - * Value "abc" is not a number<br> - * Value "vbg" is not a number + * This class is replaced by {@link org.apache.accumulo.core.data.constraints.Constraint} * - * <p> - * This would not aggregate very well, because the same violation is represented with two different - * strings. + * @deprecated since 2.1.0 Use {@link org.apache.accumulo.core.data.constraints.Constraint} */ -public interface Constraint { +@Deprecated(since = "2.1.0") +@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_INTERFACE", + justification = "Same name used for compatibility during deprecation cycle") +public interface Constraint extends org.apache.accumulo.core.data.constraints.Constraint { /** * The environment within which a constraint exists. */ - interface Environment { + interface Environment extends org.apache.accumulo.core.data.constraints.Constraint.Environment { /** * Gets the key extent of the environment. * diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java b/core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java index 3550e96..6e92a78 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java @@ -24,10 +24,19 @@ import java.util.List; import org.apache.accumulo.core.data.ColumnUpdate; import org.apache.accumulo.core.data.Mutation; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * A constraints that limits the size of keys to 1mb. + * + * @deprecated since 2.1.0 Use + * {@link org.apache.accumulo.core.data.constraints.DefaultKeySizeConstraint} */ -public class DefaultKeySizeConstraint implements Constraint { +@Deprecated(since = "2.1.0") +@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", + justification = "Same name used for compatibility during deprecation cycle") +public class DefaultKeySizeConstraint extends + org.apache.accumulo.core.data.constraints.DefaultKeySizeConstraint implements Constraint { protected static final short MAX__KEY_SIZE_EXCEEDED_VIOLATION = 1; protected static final long maxSize = 1048576; // 1MB default size @@ -46,7 +55,7 @@ public class DefaultKeySizeConstraint implements Constraint { static final List<Short> NO_VIOLATIONS = new ArrayList<>(); @Override - public List<Short> check(Environment env, Mutation mutation) { + public List<Short> check(Constraint.Environment env, Mutation mutation) { // fast size check if (mutation.numBytes() < maxSize) diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java b/core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java index 27a0a41..eab748e 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java @@ -24,12 +24,19 @@ import java.util.List; import org.apache.accumulo.core.data.ColumnUpdate; import org.apache.accumulo.core.data.Mutation; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * This constraint ensures mutations do not have deletes. * * @since 2.0.0 + * @deprecated since 2.1.0 Use {@link org.apache.accumulo.core.data.constraints.NoDeleteConstraint} */ -public class NoDeleteConstraint implements Constraint { +@Deprecated(since = "2.1.0") +@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", + justification = "Same name used for compatibility during deprecation cycle") +public class NoDeleteConstraint extends org.apache.accumulo.core.data.constraints.NoDeleteConstraint + implements Constraint { @Override public String getViolationDescription(short violationCode) { @@ -40,14 +47,13 @@ public class NoDeleteConstraint implements Constraint { } @Override - public List<Short> check(Environment env, Mutation mutation) { + public List<Short> check(Constraint.Environment env, Mutation mutation) { List<ColumnUpdate> updates = mutation.getUpdates(); for (ColumnUpdate update : updates) { if (update.isDeleted()) { return Collections.singletonList((short) 1); } } - return null; } diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java b/core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java index bf11224..80e6392 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java @@ -31,6 +31,8 @@ import org.apache.accumulo.core.security.VisibilityEvaluator; import org.apache.accumulo.core.security.VisibilityParseException; import org.apache.accumulo.core.util.BadArgumentException; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * A constraint that checks the visibility of columns against the actor's authorizations. Violation * codes: @@ -38,8 +40,15 @@ import org.apache.accumulo.core.util.BadArgumentException; * <li>1 = failure to parse visibility expression</li> * <li>2 = insufficient authorization</li> * </ul> + * + * @deprecated since 2.1.0 Use + * {@link org.apache.accumulo.core.data.constraints.VisibilityConstraint} */ -public class VisibilityConstraint implements Constraint { +@Deprecated(since = "2.1.0") +@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", + justification = "Same name used for compatibility during deprecation cycle") +public class VisibilityConstraint + extends org.apache.accumulo.core.data.constraints.VisibilityConstraint implements Constraint { @Override public String getViolationDescription(short violationCode) { @@ -54,7 +63,7 @@ public class VisibilityConstraint implements Constraint { } @Override - public List<Short> check(Environment env, Mutation mutation) { + public List<Short> check(Constraint.Environment env, Mutation mutation) { List<ColumnUpdate> updates = mutation.getUpdates(); HashSet<String> ok = null; diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java b/core/src/main/java/org/apache/accumulo/core/data/constraints/Constraint.java similarity index 84% copy from core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java copy to core/src/main/java/org/apache/accumulo/core/data/constraints/Constraint.java index c6ff5f7..02068a4 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/Constraint.java +++ b/core/src/main/java/org/apache/accumulo/core/data/constraints/Constraint.java @@ -16,12 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.constraints; +package org.apache.accumulo.core.data.constraints; import java.util.List; import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.dataImpl.KeyExtent; +import org.apache.accumulo.core.data.TabletId; import org.apache.accumulo.core.security.AuthorizationContainer; /** @@ -41,19 +41,24 @@ import org.apache.accumulo.core.security.AuthorizationContainer; * <p> * This would not aggregate very well, because the same violation is represented with two different * strings. + * + * @since 2.1.0 Replaces interface in org.apache.accumulo.core.constraints package */ public interface Constraint { /** * The environment within which a constraint exists. + * + * @since 2.1.0 */ interface Environment { + /** - * Gets the key extent of the environment. + * Gets the tablet Id of the environment. * - * @return key extent + * @return TabletId */ - KeyExtent getExtent(); + TabletId getTablet(); /** * Gets the user within the environment. @@ -85,6 +90,10 @@ public interface Constraint { * * Violation codes must be non-negative. Negative violation codes are reserved for system use. * + * New API equivalent of + * {@link org.apache.accumulo.core.constraints.Constraint#check(org.apache.accumulo.core.constraints.Constraint.Environment, Mutation)} + * but renamed to prevent ambiguous method call errors. + * * @param env * constraint environment * @param mutation diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java b/core/src/main/java/org/apache/accumulo/core/data/constraints/DefaultKeySizeConstraint.java similarity index 94% copy from core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java copy to core/src/main/java/org/apache/accumulo/core/data/constraints/DefaultKeySizeConstraint.java index 3550e96..6c0ff8e 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/data/constraints/DefaultKeySizeConstraint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.constraints; +package org.apache.accumulo.core.data.constraints; import java.util.ArrayList; import java.util.List; @@ -26,6 +26,8 @@ import org.apache.accumulo.core.data.Mutation; /** * A constraints that limits the size of keys to 1mb. + * + * @since 2.1.0 moved from org.apache.accumulo.core.constraints package */ public class DefaultKeySizeConstraint implements Constraint { diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java b/core/src/main/java/org/apache/accumulo/core/data/constraints/NoDeleteConstraint.java similarity index 92% copy from core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java copy to core/src/main/java/org/apache/accumulo/core/data/constraints/NoDeleteConstraint.java index 27a0a41..7d219b4 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/NoDeleteConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/data/constraints/NoDeleteConstraint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.constraints; +package org.apache.accumulo.core.data.constraints; import java.util.Collections; import java.util.List; @@ -27,7 +27,7 @@ import org.apache.accumulo.core.data.Mutation; /** * This constraint ensures mutations do not have deletes. * - * @since 2.0.0 + * @since 2.1.0 moved from org.apache.accumulo.core.constraints package */ public class NoDeleteConstraint implements Constraint { diff --git a/core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java b/core/src/main/java/org/apache/accumulo/core/data/constraints/VisibilityConstraint.java similarity index 95% copy from core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java copy to core/src/main/java/org/apache/accumulo/core/data/constraints/VisibilityConstraint.java index bf11224..a4d75b1 100644 --- a/core/src/main/java/org/apache/accumulo/core/constraints/VisibilityConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/data/constraints/VisibilityConstraint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.constraints; +package org.apache.accumulo.core.data.constraints; import static java.nio.charset.StandardCharsets.UTF_8; @@ -38,6 +38,8 @@ import org.apache.accumulo.core.util.BadArgumentException; * <li>1 = failure to parse visibility expression</li> * <li>2 = insufficient authorization</li> * </ul> + * + * @since 2.1.0 moved from org.apache.accumulo.core.constraints package */ public class VisibilityConstraint implements Constraint { diff --git a/core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java b/core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java index 7e2a0e1..aa479f4 100644 --- a/core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java +++ b/core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java @@ -27,6 +27,7 @@ import org.apache.accumulo.core.data.Value; import org.apache.hadoop.io.Text; import org.junit.Test; +@SuppressWarnings("deprecation") public class DefaultKeySizeConstraintTest { Constraint constraint = new DefaultKeySizeConstraint(); diff --git a/core/src/test/java/org/apache/accumulo/core/constraints/DeprecatedConstraintExtendTest.java b/core/src/test/java/org/apache/accumulo/core/constraints/DeprecatedConstraintExtendTest.java new file mode 100644 index 0000000..aa7ef99 --- /dev/null +++ b/core/src/test/java/org/apache/accumulo/core/constraints/DeprecatedConstraintExtendTest.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.accumulo.core.constraints; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.List; + +import org.apache.accumulo.core.data.ColumnUpdate; +import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.Value; +import org.apache.hadoop.io.Text; +import org.junit.Test; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +/** + * This tests the case where a user extended a Constraint class before it was deprecated to make + * sure the old Constraint will still work with the API migration changes. + * + * @since 2.1.0 + */ +@SuppressWarnings("deprecation") +public class DeprecatedConstraintExtendTest { + + Constraint constraint = new MinKeySizeConstraint(); + + byte[] min = new byte[1024]; + byte[] oversized = new byte[1048577]; + + @Test + public void testMinKeySizeConstraint() { + + // pass constraints + Mutation m = new Mutation(min); + m.put("colf", "colq", new Value(new byte[] {})); + assertEquals(Collections.emptyList(), constraint.check(null, m)); + + // test with row id < 1KB + m = new Mutation("rowid"); + m.put("colf", "colq", new Value(new byte[] {})); + assertEquals(Collections.singletonList(MinKeySizeConstraint.MIN_KEY_SIZE_EXCEEDED_VIOLATION), + constraint.check(null, m)); + + // test with colf > 1mb + m = new Mutation("rowid"); + m.put(new Text(oversized), new Text("colq"), new Value(new byte[] {})); + assertEquals( + Collections.singletonList(DefaultKeySizeConstraint.MAX__KEY_SIZE_EXCEEDED_VIOLATION), + constraint.check(null, m)); + } + + /** + * Limit the size of 1mb but also a minimum of 1KB + */ + @SuppressFBWarnings(value = "NM_WRONG_PACKAGE", + justification = "Same name used for compatibility during deprecation cycle") + private static class MinKeySizeConstraint extends DefaultKeySizeConstraint { + protected static final short MIN_KEY_SIZE_EXCEEDED_VIOLATION = 2; + protected static final long minSize = 1024; // 1MB default size + + @Override + public List<Short> check(Constraint.Environment env, Mutation mutation) { + List<Short> violations = super.check(env, mutation); + if (!violations.isEmpty()) + return violations; + + for (ColumnUpdate cu : mutation.getUpdates()) { + int size = mutation.getRow().length; + size += cu.getColumnFamily().length; + size += cu.getColumnQualifier().length; + size += cu.getColumnVisibility().length; + + if (size < minSize) + violations.add(MIN_KEY_SIZE_EXCEEDED_VIOLATION); + } + return violations; + } + } +} diff --git a/core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java b/core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java index eb42f10..d1fafab 100644 --- a/core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java +++ b/core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java @@ -27,6 +27,7 @@ import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.Value; import org.junit.Test; +@SuppressWarnings("deprecation") public class NoDeleteConstraintTest { @Test diff --git a/core/src/test/java/org/apache/accumulo/core/security/VisibilityConstraintTest.java b/core/src/test/java/org/apache/accumulo/core/constraints/VisibilityConstraintTest.java similarity index 90% copy from core/src/test/java/org/apache/accumulo/core/security/VisibilityConstraintTest.java copy to core/src/test/java/org/apache/accumulo/core/constraints/VisibilityConstraintTest.java index 69678ae..d9b5964 100644 --- a/core/src/test/java/org/apache/accumulo/core/security/VisibilityConstraintTest.java +++ b/core/src/test/java/org/apache/accumulo/core/constraints/VisibilityConstraintTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.security; +package org.apache.accumulo.core.constraints; import static java.nio.charset.StandardCharsets.UTF_8; import static org.easymock.EasyMock.createMock; @@ -29,17 +29,18 @@ import static org.junit.Assert.assertNull; import java.util.Arrays; import java.util.List; -import org.apache.accumulo.core.constraints.Constraint.Environment; -import org.apache.accumulo.core.constraints.VisibilityConstraint; import org.apache.accumulo.core.data.ArrayByteSequence; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.security.AuthorizationContainer; +import org.apache.accumulo.core.security.ColumnVisibility; import org.junit.Before; import org.junit.Test; +@SuppressWarnings("deprecation") public class VisibilityConstraintTest { VisibilityConstraint vc; - Environment env; + Constraint.Environment env; Mutation mutation; static final ColumnVisibility good = new ColumnVisibility("good"); @@ -60,7 +61,7 @@ public class VisibilityConstraintTest { expect(ac.contains(bs)).andReturn(true); replay(ac); - env = createMock(Environment.class); + env = createMock(Constraint.Environment.class); expect(env.getAuthorizationsContainer()).andReturn(ac); replay(env); } diff --git a/core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java b/core/src/test/java/org/apache/accumulo/core/data/constraints/DefaultKeySizeConstraintTest.java similarity index 94% copy from core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java copy to core/src/test/java/org/apache/accumulo/core/data/constraints/DefaultKeySizeConstraintTest.java index 7e2a0e1..f7b9679 100644 --- a/core/src/test/java/org/apache/accumulo/core/constraints/DefaultKeySizeConstraintTest.java +++ b/core/src/test/java/org/apache/accumulo/core/data/constraints/DefaultKeySizeConstraintTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.constraints; +package org.apache.accumulo.core.data.constraints; import static org.junit.Assert.assertEquals; @@ -31,12 +31,11 @@ public class DefaultKeySizeConstraintTest { Constraint constraint = new DefaultKeySizeConstraint(); - byte[] oversized = new byte[1048577]; - byte[] large = new byte[419430]; + final private byte[] oversized = new byte[1048577]; + final private byte[] large = new byte[419430]; @Test public void testConstraint() { - // pass constraints Mutation m = new Mutation("rowId"); m.put("colf", "colq", new Value(new byte[] {})); diff --git a/core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java b/core/src/test/java/org/apache/accumulo/core/data/constraints/NoDeleteConstraintTest.java similarity index 96% copy from core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java copy to core/src/test/java/org/apache/accumulo/core/data/constraints/NoDeleteConstraintTest.java index eb42f10..0523874 100644 --- a/core/src/test/java/org/apache/accumulo/core/constraints/NoDeleteConstraintTest.java +++ b/core/src/test/java/org/apache/accumulo/core/data/constraints/NoDeleteConstraintTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.constraints; +package org.apache.accumulo.core.data.constraints; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; diff --git a/core/src/test/java/org/apache/accumulo/core/security/VisibilityConstraintTest.java b/core/src/test/java/org/apache/accumulo/core/data/constraints/VisibilityConstraintTest.java similarity index 92% rename from core/src/test/java/org/apache/accumulo/core/security/VisibilityConstraintTest.java rename to core/src/test/java/org/apache/accumulo/core/data/constraints/VisibilityConstraintTest.java index 69678ae..893f0ae 100644 --- a/core/src/test/java/org/apache/accumulo/core/security/VisibilityConstraintTest.java +++ b/core/src/test/java/org/apache/accumulo/core/data/constraints/VisibilityConstraintTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.accumulo.core.security; +package org.apache.accumulo.core.data.constraints; import static java.nio.charset.StandardCharsets.UTF_8; import static org.easymock.EasyMock.createMock; @@ -29,10 +29,11 @@ import static org.junit.Assert.assertNull; import java.util.Arrays; import java.util.List; -import org.apache.accumulo.core.constraints.Constraint.Environment; -import org.apache.accumulo.core.constraints.VisibilityConstraint; import org.apache.accumulo.core.data.ArrayByteSequence; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.constraints.Constraint.Environment; +import org.apache.accumulo.core.security.AuthorizationContainer; +import org.apache.accumulo.core.security.ColumnVisibility; import org.junit.Before; import org.junit.Test; diff --git a/server/base/src/main/java/org/apache/accumulo/server/constraints/MetadataConstraints.java b/server/base/src/main/java/org/apache/accumulo/server/constraints/MetadataConstraints.java index 1476430..7d7fdf5 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/constraints/MetadataConstraints.java +++ b/server/base/src/main/java/org/apache/accumulo/server/constraints/MetadataConstraints.java @@ -28,10 +28,10 @@ import java.util.List; import java.util.Objects; import org.apache.accumulo.core.Constants; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.ColumnUpdate; import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.data.constraints.Constraint; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.metadata.MetadataTable; import org.apache.accumulo.core.metadata.schema.DataFileValue; diff --git a/server/base/src/main/java/org/apache/accumulo/server/constraints/SystemEnvironment.java b/server/base/src/main/java/org/apache/accumulo/server/constraints/SystemEnvironment.java index fc97dee..37b673a 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/constraints/SystemEnvironment.java +++ b/server/base/src/main/java/org/apache/accumulo/server/constraints/SystemEnvironment.java @@ -18,7 +18,7 @@ */ package org.apache.accumulo.server.constraints; -import org.apache.accumulo.core.constraints.Constraint; +import org.apache.accumulo.core.data.constraints.Constraint; import org.apache.accumulo.server.ServerContext; public interface SystemEnvironment extends Constraint.Environment { diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index a28bda6..c0ea220 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -23,7 +23,9 @@ import static java.nio.charset.StandardCharsets.UTF_8; import java.util.List; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.TabletId; import org.apache.accumulo.core.dataImpl.KeyExtent; +import org.apache.accumulo.core.dataImpl.TabletIdImpl; import org.apache.accumulo.core.metadata.RootTable; import org.apache.accumulo.core.metadata.schema.Ample; import org.apache.accumulo.core.metadata.schema.RootTabletMetadata; @@ -35,13 +37,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RootTabletMutatorImpl extends TabletMutatorBase implements Ample.TabletMutator { - private ServerContext context; + private final ServerContext context; private static final Logger log = LoggerFactory.getLogger(RootTabletMutatorImpl.class); - private static class RootEnv implements SystemEnvironment { + @SuppressWarnings("deprecation") + private static class RootEnv + implements SystemEnvironment, org.apache.accumulo.core.constraints.Constraint.Environment { - private ServerContext ctx; + private final ServerContext ctx; RootEnv(ServerContext ctx) { this.ctx = ctx; @@ -53,6 +57,11 @@ public class RootTabletMutatorImpl extends TabletMutatorBase implements Ample.Ta } @Override + public TabletId getTablet() { + return new TabletIdImpl(RootTable.EXTENT); + } + + @Override public String getUser() { throw new UnsupportedOperationException(); } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/TservConstraintEnv.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/TservConstraintEnv.java index cbbc1e6..8c0f771 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/TservConstraintEnv.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/TservConstraintEnv.java @@ -21,15 +21,18 @@ package org.apache.accumulo.tserver; import java.nio.ByteBuffer; import java.util.Collections; -import org.apache.accumulo.core.data.ByteSequence; +import org.apache.accumulo.core.data.TabletId; import org.apache.accumulo.core.dataImpl.KeyExtent; +import org.apache.accumulo.core.dataImpl.TabletIdImpl; import org.apache.accumulo.core.security.AuthorizationContainer; import org.apache.accumulo.core.securityImpl.thrift.TCredentials; import org.apache.accumulo.server.ServerContext; import org.apache.accumulo.server.constraints.SystemEnvironment; import org.apache.accumulo.server.security.SecurityOperation; -public class TservConstraintEnv implements SystemEnvironment { +@SuppressWarnings("deprecation") +public class TservConstraintEnv + implements SystemEnvironment, org.apache.accumulo.core.constraints.Constraint.Environment { private final ServerContext context; private final TCredentials credentials; @@ -52,19 +55,19 @@ public class TservConstraintEnv implements SystemEnvironment { } @Override + public TabletId getTablet() { + return new TabletIdImpl(ke); + } + + @Override public String getUser() { return credentials.getPrincipal(); } @Override public AuthorizationContainer getAuthorizationsContainer() { - return new AuthorizationContainer() { - @Override - public boolean contains(ByteSequence auth) { - return security.authenticatedUserHasAuthorizations(credentials, Collections - .singletonList(ByteBuffer.wrap(auth.getBackingArray(), auth.offset(), auth.length()))); - } - }; + return auth -> security.authenticatedUserHasAuthorizations(credentials, Collections + .singletonList(ByteBuffer.wrap(auth.getBackingArray(), auth.offset(), auth.length()))); } @Override diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/ConstraintChecker.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/ConstraintChecker.java index 3acd4a8..cbc1ab7 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/ConstraintChecker.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/ConstraintChecker.java @@ -25,13 +25,15 @@ import java.util.Map.Entry; import org.apache.accumulo.core.classloader.ClassLoaderUtil; import org.apache.accumulo.core.conf.AccumuloConfiguration; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.constraints.Constraint; -import org.apache.accumulo.core.constraints.Constraint.Environment; import org.apache.accumulo.core.constraints.Violations; import org.apache.accumulo.core.data.ConstraintViolationSummary; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.TabletId; +import org.apache.accumulo.core.data.constraints.Constraint; +import org.apache.accumulo.core.data.constraints.Constraint.Environment; import org.apache.accumulo.core.dataImpl.ComparableBytes; import org.apache.accumulo.server.conf.TableConfiguration; +import org.apache.hadoop.io.BinaryComparable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -84,7 +86,7 @@ public class ConstraintChecker { } public Violations check(Environment env, Mutation m) { - if (!env.getExtent().contains(new ComparableBytes(m.getRow()))) { + if (!tabletContains(env.getTablet(), new ComparableBytes(m.getRow()))) { Violations violations = new Violations(); ConstraintViolationSummary cvs = new ConstraintViolationSummary( @@ -136,4 +138,16 @@ public class ConstraintChecker { return violations; } + + /** + * Return true if the tablet contains the row. This is similar to the contains in KeyExtent + */ + public boolean tabletContains(TabletId tablet, BinaryComparable row) { + if (row == null) { + throw new IllegalArgumentException( + "Passing null to contains is ambiguous, could be in first or last extent of table"); + } + return (tablet.getPrevEndRow() == null || tablet.getPrevEndRow().compareTo(row) < 0) + && (tablet.getEndRow() == null || tablet.getEndRow().compareTo(row) >= 0); + } } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/SystemConstraint.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/SystemConstraint.java index 813054e..daedd70 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/SystemConstraint.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/SystemConstraint.java @@ -18,6 +18,6 @@ */ package org.apache.accumulo.tserver.constraints; -import org.apache.accumulo.core.constraints.Constraint; +import org.apache.accumulo.core.data.constraints.Constraint; public abstract class SystemConstraint implements Constraint {} diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/UnsatisfiableConstraint.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/UnsatisfiableConstraint.java index 8354967..d9c96d7 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/UnsatisfiableConstraint.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/constraints/UnsatisfiableConstraint.java @@ -21,8 +21,8 @@ package org.apache.accumulo.tserver.constraints; import java.util.Collections; import java.util.List; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.constraints.Constraint; public class UnsatisfiableConstraint implements Constraint { diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/constraints/ConstraintCheckerTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/constraints/ConstraintCheckerTest.java index ba4e718..e6f9c82 100644 --- a/server/tserver/src/test/java/org/apache/accumulo/tserver/constraints/ConstraintCheckerTest.java +++ b/server/tserver/src/test/java/org/apache/accumulo/tserver/constraints/ConstraintCheckerTest.java @@ -18,7 +18,7 @@ */ package org.apache.accumulo.tserver.constraints; -import static org.easymock.EasyMock.anyObject; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createMockBuilder; import static org.easymock.EasyMock.expect; @@ -31,12 +31,12 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.accumulo.core.constraints.Constraint; -import org.apache.accumulo.core.constraints.Constraint.Environment; import org.apache.accumulo.core.data.ConstraintViolationSummary; import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.dataImpl.KeyExtent; -import org.apache.hadoop.io.BinaryComparable; +import org.apache.accumulo.core.data.TabletId; +import org.apache.accumulo.core.data.constraints.Constraint; +import org.apache.accumulo.core.data.constraints.Constraint.Environment; +import org.apache.hadoop.io.Text; import org.junit.Before; import org.junit.Test; @@ -47,8 +47,9 @@ public class ConstraintCheckerTest { private ConstraintChecker cc; private ArrayList<Constraint> constraints; private Environment env; - private KeyExtent extent; + private TabletId tabletId; private Mutation m; + private Mutation m2; @Before public void setup() throws SecurityException { @@ -57,10 +58,15 @@ public class ConstraintCheckerTest { expect(cc.getConstraints()).andReturn(constraints); env = createMock(Environment.class); - extent = createMock(KeyExtent.class); - expect(env.getExtent()).andReturn(extent); + tabletId = createMock(TabletId.class); + expect(env.getTablet()).andReturn(tabletId); m = createMock(Mutation.class); + m2 = createMock(Mutation.class); + expect(tabletId.getEndRow()).andReturn(new Text("d")).anyTimes(); + expect(tabletId.getPrevEndRow()).andReturn(new Text("a")).anyTimes(); + expect(m.getRow()).andReturn("b".getBytes(UTF_8)).anyTimes(); + expect(m2.getRow()).andReturn("z".getBytes(UTF_8)).anyTimes(); } private Constraint makeSuccessConstraint() { @@ -83,9 +89,10 @@ public class ConstraintCheckerTest { } private void replayAll() { - replay(extent); + replay(tabletId); replay(env); replay(cc); + replay(m); } private Constraint makeExceptionConstraint() { @@ -97,23 +104,21 @@ public class ConstraintCheckerTest { @Test public void testCheckAllOK() { - expect(extent.contains(anyObject(BinaryComparable.class))).andReturn(true); replayAll(); constraints.add(makeSuccessConstraint()); assertNull(cc.check(env, m)); } @Test - public void testCheckMutationOutsideKeyExtent() { - expect(extent.contains(anyObject(BinaryComparable.class))).andReturn(false); + public void testCheckMutationOutsideTablet() { replayAll(); - ConstraintViolationSummary cvs = Iterables.getOnlyElement(cc.check(env, m).asList()); + replay(m2); + ConstraintViolationSummary cvs = Iterables.getOnlyElement(cc.check(env, m2).asList()); assertEquals(SystemConstraint.class.getName(), cvs.getConstrainClass()); } @Test public void testCheckFailure() { - expect(extent.contains(anyObject(BinaryComparable.class))).andReturn(true); replayAll(); constraints.add(makeFailureConstraint()); List<ConstraintViolationSummary> cvsList = cc.check(env, m).asList(); @@ -127,7 +132,6 @@ public class ConstraintCheckerTest { @Test public void testCheckException() { - expect(extent.contains(anyObject(BinaryComparable.class))).andReturn(true); replayAll(); constraints.add(makeExceptionConstraint()); ConstraintViolationSummary cvs = Iterables.getOnlyElement(cc.check(env, m).asList()); diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/ConstraintCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/ConstraintCommand.java index e4f3a58..4edfd4e 100644 --- a/shell/src/main/java/org/apache/accumulo/shell/commands/ConstraintCommand.java +++ b/shell/src/main/java/org/apache/accumulo/shell/commands/ConstraintCommand.java @@ -20,7 +20,7 @@ package org.apache.accumulo.shell.commands; import java.util.Map.Entry; -import org.apache.accumulo.core.constraints.Constraint; +import org.apache.accumulo.core.data.constraints.Constraint; import org.apache.accumulo.shell.Shell; import org.apache.accumulo.shell.Shell.Command; import org.apache.accumulo.shell.ShellCommandException; diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java index d25884a..803635d 100644 --- a/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java +++ b/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java @@ -39,7 +39,7 @@ import org.apache.accumulo.core.client.admin.TimeType; import org.apache.accumulo.core.clientImpl.Tables; import org.apache.accumulo.core.conf.IterConfigUtil; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.constraints.VisibilityConstraint; +import org.apache.accumulo.core.data.constraints.VisibilityConstraint; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.shell.Shell; import org.apache.accumulo.shell.Shell.Command; diff --git a/test/src/main/java/org/apache/accumulo/test/TableOperationsIT.java b/test/src/main/java/org/apache/accumulo/test/TableOperationsIT.java index 47c4126..89e3ddd 100644 --- a/test/src/main/java/org/apache/accumulo/test/TableOperationsIT.java +++ b/test/src/main/java/org/apache/accumulo/test/TableOperationsIT.java @@ -53,11 +53,11 @@ import org.apache.accumulo.core.client.admin.DiskUsage; import org.apache.accumulo.core.client.admin.TableOperations; import org.apache.accumulo.core.clientImpl.ClientContext; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.constraints.DefaultKeySizeConstraint; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.PartialKey; import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.data.constraints.DefaultKeySizeConstraint; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.core.security.TablePermission; import org.apache.accumulo.harness.AccumuloClusterHarness; diff --git a/test/src/main/java/org/apache/accumulo/test/constraints/AlphaNumKeyConstraint.java b/test/src/main/java/org/apache/accumulo/test/constraints/AlphaNumKeyConstraint.java index eb09c65..e88d781 100644 --- a/test/src/main/java/org/apache/accumulo/test/constraints/AlphaNumKeyConstraint.java +++ b/test/src/main/java/org/apache/accumulo/test/constraints/AlphaNumKeyConstraint.java @@ -24,9 +24,9 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.ColumnUpdate; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.constraints.Constraint; /** * This class is an accumulo constraint that ensures all fields of a key are alpha numeric. diff --git a/test/src/main/java/org/apache/accumulo/test/constraints/MaxMutationSize.java b/test/src/main/java/org/apache/accumulo/test/constraints/MaxMutationSize.java index a1d88d0..a9c9d89 100644 --- a/test/src/main/java/org/apache/accumulo/test/constraints/MaxMutationSize.java +++ b/test/src/main/java/org/apache/accumulo/test/constraints/MaxMutationSize.java @@ -21,8 +21,8 @@ package org.apache.accumulo.test.constraints; import java.util.Collections; import java.util.List; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.constraints.Constraint; /** * Ensure that mutations are a reasonable size: we must be able to fit several in memory at a time. diff --git a/test/src/main/java/org/apache/accumulo/test/constraints/NumericValueConstraint.java b/test/src/main/java/org/apache/accumulo/test/constraints/NumericValueConstraint.java index b459f9e..e1b2af7 100644 --- a/test/src/main/java/org/apache/accumulo/test/constraints/NumericValueConstraint.java +++ b/test/src/main/java/org/apache/accumulo/test/constraints/NumericValueConstraint.java @@ -23,9 +23,9 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.ColumnUpdate; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.constraints.Constraint; /** * This class is an accumulo constraint that ensures values are numeric strings. diff --git a/test/src/main/java/org/apache/accumulo/test/functional/SlowConstraint.java b/test/src/main/java/org/apache/accumulo/test/functional/SlowConstraint.java index 1fe9335..d86ea1c 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/SlowConstraint.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/SlowConstraint.java @@ -23,8 +23,8 @@ import static org.apache.accumulo.fate.util.UtilWaitThread.sleepUninterruptibly; import java.util.List; import java.util.concurrent.TimeUnit; -import org.apache.accumulo.core.constraints.Constraint; import org.apache.accumulo.core.data.Mutation; +import org.apache.accumulo.core.data.constraints.Constraint; public class SlowConstraint implements Constraint {