/* * Copyright (C) 2010 Pete Reisinger <p.reisinger@gmail.com>. * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package paypalnvp.util; import java.io.Serializable; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Validates common paypal fields. The class is used directly by paypal classes so you can use it * for validation before setting certain values in paypal requests or fields. * * @author Pete Reisinger * <p.reisinger@gmail.com> */ @SuppressWarnings("serial") public final class Validator implements Serializable { /** * pattern accepted by paypal */ private static final Pattern amountPattern; /** * email pattern for validation */ private static final Pattern emailPattern; /** create instance of amountPattern only once */ static { amountPattern = Pattern.compile("^(\\d*\\.\\d{2}|0{1})$"); emailPattern = Pattern .compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[_A-Za-z0-9-]+)$"); } /** * Validates string if it is amount supported by paypal. Amount has to be exactly two decimal * places, decimal point is ".", or 0. You can set 0 for for example Payment when you set up * recurring payment. * * @param amount string representing the amount * @return true if amount is valid, false otherwise */ public static boolean isValidAmount(String amount) { if (amount == null) { return false; } /* amount is zero or number with exactly two decimal places */ Matcher matcher = amountPattern.matcher(amount); if (!matcher.find()) { return false; } return true; } /** * Validates email address. Does not validate length of the email, this is because it varies * between paypal requests. * * @param email * @return true if email is valid, otherwise false */ public static boolean isValidEmail(String email) { if (email == null) { return false; } Matcher matcher = emailPattern.matcher(email); if (!matcher.matches()) { return false; } return true; } /** * Uses Luhn algorithm to validate numbers. Luhn algorithm is also known as modulus 10 or mod 10 * algorithm. * <p/> * In this case, this is used to validate credit card numbers. * * @param number number to be validated (credit card number) * @return */ public static boolean isValidLuhn(String number) { int sum = 0; boolean alternate = false; for (int i = number.length() - 1; i >= 0; i--) { int n = Integer.parseInt(number.substring(i, i + 1)); if (alternate) { n *= 2; if (n > 9) { n = (n % 10) + 1; } } sum += n; alternate = !alternate; } return (sum % 10 == 0); } }