Java tutorial
/* * 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; } }