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ção | Descrição | Parâmetro |
|---|---|---|
@BusinessProcessName | Informa para VSet Chameleon que essa classe será disponibilizada para os canais | name(1) - nome da classe de negócio description - descrição da classe de negócio channel - Informa que será visível para canal (depreciado) |
@NotLog | Informa para VSet Chameleon não gravar rastreamento/performance do processo | |
@NotShow | Informa para VSet Chameleon não gravar as mensagem de requisição e resposta no log de auditoria |
Exemplo:
@BusinessProcessName(name="MoveAttachment", description="Move Attachment")
@NotLog
@NotDisplay
public class MoveAttachment extends BusinessProcessWrapper {
// any code
}
Estrutura de dados
| Anotação | Descrição | Parâmetro |
|---|---|---|
@FieldInfo | Descreve as propriedades do campo | description - descrição do campo required - informa se o campo é obrigatório |
@Internal | Informa que este campo não é disponibilizado para os canais | |
@ReadOnly | Informa que este campo é somente leitura para os canais | |
@Confidential | Informa 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étodo | Tipo | Descrição | |
|---|---|---|---|
getInput() | Object – classe de dados da classe de negócio | Estrutura de dados da entrada da classe de negócio | Opcional |
getOutput() | Object – classe de dados da classe de negócio | Estrutura de dados da saída da classe de negócio | Opcional |
builtIn() | void | Implementa regras de negócio na instanciação da classe | Opcional |
initialize() | void | Implementa inicializações | Opcional |
enhancementControllerLayer(Context context) | void | Implementa regras de controle e segurança | Opcional |
preProcess() | void | Implementa regras que serão executadas antes do validate() | |
validate() | void | Implementa validações necessárias | Opcional |
beforeProcess() | void | Implementa alguma atividade antes de processar o método process() | Opcional |
process() | void | Implementa a regra de negócio propriamente dita | Obrigatório |
afterProcess() | void | Implementa alguma atividade ou rotina após a execução do método process() | Opcional |
finalize() | void | Implementa alguma atividade ou rotina para finalização | Opcional |
rollback() | void | Implementa alguma atividade ou rotina de desfazimento caso houver alguma exceção na classe de negócio | Opcional |
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étodo | Tipo | Descrição | |
|---|---|---|---|
execute()(nota) | void | Executa o processo da classe de negócio | |
clearObject(Object obj) | void | Limpa ou libera da memória as variáveis da classe | |
getProcessType() | ProcessType1: | Informa o tipo de processo | |
setProcessType(ProcessType processType) | void | Insere o tipo de processo | |
getChannel() | int | Informa o canal2 que acessou classe de negócio | |
getUser() | String | Informa usuário que executou o processo de negócio | |
getClientID() | String | Informa clientID do cliente que solicitou a requisição | |
getSecretKey() | String | Informa secret key do cliente que solicitou a requisição | |
getAddressPort() | int | Informa porta que recebeu a requisição | |
getLocale() | Locale | Informa a localidade (país e língua) da requisição | |
getRequest() | Object | Retorna os dados da requisição | O formato será de acordo com protocolo |
getFieldsRequest() | ArrayList\<String> | Retorna a lista de campos enviados pela requisição | |
fieldRequestIsNull(String field) | boolean | Verifica se o campo da requisição está com valor nulo | |
getDisplayInput(String[] confidentialFields) | void | Mostra os campos e valores da requisição | Parâ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) | void | Move os valores dos campos de um objeto para outro objeto com mesmo nome e tipo | |
getMarkID() | String | Retorna identificador marcador | Ex: referenciar quais os processos foram executados pelo determinado processo mestre |
getPathWorkArea(String vendor, String module) | String | Retorna o caminho do diretório workarea | Workarea é o diretório que faz parte da estrutura do VSet que armazena os arquivos necessários para funcionamento do módulo |
getPathSecurity(String subdir) | String | Retorna o caminho do diretório dos arquivos das certificadoras |
Variável de sessão
| Método | Tipo | Descrição | |
|---|---|---|---|
getSessionProperty(String key) | Object | Recupera o valor de uma variável de sessão tipo objeto | |
getSessionPropertyInt(String key) | int | Recupera o valor de uma variável de sessão tipo inteiro | |
getSessionPropertyLong(String key) | long | Recupera o valor de uma variável de sessão tipo long | |
getSessionPropertyByte(String key) | byte | Recupera o valor de uma variável de sessão tipo byte | |
getSessionPropertyDouble(String key) | double | Recupera o valor de uma variável de sessão tipo double | |
getSessionPropertyBool(String key) | boolean | Recupera o valor de uma variável de sessão tipo booleano | |
getSessionPropertyStr(String key) | String | Recupera o valor de uma variável de sessão tipo string | |
setSessionProperty(String key, Object value) | void | Insere o valor de uma variável de sessão tipo objeto | |
setSessionPropertyInt(String key, int value) | void | Insere o valor de uma variável de sessão tipo inteiro | |
setSessionPropertyLong(String key, long value) | void | Insere o valor de uma variável de sessão tipo long | |
setSessionPropertyByte(String key, byte value) | void | Insere o valor de uma variável de sessão tipo byte | |
setSessionPropertyDouble(String key, double value) | void | Insere o valor de uma variável de sessão tipo double | |
setSessionPropertyBool(String key, boolean value) | void | Insere 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étodo | Tipo | Descrição | |
|---|---|---|---|
beginTransactionBlock() | void | Inicia o bloco transacional de um escopo da regra de negócio | Garantir o contexto transacional do bloco - Banco de dados |
commitTransactionBlock() | void | Efetiva o bloco transacional de um escopo da regra de negócio | |
rollbackTransactionBlock() | void | Desfaz 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étodo | Tipo | Descrição | |
|---|---|---|---|
getRequestURI() | String | Informa endpoint da requisição | Somente para protocolo HTTP(S) |
getQueryURI() | String | Informa os parametros da query da requisição se houver | Somente para protocolo HTTP(S) |
getMethodURI() | String | Informa tipo de método enviado pela requisição | Somente para protocolo HTTP(S) |
Manupulação da estrutura de entrada/saída
| Método | Tipo | Descrição | |
|---|---|---|---|
addFieldsNotResponse(String field) | void | Adiciona os campos que não poderão ser retornados para canal | |
changeOutput(Object output) | void | Muda a estrutura de saída | Estrutura de saída default é getOutput() |
noOutput() | void | Aborta a estrutura de saída para canal | |
getConfidentialFieldInputList() | String[] | Lista de campos de entrada considerados confidenciais | No logs os valores destes campos são impressos como asterisco |
getConfidentialFieldOutputList() | String[] | Lista de campos de saída considerados confidenciais | No 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
}
}