Skip to main content

BusinessProcessWrapper

Classe BusinessProcessWrapper

É a base para implementar as regras de negócio de um processo de negócio gerenciado pelo contexto transacional VSet Chameleon.

Caso queira melhor entendimento sobre contexto transacional VSet Chameleon, veja aqui.

Nota: Essa classe é gerenciado pelo VSet Chameleon no modo de orquestração.

Anotações

Classe

AnotaçãoDescriçãoParâmetro
@BusinessProcessNameInforma para VSet Chameleon que essa classe será disponibilizada para os canaisname(1) - nome da classe de negócio
description - descrição da classe de negócio
channel - Informa que será visível para canal (depreciado)
@NotLogInforma para VSet Chameleon não gravar rastreamento/performance do processo
@NotShowInforma para VSet Chameleon não gravar as mensagem de requisição e resposta no log de auditoria
(1) Quando VSet Chameleon é iniciado ou faz hot deploy, ele registra o nome do processo name no seu gerenciador de processos. É esse nome que os canais que irão invocar para executar o processo. O atributo name por padrão tem o mesmo nome da classe de negócio. Mas é opcional.

Exemplo:

@BusinessProcessName(name="MoveAttachment", description="Move Attachment")
@NotLog
@NotDisplay
public class MoveAttachment extends BusinessProcessWrapper {
// any code
}

Estrutura de dados

AnotaçãoDescriçãoParâmetro
@FieldInfoDescreve as propriedades do campodescription - descrição do campo
required - informa se o campo é obrigatório
@InternalInforma que este campo não é disponibilizado para os canais
@ReadOnlyInforma que este campo é somente leitura para os canais
@ConfidentialInforma que este campo é informação sensível. Aparece no log como asterisco

Exemplo:

public class AccountBalanceInfoOutput {

@FieldInfo(description="Saldo da conta", required=true)
@Internal
@Confidential
private double accountBalance;
@FieldInfo(description="Limite do cartão", required=false)
@ReadOnly
private double cardLimit;
@FieldInfo(description="Saldo do cartão", required=false)
private double cardBalance;

public double getAccountBalance() {
return accountBalance;
}
public void setAccountBalance(double accountBalance) {
this.accountBalance = accountBalance;
}
public double getCardLimit() {
return cardLimit;
}
public void setCardLimit(double cardLimit) {
this.cardLimit = cardLimit;
}
public double getCardBalance() {
return cardBalance;
}
public void setCardBalance(double cardBalance) {
this.cardBalance = cardBalance;
}
}

Método do processo de negócio

MétodoTipoDescrição
getInput()Object – classe de dados da classe de negócioEstrutura de dados da entrada da classe de negócioOpcional
getOutput()Object – classe de dados da classe de negócioEstrutura de dados da saída da classe de negócioOpcional
builtIn()voidImplementa regras de negócio na instanciação da classeOpcional
initialize()voidImplementa inicializaçõesOpcional
enhancementControllerLayer(Context context)voidImplementa regras de controle e segurançaOpcional
preProcess()voidImplementa regras que serão executadas antes do validate()
validate()voidImplementa validações necessáriasOpcional
beforeProcess()voidImplementa alguma atividade antes de processar o método process()Opcional
process()voidImplementa a regra de negócio propriamente ditaObrigatório
afterProcess()voidImplementa alguma atividade ou rotina após a execução do método process()Opcional
finalize()voidImplementa alguma atividade ou rotina para finalizaçãoOpcional
rollback()voidImplementa alguma atividade ou rotina de desfazimento caso houver alguma exceção na classe de negócioOpcional

Nota: Quando o orquestrador do VSet Chameleon executa a classe, serão executadas os métodos na forma sequencial:

  • enhancementLayer
  • validate
  • beforeProcess
  • process
  • afterProcess
  • finalize

Se houver alguma exceção por parte da execução da classe de negócio, o VSet Chameleon executará o método rollback() para desfazer o contexto transacional.

O método process() é o principal método que executa as regras de negócio da classe de negócio.

Exemplo:

@BusinessProcessName(name="MoveAttachment", description="Move Attachment", channel=true)
public class MoveAttachment extends BusinessProcessAbstract {

private MoveAttachmentInput input = new MoveAttachmentInput();

@Override
public MoveAttachmentInput getInput() {
return input;
}

@Override
public Object getOutput() {
return null;
}

@Override
public void validate() throws Exception {
}

@Override
public void beforeProcess() throws Exception {

}

@Override
public void process() throws Exception {
AttachmentDAO from = new AttachmentDAO();
AttachmentDAO to = new AttachmentDAO();
for (MoveFrom maf : input.getFrom()) {
from.getInput().setIdComponent(maf.getFrom().getIdComponent());
from.getInput().setComponentType(maf.getFrom().getComponentType());
from.getInput().setId(maf.getId());
from.select();
Attachment fromo = (Attachment) from.getOutputOnlyRecord();
to.moveCorr(fromo, to.getInput());
to.getInput().setIdComponent(input.getTo().getIdComponent());
to.getInput().setComponentType(input.getTo().getComponentType());
to.insert();
from.delete();
}
}

@Override
public void afterProcess() throws Exception {
}

@Override
public void rollback() throws Exception {
}

@Override
public void cleanVariables() throws Exception {
}

}

