Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

15
Nicolás Bortolotti versión:1.1 Datastore, eliminando un objeto mediante GWT and GAE En esta actividad vamos a seguir utilizando el DataStore de GAE y vamos a realizar una eliminación de objeto simple. Para esta actividad vamos a utilizar todo lo aprendido en la actividad “Datastore, creando un nuevo objeto mediante GWT”. Introducción Como ya sabemos App Engine permite el uso de dos estándares de API diferentes para el almacén de datos: Objetos de datos Java (JDO) y API de persistencia Java (JPA). Estas interfaces las proporciona DataNucleus Access Platform, una implementación de software libre de varios estándares de persistencia Java, con un adaptador para el almacén de datos de App Engine. Para confeccionar un servicio mediante GWT RPC utilizaremos la referencia al articulo: - “Operando datos contra el servidor utilizando GWT RPC” Para confeccionar la UI utilizaremos la referencia a los siguientes artículos: - “Interfaz de usuario sobre GWT - Utilizando UBinder” - “Interfaz de usuario sobre GWT - Programando la UI” - “Interfaz de usuario sobre GWT - Utilizando GWT Designer, simplificando el diseño” La actividad que debemos cumplir tiene el siguiente flujo de trabajo: - Generaremos la UI, donde se permitan ingresar el id de un objeto de negocio, en este caso cliente que deseamos eliminar del repositorio de datos. - Generaremos un servicio que permita comunicar esta información de forma asincrónica, utilizaremos GWT RPC. - Articularemos las entidades para poder eliminar la entidad deseada. Nota: esta situación problemática está totalmente simulada. Veamos el prototipo diagramado de lo que debemos lograr: Parte del programa "Preguntale al experto de cloud" CC 3

Transcript of Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Page 1: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

Datastore, eliminando un objeto mediante GWT and GAEEn esta actividad vamos a seguir utilizando el DataStore de GAE y vamos a realizar una eliminación de objeto simple. Para esta actividad vamos a utilizar todo lo aprendido en la actividad “Datastore, creando un nuevo objeto mediante GWT”.

Introducción Como ya sabemos App Engine permite el uso de dos estándares de API diferentes para el almacén de datos: Objetos de datos Java (JDO) y API de persistencia Java (JPA). Estas interfaces las proporciona DataNucleus Access Platform, una implementación de software libre de varios estándares de persistencia Java, con un adaptador para el almacén de datos de App Engine. Para confeccionar un servicio mediante GWT RPC utilizaremos la referencia al articulo:- “Operando datos contra el servidor utilizando GWT RPC” Para confeccionar la UI utilizaremos la referencia a los siguientes artículos:- “Interfaz de usuario sobre GWT - Utilizando UBinder”- “Interfaz de usuario sobre GWT - Programando la UI”- “Interfaz de usuario sobre GWT - Utilizando GWT Designer, simplificando el diseño” La actividad que debemos cumplir tiene el siguiente flujo de trabajo:- Generaremos la UI, donde se permitan ingresar el id de un objeto de negocio, en este caso cliente que deseamos eliminar del repositorio de datos.- Generaremos un servicio que permita comunicar esta información de forma asincrónica, utilizaremos GWT RPC.- Articularemos las entidades para poder eliminar la entidad deseada. Nota: esta situación problemática está totalmente simulada. Veamos el prototipo diagramado de lo que debemos lograr:

Parte del programa "Preguntale al experto de cloud"CC3

Page 2: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

Fig. 1 Prototipo diagrama de la presentación de la solución. Como muestra la Fig. 1 se expone el prototipo simple que vamos a desarrollar, el elemento “id” representa una caja de texto donde ingresar la clave de un objeto para su eliminación, el elemento “eliminar” representa un botón que desencadenará las acción de eliminación.

Generando la UIPara esta actividad vamos a utilizar parte del segmento de código que propone el ejemplo que genera el asistente de proyectos de GWT.Como podemos observar en el Code 1, se encuentra segmentado en 3 partes para un mejor análisis:

● Parte 1: paquete en donde se encuentra la clase entrypoint (cliente)● Parte 2: importaciones necesarias para el desempeño de la actividad planteada.● Parte 3: clase entrypoint que maneja el servicio que realiza la actividad de eliminación

del objeto cliente.

package ar.com.comunidadxcloud.nbortolotti.client;

import com.google.gwt.core.client.EntryPoint;import com.google.gwt.core.client.GWT;import com.google.gwt.event.dom.client.ClickEvent;import com.google.gwt.event.dom.client.ClickHandler;import com.google.gwt.event.dom.client.KeyCodes;import com.google.gwt.event.dom.client.KeyUpEvent;import com.google.gwt.event.dom.client.KeyUpHandler;import com.google.gwt.user.client.Window;import com.google.gwt.user.client.rpc.AsyncCallback;

Parte del programa "Preguntale al experto de cloud"CC3

Page 3: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

