Author: angela
Date: Mon Feb 9 17:35:18 2015
New Revision: 1658480
URL: http://svn.apache.org/r1658480
Log:
OAK-2491 : Improve OAK-2465 avoiding ArithmeticException altogether
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryProviderImpl.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryProviderImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryProviderImpl.java?rev=1658480&r1=1658479&r2=1658480&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryProviderImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryProviderImpl.java
Mon Feb 9 17:35:18 2015
@@ -24,19 +24,14 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
-
import javax.annotation.Nonnull;
import com.google.common.base.Strings;
import com.google.common.collect.Iterators;
-import com.google.common.math.LongMath;
-
import org.apache.jackrabbit.commons.iterator.AbstractLazyIterator;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
import
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
class PermissionEntryProviderImpl implements PermissionEntryProvider {
@@ -44,8 +39,6 @@ class PermissionEntryProviderImpl implem
private static final long DEFAULT_SIZE = 250;
- private static final Logger log =
LoggerFactory.getLogger(PermissionEntryProviderImpl.class);
-
/**
* The set of principal names for which this {@code
PermissionEntryProvider}
* has been created.
@@ -102,12 +95,7 @@ class PermissionEntryProviderImpl implem
if (Long.MAX_VALUE == n) {
cnt = Long.MAX_VALUE;
} else {
- try {
- cnt = LongMath.checkedAdd(cnt, n);
- } catch (ArithmeticException ae) {
- log.warn("Long overflow while calculate the total
number of permission entries");
- cnt = Long.MAX_VALUE;
- }
+ cnt = safeAdd(cnt, n);
}
}
}
@@ -173,6 +161,25 @@ class PermissionEntryProviderImpl implem
return ret;
}
+ /**
+ * Sums {@code a} and {@code b} and verifies that it doesn't overflow in
+ * signed long arithmetic, in which case {@link Long#MAX_VALUE} will be
+ * returned instead of the result.
+ *
+ * Note: this method is a variant of {@link
com.google.common.math.LongMath#checkedAdd(long, long)}
+ * that returns {@link Long#MAX_VALUE} instead of throwing {@code
ArithmeticException}.
+ *
+ * @see com.google.common.math.LongMath#checkedAdd(long, long)
+ */
+ private static long safeAdd(long a, long b) {
+ long result = a + b;
+ if ((a ^ b) < 0 | (a ^ result) >= 0) {
+ return result;
+ } else {
+ return Long.MAX_VALUE;
+ }
+ }
+
private final class EntryIterator extends
AbstractLazyIterator<PermissionEntry> {
private final EntryPredicate predicate;