ADF: Usando Save Points (Explícito)

Você pode configurar um task flow para capturar o estado de uma aplicação ADF em uma instância específica criando o que se chama um Save Point. Isso permite que você salve o estado do aplicativo quando, por exemplo, você está criando um novo departamento, e o estado do aplicativo pode ser restaurado em um momento posterior.

Um save point explícito requer uma ação do usuário final antes de um bounded ou unbounded task flow criar um Save Point. Por exemplo, um usuário final clica em um botão que invoca um method call activity, que por sua vez, cria um save point.

Neste post, você vai aprender como usar save point explícito no Oracle ADF 12c (12.1.3).
Faça o download do aplicativo de amostra: ADFSavePointApp.zip.

Crie um ADF Fusion Web Application, e nomeie como ADFSavePointApp.
Esta aplicação deve implementar ADF Task Flow com dados de departamentos.

adf-using-save-points-explicit1

Configure seu aplicativo para usar save points.
No painel Application Resources, expanda Descriptors > ADF META-INF, e abra o arquivo adf-config.xml.
Vá para a página Controller e clique no ícone de lupa perto do campo Data Source, para escolher o savepoint connection.

adf-using-save-points-explicit2

Para usar save point, deixe o valor da propriedade jbo.locking.mode definido para o valor padrão optimistic.

adf-using-save-points-explicit3

Uma tabela de banco de dados chamada ORADFCSAVPT armazena save points. Se esta tabela de banco de dados não existir, ela é criada automaticamente pela aplicação ADF. Você pode usar o seguinte script SQL para criar a tabela de banco de dados do ORADFCSAVPT também.

<MIDDLEWARE_HOME>\oracle_common\common\sql\adfc_create_save_point_table.sql

Para criar save points, você pode usar o método createSavePoint exposto pelo nó currentViewPort do ADF Controller Objects. A expressão EL resultante é semelhante ao que se segue:

#{controllerContext.currentViewPort.createSavePoint}

Vou identificar meus save points com o nome dos departamentos, assim, vou criar um método personalizado para a criação de save points.
No task flow, clique duas vezes no componente listSavePoints.
Na caixa de diálogo Select Method, clique no botão New e crie um novo Managed Bean.

adf-using-save-points-explicit4

Na caixa de diálogo Select Method, defina listSavePoints como nome do método.

adf-using-save-points-explicit5

Dê um duplo clique no componente listSavePoints para ir ao bean.
Substitua todo o conteúdo do arquivo com o seguinte código:

package br.com.waslleysouza.view.beans;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import oracle.adf.controller.ControllerContext;
import oracle.adf.controller.savepoint.SavePointAttributes;
import oracle.adf.controller.savepoint.SavePointManager;

public class SavePointBean implements Serializable {

  private static final long serialVersionUID = 1L;
    
  private List savePointSelectItems = new ArrayList();

  public SavePointBean() {}

  public List getSavePointSelectItems() {
    return savePointSelectItems;
  }

  public void createSavePoint(String savePointName) {
    ControllerContext cc = ControllerContext.getInstance();
    if (cc != null) {
      SavePointManager mgr = cc.getSavePointManager();
      if (mgr != null) {
        SavePointAttributes spa = new SavePointAttributes(savePointName, savePointName, null);
        String id = mgr.createSavePoint(spa);
        System.out.println("Save point is being set " + id);
      }
    }
  }

  public void listSavePoints() {
    savePointSelectItems.clear();
    ControllerContext cc = ControllerContext.getInstance();
    if (cc != null) {
      SavePointManager mgr = cc.getSavePointManager();
      if (mgr != null) {
        List savePointIdList = mgr.listSavePointIds();
        for (String savePointId : savePointIdList) {
          SavePointAttributes attributes = mgr.getSavePointAttributes(savePointId);
          SelectItem item = new SelectItem(savePointId, attributes.getName());
          savePointSelectItems.add(item);
        }
      }
    }
  }
}

Crie o fragmento de página deptView.
O componente selectOneChoice apresenta todos os save points.
Os componentes de botão adicionam departamentos e gerenciam save points (Restaurar e remover).

adf-using-save-points-explicit6

adf-using-save-points-explicit7

Crie o fragmento de página deptEditView.
O componentes de botão salvam departamentos e criam save points.

adf-using-save-points-explicit8

adf-using-save-points-explicit9

Clique no componente removeAllSavePoints e o configure.
Ele remove todos os save points para o usuário atual.

adf-using-save-points-explicit10

Clique no componente savePointRestore e o configure.
Ele restaura o save point por id.

adf-using-save-points-explicit11

Clique no componente removeSavePoint e o configure.
Ele remove o save point com um determinado id.

adf-using-save-points-explicit12

Clique no componente createSavePoint e o configure.
Ele cria um save point para o usuário atual.

adf-using-save-points-explicit13

Faça deploy do aplicativo e divirta-se!
Crie um save point.

adf-using-save-points-explicit14

adf-using-save-points-explicit15

adf-using-save-points-explicit16

Restaure o save point.

adf-using-save-points-explicit17

Faça commit do novo departamento (e remova o save point).

adf-using-save-points-explicit18

adf-using-save-points-explicit19

Remova todos os save points.

adf-using-save-points-explicit20

adf-using-save-points-explicit21

Referências:
Oracle ADF 12c Documentation
Java API Reference for Oracle ADF 12c

Waslley Souza

Autor: Waslley Souza

Consultor Oracle com foco em tecnologias Oracle Fusion Middleware e SOA. Certificado Oracle WebCenter Portal, Oracle ADF e Java.

2 pensamentos em “ADF: Usando Save Points (Explícito)”

  1. Ola Waslley vc é a minha ultima esperança. Tenho 3 componentes inputcomboboxlistofvalues mas preciso colocar validação. Ao informar um valor invalido a tela de pesquisa e exibida se eu não pesquisar um novo valor e clicar no botão cancelar e clicar no proximo campo com o mesmo componente eu queria que a telade pesquisa fosse exibida ate que o primeiro campo tivesse o valor corrigido. Sabe me ajudar com essa duvida.
    Obrigada

    1. Joyce, penso que a melhor solução para o seu caso seria você colocar os outros campos bloqueados e somente desbloquear depois que o primeiro campo fosse preenchido corretamente. Você também pode fazer a validação no próximo campo, e caso o campo anterior não esteja preenchido, executa a tela de pesquisa.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *