Como o Aman disse, para fazer a validação do dígito verificador, é necessário fazer uma implementação.
Como se trata de uma validação, recomenda-se o uso tanto de validação client-side, quanto server-side. A primeira serve para melhorar a experiência do usuário, uma vez que ele não precisa esperar um round-trip ao servidor para ter o resultado da validação. Já a segunda é usada por segurança, uma vez que o cliente pode não estar com o Javascript habilitado.
Para cenários como esse, uma maneira interessante é criar um controle de validação específico, de modo que possa ser reutilizado em vários projetos. Como há uma validação de regular expression envolvida, pode-se estender o controle lumis.doui.control.validator.RegularExpressionValidatorControl para acrescentar a validação de dígito verificador client e server side.
Abaixo segue um exemplo de como fazer:
Arquivo def/lumis/sample/testecpfvalidator/servicedefinition.xml:
<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/servicedefinition.xsd">
<service id="lumis.sample.testecpfvalidator" name="Teste de controle de valida??o de CPF" type="lum_doui" />
<interfaces>
<interface id="Teste" name="Teste" type="lum_doui" />
</interfaces>
</serviceDefinition>
Arquivo def/lumis/sample/testecpfvalidator/douidefinition.xml:
<?xml version="1.0" encoding="UTF-8"?>
<douiDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/douidefinition.xsd" xmlns:control="http://www.lumis.com.br/douicontrols">
<service id="lumis.sample.testecpfvalidator" />
<interfaces>
<interface id="Teste">
<controls>
<control:lum_form>
<control:lum_inputText id="cpf">
<control:lum_regularExpressionValidator className="lumis.sample.CPFValidatorControl" errorMessage="CPF inválido!" id="cpfValidator"/>
</control:lum_inputText>
<control:lum_button text="Validar">
<onClick type="processAction" processActionId="ok" />
</control:lum_button>
</control:lum_form>
</controls>
<processActions>
<processAction id="ok" type="generic">
<response type="doui_message" message="OK! CPF Válido!" />
</processAction>
</processActions>
</interface>
</interfaces>
</douiDefinition>
Arquivo src/java/lumis/sample/CPFValidatorControl.java:
package lumis.sample;
import org.w3c.dom.Node;
import lumis.doui.control.ControlContainer;
import lumis.doui.control.ControlException;
import lumis.doui.control.IClientSideReadableControl;
import lumis.doui.control.IControl;
import lumis.doui.control.IDataControl;
import lumis.doui.control.IErrorSummaryControl;
import lumis.doui.control.validator.RegularExpressionValidatorControl;
import lumis.portal.PortalException;
import lumis.portal.UnexpectedException;
import lumis.util.XmlUtil;
public class CPFValidatorControl extends RegularExpressionValidatorControl
{
protected static final String DEFAULT_EXPRESSION = "\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}";
public void init(Node controlDefinitionNode, ControlContainer controlContainer, IControl parentControl) throws PortalException
{
super.init(controlDefinitionNode, controlContainer, parentControl);
expression = DEFAULT_EXPRESSION;
}
@Override
public boolean doServerValidation() throws PortalException {
if (!super.doServerValidation())
return false;
IControl control = getControlToValidate();
if(!(control instanceof IDataControl))
throw new ControlException("STR_VALIDATING_NON_DATA_CONTROL");
IDataControl controlToValidate = (IDataControl)control;
if (controlToValidate.getValue() != null)
{
String cpf = controlToValidate.getValue().toString().replaceAll("[.-]", "");
boolean valid = CPF.validaCPF(cpf);
if (!valid)
{
messages = getMessages();
if (messages.getErrorMessage() != null)
{
// localize error message
String errorMessage = localize(messages.getErrorMessage());
IErrorSummaryControl errorSummaryControl = controlContainer.getErrorSummaryControl();
errorSummaryControl.addErrorMessage(errorMessage);
}
controlToValidate.setValid(false);
return false;
}
}
return true;
}
@Override
public String getScriptValidationFunctionImplementation()
throws PortalException {
String controlToValidateId = XmlUtil.readAttributeString("controlToValidateId", controlDefinitionNode);
IControl controlToValidate = null;
if(controlToValidateId == null)
controlToValidate = this.getParentControl();
else
controlToValidate = controlContainer.getControlById(controlToValidateId);
StringBuilder code = new StringBuilder();
code.append("function originalValidation(){");
code.append(super.getScriptValidationFunctionImplementation());
code.append("}");
code.append("if (!originalValidation()) return false;");
code.append("var s = " + ((IClientSideReadableControl)controlToValidate).getScriptGetValues() + ";");
code.append("if (s[0] == '') {");
code.append(getScriptClear());
code.append(";");
code.append("return true; }");
code.append("if (!ValidaCPF(s[0])) {" + getScriptSetMessages(douiContext.getTransaction())+ "; return false;}");
code.append("return true;");
return code.toString();
}
@Override
protected void includeScripts() throws PortalException
{
super.includeScripts();
try
{
douiContext.getRenderResponse().getBeforeWriter().print("<script type=\"text/javascript\" charset=\"UTF-8\" src=\"CPFValidatorControl.js\"></script>", "CPFValidatorControl.js");
}
catch (Exception e)
{
throw new UnexpectedException(e);
}
}
}
Arquivo src/java/lumis/sample/CPF.java:
package lumis.sample;
// Código abaixo obtido em http://www.javafree.org/artigo/851371/Validacao-de-CPF.html
/* ******************************************************
* Código <a href='#' onClick="hwClick3367388890917(1701657801);return false;" style='cursor: hand; color:#006600; text-decoration:underline; border-bottom:dotted 1px;' onmouseover="hw3367388890917(event, this, '1701657801'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe(event, this); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " oncontextmenu="return false;">Original</a>:
* Autor: Allan Peron
* ******************************************************
* Modificações feitas para fácil aplicação
*/
public abstract class CPF extends Object
{
private static String calcDigVerif(String num) {
Integer primDig, segDig;
int soma = 0, peso = 10;
for (int i = 0; i < num.length(); i++)
soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
if (soma % 11 == 0 | soma % 11 == 1)
primDig = new Integer(0);
else
primDig = new Integer(11 - (soma % 11));
soma = 0;
peso = 11;
for (int i = 0; i < num.length(); i++)
soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
soma += primDig.intValue() * 2;
if (soma % 11 == 0 | soma % 11 == 1)
segDig = new Integer(0);
else
segDig = new Integer(11 - (soma % 11));
return primDig.toString() + segDig.toString();
}
private static int calcSegDig(String cpf, int primDig) {
int soma = 0, peso = 11;
for (int i = 0; i < cpf.length(); i++)
soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;
soma += primDig * 2;
if (soma % 11 == 0 | soma % 11 == 1)
return 0;
else
return 11 - (soma % 11);
}
public static String geraCPF() {
String iniciais = "";
Integer numero;
for (int i = 0; i < 9; i++) {
numero = new Integer((int) (Math.random() * 10));
iniciais += numero.toString();
}
return iniciais + calcDigVerif(iniciais);
}
public static boolean validaCPF(String cpf) {
if (cpf.length() != 11)
return false;
String numDig = cpf.substring(0, 9);
return calcDigVerif(numDig).equals(cpf.substring(9, 11));
}
}
Arquivo www/CPFValidatorControl.js:
// Código obtido em http://www.construindoseusite.com.br/javascript/scripts/js_validacao_cpf_imp.htm
// Autores: Anderson Luciano Santos da Silva e Marçal de Lima Hokama
// Adaptado para não exibir mensagens, apenas validar CPF, e também para validar tamanho.
function ValidaCPF(CPF)
{
CPF = (CPF+"").replace(/[.-]/g, "");
if (CPF.length != 11)
return false;
// Aqui começa a checagem do CPF
var POSICAO, I, SOMA, DV, DV_INFORMADO;
var DIGITO = new Array(10);
DV_INFORMADO = CPF.substr(9, 2); // Retira os dois últimos dígitos do número informado
// Desemembra o número do CPF na array DIGITO
for (I = 0; I <= 8; I++) {
DIGITO[I] = CPF.substr(I, 1);
}
// Calcula o valor do 10º dígito da verificação
POSICAO = 10;
SOMA = 0;
for (I = 0; I <= 8; I++) {
SOMA = SOMA + DIGITO[I] * POSICAO;
POSICAO = POSICAO - 1;
}
DIGITO[9] = SOMA % 11;
if (DIGITO[9] < 2) {
DIGITO[9] = 0;
}
else {
DIGITO[9] = 11 - DIGITO[9];
}
// Calcula o valor do 11º dígito da verificação
POSICAO = 11;
SOMA = 0;
for (I = 0; I <= 9; I++) {
SOMA = SOMA + DIGITO[I] * POSICAO;
POSICAO = POSICAO - 1;
}
DIGITO[10] = SOMA % 11;
if (DIGITO[10] < 2) {
DIGITO[10] = 0;
}
else {
DIGITO[10] = 11 - DIGITO[10];
}
// Verifica se os valores dos dígitos verificadores conferem
DV = DIGITO[9] * 10 + DIGITO[10];
if (DV != DV_INFORMADO) {
return false;
}
return true;
}