You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2017/02/13 10:55:52 UTC

svn commit: r1782740 - in /commons/proper/validator/trunk/src: main/java/org/apache/commons/validator/routines/CreditCardValidator.java test/java/org/apache/commons/validator/routines/CreditCardValidatorTest.java

Author: sebb
Date: Mon Feb 13 10:55:52 2017
New Revision: 1782740

URL: http://svn.apache.org/viewvc?rev=1782740&view=rev
Log:
VALIDATOR-415 Extend syntax to allow disjoint lengths

Modified:
    commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/CreditCardValidator.java
    commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/CreditCardValidatorTest.java

Modified: commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/CreditCardValidator.java
URL: http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/CreditCardValidator.java?rev=1782740&r1=1782739&r2=1782740&view=diff
==============================================================================
--- commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/CreditCardValidator.java (original)
+++ commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/CreditCardValidator.java Mon Feb 13 10:55:52 2017
@@ -64,6 +64,7 @@ import java.util.ArrayList;
  *        new CreditCardRange("3095", null, 14, 14), // Diners
  *        new CreditCardRange("36",   null, 14, 14), // Diners
  *        new CreditCardRange("38",   "39", 14, 14), // Diners
+ *        new CreditCardRange("4",    null, new int[] {13, 16}), // VISA
  *    }
  * );
  * </code>
@@ -88,13 +89,15 @@ public class CreditCardValidator impleme
     private static final int MAX_CC_LENGTH = 19; // maximum allowed length
 
     /**
-     * Class that represents a credit card range. 
+     * Class that represents a credit card range.
+     * @since 1.6
      */
     public static class CreditCardRange {
         final String low; // e.g. 34 or 644
         final String high; // e.g. 34 or 65
-        final int minLen; // e.g. 16
-        final int maxLen; // e.g. 19
+        final int minLen; // e.g. 16 or -1
+        final int maxLen; // e.g. 19 or -1
+        final int lengths[]; // e.g. 16,18,19
 
         /**
          * Create a credit card range specifier for use in validation
@@ -117,6 +120,30 @@ public class CreditCardValidator impleme
             this.high = high;
             this.minLen = minLen;
             this.maxLen = maxLen;
+            this.lengths = null;
+        }
+
+        /**
+         * Create a credit card range specifier for use in validation
+         * of the number syntax including the IIN range.
+         * <p>
+         * The low and high parameters may be shorter than the length
+         * of an IIN (currently 6 digits) in which case subsequent digits
+         * are ignored and may range from 0-9.
+         * <br>
+         * The low and high parameters may be different lengths.
+         * e.g. Discover "644" and "65".
+         * </p>
+         * @param low the low digits of the IIN range 
+         * @param high the high digits of the IIN range
+         * @param lengths array of valid lengths
+         */
+        public CreditCardRange(String low, String high, int [] lengths) {
+            this.low = low;
+            this.high = high;
+            this.minLen = -1;
+            this.maxLen = -1;
+            this.lengths = lengths.clone();
         }
     }
 
@@ -422,6 +449,19 @@ public class CreditCardValidator impleme
     }
 
     // package protected for unit test access