Método auxiliar/apoio do processo de negócio

MétodoTipoDescrição
execute()(nota)voidExecuta o processo da classe de negócio
clearObject(Object obj)voidLimpa ou libera da memória as variáveis da classe
getProcessType()ProcessType1:Informa o tipo de processo
setProcessType(ProcessType processType)voidInsere o tipo de processo
getChannel()intInforma o canal2 que acessou classe de negócio
getUser()StringInforma usuário que executou o processo de negócio
getClientID()StringInforma clientID do cliente que solicitou a requisição
getSecretKey()StringInforma secret key do cliente que solicitou a requisição
getAddressPort()intInforma porta que recebeu a requisição
getLocale()LocaleInforma a localidade (país e língua) da requisição
getRequest()ObjectRetorna os dados da requisiçãoO formato será de acordo com protocolo
getFieldsRequest()ArrayList\<String>Retorna a lista de campos enviados pela requisição
fieldRequestIsNull(String field)booleanVerifica se o campo da requisição está com valor nulo
getDisplayInput(String[] confidentialFields)voidMostra os campos e valores da requisiçãoParâmetro confidentialFields informa quais os campos não podem mostrar os seus valores. São substituídos por asteriscos
moveCorr(Object from, Object target, boolean checkParent)voidMove os valores dos campos de um objeto para outro objeto com mesmo nome e tipo
getMarkID()StringRetorna identificador marcadorEx: referenciar quais os processos foram executados pelo determinado processo mestre
getPathWorkArea(String vendor, String module)StringRetorna o caminho do diretório workareaWorkarea é o diretório que faz parte da estrutura do VSet que armazena os arquivos necessários para funcionamento do módulo
getPathSecurity(String subdir)StringRetorna o caminho do diretório dos arquivos das certificadoras

Variável de sessão

MétodoTipoDescrição
getSessionProperty(String key)ObjectRecupera o valor de uma variável de sessão tipo objeto
getSessionPropertyInt(String key)intRecupera o valor de uma variável de sessão tipo inteiro
getSessionPropertyLong(String key)longRecupera o valor de uma variável de sessão tipo long
getSessionPropertyByte(String key)byteRecupera o valor de uma variável de sessão tipo byte
getSessionPropertyDouble(String key)doubleRecupera o valor de uma variável de sessão tipo double
getSessionPropertyBool(String key)booleanRecupera o valor de uma variável de sessão tipo booleano
getSessionPropertyStr(String key)StringRecupera o valor de uma variável de sessão tipo string
setSessionProperty(String key, Object value)voidInsere o valor de uma variável de sessão tipo objeto
setSessionPropertyInt(String key, int value)voidInsere o valor de uma variável de sessão tipo inteiro
setSessionPropertyLong(String key, long value)voidInsere o valor de uma variável de sessão tipo long
setSessionPropertyByte(String key, byte value)voidInsere o valor de uma variável de sessão tipo byte
setSessionPropertyDouble(String key, double value)voidInsere o valor de uma variável de sessão tipo double
setSessionPropertyBool(String key, boolean value)voidInsere o valor de uma variável de sessão tipo booleano

Exemplo:

  • Inclusão do valor da variável de sessão
    setSessionPropertyInt("IdUser", ui.getOutput().getId());
setSessionPropertyInt("IdCompany", idCompany);
setSessionProperty("Usercode", input.getUsercode());
  • Recuperação do valor da variável de sessão
    int idUser = getSessionPropertyInt("IdUser");
int idCompany = getSessionPropertyInt("IdCompany");
String usercode = getSessionProperty("Usercode");

Contexto Transacional Nível Bloco

MétodoTipoDescrição
beginTransactionBlock()voidInicia o bloco transacional de um escopo da regra de negócioGarantir o contexto transacional do bloco - Banco de dados
commitTransactionBlock()voidEfetiva o bloco transacional de um escopo da regra de negócio
rollbackTransactionBlock()voidDesfaz o bloco transacional de um escopo da regra de negócio

Exemplo:

    try {
PassportPassword pp = new PassportPassword();
pp.setUsercode(input.getUsercode());
pp.setChannel(uio.getChannel());
pp.setTokenApp(getClientID());
pp.setToken(Util.generateKeyRandom(8));
// begin transaction block
beginTransactionBlock();
TokenUserDAO tuDAO = new TokenUserDAO();
tuDAO.getInput().setId(uio.getIdToken());
tuDAO.select();
TokenUser tu = (TokenUser) tuDAO.getOutputOnlyRecord();
tuDAO.getInput().setPasswordErrorAmount(tu.getPasswordErrorAmount() + 1);
tuDAO.getInput().setLastPasswordErrorDate(new Timestamp(System.currentTimeMillis()));
tuDAO.update();
// end transaction block
commitTransactionBlock();
}
catch (Exception e) {
// rollback transaction block
rollbackTransactionBlock();
throw e;
}

