Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011

download Datastore Utilizando consultas simples mediante GWT and GAE - Devfest Mx2011

of 10

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/