getManager() conceitual

0:00 / 0:00

O getManager() aparece em vários lugares do CRUD — Action, XtPage, DAO, MdFactory e Model. Este episódio explica o fio invisível que conecta essas peças: como o cartão temporário (o Manager) é montado quando um pedido chega, e como ele é passado de peça em peça pra que todo mundo tenha o mesmo contexto do request.

Nota: esta é uma página conceitual — não tem arquivo Java pra modificar. Entender esse fio é o que conecta tudo que a gente construiu nos episódios anteriores.

Duas fases: prédio acordando vs pedido chegando

O Jasap tem dois momentos distintos em que lida com Managers — importante não confundir:

Fase 1 — Inicialização (prédio acordando):

  1. O sistema sobe, antes de qualquer pedido
  2. Cria uma INSTÂNCIA TEMPORÁRIA de cada Manager do prédio (RootManager, PnlManager, DepartamentoManager, etc.)
  3. Chama config() em cada um — é aí que cada Manager registra seus serviços (regAction) e crachás (regFun) no mapa global do prédio
  4. Descarta as instâncias — elas eram só temporárias pra config

Nessa fase não tem agente, não tem cartão de verdade. Só o sistema preparando o prédio.

Fase 2 — Requisição (pedido chegando):

  1. Um request chega na internet
  2. O sistema consulta o mapa global e descobre que destino o pedido quer
  3. Monta UM CARTÃO TEMPORÁRIO novo com as 3 camadas encaixadas: AppManager + PnlManager + DepartamentoManager
  4. O cartão tem: sessão do usuário, conexão com o banco, ferramentaria local, acessos ao ui() — tudo do contexto deste request
  5. Um agente novo nasce com o cartão pronto na mão
  6. No fim do request, cartão e agente são descartados
Onde getManager() aparece

O mesmo cartão (Manager) é passado pra várias peças. Cada uma o acessa com getManager() — mas vem de lugares diferentes:

PeçaDe onde getManager() vemPra que usa
Action (ex: List)Herdado de JasapAct — framework injeta no início do requestPassar pro new XtPage(getManager()), pro getFactory(), pra buscar o WBean
XtPagePassado no construtor da Action new XtPage(getManager())Acessar ferramentaria, configurar a página com contexto
DAOConfigurado via setManager(manager) no construtorAcessar o banco: getDataBase()
MdFactoryRecebido no construtor: DepartamentoMdFactory(AppManager manager)Passar pros Models que a factory fabrica
ModelHerdado do DAO (via super(manager))Mesmo que o DAO — acesso ao banco

É SEMPRE O MESMO cartão passando de mão em mão. Não tem dois cartões diferentes rodando ao mesmo tempo no mesmo request.

As 3 camadas encaixadas do cartão

O cartão não é um objeto único — são 3 camadas encaixadas como País > Estado > Cidade (um endereço, não pessoas diferentes):

CamadaTipoFornece
1AppManager (framework)Sessão, conexão com banco, contexto do request — a infraestrutura básica
2PnlManager (projeto)Permissões do Painel de Controle, regFun, verificação de ok()
3DepartamentoManager (módulo)Actions registradas do módulo, F_ACESSO_MODULO, config específica

Quando uma Action chama getManager(), o que ela recebe é a camada mais externa (DepartamentoManager), que tem TUDO das camadas de baixo por herança. É um só objeto com todo o contexto junto.

Por que o DAO precisa do cartão?

O DAO não fala com o banco direto — ele passa por um LEITOR DE CARTÃO. O leitor precisa do cartão pra:

  • Pegar a conexão que foi aberta pelo guarda da portaria (DataBaseFilter) no início do request
  • Confirmar qual departamento tá fazendo a query (pra logs, permissões, filtros globais)
  • Usar o contexto da sessão se precisar (ex: timezone do usuário)

Sem o cartão, o DAO não tem acesso ao banco. Por isso o construtor do DAO faz setManager(manager) + setDataBase(manager.getDataBase()) — extrai a conexão do cartão e guarda.

O fio completo numa chamada real

Veja uma chamada típica que um setor de listagem faz pra buscar produtos:

getFactory().departamento().proModel().daoList(lv.getData());

Seguindo o fio do cartão:

  1. getFactory() — herdado de AppsRootAction. Devolve a AppsRootModelFactory configurada com o cartão do request atual
  2. .departamento() — a factory central cria uma DepartamentoMdFactory passando o mesmo cartão pro construtor
  3. .proModel() — na primeira chamada, a factory local cria o DepartamentoProdutoModel passando o mesmo cartão. Construtor do Model faz super(manager) — o cartão chega no DAO. DAO faz setManager + setDataBase
  4. .daoList(lv.getData()) — agora o DAO tem o cartão e consegue chamar getDataBase() pra rodar a query

O cartão passou por 4 peças diferentes nessa única linha de código. Nenhuma criou um cartão novo — todas receberam o mesmo que o agente tinha na mão.

Resumo — O Fio do Cartão

Em cada request:

Saber que é sempre o MESMO cartão passando de mão em mão é o que faz tudo fazer sentido junto.