Tecnologías libres

sábado, septiembre 07, 2013

Llamadas asincronas a internet, haciendo hueco en el ViewModel

Cuando se realiza una llamada a internet desde la que vamos a obtener datos para nuestra aplicación. Puede tratarse de una tabla de datos de las cotas de nieve en Navacerrada o de un titular del pais.

¿Por que realizar una llamada asíncrona?
El caso es que la idea al ser un entorno táctil y lo recomendable es no bloquear la aplicación con un procesado de datos. Si tardara mucho esa llamada porque no tienes conexión o en ese momento va muy lenta. El usuario se vería "atrapado" en un proceso que no sabe cuánto va a durar y mientras tanto no puede seguir interactuando. De esa forma, consigues que el usuario pueda seguir interactuando con la aplicación.

¿Cuando se realiza esta llamada?
Lo primero al ser asincrona el metodo se ejecuta después de cargada la pantalla que con contendría esos datos. Es decir el método asincrono Resultados(IAsyncResult result) no se ejecutaría hasta que la pantalla que lo lance no se carga

//Petición de llamada asincrona
peticion = (HttpWebRequest)HttpWebRequest.Create(http://google.com);
peticion.BeginGetResponse(DatosObtenidos,null);
.....
//método que ejecuta la llamada
void Resultados(IAsyncResult result)
{
    HttpWebResponse respuesta;
    respuesta = (HttpWebResponse)peticion.EndGetResponse(result);
....
VMResultados.Resultados = ResultadosItems;
}

¿Como encajo este tipo de métodos en el patrón MVVM de mi proyecto?

La idea es que en el Binding desde el XAML se peuda acceder a la propiedad del ViewModel que recoge los datos. Como mandan los canones del MVVM.

Desde este ViewModel se usará NotifyPropertyChanged al finalizar la carga de los datos para notificar que ha habido modificación de los mismos. Esto hará que se actualice la vista.

//EventHandler notifica cambios para actualizar la vista
public event PropertyChangedEventHandler PropertyChanged;
//Si hay una propiedad de nombre "propertyName" escuchando en la vista actualiza
if (PropertyChanged != null)
    PropertyChanged(this,new PropertyChangedEventArgs(propertyName));

http://msdn.microsoft.com/es-es/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx
http://jesseliberty.com/2012/06/28/c-5making-inotifypropertychanged-easier/

¿Y ya esta?
Usualmente nuestro NotifyPropertyChanged, en esta situación arrojara una exception System.UnauthorizedAccessException

at MS.Internal.XcpImports.CheckThread()
   at System.Windows.DependencyObject.GetValueInternal(DependencyProperty dp)
   at System.Windows.FrameworkElement.GetValueInternal(DependencyProperty dp)
   at Microsoft.Phone.Controls.PhoneApplicationFrame.get_Orientation()
  
Excepción que se produce cuando el sistema operativo deniega el acceso a causa de un error de E/S o de un error de seguridad de un tipo concreto. (http://msdn.microsoft.com/es-es/library/system.unauthorizedaccessexception.aspx)

Deberemos darle el permiso adecuado a nuestro NotifyPropertyChanged para que pueda actualizar la vista con nuestors datos recien llegados de internet.

public event PropertyChangedEventHandler PropertyChanged;

protected void NotifyPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        if (Deployment.Current.Dispatcher.CheckAccess())
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        else
        {   //Actualizamos de esta forma la vista en una llamada asincrona.
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            });
        }
    }
}

http://10rem.net/blog/2012/01/10/threading-considerations-for-binding-and-change-notification-in-silverlight-5

El efecto visual es que los datos se cargan en la pantalla después de mostrar esta. Permitiendo volver a otra vista de la aplicación o salir de ella sin dificultad.

Objetos en session en Google App Engine (GAE)



Para implementar objetos en HttpSession, en primer lugar es necesario activar la session desde el fichero appengine-web.xml añadiremos <sessions-enabled>true</sessions-enabled>. La session no viene activada por defecto.

Y en caso de que queramos tener objetos en session dentro del propio GAE se precisa implemente este interface java.io.Serializable. Esto es debido a que GAE usa objectos serializables para mencache y datastore.

El caso más típico sería al intentar meter en session objetos VO. Con la instrucción :

request.getSession().setAttribute("entradaBlog", oEntradaBlog);

Si dicho objeto oEntradaBlog, no implementa el interface  java.io.Serializable. Se producirá una exception :