import com.google.gwt.user.client.ui.Button;import com.google.gwt.user.client.ui.Label;import com.google.gwt.user.client.ui.RootPanel;import com.google.gwt.user.client.ui.TextBox;

public class EliminarObjetoPersistenciaGAE implements EntryPoint { private final ClientesServiceAsync clienteService = GWT.create(ClientesService.class);

public void onModuleLoad() {

final Button sendButton = new Button("Eliminar");final TextBox nameField = new TextBox();final Label errorLabel = new Label();

sendButton.addStyleName("sendButton");

RootPanel.get("nameFieldContainer").add(nameField);RootPanel.get("sendButtonContainer").add(sendButton);RootPanel.get("errorLabelContainer").add(errorLabel);

nameField.setFocus(true);nameField.selectAll();

class MyHandler implements ClickHandler, KeyUpHandler {

public void onClick(ClickEvent event) {

EliminarCliente(nameField.getText());

}

public void onKeyUp(KeyUpEvent event) {

if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {

Parte del programa "Preguntale al experto de cloud"CC3

Page 4: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

}}

private void EliminarCliente(String id){

clienteService.eliminarCliente(id,new AsyncCallback<Boolean>()

{public void onFailure(Throwable e){Window.alert("Se ha generado un error");}public void onSuccess(Boolean result){

if (result==true) {

Window.alert("Cliente eliminado correctamente"); } else { Window.alert("Problemas"); }

}});

}

}

MyHandler handler = new MyHandler();sendButton.addClickHandler(handler);nameField.addKeyUpHandler(handler);

}}

Code 1 - Entrypoint donde se hace la llamada al método eliminarCliente El Code 1 muestra el entrypoint en donde se realiza la implementación programática de la UI y se hace la llamada al servicio de eliminación pasando como parámetro el “id” del objeto de

Parte del programa "Preguntale al experto de cloud"CC3

Page 5: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

negocio a eliminar. Se muestra en amarillo la llamada al método privado de eliminación y se resalta en celeste el método privado que hace la llamada al servicio asincrónico.

Generación del servicio de generación del eliminación de cliente El servicio “ClientesService” se implementa completamente por 3 elementos:

● Interface “ClientesService ”.● Interface “ClientesServiceAsync”.● Clase “ClientesServiceImpl”.

package ar.com.comunidadxcloud.nbortolotti.client;

import com.google.gwt.user.client.rpc.RemoteService;import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("clientesService")public interface ClientesService extends RemoteService {

/* * Método que realiza la operación de eliminción del cliente */Boolean eliminarCliente(String id);

}

Code 2 - Interface que extiende de RemoteService para la implementación del servicio. El Code 2 muestra la interface del servicio “ClienteService” con su extensión desde RemoteService.

package ar.com.comunidadxcloud.nbortolotti.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface ClientesServiceAsync {

public void eliminarCliente(String id, AsyncCallback<Boolean> callback);}

Code 3 - Interface que propone el mecanismo asincrónico.

Parte del programa "Preguntale al experto de cloud"CC3

Page 6: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

El Code 3 muestra la interface donde se representa el mecanismo asincrónico del servicio “ClientesService”.

package ar.com.comunidadxcloud.nbortolotti.server;

import javax.jdo.PersistenceManager;import ar.com.comunidadxcloud.nbortolotti.client.ClientesService;import ar.com.comunidadxcloud.nbortolotti.server.domain.Cliente;import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO;import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")public class ClientesServiceImpl extends RemoteServiceServlet implements ClientesService { public Boolean eliminarCliente(String id) {

PersistenceManager pm = PMF.get().getPersistenceManager(); try {

Cliente c = pm.getObjectById(Cliente.class,Integer.parseInt(id));

if (c != null)

{

pm.deletePersistent(pm.getObjectById(Cliente.class, Integer.parseInt(id)));

}

} catch (Exception e)

{

}

finally { pm.close(); } return true; }

Parte del programa "Preguntale al experto de cloud"CC3

Page 7: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

}

Code 4 - Clase que implementa el servicio de eliminación del objeto Cliente. El Code 4 muestra la implementación del servicio de eliminación, remarcado en amarillo se puede observar la búsqueda del objeto por medio de su “id”, y resaltado en azul se puede observar la eliminación propiamente dicha del objeto del datastore.

Generación de entidades que participan en el mecanismo de persistenciaFinalmente les voy a detallar 3 elementos que tienen que ver con la persistencia que vamos a implementar.

● Clase “Cliente”.● Clase “ClienteDTO”.● Clase auxiliar “PMF”.

package ar.com.comunidadxcloud.nbortolotti.server.domain;

import javax.jdo.PersistenceManager;import javax.jdo.annotations.Extension;import javax.jdo.annotations.IdGeneratorStrategy;import javax.jdo.annotations.IdentityType;import javax.jdo.annotations.PersistenceCapable;import javax.jdo.annotations.Persistent;import javax.jdo.annotations.PrimaryKey;import javax.jdo.listener.StoreCallback;import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO;

