Consumindo SOAP Web Service no MAF

Tweet about this on TwitterShare on Facebook3Share on LinkedIn8Share on Google+0

Vamos criar um aplicativo MAF para consumir o ADF-BC Application Module exposto como SOAP Web Service (Expor Application Module como SOAP Web Service). Como você deve saber, o Oracle MAF, anteriormente Oracle ADF Mobile, é a nova solução mobile da Oracle.

Neste post vamos criar um CRUD de funcionários no Oracle MAF 2.0.1. Ele irá se comunicar com o ADF-BC através de um SOAP Web Service. Baixe o aplicativo de exemplo: MAFSOAPApp.zip .

Vamos começar!
Crie um aplicativo Framework Mobile Application, e nomeie como MAFSOAPApp.

consuming-soap-web-services-in-maf1

No arquivo maf-feature.xml, crie uma nova feature e nomeie como employees.

consuming-soap-web-services-in-maf2

Clique na guia Content e, em seguida, clique no botão de mais verde perto do campo File, para criar o EmployeesTF Task Flow.

consuming-soap-web-services-in-maf3

Crie o Data Control que conecta ao ADF-BC SOAP Web Service.
Antes de tudo, inicialize o ADF-BC SOAP Web Service.

consuming-soap-web-services-in-maf4

No menu principal, selecione File > New > From Gallery.
Na caixa de diálogo New Gallery, escolha Business Tier > Data Controls > Web Service Data Control (SOAP/REST).
Preencha o formulário e clique em Next.

consuming-soap-web-services-in-maf5

Selecione todas as operações e clique em Finish.

consuming-soap-web-services-in-maf6

Crie a entidade Employee.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > Java Class.
Nesta aplicação, a classe Employee deve implementar a classe Cloneable.

consuming-soap-web-services-in-maf7

Copie o seguinte código dentro da classe Employee.

private Integer employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private java.sql.Date hireDate;
private String jobId;
private BigDecimal salary;
private BigDecimal commissionPct;
private Integer managerId;
private Integer departmentId;

protected Object clone() throws CloneNotSupportedException {
  return super.clone();
}

Gere os assessores.
Marque esta opção: “Notify listeners when property changes”.

consuming-soap-web-services-in-maf8

Nós não vamos usar o HRSOAPDC Data Control dentro das páginas.
Vamos criar um POJO Data Control que irá utilizar as operações do HRSOAPDC.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > Java Class.

consuming-soap-web-services-in-maf9

Copie o seguinte código dentro da classe HRSOAPPojoDC.

private Employee employee;
private List employees = new ArrayList();

public void setEmployee(Employee employee) {
  this.employee = employee;
}

public Employee getEmployee() {
  return employee;
}

public Employee[] getEmployees() {
  return (Employee[]) employees.toArray(new Employee[employees.size()]);
}

public void initEmployeeToAdd() {
  employee = new Employee();
}

public void initEmployeeToEdit(Employee employee) throws CloneNotSupportedException {
  this.employee = (Employee) employee.clone();
}

public void findAll() {
  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "findAll", "Executing findAll Method");

  try {
    GenericType result =
      (GenericType) AdfmfJavaUtilities.invokeDataControlMethod(
        "HRSOAPDC", null, "findEmployees", new ArrayList(), new ArrayList(), new ArrayList());

    result = result.getParent();
    employees.clear();

    for (int i = 0; i < result.getAttributeCount(); i++) {
      GenericType gt = (GenericType) result.getAttribute(i);
      Employee employee = (Employee) GenericTypeBeanSerializationHelper.fromGenericType(Employee.class, gt);
      employees.add(employee);
    }

  } catch (AdfInvocationException ex) {
    if (AdfInvocationException.CATEGORY_WEBSERVICE.compareTo(ex.getErrorCategory()) == 0) {
      throw new RuntimeException("Error with the server. Please try later.");
    }
  } catch (Exception e) {
    throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
  }

  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "findAll", "End findAll Method");
}

public void update(Employee employee) {
  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "update", "Executing update Method");

  List pNames = new ArrayList();
  List pValues = new ArrayList();
  List pTypes = new ArrayList();

  pNames.add("employeesView1");
  pValues.add(employee);
  pTypes.add(Employee.class);
        
  try {
    AdfmfJavaUtilities.invokeDataControlMethod("HRSOAPDC", null, "updateEmployee", pNames, pValues, pTypes);

  } catch (AdfInvocationException ex) {
    if (AdfInvocationException.CATEGORY_WEBSERVICE.compareTo(ex.getErrorCategory()) == 0) {
      throw new RuntimeException("Error with the server. Please try later.");
    }
  } catch (Exception e) {
    throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
  }

  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "update", "End update Method");
}

