br.com.nordestefomento.jrimum.vallia.AbstractCPRFValidator.java Source code

Java tutorial

Introduction

Here is the source code for br.com.nordestefomento.jrimum.vallia.AbstractCPRFValidator.java

Source

/*
 * Copyright 2008 JRimum Project
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
 * applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 * OF ANY KIND, either express or implied. See the License for the specific
 * language governing permissions and limitations under the License.
 * 
 * Created at: 30/03/2008 - 18:19:24
 * 
 * ================================================================================
 * 
 * Direitos autorais 2008 JRimum Project
 * 
 * Licenciado sob a Licena Apache, Verso 2.0 ("LICENA"); voc no pode usar
 * esse arquivo exceto em conformidade com a esta LICENA. Voc pode obter uma
 * cpia desta LICENA em http://www.apache.org/licenses/LICENSE-2.0 A menos que
 * haja exigncia legal ou acordo por escrito, a distribuio de software sob
 * esta LICENA se dar COMO EST??, SEM GARANTIAS OU CONDIES DE QUALQUER
 * TIPO, sejam expressas ou tcitas. Veja a LICENA para a redao especfica a
 * reger permisses e limitaes sob esta LICENA.
 * 
 * Criado em: 30/03/2008 - 18:19:24
 * 
 */

package br.com.nordestefomento.jrimum.vallia;

import static br.com.nordestefomento.jrimum.utilix.ObjectUtil.isNotNull;

import java.io.Serializable;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import br.com.nordestefomento.jrimum.utilix.ObjectUtil;
import br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador;
import br.com.nordestefomento.jrimum.vallia.digitoverificador.CNPJDV;
import br.com.nordestefomento.jrimum.vallia.digitoverificador.CPFDV;

/**
 * <p>
 * Representa a famlia de validadores para o cadastro de pessoa na receita
 * federal (CPRF).
 * </p>
 * 
 * 
 * 
 * @author <a href="http://gilmatryx.googlepages.com/">Gilmar P.S.L</a>
 * @author Misael Barreto
 * @author Rmulo Augusto
 * @author <a href="http://www.nordeste-fomento.com.br">Nordeste Fomento
 *         Mercantil</a>
 * 
 * @since 0.2
 * 
 * @version 0.2
 * 
 */
public abstract class AbstractCPRFValidator {

    private static final long serialVersionUID = -3107505512223559948L;

    /**
     * <p>
     * Cadastro de pessoa para validao.
     * </p>
     */
    protected StringBuilder codigoDoCadastro;

    /**
     * <p>
     * Validador de dgito verificador do cadastro de Pessoa.
     * </p>
     */
    protected AbstractDigitoVerificador digitoVerificador;

    /**
     * <p>
     * Expresso regular para validao de CPF: "###.###.###-##" ou
     * "###########".
     * </p>
     */
    private static final String REGEX_CPF = "(\\d{3}\\.\\d{3}\\.\\d{3}\\-\\d{2})|(\\d{11})";

    /**
     * <p>
     * Expresso regular para validao de CNPJ: "##.###.###/####-##" ou
     * "##############".
     * </p>
     */
    private static final String REGEX_CNPJ = "(\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}\\-\\d{2})|(\\d{14})";

    /**
     * <p>
     * Expresso regular para validao de um cadastro: "###" ou
     * "##############".
     * </p>
     */
    private static final String REGEX_CADASTRO = "\\d{3,14}";

    /**
     * <p>
     * Representa o tipo de cadastro e fornece o autenticador correto de a cordo
     * com este tipo.
     * </p>
     * 
     * 
     * 
     * @author <a href="http://gilmatryx.googlepages.com/">Gilmar P.S.L</a>
     * @author Misael Barreto
     * @author Rmulo Augusto
     * @author <a href="http://www.nordeste-fomento.com.br">Nordeste Fomento
     *         Mercantil</a>
     * 
     * @since 0.2
     * 
     * @version 0.2
     */
    public enum TipoDeCPRF implements Serializable {

        CPF, CNPJ;

        public AbstractCPRFValidator getAutenticador() {

            AbstractCPRFValidator validador = null;

            switch (this) {

            case CPF:

                validador = new CPFValidator();
                validador.digitoVerificador = new CPFDV();

                break;

            case CNPJ:

                validador = new CNPJValidator();
                validador.digitoVerificador = new CNPJDV();

                break;
            }

            return validador;
        }

        /**
         * @see br.com.nordestefomento.jrimum.utilix.ObjectUtil#toString()
         * @see java.lang.Enum#toString()
         */
        public String toString() {
            return ObjectUtil.toString(this);
        }
    }

    /**
     * @see br.com.nordestefomento.jrimum.vallia.AbstractCPRFValidator.TipoDeCPRF
     */
    @SuppressWarnings("unused")
    private TipoDeCPRF tipoDeCadastro;

    /**
     * <p>
     * Valida o dgito verificador do cadastro de pessoa passado durante a
     * instanciao do validador.
     * </p>
     * 
     * @return verdadeiro se o dgito verificador for vlido.
     */
    public abstract boolean isValido();

    /**
     * <p>
     * Revome a formatao existente em <code>cdigoDoCadastro</code>.
     * </p>
     */
    protected abstract void removeFormatacao();

