- EL CONOCIMIENTO ES Y DEBE SER LIBRE -

domingo, diciembre 26, 2010

PRIMEROS PASOS CON: SMARTGWT LGPL+APP ENGINE

ACLAREMOS EL PANORAMA
SMARTGWT EE (Enterprise Edition) hace uso del protocolo GWT-RPC; por lo tanto,  el Servidor (contenedor de Servlets) debe entender Java.  Sin embargo, existe un proyecto denominado  GWTPPHP que intenta implementar GWT-RPC para usarlo con PHP (lamentablemente la actividad del proyecto es bastante baja, casi nula) .

SMARTGWT LGPL (FREE) puede recuperar los datos en formato JSON o XML vía HTTP (como se ha mostrado a lo largo de este Blog). Sin embargo, en el foro de SmartGWT encontraran una librería llamada GwtRpcDataSource (desarrollada por marbot)  que nos permite utilizar GWT-RPC, pero todavía no está lo bastante madura.

Debido a lo anteriormente mencionado en este post nos comunicaremos con Appengine a través de scripts jsp(java server page), es decir JSON vía HTTP.

Aunque he conseguido realizar  pequeños proyectos con SmartGWT  LGPL con PHP usando  MVP . Seguir con la misma filosofía  con un Servidor Java (contenedor de Servlets) es factible, aunque tendría que construir un framework MVP (similar al construido con PHP),  en el corto plazo no está en mis planes.

EL EJEMPLO
El ejemplo mostrado tiene el mismo funcionamiento de de la entrada: “PRIMEROS PASOS CON: GWT DESIGNER  + SMARTGWT + PHP”. Solo se ha migrado la aplicación, que inicialmente corría sobre el Servidor Web Apache, para que ahora se ejecute sobre el Almacén de Datos de Appengine.
En esta dirección podrás ver la ejecución del ejemplo:  http://gwtdesigner2010.appspot.com  , la librería SmartGwt es bastante pesada, así que, tendrás que tener un poco de paciencia.
La entrada “PRIMEROS PASOS CON: GWT DESIGNER  + SMARTGWT + PHP” genero un proyecto que lo llamamos “gwtdesigner” es conveniente que habrás este proyecto para completar el ejemplo; ya que, haremos uso del código ahí mostrado.

Los pasos que se muestran en el video-tutorial se pueden resumir como sigue:
  1. Creamos un nuevo proyecto nombrándolo como “gwtdesignerAppEngine“.
  2. Borramos el código generado, por el Asistente, convenientemente (ver el video).
  3. Copiamos “DSDesigner.java” y “gwtdesigner.java” del proyecto “gwtdesigner” a nuestro paquete “pck.client”.
  4. Modificamos  el archivo de configuración (gwt.xml) para que el punto de entrada (entry point) del proyecto sea “gwtdesigner.java”; ya que, el asistente creo  por defecto el “gwtdesignerappengine.java” como punto de entrada.
  5. Eliminamos “gwtdesignerappengine.java”.
  6. Creamos los archivo “add.jsp”,” remove.jsp” y “update.jsp”.
  7. Creamos el archivo “Empleados.java” y “PMF.java”, enseguida los añadimos en “pck.server”.
  8. Modificamos “DSDesigner.java” para que se direccionen a:  “add.jsp”,” remove.jsp” y “update.jsp”.
  9. Subimos la proyecto a AppEngine.   
Esta entrada se continuara actualizando… en el breve plazo.

/*
 * Codigo Fuente PMF.java
 */
package pck.server;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

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

    private PMF() {}

    public static PersistenceManagerFactory get() {
        return pmfInstance;
    }
}
/*
 * Codigo Fuente Empleado.java
 */