public void create(Employee employee) {
  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "create", "Executing create Method");

  List pNames = new ArrayList();
  List pValues = new ArrayList();
  List pTypes = new ArrayList();

  pNames.add("employeesView1");
  pValues.add(employee);
  pTypes.add(Employee.class);

  try {
    AdfmfJavaUtilities.invokeDataControlMethod("HRSOAPDC", null, "createEmployee", pNames, pValues, pTypes);

  } catch (AdfInvocationException ex) {
    if (AdfInvocationException.CATEGORY_WEBSERVICE.compareTo(ex.getErrorCategory()) == 0) {
      throw new RuntimeException("Error with the server. Please try later.");
    }
  } catch (Exception e) {
    throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
  }

  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "create", "End create Method");
}

public void delete(Employee employee) {
  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "delete", "Executing delete Method");

  List pNames = new ArrayList();
  List pValues = new ArrayList();
  List pTypes = new ArrayList();

  pNames.add("employeesView1");
  pValues.add(employee);
  pTypes.add(Employee.class);

  try {
    AdfmfJavaUtilities.invokeDataControlMethod("HRSOAPDC", null, "deleteEmployee", pNames, pValues, pTypes);

  } catch (AdfInvocationException ex) {
    if (AdfInvocationException.CATEGORY_WEBSERVICE.compareTo(ex.getErrorCategory()) == 0) {
      throw new RuntimeException("Error with the server. Please try later.");
    }
  } catch (Exception e) {
    throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
  }

  Trace.log(Utility.ApplicationLogger, Level.FINEST, this.getClass(), "delete", "End delete Method");
}

Crie o HRSOAPPojoDC Data Control.
Vá ao painel Projects, clique com o botão direito no arquivo HRSOAPPojoDC.java e escolha Create Data Control.
Na caixa de diálogo Create Bean Data Control, clique em Next e em Finish.

consuming-soap-web-services-in-maf10

consuming-soap-web-services-in-maf11

Abra o arquivo EmployeesTF.xml.
Vá para o painel Data Controls e expanda HRSOAPPojoDC.
Arraste as operações FindAll, initEmployeeToAdd e initEmployeeToEdit e solte dentro da EmployeesTF.
Na caixa de diálogo Edit Action Binding, defina o valor de employee para #{pageFlowScope.employeeSelected}.

consuming-soap-web-services-in-maf12

Arraste três componentes View e um Router e solte dentro da EmployeesTF.
Conecte-os usando o componente Flow Control Case.

consuming-soap-web-services-in-maf13

Clique duas vezes em todos os componentes View e clique em OK para criar as AMX Pages.

consuming-soap-web-services-in-maf14

Clique no componente Router e o configure como a imagem seguinte.

consuming-soap-web-services-in-maf15

Abra a página EmpList.
Vá ao painel Data Control, arraste a coleção employees e solte dentro página como MAF List View.
Na ListView Gallery, clique em OK duas vezes.

consuming-soap-web-services-in-maf16

consuming-soap-web-services-in-maf17

Altere a página EmpList como a imagem seguinte.

consuming-soap-web-services-in-maf18

Vá para Bindings e edite o employees binding.
Adicione lastName e firstName como Display Attributes.

consuming-soap-web-services-in-maf19

Abra a página EmpDetail.
Vá ao painel Data Control, arraste a coleção employees e solte dentro página como MAF Read-only Form.
Na caixa de diálogo Edit Form Fields, clique em Ok.

consuming-soap-web-services-in-maf20

Vá ao painel Data Control, arraste a operação delete e solte dentro do facet secondary como MAF Button.
Em Edit Action Binding, defina o valor de employee para #{bindings.employeesIterator.currentRow.dataProvider}.

consuming-soap-web-services-in-maf21

Altere a página empDetail como a imagem seguinte.

consuming-soap-web-services-in-maf22

Abra a página empEdit.
Vá ao painel Data Control, arraste o atributo estruturado employee e solte dentro da página como MAF Form.
Na caixa de diálogo Edit Form Fields, clique em Ok.

consuming-soap-web-services-in-maf23

Vá ao painel Data Control, arraste as operações create e update e solte dentro do facet secondary como MAF Button.
Em Edit Action Binding, defina o valor de employee para #{bindings.employeeIterator.currentRow.dataProvider}.

consuming-soap-web-services-in-maf24

consuming-soap-web-services-in-maf25

Altere a página empEdit como a imagem seguinte.

consuming-soap-web-services-in-maf26

Abra o arquivo DataBindings.cpx e adicione a seguinte linha.

consuming-soap-web-services-in-maf28

Vá ao Painel Application Resources e expanda Descriptors > ADF META-INF.
Abra o arquivo connections.xml e mude o host para 10.0.2.2.
Android usa esse host para acessar o seu localhost.

consuming-soap-web-services-in-maf27

Faça deploy do aplicativo e divirta-se!

consuming-soap-web-services-in-maf29

consuming-soap-web-services-in-maf30

consuming-soap-web-services-in-maf31

consuming-soap-web-services-in-maf32

Tweet about this on TwitterShare on Facebook3Share on LinkedIn8Share on Google+0

Autor: Waslley Souza

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

Deixe uma resposta

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