Observação: Aqueles trechos que estão fora do contexto transacional do bloco serão controlados pelo contexto transacional nível global.

Protocolo HTTP(S)

MétodoTipoDescrição
getRequestURI()StringInforma endpoint da requisiçãoSomente para protocolo HTTP(S)
getQueryURI()StringInforma os parametros da query da requisição se houverSomente para protocolo HTTP(S)
getMethodURI()StringInforma tipo de método enviado pela requisiçãoSomente para protocolo HTTP(S)

Manupulação da estrutura de entrada/saída

MétodoTipoDescrição
addFieldsNotResponse(String field)voidAdiciona os campos que não poderão ser retornados para canal
changeOutput(Object output)voidMuda a estrutura de saídaEstrutura de saída default é getOutput()
noOutput()voidAborta a estrutura de saída para canal
getConfidentialFieldInputList()String[]Lista de campos de entrada considerados confidenciaisNo logs os valores destes campos são impressos como asterisco
getConfidentialFieldOutputList()String[]Lista de campos de saída considerados confidenciaisNo logs os valores destes campos são impressos como asterisco
````

FAQ (Frequently Asked Questions)

Para que os processos de negócios e/ou regras de negócios sejam executados no middleware VSet deverão herdar sempre a classe BusinessProcessWrapper?

Depende. Se for para os canais ou processos de negócios que dependem do contexto transacional sim. Se for para serviços que são executados na forma background e/ou batch, não.

Se quiser saber mais sobre o conceito de processo de negócio, veja aqui.

É obrigatório implemetar a classe de estrutura dados nos métodos getInput() e getOutput()?

Não. Mas tem que ter pelo menos o método getInput() ou getOutput(). Não faz sentido que o processo que não tem entrada e saída para classe BusinessProcessWrapper. Se precisar implementar algo que não precisa da entrada(input) ou saída(output), faça na outra classe service.

Quando devo colocar anotação @BusinessProcessName na classe BusinessProcessWrapper?

Só deve colocar se for disponibilizado para os canais. Esta anotação informa para VSet middleware, que a classe de negócio será disponibilizada para os canais. Se for para processos internos e/ou processos de apoio/suporte não é necessário desta anotação.

Posso criar o bloco de contexto transacional dentro do codigo para garantir a integradade caso tenha alguma falha ocorrido fora do meu contexto criado?

Sim. Basta você colocar o método beginTransactionBlock() e commitTransactionBlock(). Se a falha ocorrer fora do seu bloco de contexto transacional criado por você, VSet Chameleon garantirá a execução com sucesso as instruções executadas dentro do seu bloco.

Caso meu projeto/módulo precisa de implementar uma especialidade, posso criar uma outra classe herdando a classe BusinessProcessWrapper?

Pode. Você pode criar uma classe para implementar as particularidades do seu projeto/módulo herdando a classe BusinessProcessWrapper para que as demais classes de negócios do seu projeto/módulo herdam diratamente da classe criada por você para implementá-las. O ideal é que a classe criada por você herdado pela classe BusinessProcessWrapper seja abstrada.

Exemplo:

Vou criar uma classe abstrada, BusinessProcessAdapter, herdada BusinessProcessWrapper, implementado a rotina para gravar o log das operações das classes de negócios. As demais classes no meu projeto/módulo que herdarão essa classe criada, BusinessProcessAdapter, já com a gravação do log operacional.

public abstract class BusinessProcessAdapter extends BusinessProcessWrapper {

@Override
public void log() throws Exception {
// code
}

}

Classe de negócios do meu projeto/módulo herdada pela classe BusinessProcessAdapter.

public class FindZipCode extends BusinessProcessAdapter {

@Override
public Object getInput() {
return null;
}

@Override
public Object getOutput() {
return null;
}

@Override
public void validate() throws Exception {
// code
}

@Override
public void beforeProcess() throws Exception {
// code
}

@Override
public void process() throws Exception {
// code
}

@Override
public void afterProcess() throws Exception {
// code
}

@Override
public void rollback() throws Exception {
// code
}

@Override
public void cleanVariables() throws Exception {
// code
}

}


    • Tipo de canal: 1- WEB (Cliente), 2 - Mobile, 3 - Desktop, 4 - Parceiro, 5 - Gestor, 6 - Produção, 7 - Dashboard, 8 - Rede, 9 - Tablet, 10 - Backoffice

    • Tipo de processo: Internal, External, Database, Batch, Boundary, File, Transfer