package pck.server;

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;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Empleado {
 
 @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;
 @Persistent
 private String nombres;
 @Persistent
 private String dni;
 @Persistent
 private String email;
 
 public Empleado(String Nombres, String Dni,String Email) {
  this.nombres=Nombres;
        this.dni=Dni;
        this.email=Email;
    }

 public void setNombres(String nombres) {
  this.nombres = nombres;
 }

 public String getNombres() {
  return nombres;
 }

 public void setDni(String dni) {
  this.dni = dni;
 }

 public String getDni() {
  return dni;
 }

 public void setEmail(String email) {
  this.email = email;
 }

 public String getEmail() {
  return email;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public Long getId() {
  return id;
 }
}
<%
/*
* Codigo Fuente add.jsp
*/
%>
<%@ page import= "pck.server.*" %>
<%@ page import= "java.util.List" %>
<%@ page import= "javax.jdo.PersistenceManager" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %>
<%
  String nombres=request.getParameter("nombres");
  String dni=request.getParameter("dni");
  String email=request.getParameter("email");
  
  Empleado employee = new Empleado(nombres, dni,email);
  PersistenceManager pm = PMF.get().getPersistenceManager();

  JSONObject enviar=new JSONObject();
  JSONObject resp=new JSONObject();
  JSONArray data=new JSONArray(); 

  try {   
    employee=pm.makePersistent(employee);
             
    JSONObject reg= new  JSONObject();
    reg.put("id", employee.getId());
    reg.put("nombres", nombres);
    reg.put("dni", dni);
    reg.put("email", email);
    data.put(0, new JSONObject(reg.toString()));
    pm.close();
   resp.put("status",0);
   resp.put("data",new JSONArray(data.toString())); 
   enviar.put("response", new JSONObject(resp.toString()));
   
  } catch (Exception e) {
   pm.close();
   response.setContentType("text/plain");
   response.getWriter().println(e.toString());
  }
  
  response.setContentType("text/plain");
  response.getWriter().println(enviar.toString());
%>
<%
/*
* Codigo Fuente fetch.jsp
*/
%>
<%@ page import= "pck.server.*" %>
<%@ page import= "java.util.List" %>
<%@ page import= "javax.jdo.PersistenceManager" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %>

<%
  JSONObject enviar=new JSONObject();
  JSONObject resp=new JSONObject();
  JSONArray data=new JSONArray(); 
  
  PersistenceManager pm = PMF.get().getPersistenceManager();
   
  try {
   
   String query = "select from " + Empleado.class.getName();
   
      List<Empleado> employees = (List<Empleado>) pm.newQuery(query).execute();   
   
   for(int i=0;i<employees.size();i++){
    
    JSONObject reg= new  JSONObject();
    reg.put("id", employees.get(i).getId());
    reg.put("nombres", employees.get(i).getNombres());
    reg.put("dni", employees.get(i).getDni());
    reg.put("email", employees.get(i).getEmail());
    
    data.put(i, new JSONObject(reg.toString()));
   }
   pm.close();
   resp.put("status",0);
   resp.put("data",new JSONArray(data.toString())); 
   enviar.put("response", new JSONObject(resp.toString()));
   
  } catch (Exception e) {
   pm.close();
   response.setContentType("text/plain");
   response.getWriter().println(e.toString());
  }
  response.setContentType("text/plain");
  response.getWriter().println(enviar.toString());
  
%>
<%
/*
* Codigo Fuente update.jsp
*/
%><%@ page import= "pck.server.*" %>
<%@ page import= "java.util.List" %>
<%@ page import= "javax.jdo.PersistenceManager" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %>

<%
  String id=request.getParameter("id");
  String nombres=request.getParameter("nombres");
  String dni=request.getParameter("dni");
  String email=request.getParameter("email");
  
  JSONObject enviar=new JSONObject();
  JSONObject resp=new JSONObject();
  JSONArray data=new JSONArray(); 
  
  PersistenceManager pm = PMF.get().getPersistenceManager();
    
  try {
    Empleado e = pm.getObjectById(Empleado.class, Long.parseLong(id));
    
    e.setDni(dni);
    e.setNombres(nombres);
    e.setEmail(email);
    
    pm.close();
    
    JSONObject reg= new  JSONObject();
    reg.put("id", Integer.parseInt(id));
    reg.put("nombres", nombres);
    reg.put("dni", dni);
    reg.put("email", email);
    data.put(0, new JSONObject(reg.toString()));
   
   resp.put("status",0);
   resp.put("data",new JSONArray(data.toString())); 
   enviar.put("response", new JSONObject(resp.toString()));
   
  } catch (Exception e) {
   
   pm.close();
   response.setContentType("text/plain");
   response.getWriter().println(e.toString());
  }
  response.setContentType("text/plain");
  response.getWriter().println(enviar.toString());
%>