java.lang.RuntimeException: java.io.NotSerializableException:
 com.google.appengine.tools.development.
SerializableObjectsOnlyHashSessionManager$SerializableObjectsOnlyHttpSession.
checkCanSerialize
(SerializableObjectsOnlyHashSessionManager.java:66)
at com.google.appengine.tools.development.
SerializableObjectsOnlyHashSessionManager$
SerializableObjectsOnlyHttpSession.setAttribute
(SerializableObjectsOnlyHashSessionManager.java:43)

Por todo ello quedaría así las declaraciones de objetosVO .


@PersistenceCapable(detachable = "true")
public class RecursoVO implements java.io.Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)

    private Key key;
  ......
}

Este objeto ya podríamos almacenarlo en el big Data de Google además de poder usarlo en la HttpSession.

martes, mayo 06, 2008

Manual básico para CruiseControl en aplicaciones J2EE en Español



Manual básico de CruiseControl espero que os sirva de algo... ;): No dudeis en preguntar...

CruiseControl home

Manual CruiseControl desde cero
Mirror

viernes, octubre 13, 2006

Aplicaciones de ejemplo

Aplicaciones de ejemplo para la integración spring ibatis recomiendo:

https://blueprints.dev.java.net/petstore/

Esta montada con struts e integra spring con ibatis, ojala la hubiese encontrado antes de haberlo echo yo. Si quereis hacerlo de forma más moderna buscad información sobre data-mapper sustituyen a los antiguos sql-maps.

http://www.ica.org.ve/siweb/presentaciones/datamapper.pdf

Tambien recomiendo para jsf,spring,ibatis,hibernate el ejemplo generico de appfuse.

https://appfuse.dev.java.net/

lunes, septiembre 11, 2006

Alternativa a Jameleon selenium-ide

He encontrado una alternativa en forma de plugin de firefox a Jameleon. Si bien no es tan completa y esta destinada a pruebas funcionales sobre web el manejo es similar pero visual.

http://www.openqa.org/selenium-ide/

Obtiene de un formulario los campos sobre los que se pueden ejecutar las pruebas. Jamaleon es esto y además ejecutar estas pruebas con una tarea de ant lo cual permite reutilizar todo o parte de las mismas. Aunque selenium puede servirnos para aplicaciones más sencillas y no tan grandes.

miércoles, septiembre 06, 2006

Jakarta slide

Slide

Una buena opción para crear una gestión de usuarios es un servidor web-dav, he encontrado una framework de apache que facilita esta tarea. Las clases de este framework simulan un servidor web-dav como apache que utilizaba para dar soporte web-dav a subversion.

Tal como aparece en la arquitectura. Utiliza la api de nombrado JNDI de java haciendo más sencilla su utilización y desarrollo.

martes, agosto 22, 2006

Configuración de un entorno de desarrollo para JSF + Spring + Ibatis (II)

Instalación y uso de los siguientes plugins de eclipse:
callisto
abator
springide
amateras faceside

Abator

Este plugin lo facilita ibatis en su página web es bastante util.

Ibatis es un motor de persistencia j2ee de apache. El cuál mapeo en ficheros xml sqlmap o datamapper el modelo de datos de nuestra aplicación web. Este framework esta diseñado y orientado a la arquitectura DAO
Conociendo esta arquitectura sabemos que implementa las siguientes clases VO , DAO (interface) y DAOImpl (Implementacion del interface) por cada tabla de la base de datos existira un VO un DAO con su implementación. Ibatis desacopla el modelo de datos campos de cada tabla mapeando los mismos en un fichero xml. Este framework favorece la reutilización del modelo de datos al estar los datos de provenientes de cada tabla y que utilizan los DAO's configurados y mapeados en un fichero xml.

El objetivo del plugin abator es generar estas clases java además de proporcionar una conexión a la base de datos con la cual en cualquier momento podremos modificar esas clases generadas automaticamente a traves de avator haciendo más facil el mantenimiento de la aplicación.

Para instalarlo dispone de la opción on-line de eclipse esto es pestaña help>Software updates> find&install>New Remote Site. A continuación se inserta la siguiente url http://ibatis.apache.org/tools/abator y se continua con el asistente de instalación.

Para su uso en primer lugar se crea un java project o un web project a continuación se añaden los jar de ibatis. Por motivos de orden es recomentable crear un paquete de configuración tanto para los sql-maps como para el fichero de configuración de abator. Para crear el fichero de configuración de abator sobre el proyecto new file>other>abator. Se crea autometicamente el siguiente fichero abatorConfig.xml sin datos.



