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;


Reply via email to