Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
-
Upload
nicolas-bortolotti -
Category
Documents
-
view
218 -
download
0
Transcript of Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
-
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
1/10
Nicols Bortolotti
versin:1.1
Datastore, Utilizando consultas simplesmediante 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 archivode 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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
2/10
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 deuna 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 panelorganizador 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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
3/10
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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
4/10
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 {
}
public consultaCliente() {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("btnConsultar")
void onBtnConsultarClick(ClickEvent event)
{
clienteService.GetClienteImportante(txtemail.getText(),new AsyncCallback() {
@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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
5/10
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 quese 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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
6/10
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;
@Persistentprivate 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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
7/10
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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
8/10
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
http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
9/10
Nicols Bortolotti
versin:1.1
Code 5 Mtodo getClienteImportante detallado
El Code 5 muestra resaltado en amarillo la utilizacin de PersistenceManager, luego en azulpodemos 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
http://www.eclipse.org/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://www.eclipse.org/http://www.eclipse.org/http://www.eclipse.org/http://www.eclipse.org/http://www.eclipse.org/http://www.eclipse.org/http://www.eclipse.org/http://www.eclipse.org/ -
8/6/2019 Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011
10/10
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
http://code.google.com/webtoolkit/http://code.google.com/appengine/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://creativecommons.org/licenses/by-nc/3.0/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/appengine/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/http://code.google.com/webtoolkit/