@PersistenceCapable(identityType= IdentityType.APPLICATION,detachable="true")public class Cliente implements StoreCallback {

@PrimaryKey@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")private String id;

@Persistentprivate String nombre;

Parte del programa "Preguntale al experto de cloud"CC3

Page 8: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

@Persistentprivate String apellido;

public Cliente(){

} public Cliente(ClienteDTO cliente){

this();this.nombre = cliente.getNombre();this.apellido = cliente.getApellido();

}

public Cliente(ClienteDTO cliente, PersistenceManager pm){

this();this.nombre = cliente.getNombre();this.apellido = cliente.getApellido(); pm.makePersistent(this);

}

@Overridepublic void jdoPreStore() {

// TODO Auto-generated method stub

} public String getId() {

return id;}

Parte del programa "Preguntale al experto de cloud"CC3

Page 9: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

public void setNombre(String nombre) {

this.nombre = nombre;}

public String getNombre() {

return nombre;}

public void setApellido(String apellido) {

this.apellido = apellido;}

public String getApellido() {

return apellido;}

public ClienteDTO toDTO() { ClienteDTO clienteDTO = new ClienteDTO(this.getNombre(),this.getApellido()); clienteDTO.setId(this.getId());

return clienteDTO; }

}

Code 5 - Clase “Cliente” El Code 5 es una parte fundamental del mecanismo de persistencia implementado para la solución de la actividad planteada.En primer lugar podemos observar que la clase se encuentra adornada por el atributo “@PersistenceCapable(identityType= IdentityType.APPLICATION,detachable="true")” esto es derivado del mecanismo JDO y JPA para informar al API de persistencia que esta clase tendrá el mecanimo de persistencia habilitado.Para persistir el objeto debemos colocar algunos elementos a sus atributos y determinar la clave primaria, eso lo podemos visualizar en las secciones resaltadas en amarillo y azul. El el caso de “id” el elemento utilizado es @PrimaryKey además del tradicional @Persistent.

Parte del programa "Preguntale al experto de cloud"CC3

Page 10: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

El constructor de la clase realiza la operación de persistencia recibiendo como parámetros un objeto DTO(será el detalle del Code 6) y “PersistenceManager” que ejecuta el método “makePersistent” para persistir a ese mismo objeto cliente.Finalmente se encuentra resaltado en gris un método que hace la transformación a un objeto DTO cuando se lo requiera desde el servicio de persistencia.

package ar.com.comunidadxcloud.nbortolotti.shared;

import java.io.Serializable;

Parte del programa "Preguntale al experto de cloud"CC3

Page 11: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

@SuppressWarnings("serial")

public class ClienteDTO implements Serializable

{

private String id;private String nombre;private String apellido; public void setId(String id) {

this.id = id;}public String getId() {

return id;}public void setNombre(String nombre) {

this.nombre = nombre;}public String getNombre() {

return nombre;}public void setApellido(String apellido) {

this.apellido = apellido;}public String getApellido() {

return apellido;} public ClienteDTO(){

} public ClienteDTO(String nombre, String apellido){

this();this.nombre = nombre;this.apellido = apellido;

Parte del programa "Preguntale al experto de cloud"CC3

Page 12: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

}}

Code 6 - Clase ClienteDTO El Code 6, muestra la clase “ClienteDTO” que expone resaltado en amarillo que esta clase implementa la interface “Serializable” fundamental para el mecanismo de transferencia de objetos en el mecanimo GWT RPC siempre que el caso sea, que se utilicen objetos en las operaciones.

package ar.com.comunidadxcloud.nbortolotti.server; import javax.jdo.JDOHelper;import javax.jdo.PersistenceManagerFactory; public class PMF {

private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");

private PMF() {}

public static PersistenceManagerFactory get() { return pmfInstance; }

}

Code 7 - Factory de persistencia El Code 7 muestra una clase auxiliar que posee la fábrica de administradores de persistencia. Finalmente les dejo los resultados de implementación.

Parte del programa "Preguntale al experto de cloud"CC3

Page 13: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

Fig 2 - UI Generada para realizar la persitencia del objeto “Cliente” Para analizar el Datastore utilicé AppWrench como muestra la Fig. 3.

Parte del programa "Preguntale al experto de cloud"CC3

Page 14: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

Fig. 3 AppWrench con Data View donde se expone la operación de persistencia local. Tecnología utilizada

Parte del programa "Preguntale al experto de cloud"CC3

Page 15: Datastore eliminando un objeto mediante GWT and GAE - Devfest Mx2011

Nicolás Bortolottiversión:1.1

- Entorno de desarrollo Eclipse Helios:http://www.eclipse.org/ - GAE y GWT:http://code.google.com/webtoolkit/http://code.google.com/appengine/ - AppWrench:http://appwrench.onpositive.com/ - Pueden consultar el vídeo de implementación.- Puenden consultar la presentación resumen.

Parte del programa "Preguntale al experto de cloud"CC3