    /**
     * <p>
     * Recupera uma instncia de um validador para o cadastro de pessoa a partir
     * de um identificador.
     * </p>
     * <p>
     * Primeiro  feita uma pr-validao que consiste em:
     * <ul>
     * <li>Verificar se o parmetro no  nulo.</li>
     * <li>Verificar se o parmetro no  vazio.</li>
     * <li>Verificar se o parmetro est em algum formatador vlido para
     * cadastro de pessoa.</li>
     * </ul>
     * </p>
     * 
     * @param codigoDoCadastro
     *            - identificador do cadastro de pessoa.
     * @return uma instncia de <code>AbstractCPRFValidator</code>.
     * @exception IllegalArgumentException
     *                - caso o parmetro no esteja em um formatador vlido de
     *                cadastro de pessoa.
     * @since 0.2
     */
    public static AbstractCPRFValidator create(String codigoDoCadastro) throws IllegalArgumentException {

        AbstractCPRFValidator validatorCPRF = null;

        validatorCPRF = create(selectTipoDeCadastro(codigoDoCadastro));

        validatorCPRF.codigoDoCadastro = new StringBuilder(codigoDoCadastro);
        validatorCPRF.removeFormatacao();

        return validatorCPRF;
    }

    /**
     * <p>
     * Cria um validador a partir do tipo de CPRF.
     * </p>
     * 
     * @param tipoDeCadastro
     * @return um validador
     * 
     * @since 0.2
     */

    public static AbstractCPRFValidator create(TipoDeCPRF tipoDeCadastro) {

        AbstractCPRFValidator validatorCPRF = null;

        if (isNotNull(tipoDeCadastro)) {

            validatorCPRF = tipoDeCadastro.getAutenticador();

            validatorCPRF.tipoDeCadastro = tipoDeCadastro;

        } else {
            throw new IllegalArgumentException("Tipo de Cadastro [ " + tipoDeCadastro + " ] nulo !");
        }

        return validatorCPRF;
    }

    /**
     * <p>
     * Faz a pr-validao e se correto identifica o tipo de cadastro.
     * </p>
     * 
     * @param codigoDoCadastro
     * @return
     * @throws IllegalArgumentException
     * 
     * @since 0.2
     */
    private static TipoDeCPRF selectTipoDeCadastro(String codigoDoCadastro) throws IllegalArgumentException {

        TipoDeCPRF tipo = null;

        switch_Tipo: {

            if (StringUtils.isNotBlank(codigoDoCadastro)) {

                /*
                 * FILTRO
                 */

                if (Pattern.matches(REGEX_CPF, codigoDoCadastro)) {

                    tipo = TipoDeCPRF.CPF;

                    break switch_Tipo;
                }

                if (Pattern.matches(REGEX_CNPJ, codigoDoCadastro)) {

                    tipo = TipoDeCPRF.CNPJ;

                    break switch_Tipo;
                }

            }

            throw new IllegalArgumentException(
                    "O cdigo de cadastro [ " + codigoDoCadastro + " ] no est em um formatador vlido !");
        }

        return tipo;
    }

    /**
     * <p>
     * Define se os parmetros vlidos em relao a nulidade e formato de CPRF.
     * </p>
     * 
     * @param codigoDoCadastro
     * @param tipoDeCadastro
     * @return indicao de aprovao
     * @throws IllegalArgumentException
     * 
     * @since 0.2
     */

    public static boolean isParametrosValidos(String codigoDoCadastro, TipoDeCPRF tipoDeCadastro)
            throws IllegalArgumentException {

        boolean isValido = false;

        if (isNotNull(codigoDoCadastro) && isNotNull(tipoDeCadastro)) {

            if (Pattern.matches(REGEX_CADASTRO, codigoDoCadastro)) {

                isValido = true;

            } else {

                throw new IllegalArgumentException(
                        "O cadastro est em um tamanho incorreto ou no exsite: [ " + codigoDoCadastro + " ]");
            }
        } else {

            throw new IllegalArgumentException("O tipo de cadastro est incorreto: [ " + tipoDeCadastro
                    + " ] ou o cadastro no exsite: [ " + codigoDoCadastro + " ]");
        }

        return isValido;
    }

    /**
     * <p>
     * Recupera o cadastro de pessoa a ser validado. <br />
     * Obs.: A String retornada no possui formatao, ou seja, possui apenas os
     * dgitos.
     * </p>
     * 
     * @return cadastro de pessoa a ser validado.
     * 
     * @since 0.2
     */
    public String getCodigoDoCadastro() {

        return codigoDoCadastro.toString();
    }

    /**
     * <p>
     * Indica se o validador  de pessoa fsica.
     * </p>
     * 
     * @return verdadeiro se for de pessoa fsica.
     * @since 0.2
     */
    public boolean isFisica() {

        return this instanceof CPFValidator;
    }

    /**
     * </p> Indica se o validador  de pessoa jurdica. </p>
     * 
     * @return verdadeiro se for de pessoa jurdica.
     * @since 0.2
     */
    public boolean isJuridica() {

        return this instanceof CNPJValidator;
    }

}