You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by dg...@apache.org on 2003/06/07 20:31:18 UTC

cvs commit: jakarta-commons/validator/src/share/org/apache/commons/validator CreditCardValidator.java

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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org