dgraham     2003/06/07 11:31:18

  Modified:    validator/src/share/org/apache/commons/validator
                        CreditCardValidator.java
  Log:
  Refactored prefix checking into card specific methods.
  
  Revision  Changes    Path
  1.5       +73 -47    
jakarta-commons/validator/src/share/org/apache/commons/validator/CreditCardValidator.java
  
  Index: CreditCardValidator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/validator/src/share/org/apache/commons/validator/CreditCardValidator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CreditCardValidator.java  1 May 2003 02:15:16 -0000       1.4
  +++ CreditCardValidator.java  7 Jun 2003 18:31:18 -0000       1.5
  @@ -77,10 +77,10 @@
    */
   public class CreditCardValidator {
   
  -     private static final String AX_PREFIX = "34,37,";
  -     private static final String VS_PREFIX = "4";
  -     private static final String MC_PREFIX = "51,52,53,54,55,";
  -     private static final String DS_PREFIX = "6011";
  +     private static final String AMEX_PREFIX = "34,37,";
  +     private static final String VISA_PREFIX = "4";
  +     private static final String MASTERCARD_PREFIX = "51,52,53,54,55,";
  +     private static final String DISCOVER_PREFIX = "6011";
   
        /**
         * Singleton instance of this class.
  @@ -104,13 +104,26 @@
   
        /**
         * Checks if the field is a valid credit card number.
  -      *
  -      * @param value The value validation is being performed on.
  +      * @param card The card number to validate.
         */
  -     public boolean isValid(String value) {
  -             return (
  -                     this.validateCreditCardLuhnCheck(value)
  -                             && this.validateCreditCardPrefixCheck(value));
  +     public boolean isValid(String card) {
  +             if (card.length() < 13) {
  +                     return false;
  +             }
  +
  +             if (!this.luhnCheck(card)) {
  +                     return false;
  +             }
  +
  +             if (this.isVisa(card)
  +                     || this.isAmex(card)
  +                     || this.isMastercard(card)
  +                     || this.isDiscover(card)) {
  +
  +                     return true;
  +             }
  +
  +             return false;
        }
   
        /**
  @@ -118,7 +131,7 @@
         *
         * @param cardNumber Credit Card Number.
         */
  -     protected boolean validateCreditCardLuhnCheck(String cardNumber) {
  +     protected boolean luhnCheck(String cardNumber) {
                // number must be validated as 0..9 numeric first!!
                int digits = cardNumber.length();
                int oddoeven = digits & 1;
  @@ -131,6 +144,7 @@
                        } catch (NumberFormatException e) {
                                return false;
                        }
  +
                        if (((count & 1) ^ oddoeven) == 0) { // not
                                digit *= 2;
                                if (digit > 9) {
  @@ -139,6 +153,7 @@
                        }
                        sum += digit;
                }
  +
                if (sum == 0) {
                        return false;
                }
  @@ -152,47 +167,58 @@
   
        /**
         * Checks for a valid credit card number.
  -      *
  -      * @param cardNumber Credit Card Number.
  +      * @param card Credit Card Number.
  +      * @deprecated This will be removed in a future release.
         */
  -     protected boolean validateCreditCardPrefixCheck(String cardNumber) {
  +     protected boolean isValidPrefix(String card) {
   
  -             int length = cardNumber.length();
  -             if (length < 13) {
  +             if (card.length() < 13) {
                        return false;
                }
   
  -             int cardType = 0;
  +             return (
  +                     this.isVisa(card)
  +                             || this.isAmex(card)
  +                             || this.isMastercard(card)
  +                             || this.isDiscover(card));
  +     }
   
  -             final String prefix2 = cardNumber.substring(0, 2) + ",";
  +     /**
  +      * Returns true if the card is American Express.
  +      */
  +     private boolean isAmex(String card) {
  +             String prefix2 = card.substring(0, 2) + ",";
   
  -             if (AX_PREFIX.indexOf(prefix2) != -1) {
  -                     cardType = 3;
  -             } 
  -             if (cardNumber.substring(0, 1).equals(VS_PREFIX)) {
  -                     cardType = 4;
  -             }
  -             if (MC_PREFIX.indexOf(prefix2) != -1) {
  -                     cardType = 5;
  -             }
  -             if (cardNumber.substring(0, 4).equals(DS_PREFIX)) {
  -                     cardType = 6;
  -             }
  +             return ((AMEX_PREFIX.indexOf(prefix2) != -1) && (card.length() == 15));
  +     }
   
  -             if ((cardType == 3) && (length == 15)) {
  -                     return true;
  -             }
  -             if ((cardType == 4) && ((length == 13) || (length == 16))) {
  -                     return true;
  -             }
  -             if ((cardType == 5) && (length == 16)) {
  -                     return true;
  -             }
  -             if ((cardType == 6) && (length == 16)) {
  -                     return true;
  -             }
  +     /**
  +      * Returns true if the card is Visa.
  +      */
  +     private boolean isVisa(String card) {
  +             return (
  +                     card.substring(0, 1).equals(VISA_PREFIX)
  +                             && (card.length() == 13 || card.length() == 16));
  +     }
   
  -             return false;
  +     /**
  +      * Returns true if the card is Mastercard.
  +      */
  +     private boolean isMastercard(String card) {
  +             String prefix2 = card.substring(0, 2) + ",";
  +
  +             return (
  +                     (MASTERCARD_PREFIX.indexOf(prefix2) != -1)
  +                             && (card.length() == 16));
  +     }
  +
  +     /**
  +      * Returns true if the card is Discover.
  +      */
  +     private boolean isDiscover(String card) {
  +             return (
  +                     card.substring(0, 4).equals(DISCOVER_PREFIX)
  +                             && (card.length() == 16));
        }
   
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to