fichero abatorConfig.xml completado.



Se continua aplicando botón derecho sobre abatorConfig.xml y generando automaticamente las clases DAO.



Este es el resultado final.



Este proceso se puede repetir cuantas veces se quiera detectando las modificaciones sobre nuestra base de datos y cambiando la estructura DAO de la misma.

SpringIDE

Para facilitar el desarrollo, y el tratamiento de ficheros de Spring, existe el plugin para Eclipse,SpringIDE [http://springide.org/project].
Este plugin, permite ver de una forma visual la definición de beans, además incluye caraterísticas como el autocompletado de clases y el acceso directo desde el gráfico de visualización, a la definición del bean o de la clase.

La instalación se puede hacer on-line exactamente igual que en el caso de abator help>Software updates> find&install>New Remote Site la url "http://springide.org/updatesite/". Desde donde también se puede actualizar a nuevas versiones. SpringIde proporciona una vista para spring beans donde es posible localizar los ficheros de configuración de spring de un proyecto, además de un buscador y un corrector sintactico de estos ficheros que comprueba si estan mal formados. Alternativamente posee una vista BeansGraph que graficamente muestra los ficheros Spring clasificados y ordenados por dependencias para ello es necesario tener instalada en eclise la librería gráfica GEF disponible en la página www.eclipse.org/gef
Seguiremos informando gracias por vuestra paciencia

lunes, agosto 21, 2006

Configuración de un entorno de desarrollo para JSF + Spring + Ibatis

Para el desarrollo del proyecto se han comparado los siguientes entornos:

Java Studio creator
Netbeans
Eclipse + exadel
Eclipse + myeclipse
Eclipse 3.2 + calisto + amateras + springide + abator

Java Studio Creator
Entorno de desarrollo de sun basado en Netbeans gratuito, muy potente, con varias herramientas visuales como una paleta de componentes JSF de sun. El entorno es muy estable y viene en español. Muy complicado de manejar y exige grandes requisitos de memoria lo que lo hacen lento aún con un ordenador potente.
















Netbeans
Buen entorno de programación muy estable, fácil de manejar configuración potente aunque no es tan flexible como los plugin´s de eclipse. Exige un gran consumo de memoria no tanto como el Java Studio Creator pero si importante. Pocas herramientas visuales y poca automatización de tareas de despliegue. Y no posee la depuración en caliente de eclipse.

Eclipse + Exadel
Entorno muy flexible que se beneficia de los pro’s de eclipse depuración en caliente sencillez de manejo. Herramientas visuales prácticas y cómodas para desarrollar además sistema de redeploy automático en el servidor. Exadel es un entorno de desarrollo inestable en el refactor y a la hora de desplegar en el servidor, algunos problemas se han ido solventando en las actuales versiones. Posee versión gratuita y profesional no existen diferencias significativas entre las mismas.

Eclipse + Myeclipse
Entorno que se beneficia también de eclipse. No posee herramientas visuales espectaculares pero si eficientes el redeploy es manual, da soporte a Strus, JSF, Spring, Hibernate e integra algunos plugins gratuitos de eclipse como spring ide, WTP. No es una herramienta gratuita y no posee versión gratuita. Es más estable en el refactor y el redeploy pero a veces da problemas.

Eclipse 3.2 + calisto + amateras + springide + abator
Es la solución que se ha terminado adoptando es un entorno gratuito flexible y fácil de manejar.

Calisto nos provee de nuevas funciones como el redeploy automático herramientas de consulta a bases de datos, servicios de logeo ect. . Es un conjunto de plugins que se pueden desactivar o desinstalar independientes unos con otros.

SpringIde provee de editores que nos avisan de errores de sintaxis en los ficheros xml de configuración de spring. Provee de una vista de los beans mapeados en spring que hacen más fácil su localización.(
http://springide.org)

Abator. Plugin que distribuye ibatis en su página y que nos de funcionalidades tan espectaculares como genera automáticamente código java dao y vo, conforme se cambia el modelo de datos.(http://ibatis.apache.org/abator.html)

Amateras. Plugin para dar soporte JSF muy sencillo que nos da además herramientas visuales para mantener el faces-config y programar las jsp que contienen faces.
( http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=FacesIDE)










El entorno es muy estable se notan las mejoras de eclipse 3.2 sencillo, con ayudas visuales practicas aunque no sean muy espectaculares. Rápido y para ser un IDE java no requiere un gran consumo de memoria.

(cont)