Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.lavieri.util.brazil.register;
- import javax.persistence.Transient;
- /**
- * Prove uma valida��o generica de digitos verificadores de acordo com os parametros
- * especificados.
- * <BR>
- * <BR>Serve como utilit�rio para classes que que necessitem de valida��o de digitos
- * verificadres, como CPF, CNPJ, Inscri��o Estadual, ou qualquer uma outra, que siga os
- * padr�es aqui estipulado.
- * <BR>
- * <BR>Exemplo de uso:
- * A classe cpf pode implementar sua valida��o da seguinte forma:<tt>
- * <BR>/**
- * <BR> * Pesos para o calculor de dos digitos verificadores do CPF.
- * <BR> *</tt><tt>/
- * <BR>private static final int[][] COEFICIENTS =
- * <BR> {
- * <BR>
- * {10,9,8,7,6,5,4,3,2}, //pesos para o 1� digito verificador
- * <BR>
- * {11,10,9,8,7,6,5,4,3} //pesos para o 2� digito verificador
- * <BR> }
- * <BR>/**
- * <BR> * N�mero de digitos de um CPF (excluindo-se os digitos verificadores)
- * <BR> *</tt><tt>/
- * <BR>private static final int BASE_LENGTH = 9;
- * <BR>/**
- * <BR> * Fator de divis�o, usado no calculo dos digitos verificadores.
- * <BR> *</tt><tt>/
- * <BR>private static final int FACTOR = 11; //fator de divis�o para calculo dos digitos
- * <BR>
- * <BR>/**
- * <BR> * Verifica��o se este CPF � valido, null significa que o teste ainda n�o foi
- * <BR> * realizado, so � verificar uma vez, apois a primeira chamada de isValid()
- * <BR> * @see isValid()
- * <BR> *</tt><tt>/
- * <BR>@{@link Transient} private Boolean valid = null;
- * <BR>/**
- * <BR> * String contendo o valor deste CPF
- * <BR> *</tt><tt>/
- * <BR>private String cpf;
- * <BR>
- * <BR>//...
- * <BR>// outros m�todos
- * <BR>//...
- * <BR>
- * <BR>public boolean isValid() {
- * <BR> if (valid == null)
- * <BR> valid = {@link VerifierDigits}.isValid(this.cpf,
- * <i>BASE_LENGTH</i>, <i>FACTOR</i>, <i>COEFICIENTS</i>);
- * <BR> return valid;
- * <BR>}</tt>
- * <BR>
- * <BR>Last Revision: 01/12/2009
- * @author Tomaz Lavieri
- * @version 1.0
- * @since 01/12/09
- */
- public class VerifierDigits {
- /**
- * Mensagem de erro, quando o n�mero de digitos a checar � diferente da soma do
- * n�mero de digitos basicos mais o n�mero de digitos validadores.
- */
- private final static String ERROR = "The digits to check \"%s\" length (%s) "+
- "must be equals to: base length (%s) + digits of verifier digitis (%s)";
- /**
- * Verifica se a sequencia de digitos <tt>digitsToCheck</tt>, que tem dimens�o
- * basica <tt>baseLength</tt> (o restante � digitos verificadores), onde cada digito
- * verificador utiliza o <tt>factor</tt> de divis�o e os pesos enviado na array de
- * {@link DigitsSequence}[] <tt>coeficients</tt>
- * @param digitsToCheck sequencia de digitos a ser validada.
- * @param baseLength dimens�o basica da sequencia de digitos. Por exemplo o CPF tem
- * dimens�o basica = 9 os outros 2 s�o digitos verificadores.
- * @param factor o divisor do teste dos digitos. Por exemplo o CPF usa divisor 11
- * @param coeficients uma array de DigitsSequence com os pesos para cada digito
- * verificador. Por exemplo para o CNPJ a array �<tt>
- * <BR>coeficients = {@link DigitsSequence}[2];
- * <BR>coeficients[0] = new {@link IntegerDigitsSequence}({5,4,3,2,9,8,7,6,5,4,3,2});
- * <BR>coeficients[1] = new {@link StringDigitsSequence}("6543298765432");
- * </tt>
- * @return <tt>true</tt> caso a sequencia de digitos contenha os verificadores
- * corretos, e <tt>false</tt> caso contrario.
- */
- public static boolean isValid(DigitsSequence digitsToCheck,int baseLength, int factor,
- DigitsSequence ... coeficients ) throws IllegalArgumentException {
- if (digitsToCheck.length() != baseLength + coeficients.length)
- throwIllegalArgumentException(digitsToCheck,baseLength,coeficients.length);
- boolean result = false;
- boolean needMoreTest = coeficients.length > 0;
- int coeficientsCursor = 0;
- while(needMoreTest) {
- int sum = 0;
- int currentCoeficientsSize = baseLength + coeficientsCursor;
- for (int i = 0; i < currentCoeficientsSize; i++ ) {
- sum += digitsToCheck.getNumberAt(i) *
- coeficients[coeficientsCursor].getNumberAt(i);
- }
- int correctDigit = (factor - sum%factor >= 10) ? 0 : factor - sum%factor;
- result = correctDigit == digitsToCheck.getNumberAt(currentCoeficientsSize);
- needMoreTest = (++coeficientsCursor < coeficients.length && result == true);
- }
- return result;
- }
- public static String getValidDigits(DigitsSequence digitsToCheck,int baseLength,
- int factor, DigitsSequence ... coeficients )throws IllegalArgumentException {
- if (digitsToCheck.length() != baseLength + coeficients.length)
- throwIllegalArgumentException(digitsToCheck,baseLength,coeficients.length);
- String result = "";
- int[] sum = new int[coeficients.length];
- for (int i = 0; i < baseLength; i++)
- for (int j = 0; j < sum.length; j++)
- sum[j] += digitsToCheck.getNumberAt(i) * coeficients[j].getNumberAt(i);
- int[] digit = new int[coeficients.length];
- boolean hasMore = true;
- int cursor = 0;
- while (hasMore) {
- digit[cursor] = (factor - (sum[cursor]%factor) >= 10) ? 0 :
- factor - (sum[cursor]%factor);
- result += digit[cursor++];
- hasMore = (cursor + baseLength < digitsToCheck.length());
- if (hasMore)
- for (int j = cursor ; j < coeficients.length ; j++)
- sum[j] += digit[cursor-1] * //digito recem calculado
- coeficients[j].getNumberAt(baseLength + cursor -1); //peso
- }
- return result;
- }
- /**
- * Verifica se a sequencia de digitos <tt>digitsToCheck</tt>, que tem dimens�o
- * basica <tt>baseLength</tt> (o restante � digitos verificadores), onde cada digito
- * verificador utiliza o <tt>factor</tt> de divis�o e os pesos enviado na array de
- * {@link String}[] <tt>coeficients</tt>
- * @param digitsToCheck sequencia de digitos a ser validada.
- * @param baseLength dimens�o basica da sequencia de digitos. Por exemplo o CPF tem
- * dimens�o basica = 9 os outros 2 s�o digitos verificadores.
- * @param factor o divisor do teste dos digitos. Por exemplo o CPF usa divisor 11
- * @param coeficients uma array de String com os pesos para cada digito
- * verificador, onde cada peso � um digito entre 0 e 9.
- * <BR>Por exemplo para o CNPJ a array �<tt>
- * <BR>coeficients = {@link String}[2];
- * <BR>coeficients[0] = "543298765432";
- * <BR>coeficients[1] = "6543298765432";</tt>
- * @return <tt>true</tt> caso a sequencia de digitos contenha os verificadores
- * corretos, e <tt>false</tt> caso contrario.
- */
- public static boolean isValid(String digitsToCheck,int baseLength, int factor,
- String ... coeficients ) {
- StringDigitsSequence siDigitsToCheck = new StringDigitsSequence(digitsToCheck);
- if (siDigitsToCheck.length() != baseLength + coeficients.length)
- throwIllegalArgumentException(siDigitsToCheck,baseLength,coeficients.length);
- StringDigitsSequence[] coefcientsStrSequence =
- new StringDigitsSequence[coeficients.length];
- for(int i = 0; i<coeficients.length; i++) {
- coefcientsStrSequence[i] = new StringDigitsSequence(coeficients[i]);
- }
- return isValid(siDigitsToCheck, baseLength, factor, coefcientsStrSequence);
- }
- /**
- * Verifica se a sequencia de digitos <tt>digitsToCheck</tt>, que tem dimens�o
- * basica <tt>baseLength</tt> (o restante � digitos verificadores), onde cada digito
- * verificador utiliza o <tt>factor</tt> de divis�o e os pesos enviado na array de
- * <tt>int[][] coeficients</tt>
- * @param digitsToCheck sequencia de digitos a ser validada.
- * @param baseLength dimens�o basica da sequencia de digitos. Por exemplo o CPF tem
- * dimens�o basica = 9 os outros 2 s�o digitos verificadores.
- * @param factor o divisor do teste dos digitos. Por exemplo o CPF usa divisor 11
- * @param coeficients uma array de int com os pesos para cada digito
- * verificador. Por exemplo para o CPF a array �<tt>
- * <BR>coeficients = int[2];
- * <BR>coeficients[0] = {10, 9,8,7,6,5,4,3,2};
- * <BR>coeficients[1] = {11,10,9,8,7,6,5,4,3,0};</tt>
- * @return <tt>true</tt> caso a sequencia de digitos contenha os verificadores
- * corretos, e <tt>false</tt> caso contrario.
- */
- public static boolean isValid(String digitsToCheck,int baseLength, int factor,
- int[] ... coeficients ) {
- StringDigitsSequence siDigitsToCheck = new StringDigitsSequence(digitsToCheck);
- if (siDigitsToCheck.length() != baseLength + coeficients.length)
- throwIllegalArgumentException(siDigitsToCheck,baseLength,coeficients.length);
- IntegerDigitsSequence[] coefcientsIntSequence =new IntegerDigitsSequence[coeficients.length];
- for(int i = 0; i<coeficients.length; i++) {
- coefcientsIntSequence[i] = new IntegerDigitsSequence(coeficients[i]);
- }
- return isValid(siDigitsToCheck, baseLength, factor, coefcientsIntSequence);
- }
- /**
- * Lan�a uma exce��o de erro, com mensagem especifica do erro.
- * @param siDigitsToCheck
- * @param baseLength
- * @param numberOfVerifierDigits
- * @throws IllegalArgumentException
- */
- private static void throwIllegalArgumentException(DigitsSequence siDigitsToCheck,
- int baseLength,int numberOfVerifierDigits) throws IllegalArgumentException {
- throw new IllegalArgumentException(
- String.format(ERROR,
- siDigitsToCheck.toString(),
- siDigitsToCheck.length(),
- baseLength,
- numberOfVerifierDigits));
- }
- /**
- * cont�m apenas m�todos estaticos.
- */
- private VerifierDigits(){}
- }
Advertisement
Add Comment
Please, Sign In to add comment