+    static boolean validLength(int valueLength, CreditCardRange range) {
+        if (range.lengths != null) {
+            for(int length : range.lengths) {
+                if (valueLength == length) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        return valueLength >= range.minLen && valueLength <= range.maxLen;
+    }
+
+    // package protected for unit test access
     static CodeValidator createRangeValidator(final CreditCardRange[] creditCardRanges, final CheckDigit digitCheck ) {
         return new CodeValidator(
                 // must be numeric (rest of validation is done later)
@@ -434,7 +474,7 @@ public class CreditCardValidator impleme
                         if (super.match(value) != null) {
                             int length = value.length();
                             for(CreditCardRange range : ccr) {
-                                if (length >= range.minLen && length <= range.maxLen) {
+                                if (validLength(length, range)) {
                                     if (range.high == null) { // single prefix only
                                         if (value.startsWith(range.low)) {
                                             return value;

Modified: commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/CreditCardValidatorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/CreditCardValidatorTest.java?rev=1782740&r1=1782739&r2=1782740&view=diff
==============================================================================
--- commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/CreditCardValidatorTest.java (original)
+++ commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/CreditCardValidatorTest.java Mon Feb 13 10:55:52 2017
@@ -27,23 +27,23 @@ import org.apache.commons.validator.rout
  */
 public class CreditCardValidatorTest extends TestCase {
     
-    private static final String VALID_VISA = "4417123456789113";
-    private static final String ERROR_VISA = "4417123456789112";
-    private static final String VALID_SHORT_VISA = "4222222222222";
+    private static final String VALID_VISA       = "4417123456789113"; // 16
+    private static final String ERROR_VISA       = "4417123456789112"; 
+    private static final String VALID_SHORT_VISA = "4222222222222"; // 13
     private static final String ERROR_SHORT_VISA = "4222222222229";
-    private static final String VALID_AMEX = "378282246310005";
-    private static final String ERROR_AMEX = "378282246310001";
+    private static final String VALID_AMEX       = "378282246310005"; // 15
+    private static final String ERROR_AMEX       = "378282246310001";
     private static final String VALID_MASTERCARD = "5105105105105100";
     private static final String ERROR_MASTERCARD = "5105105105105105";
-    private static final String VALID_DISCOVER = "6011000990139424";
-    private static final String ERROR_DISCOVER = "6011000990139421";
+    private static final String VALID_DISCOVER   = "6011000990139424";
+    private static final String ERROR_DISCOVER   = "6011000990139421";
     private static final String VALID_DISCOVER65 = "6534567890123458"; // FIXME need verified test data for Discover with "65" prefix
     private static final String ERROR_DISCOVER65 = "6534567890123450"; // FIXME need verified test data for Discover with "65" prefix
-    private static final String VALID_DINERS = "30569309025904";
-    private static final String ERROR_DINERS = "30569309025901";
-    private static final String VALID_VPAY = "4370000000000061";
-    private static final String VALID_VPAY2 = "4370000000000012";
-    private static final String ERROR_VPAY = "4370000000000069";
+    private static final String VALID_DINERS     = "30569309025904"; // 14
+    private static final String ERROR_DINERS     = "30569309025901";
+    private static final String VALID_VPAY       = "4370000000000061"; // 16
+    private static final String VALID_VPAY2      = "4370000000000012";
+    private static final String ERROR_VPAY       = "4370000000000069";
 
     private static final String [] VALID_CARDS = {
         VALID_VISA,
@@ -606,4 +606,45 @@ public class CreditCardValidatorTest ext
             assertFalse(s, ccv.isValid(s));
         }
     }
+
+    public void testValidLength() {
+        assertTrue(CreditCardValidator.validLength(14, new CreditCardRange("", "", 14, 14)));
+        assertFalse(CreditCardValidator.validLength(15, new CreditCardRange("", "", 14, 14)));
+        assertFalse(CreditCardValidator.validLength(13, new CreditCardRange("", "", 14, 14)));
+
+        assertFalse(CreditCardValidator.validLength(14, new CreditCardRange("", "", 15, 17)));
+        assertTrue(CreditCardValidator.validLength(15, new CreditCardRange("", "", 15, 17)));
+        assertTrue(CreditCardValidator.validLength(16, new CreditCardRange("", "", 15, 17)));
+        assertTrue(CreditCardValidator.validLength(17, new CreditCardRange("", "", 15, 17)));
+        assertFalse(CreditCardValidator.validLength(18, new CreditCardRange("", "", 15, 17)));
+
+        assertFalse(CreditCardValidator.validLength(14, new CreditCardRange("", "", new int[]{15, 17})));
+        assertTrue(CreditCardValidator.validLength(15, new CreditCardRange("", "", new int[]{15, 17})));
+        assertFalse(CreditCardValidator.validLength(16, new CreditCardRange("", "", new int[]{15, 17})));
+        assertTrue(CreditCardValidator.validLength(17, new CreditCardRange("", "", new int[]{15, 17})));
+        assertFalse(CreditCardValidator.validLength(18, new CreditCardRange("", "", new int[]{15, 17})));
+    }
+
+    public void testDisjointRange() {
+        CreditCardValidator ccv = new CreditCardValidator(
+            new CreditCardRange[]{
+                    new CreditCardRange("305", "4", new int[]{13, 16}),
+                }
+            );
+        assertEquals(13, VALID_SHORT_VISA.length());
+        assertEquals(16, VALID_VISA.length());
+        assertEquals(14, VALID_DINERS.length());
+        assertTrue(ccv.isValid(VALID_SHORT_VISA));
+        assertTrue(ccv.isValid(VALID_VISA));
+        assertFalse(ccv.isValid(ERROR_SHORT_VISA));
+        assertFalse(ccv.isValid(ERROR_VISA));
+        assertFalse(ccv.isValid(VALID_DINERS));
+        ccv = new CreditCardValidator(
+            new CreditCardRange[]{
+                    // add 14 as a valid length
+                    new CreditCardRange("305", "4", new int[]{13, 14, 16}),
+                }
+            );
+        assertTrue(ccv.isValid(VALID_DINERS));
+    }
 }