Está en la página 1de 10

Nicols Bortolotti versin:1.

Datastore, Utilizando consultas simples mediante GWT y GAE.


En esta actividad nos vamos a introducir a las consultas en el datastore, algo muy importante en miras de generar aplicaciones empresariales. Introduccin Cada consulta del almacn de datos utiliza un ndice, una tabla que contiene los resultados de la consulta en el orden deseado. Una aplicacin App Engine define sus ndices en un archivo de configuracin con el nombre datastore-indexes.xml. El mecanismo de consultas basado en ndices admite los tipos de consultas ms habituales, pero no admite determinados tipos de consultas procedentes de otras tecnologas de bases de datos a los que es posible que ests acostumbrado. Para ejecutar las consultas como introducimos en los articulos de persistencias utilizamos JDO y esta tecnologa utiliza un lenguaje de consultas denominado JDOQL.. JDO como les coment, incluye un lenguaje de consulta favorable para recuperar objetos que cumplen una serie de criterios. Este lenguaje, denominado JDOQL, hace referencia a los campos y clases de datos JDO e incluye una comprobacin de tipos para los resultados y parmetros de la consulta. JDOQL es similar a SQL, aunque es ms adecuado para bases de datos relacionadas con objetos, como, por ejemplo, el almacn 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 artculos: - 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 diseo Vamos a generar una prctica que pueda devolver los objetos cliente que cumplan con la condicin de tener un email ingresado por UI. Al obtener el resultado de esta consulta se muestra el nombre del cliente correspondiente. Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1 Generando el UI de la actividad Para esta actividad se le solicita que genere el UI que permita ingresar un email y por medio de una accin se pueda obtener el nombre del cliente al cual le corresponde dicha informacin.

Fig. 1 - Prototipo de alto nivel propuesto. La Fig. 1 muestra la idea simple del diseo de UI pero propone en el entrypoint un panel organizador DockLayoutPanel dentro de una de las zonas, en este caso sobre la zona oeste colocaremos una UI especfica llamada consultaCliente esta ultima con tecnologa UiBinder.

package ar.com.comunidadxcloud.nbortolotti.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.RootPanel; public class Entrada implements EntryPoint { @Override public void onModuleLoad() { RootPanel rootPanel = RootPanel.get(); Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1 DockLayoutPanel dockLayoutPanel = new DockLayoutPanel(Unit.EM); rootPanel.add(dockLayoutPanel, 10, 10); dockLayoutPanel.setSize("259px", "280px"); consultaCliente obj = new consultaCliente(); dockLayoutPanel.addWest(obj, 100); } } Code 1 Entry point de la aplicacin planteada.

package ar.com.comunidadxcloud.nbortolotti.client; import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Button; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.event.dom.client.ClickEvent; public class consultaCliente extends Composite { Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1 private final ClientesServiceAsync clienteService = GWT.create(ClientesService.class); private static consultaClienteUiBinder uiBinder = GWT .create(consultaClienteUiBinder.class); @UiField TextBox txtemail; @UiField Button btnConsultar; interface consultaClienteUiBinder extends UiBinder<Widget, consultaCliente> { } public consultaCliente() { initWidget(uiBinder.createAndBindUi(this)); } @UiHandler("btnConsultar") void onBtnConsultarClick(ClickEvent event) { clienteService.GetClienteImportante(txtemail.getText(),new AsyncCallback<ClienteDTO>() { @Override public void onSuccess(ClienteDTO result) { Window.alert(result.getNombre()); } @Override public void onFailure(Throwable caught) { Window.alert("Error"); } }); } } Code 2 - Interfaz UiBinder consultaCliente En el Code 2 se muestra la presentacin en UI que propone la actividad, y como pueden observar la llamada al servlet se utiliza desde dentro de esta UI, resaltado en amarillo. Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1

Servicio de soporte a la consulta Para esta actividad utilizaremos un servicio GWT RPC que de soporte a la consulta. Para ellos tendremos los siguientes elementos: ClientesService ClientesServiceAsync ClientesServiceImpl El objetivo del servicio es devolver un objeto, como ustedes saben tiene que ser serializable y para ello utilizamos los DTO. Por simplicidad solo visualizaremos el cdigo de la implementacin del servicio. package ar.com.comunidadxcloud.nbortolotti.server; 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 ClienteDTO GetClienteImportante(String email) { return Cliente.toDTO(Cliente.getClienteImportante(email)); } } Code 3 Implementacin del servicio ClientesServiceImpl En el Code 3 podemos observar como se utiliza el objeto de dominio Cliente y se utiliza para la respuesta el cliente DTO, ClienteDTO. Vamos a analizar el escenario de persistencia que se implementa. Escenario de persistencia Para analizar este escenario les voy a proponer la descripcin del objeto de dominio Cliente y luego analizaremos la consulta que es parte de un mtodo de la clase. Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1

package ar.com.comunidadxcloud.nbortolotti.server.domain; import javax.jdo.PersistenceManager; import javax.jdo.Query; 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 ar.com.comunidadxcloud.nbortolotti.server.PMF; import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO; @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true") public class Cliente { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true") private String id; @Persistent private String nombre; @Persistent private String apellido; @Persistent private String email;

public Cliente() { }

public String getId() { return id; } Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin: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 void setEmail(String email) { this.email = email; }

public String getEmail() { return email; } public static ClienteDTO toDTO(Cliente c) { if (c == null) { return null; } return new ClienteDTO(c.getEmail(), c.getNombre()); Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1 } public static Cliente getClienteImportante(String email) { .. Code 5 } Code 4 Objeto de dominio Cliente El Code 4 muestra el objeto de dominio Cliente con toda su estructura de persistencia, pero el objetivo de nuestra actividad es generar una consulta especfica, por este motivo resaltaremos en el Code 5 los elementos fundamentales de la consulta. PersistenceManager pm = PMF.get().getPersistenceManager(); Cliente oneResult = null, detached = null; Query q = pm.newQuery(Cliente.class); q.setFilter("email == :email"); q.setUnique(true); try { oneResult = (Cliente) q.execute(email); if (oneResult != null) { detached = pm.detachCopy(oneResult); } } catch (Exception e) { e.printStackTrace(); } finally { pm.close(); q.closeAll(); } return detached; } Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1 Code 5 Mtodo getClienteImportante detallado El Code 5 muestra resaltado en amarillo la utilizacin de PersistenceManager, luego en azul podemos visualizar la manera de generar una consulta al datastore, en este caso particular se est utilizando un filtro para devolver un objeto que compla con el email ingresado. Finalmente resaltado en verde se puede observar la ejecuacin de la consulta, posterior a eso se manipulan los resultados para la devolucin. Veamos el resultado final de la actividad.

Fig. 2 Resultado de la implementacin de la actividad.

Tecnologa utilizada - Entorno de desarrollo Eclipse Helios: http://www.eclipse.org/ Parte del programa "Preguntale al experto de cloud" CC3

Nicols Bortolotti versin:1.1 - GAE y GWT: http://code.google.com/webtoolkit/ http://code.google.com/appengine/ - Pueden consultar el vdeo de implementacin. - Puenden consultar la presentacin resumen.

Parte del programa "Preguntale al experto de cloud" CC3

También podría gustarte