Desarrollo de una aplicación
De MorfeoWiki
Introducción
El desarrollo debe abordarse como una aplicación Web J2EE convencional la cual incluirá de forma adicional las librerías de la plataforma de movilidad en WEB-INF/lib El único punto “distinto” es que la capa de presentación debe definirse en XML y generarse, para posteriormente ser desplegada. Este manual supone que el programador tiene instalado en su máquina el JDK de Java 1.4.2 o posterior, un contenedor de Servlets (para esta guía se ha usado Tomcat 5.5), una instancia de la herramienta de desarrollo Eclipse e instalado debidamente el plugin de Tomcat para Eclipse si finalmente se optó por usar este contenedor de Servlets. El plugin de Tomcat para Eclipse se puede obtener de forma gratuita de http://www.sysdeo.com/eclipse/tomcatplugin.
Estructura básica de la aplicación Web
- Creación de un nuevo proyecto con la herramienta Eclipse.
Figura 4-1: Nuevo proyecto
- Seleccionar Tomcat Project y pulsar sobre el botón Next >
Figura 4-2: Proyecto Tomcat
- Dar nombre al proyecto de la aplicación Web, en este caso será demo, y pulsar sobre Next >
Figura 4-3: Nombre del proyecto
- A continuación, aparecerá una nueva ventana donde habrá que indicar a Eclipse que no actualice el fichero server.xml, para ello se deseleccionará la pestaña Can update server.xml file
Figura 4-4: Actualización del contexto
- En este punto se ha creado la estructura de directorios que conforman la aplicación demo.
Figura 4-5: Aplicación demo
En la imagen anterior se observa que esta aplicación usará para compilar una versión 1.5.0 del JDK de JAVA. Las tres librerías con extensión .jar son añadidas por la herramienta Eclipse por defecto para toda aplicación Web J2EE. En la carpeta WEB-INF/src se localizarán las fuentes que se crearán para la aplicación demo. Bajo la carpeta WEB-INF/lib se colocarán las librerías de la plataforma de movilidad, que más delante se explicarán. El directorio work lo crea Eclipse por defecto, no debe ser manipulado por el programador.
Definición de contexto
A continuación se debe añadir un nuevo contexto que apunte a la aplicación recién creada demo. Para realizar ésto, se debe abrir el fichero server.xml ubicado en la carpeta conf de la instalación Tomcat. Se ha de añadir la siguiente línea como tag hijo de Host cuyo nombre es localhost.
Definición de contexto
<Context path="/demo" reloadable="true" docBase="D:\eclipse\workspace\demo"
workDir="D:\eclipse\workspace\demo\work"/>
Atributos de Context:
- path, nombre del contexto ha elección del desarrollador, podría haber sido demo u otro nombre.
- reloadable, valor true indica que esta aplicación Web será recargada en cuando el monitor de Tomcat detecte algún cambio realizado en las clases de la propia aplicación o bien cambios en las librerías alojadas en WEB-INF/lib.
- docBase, raíz de la aplicación Web.
- workDir, ruta completa del subdirectorio work de la aplicación.
Realizado esto, se guardan los cambios realizados en el fichero server.xml y así se habrá definido un nuevo contexto que apunta a la aplicación demo Si se quiere ampliar conocimientos o resolver cualquier duda en la definición de contexto remitirse al manual de Tomcat http://jakarta.apache.org/tomcat.
Pasos para MyMobileWeb_DeviceManager
Los pasos a seguir para una correcta instalación del componente MyMobileWeb_DeviceManager son los siguientes:
- Como se vio en el de MyMobileWeb_DeviceManager el paquete MyMobileWeb_DeviceManager ha deb ser descomprimido. Será instalado en D:\MyMobileWeb\DeviceManager.
- Copiar todas las librerías con extensión .jar ubicadas en la carpeta lib al directorio WEBINF/ lib de la aplicación a desarrollar.
- Crear un subdirectorio en la aplicación con el nombre config y copiar todo el contenido de la carpeta D:\MyMobileWeb\DeviceManager/config/template a la carpeta creada excepto el contenido de logs.
- Observar que la estructura de la aplicación Web es análoga a la que se muestra en la Figura 4-7: Estructura Web.
Figura 4-7: Estructura Web.
- Han sido copiadas todas las librerías .jar ya que son todas necesarias en ejecución, pero sólo mymw-common.jar y log4j-1.2.9.jar son necesarias en compilación, por lo tanto se ha de indicar a la herramienta Eclipse. Para hacer esto, se ha de pulsar sobre el nombre de la aplicación (en este caso demo) con el botón derecho del ratón y seleccionar la opción Properties. A continuación se mostrará la siguiente ventana:
Figura 4-8: Propiedades del proyecto
- El siguiente paso será seleccionar Java Build Path y dentro de esta ventana pulsar la pestaña Libraries. En este momento se han de añadir las dos librerías antes citadas, para ello se ha de pulsar en el botón Add JARs...
Figura 4-9: Añadir librerías para compilación
- Terminado esto, han sido añadidas correctamente las librerías.
En capítulos posteriores se explicará como configurar el ficheros MyMobileWeb.DevMgt.xml, ayudándose de la sección Configuración del gestor de dispositivos, donde por ejemplo, se indicará donde se encuentra la base de datos de dispositivos.
Pasos para MyMobileWeb_WasComponents
Los pasos a seguir para una correcta instalación del componente MyMobileWeb_WasComponents son los siguientes:
- Ha de ser descomprimido el componente MyMobileWeb_WasComponents como se vio en la sección MyMobileWeb_WasComponents. Será instalado en D:\MyMobileWeb\WasComponents.
- Copiar todas las librerías con extensión .jar ubicadas en la carpeta D:/MyMobileWeb/WasComponents/lib al directorio WEB-INF/lib.de la aplicación a desarrollar, excepto mymw-common.jar, mf-commons.jar, log4j-1.2.9.jar y xercesImpl.jar ya que fueron copiadas cuando se instaló el MyMobileWeb_DeviceManager.
- Crear un subdirectorio en la aplicación con el nombre i18N y copiar todo el contenido de la carpeta resources del componente MyMobileWeb_WasComponents..Aquí se copiarán todos los ficheros de configuración de literales y mensajes del framework.
- Copiar todos los ficheros XML de configuración de la carpeta D:/MyMobileWeb/WasComponents/config/template a la carpeta config de la aplicación.
- Observar que la estructura de la aplicación Web hasta el momento es análoga a la que se muestra en la Figura 4-10.
Figura 4-10: Estructura Web
- Han sido añadidas todas las librerías .jar ya que son todas necesarias en ejecución, pero sólo mymw-wascomponents.jar es necesaria en compilación, por lo tanto, habrá que añadirla de la misma manera que se hizo en paso 6 de 4.4 Pasos para MyMobileWeb_DeviceManager.
- Si se trabaja con Tomcat como contenedor de Servlet, se ha de añadir la librería mymw- el.jar (implementación de Apache para tratamiento de Expression Language) a la carpeta common/endorsed de la instalación de Tomcat
- Más delante se verá como configurar este módulo.
Completar la estructura de directorios
A continuación se indicará los subdirectorios que completarán la estructura de directorios de la aplicación Web.
Directorio OPs
Cada una de las OP’s se encuentra definida en un directorio independiente bajo el que se colocan las presentaciones bajo su estructura correspondiente. Véase un ejemplo en la Figura 4-11: Directorio de definición de OP’s. Para más información ver el documento Guía de Generador.
Figura 4-11: Directorio de definición de OP’s
Directorio CSS
MyMobileWeb adopta el estándar CSS2 para definir los estilos de los Controles Visuales en las presentaciones. Una de las ventajas de separar las presentaciones de los estilos está en que es posible redefinir estilos por lenguaje de marcado destino (WML_1, HTML_WEB_3_2, XHTML_MP ...) o por familia de dispositivos. Sobre las propiedades estándar CSS2 se añaden extensiones propietarias que permiten enriquecer las CSS para convertirlas en auténticos ficheros de definición de propiedades de los controles visuales. En todo momento los controles visuales heredan los estilos de sus padres. Es posible redefinir estilos a modo de overriding para una o más tecnologías o familias de dispositivos. Este overrding permite sobreescribir solo aquellas propiedades que se desea redefinir para una familia de terminales o tecnología). Por ejemplo, en un terminal WAP puede interesar que el layout de un párrafo sea vertical y no grid, etc. Para redefinir estilos basta con crear nuevos directorios sobre el directorio base de css. De esta forma las CSS serán sobreescritas en la correspondiente tecnología y/o familia de dispositivos.Las CSS válidas para todas las tecnologías destino, se dejarán en el directorio ‘generic’. La aplicación puede especificar una CSS por defecto, llamada habitualmente default.css, de la cual se toman los estilos por defecto en caso de que el programador no los especifique explícitamente. Si un estilo no queda especificado explícitamente ni en la CSS por defecto ni en una específica, entonces se tomarán los estilos de plataforma por defecto, que son unos estilos “fallback” que la plataforma del Canal de Movilidad asigna a los controles visuales en cada una de las tecnologías. Estos estilos están sintonizados adecuadamente para cada tecnología. Para más información ver el documento Guía de Generador.
Figura 4-12: Directorio CSS
Directorio JSP
El directorio JSP alojará el resultado de aplicar generación sobre las presentaciones definidas. Remitirse al documentos Guía de Generador.
Directorio resource
Directorio donde se almacenarán los recursos de la aplicación Web, como por ejemplo una carpeta llamada images que contiene una serie de imágenes gif y wbmp.
Figura 4-13: Estructura de directorios final
Configuración de la Aplicación Web
En esta sección se va a indicar como configurar la aplicación Web demo.
Fichero web.xml
Se creará un fichero web.xml bajo la carpeta config de la aplicación demo. El contenido de este fichero, su estructura, etiquetas y configuración adecuada se indica a continuación.
Configuración web.xml
- Parámetro ‘configuration’.
<context-param>
<param-name>configuration</param-name>
<param-value>D:/eclipse/workspace/demo/config</paramvalue>
</context-param>
- Configurar Servlet
<servlet>
<!-— Nombre del Servlet -->
<servlet-name>
DriverHTTP
</servlet-name>
<!-— Clase que implementa DriverHTTP-->
<servlet-class>
org.morfeo.tidmobile.server.DriverHTTP
</servlet-class>
</servlet>
- Mapeo del Servlet
<servlet-mapping>
<servlet-name>
DriverHTTP
</servlet-name>
<url-pattern>/
DriverHTTP
</url-pattern>
</servlet-mapping>
- PATH de la aplicación a partir del contexto http://url:8080/demo/DH
<servlet-mapping>
<servlet-name>
DriverHTTP
</servlet-name>
<url-pattern>
/DH
</url-pattern>
</servlet-mapping>
- Configuración del mecanismo de reconocimiento de dispositivo basado en filtro
<filter>
<filter-name>
MultiChannelFilter
</filter-name>
<filterclass>
org.morfeo.tidmobile.devmgt.MultiChannelFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>
MultiChannelFilter
</filter-name>
<url-pattern>
/*
</url-pattern>
</filter-mapping>
- Especificar el número de minutos que tienen que pasar, mientras la sesión está inactiva, para darla por terminada.
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
Ejemplo Web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
“http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <context-param> <param-name> configuration </param-name> <param-value> D:/eclipse/workspace/demo/config </param-value> </context-param> <servlet> <servlet-name> DriverHTTP </servlet-name> <servlet-class> org.morfeo.tidmobile.server.DriverHTTP </servlet-class> </servlet> <servlet-mapping> <servlet-name> DriverHTTP </servlet-name> <url-pattern> /DriverHTTP </url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name> DriverHTTP </servlet-name> <url-pattern> /DH </url-pattern> </servlet-mapping> <filter> <filter-name> MultiChannelFilter </filter-name> <filter- class> org.morfeo.tidmobile.devmgt.MultiChannelFilter </filter-class> </filter> <filter-mapping> <filter-name> MultiChannelFilter </filter-name> <url-pattern> /* </url-pattern> </filter-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <mime-mapping> <extension> htm </extension> <mime-type> text/html </mime-type> </mime-mapping> <mime-mapping> <extension> html </extension> <mime-type> text/html </mime-type> </mime-mapping> <mime-mapping> <extension> gif </extension> <mime-type> image/gif </mime-type> </mime-mapping> <mime-mapping> <extension> jpeg </extension> <mime-type> image/jpeg </mime-type> </mime-mapping> <mime-mapping> <extension> jpg </extension> <mime-type> image/jpeg </mime-type> </mime-mapping> <mime-mapping> <extension> pdf </extension> <mime-type> application/pdf </mime-type> </mime-mapping> <mime-mapping> <extension> zip </extension> <mime-type> application/zip </mime-type> </mime-mapping> <mime-mapping> <extension> class </extension> <mime-type> application/x-java-vm </mime-type> </mime-mapping> <mime-mapping> <extension> jar </extension> <mime-type> application/x-java-archive </mime-type> </mime-mapping> <mime-mapping> <extension> ser </extension> <mime-type> application/x-java-serialized-object </mime-type> </mime-mapping> <mime-mapping> <extension> exe </extension> <mime-type> application/octet-stream </mime-type> </mime-mapping> <mime-mapping> <extension> swf </extension> <mime-type> application/x-shockwave-flash </mime-type> </mime-mapping> <mime-mapping> <extension> wbmp </extension> <mime-type> image/vnd.wap.wbmp</mime-type> </mime-mapping> <mime-mapping> <extension> wml </extension> <mime-type> text/vnd.wap.wml </mime-type> </mime-mapping> </web-app>
Fichero MyMobileWeb.DevMgt.xml
Preparar la configuración del gestor de dispositivos. Remitirse a la sección Configuración del gestor de dispositivos
Configuración del gestor de dispositivos
- Ruta de fichero de trazas.
<property name="file" value="config/logs/traces.xml" />
- Intervalo de refresco de la caché interna.
<property name="refreshInterval" value="1" />
- Directorio que contiene la base de datos de dispositivos..
<property name = "dataBaseDirectory" value="D:/MyMobileWeb/DeviceManager/resource"/>
- Fichero de dispositivos WURFL.
<property name = "xml" value = "wurfl.xml"/>
- Fichero patch de WURFL.
<property name = "patch" value = "wurfl_patch.xml"/>
- Acceso a información de dispositivos local.
<property name = "type" value = "0"/>
- Fichero XML con las reglas que se aplican para reconocer los dispositivos si éstos no aparecen en la base de datos de dispositivos.
<property name = "acceptXml" value = "acceptRules.xml"/>
- Fichero XSL que indica la precedencia y prioridad a la hora de aplicar las anteriores reglas.
<property name = "acceptXsl" value = "acceptRules.xsl"/>
MyMobileWeb.DevMgt.xml
<configuration name = "root">
<module name="devmgt">
<module name="log4j">
<property name="file" value="config/logs/traces.xml" />
</module>
<module name="cache">
<property name="refreshInterval" value="1" />
</module>
<module name="directories">
<property name = "dataBaseDirectory" value="D:/MyMobileWeb/DeviceManager/resource"/>
</module>
<module name = "wurfl">
<property name = "xml" value = "wurfl.xml"/>
<property name = "patch" value = "wurfl_patch.xml"/>
</module>
<module name = "driver">
<property name = "type" value = "0"/>
</module>
<module name = "rules">
<property name = "acceptXml" value = "acceptRules.xml"/>
<property name = "acceptXsl" value = "acceptRules.xsl"/>
</module>
<module name="ContentAdapter">
<property name="Images_Path" value="resource/images" />
</module> <module name="Validator">
<property name="Default_Date_Mask" value="dd/MM/yyyy" />
<property name="Default_Time_Mask" value="hh:mm:ss" />
</module>
</configuration>
Fichero MyMobileWeb.Global.xml
Preparar la configuración global de la aplicación demo. Remitirse al apartado Configuración del servidor Web
Configuración del servidor Web
- Ruta del fichero de configuración de trazas
<property name="LOG4J_Config" value="logs/traces.xml" />
Véase Fichero logs/traces.xml
- Indica si el modo de trabajo es en desarrollo o producción, en este caso de desarrollo.
<property name="Working_Mode" value="DEVL" />
- Fichero de configuración específica de la aplicación demo.
<property name="Appl_Config" value="MyApplication.xml" />
Véase Configuración de la Aplicación Web
- Clase lanzadora de la aplicación, deberá implementar la interfaz org.morfeo.tidmobile.server. ApplInitializer.
<property name="Appl_Initializer" value="demo.MyApplInitializer" />
Véase Definir el inicializador de la aplicación
- Clase que gestiona los perfiles de usuario, deberá implementar la interfaz org.morfeo.tidmobile.server.IProfileManager.
<property name="Profile_Manager" value="demo.MyProfileManager" />
Véase Definir el gestor de perfil
- Operación de aplicación principal, podría ser.
<property name="First_Application_OP" value="Menu" />
- Lenguaje por defecto Castellano.
<property name="Default_Language" value="es_ES" />
- La aplicación demo será en Castellano e Inglés.
<property name="Installed_Languages" value="eng_US,es_ES" />
- Configuración del mecanismo de Login, tomar el usuario y contraseña de la request http.
<property name="Login_Manager" value="org.morfeo.tidmobile.server.login.CustomLogin" />
- Configuración de la clase que actuará como entrada del flujo, en este caso la gestión de flujo será basada en eventos.
<property name="Flow_Handler"
value="org.morfeo.tidmobile.server.flow.TidMobileFlowEngine" />
Véase Definir el gestor de flujo
- Especificar paquete base que almacenará los manejadores de eventos.
<property name="Handler_Package_Base" value="demo" />
- Ruta relativa de las presentaciones generadas.
<property name="Presentations_Directory" value="JSP" />
- Ruta relativa al fichero de configuración de operaciones de aplicación.
<property name="OA_Descriptor_File" value="OAConfig.xml" />
Véase Especificación de Operaciones de Aplicación
- Definición del contexto y PATH de la aplicación.
<property name="Context_Name" value="demo" /> <property name="Navigate_Path" value="DH" />
Véase Configuración web.xml
- Ruta relativa de los ficheros XML’s que almacenan los mensajes.
<property name="Messages_Directory" value="i18N/messages" />
- Localización de los ficheros XML’s que almacena los literales, tanto de aplicación como de plataforma.
<property name="Literals_Directory" value="i18N/literals" />
- Subdirectorio donde se colocarán los XML’s que almacenan los literales aplicables a toda la aplicación.
<property name="Global_Literals_Subdirectory" value="All" />
- Directorio de recursos de imágenes de recursos.
<property name="Images_Path" value="resource/images" />
Véase Configuración del catálogo de recursos
- Componente de validación.
<code>
<property name="Default_Date_Mask" value="dd/MM/yyyy" /> <property name="Default_Time_Mask" value="hh:mm:ss" />
Ejemplo MyMobileWeb.Global.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<configuration name = "root">
<property name="LOG4J_Config" value="logs/traces.xml" />
<property name="Working_Mode" value="DEVL" />
<module name="Global">
<property name="Appl_Config" value="MyApplication.xml" />
<property name="Appl_Initializer" value="demo.MyApplInitializer" />
<property name="Profile_Manager" value="demo.MyProfileManager" />
<property name="First_Application_OP" value="InitialMenu" />
<property name="Default_Language" value="es_ES" />
<property name="Installed_Languages" value="eng_US,es_ES" />
</module>
<module name="LoginManager">
<property name="Login_Manager" value="org.morfeo.tidmobile.server.login.CustomLogin" />
</module>
<module name="FlowEngine">
<property name="Flow_Handler" value="org.morfeo.tidmobile.server.flow.TidMobileFlowEngine" />
<property name="Handler_Package_Base" value="demo" />
</module>
<module name="PresentationAdapter">
<property name="Presentations_Directory" value="JSP" />
</module>
<module name="OAController">
<property name="OA_Descriptor_File" value="OAConfig.xml" />
</module> <module name="URLManager">
<property name="Context_Name" value="demo" />
<property name="Navigate_Path" value="DH" />
</module> <module name="MessageManager">
<property name="Messages_Directory" value="i18N/messages" />
<module name="LiteralManager">
<property name="Literals_Directory" value="i18N/literals" />
<property name="Global_Literals_Subdirectory" value="All" />
</module>
Catálogo de recursos
En este sistema de ficheros se indicará cada uno de los recursos que se usarán en las presentaciones, como se vio en la sección Configuración del catálogo de recursos.
Configuración del catálogo de recursos
Para la visualización de los enlaces de navegación de los párrafos y tablas paginados y del botón de retroceso en los menús encadenados, se han de definir una serie de recursos con un nombre específico. Las constantes que definen los identificadores de estos recursos se encuentran almacenadas en la clase org.morfeo.tidmobile.CmtConstants. La lista de recursos por defecto es: Párrafos paginados
- Imagen de avance entre párrafos paginados, id=”_MYMW_IMG_NEXT_PAR”(IMG_NEXT_PAR).
- Imagen de retroceso entre párrafos paginados, id=”_MYMW_IMG_PREVIOUS_PAR” (IMG_PREV_PAR). Menús encadenados
- Imagen de retroceso, id=”_MYMW_IMG_PREVIOUS_MENU”( IMG_PREV_MENU). Tablas paginadas
- Imagen de avance, id=”_MYMW_IMG_NEXTt”( IMG_NEXT).
- Imagen de retroceso id=”_MYMW_IMG_PREVIOUS” (IMG_PREVIOUS)
- Imagen de contenido inicial id=”_MYMW_IMG_FIRST” (IMG_FIRST)
- Imagen de contenido final id=”_MYMW_IMG_LAST” (IMG_LAST)
Ejemplo
Figura 4-14: Sistema de ficheros del Catálogo de recursos de imágenes
Fichero OAConfig.xml
En este fichero se indicará las operaciones de aplicación que se usarán en la aplicación Web.
Configuración de OA’s
En este punto aún no se ha definido la lógica de la aplicación Web, pero en el siguiente ejemplo, se ve como se define en el XML dos OA’s, la primera de ellas dispone datos de Nacionalidades y la segunda de ciudades.
Ejemplo: OAConfig.xml
<?xml version="1.0" encoding="iso-8859-1" ?> <OAConfiguration> <OA id="Nationalities" class="demo.oa.Nationalities"/> <OA id="Sex" class="demo.oa.Cities"/> </OAConfiguration>
Fichero logs/traces.xml
El MyMobileWeb framework define tres ficheros de log. Uno para la información de caché, otro para el contexto de la aplicación y otro para el funcionamiento del Servidor Web y del gestor de dispositivos.
Configuración de trazas
Los dos parámetros de configuración de los ficheros de trazas por defecto más útiles para el desarrollador son: el fichero físico de volcado y el tamaño del mismo, parámetros File y MaxFileSize respectivamente.
Ejemplo: traces.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="ficheroRolling" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/tmp/cmt.log" />
<param name="MaxFileSize" value="512KB" />
<param name="MaxBackupIndex" value="10" />
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{dd-MM-yyyy HH:mm:ss,SSS}] %-25.25t %-25.25c{1} %-8p - %m%n"/>
</layout> </appender>
<appender name="ficheroRolling2" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/tmp/cmtcache.log" />
<param name="MaxFileSize" value="512KB" />
<param name="MaxBackupIndex" value="10" />
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{dd-MM-yyyy HH:mm:ss,SSS}] %-25.25t %-25.25c{1} %-8p - %m%n"/>
</layout>
</appender>
<appender name="ficheroRolling4" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/tmp/context.log" />
<param name="MaxFileSize" value="512KB" />
<param name="MaxBackupIndex" value="10" />
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{dd-MM-yyyy HH:mm:ss,SSS}] %-25.25t %-25.25c{1} %-8p - %m%n"/>
</layout>
</appender>
<category name="MyMobileWeb" additivity="false">
<priority value="DEBUG" />
<appender-ref ref="ficheroRolling"/>
</category>
<category name="MyMobileWeb.devmgt" additivity="false">
<priority value="DEBUG" />
<appender-ref ref="ficheroRolling"/>
</category> <category name="MyMobileWeb.cache" additivity="false">
<priority value="DEBUG" />
<appender-ref ref="ficheroRolling2"/>
</category> <category name="MyMobileWeb.context" additivity="false">
<priority value="DEBUG" />
<appender-ref ref="ficheroRolling4"/>
</category>
<root>
<priority value="DEBUG" />
<appender-ref ref="ficheroRolling" />
</root>
</log4j:configuration>
Pasos para desarrollar una aplicación
Se indica que clases se han de implementar y el modo de hacerlo para comenzar a trabajar en la aplicación Web.
Definir el inicializador de la aplicación
Las aplicaciones pueden definir una clase inicializadora, la cual se encargará de llevar a cabo las tareas de inicialización de los componentes que cada aplicación use internamente. Por ejemplo, la inicialización de un pool de conexiones, la obtención de stubs, etc. El inicializador de la aplicación es una clase Java ordinaria que debe implementar la interfaz org.morfeo.tidmobile.servlet.ApplInitializer. Este inicializador debe ser especificado en Configuración del servidor Web
Ejemplo: demo.MyApplInitializer.java
package demo;
import org.apache.log4j.Logger;
import org.morfeo.tidmobile.context.ApplicationContextNode;
import org.morfeo.tidmobile.server.ApplInitializer;
public class MyApplInitializer implements ApplInitializer {
private Logger log = Logger.getLogger(getClass().getName());
public void intialize(ApplicationContextNode appl) {
/** Inicialización de la aplicación **/
}
}
Esta clase implementa la interfaz org.morfeo.tidmobile.servlet.ApplInitializer, para ello debe definir el método intialize (ApplicationContextNode appl). Éste es el lugar donde escribir el código que inicializa los distintos componentes que la aplicación use internamente.
Definir el gestor de perfil
El Gestor de Perfil es el encargado de calcular el perfil del usuario cada vez que se crea una nueva sesión de usuario. Para definirlo basta implementar la interfaz org.morfeo.tidmobile.server.IProfileManager. El perfil del usuario puede ser cualquier objeto y así lo refleja el único método publicado por esta interfaz. La clase que implementa el Gestor de Perfil debe especificarse en el fichero de configuración global de MyMobileWeb (Configuración del servidor Web) Puede verse un ejemplo de Gestor de Perfil a continuación:
demo.ProfileBean.java
package demo;
public class ProfileBean {
private String login;
public ProfileBean(String login) {
this.login = login;
}
public void setLogin(String login) {
this.login = login;
}
public String getLogin() {
return login;
}
}
demo.MyProfileManager.java
package demo;
import org.apache.log4j.Logger;
import org.morfeo.tidmobile.server.IProfileManager;
import org.morfeo.tidmobile.server.RequestData;
public class MyProfileManager implements IProfileManager {
public Object getUserProfile(String login, RequestData data) throws Throwable {
Logger.getRootLogger().debug("Login Manager invoked");
ProfileBean user = new ProfileBean(login); return bean;
}
}
Esta clase implementa la interfaz org.morfeo.tidmobile.server.IProfileManager, para ello debe definir el método getUserProfile (String login, RequestData data). Éste es el lugar donde escribir el código que se encarga de calcular el perfil del usuario cada vez que se crea una nueva sesión de usuario. En este ejemplo se crea un Bean con un campo de texto que representa el Login de usuario. MyMobileWeb es responsable de almacenar el perfil del usuario en el contexto de sesión del usuario, en este caso almacenará el objeto user de ProfileBean. Para recuperarlo basta con que la aplicación llame a: org.morfeo.tidmobile.server.util.ContextUtil.getUserProfile, pasando el Contexto.
Definir el gestor de flujo
El Gestor de Flujo o Gestor de Dialogo es el componente fundamental que debe proporcionar la aplicación. Se trata de un componente que en todo momento debe decidir en el lado servidor que acciones ejecutar ante un evento provocado por el usuario. Las acciones a ejecutar dependerán del control, del evento, de la OP actual, de la presentación actual y en general de datos presentes en el contexto. Las posibles acciones a ejecutar son:
- Navegar hacia otra presentación (dentro de la misma OP).. La presentación se especifica mediante un nombre que es igual al nombre del fichero XML origen de la presentación. Esta será una acción terminal dentro del flujo.
- Ejecutar una OA, cuyo nombre será el especificado en el fichero de configuración de OAs.
- Llamar a otra OP. Esta será una acción terminal dentro del flujo.
- Mostrar un mensaje. Esta será una acción terminal dentro del flujo. Para facilitar a las aplicaciones la ejecución de estas acciones, MyMobileWeb proporciona una interfaz denominada ActionExecutor, la cual proporciona métodos para ejecutar dichas acciones.
Gestor de flujo
Un Gestor de Flujo para la aplicación debe implementar la clase org.morfeo.tidmobile.server.flow.IFlowEngine. Dicha interfaz publica un único método el cual es invocado automáticamente por MyMobileWeb cuando se requiera.
Ejemplo: demo.AbstractFlow.java
package demo;
import org.apache.log4j.Logger;
import org.morfeo.tidmobile.server.RequestData;
import org.morfeo.tidmobile.server.flow.BaseFlowEngine;
import org.morfeo.tidmobile.server.flow.IActionExecutor;
abstract class AbstractFlow extends BaseFlowEngine {
protected Logger log = Logger.getLogger(getClass());
public void performApplicationFlow(RequestData req, IActionExecutor act)
throws Throwable {
}
}
Clase que hereda de BaseFlowEngine y define un logger, el cual será heredado por cada uno de los gestores de flujo que se implementen en la aplicación.
demo.MyFlow.java
package demo;
import org.morfeo.tidmobile.cfg.Configuration;
import org.morfeo.tidmobile.context.Context;
import org.morfeo.tidmobile.server.RequestData;
import org.morfeo.tidmobile.server.flow.IActionExecutor;
import org.morfeo.tidmobile.server.flow.IFlowEngine;
import org.morfeo.tidmobile.server.util.ContextUtil;
public class MyFlow extends AbstractFlow implements IFlowEngine {
public void performApplicationFlow(RequestData req, IActionExecutor act) throws Throwable {
try {
Context myContext = req.getContext();
String currentOP = ContextUtil.getCurrentOP(myContext);
log.debug("Current OP: " + currentOP);
IFlowEngine flow = new MenuFlow();
flow.performApplicationFlow(req, act);
} catch (Throwable thr) {
log.error("Unexpected error", thr);
act.showMessage(thr.getMessage(), req);
}
}
public void setConfiguration(Configuration cfg){
}
}
demo.MenuFlow.java
package demo;
import org.morfeo.tidmobile.cfg.Configuration;
import org.morfeo.tidmobile.server.RequestData;
import org.morfeo.tidmobile.server.flow.IActionExecutor;
import org.morfeo.tidmobile.server.flow.IFlowEngine;
public class MenuFlow extends AbstractFlow implements IFlowEngine {
public void performApplicationFlow(RequestData req, IActionExecutor act)
throws Throwable {
try {
} catch (Throwable thr) {
}
}
public void setConfiguration(Configuration cfg){
}
}
La clase MyFlow implementa el Gestor de Flujo en la aplicación demo. Dicho Gestor de Flujo delega en otro Gestor de Flujo que sabe resolver el flujo de la OP actual, el MenuFlow. El control del flujo se hace siempre en el método performApplicationFlow (RequestData req, IActionExecutor act). Cuando se implementa el Gestor de Flujo debe tenerse en cuenta la clase RequestData, la cual proporciona acceso al contexto, control, evento, etc, y la clase ContextUtil que permite recuperar datos bien conocidos del Contexto. El Gestor de Flujo debe especificarse en el fichero de configuración global de MyMobileWeb (4.7.3.1 Configuración del servidor Web), en este caso es la clase demo.MyFlow.
Gestor de flujo basado en Eventos
Las clases manejadoras de eventos son clases Java (no deben heredar de ninguna clase o implementar ninguna interfaz del MyMobileWeb framework), las cuales disponen de métodos con una signatura bien conocida y que van a ser invocados automáticamente por MyMobileWeb cuando se produzca un evento en la aplicación del terminal móvil. Por convenio, los métodos, implementados por dichas clases deben tener la forma
<control_evento(RequestData, IActionExecutor>.
Por ejemplo, si se quisiera responder al evento onclick en el control m1 de tipo link, pues se codificaría un método denominado public void m1_onclick(RequestData req,IActionExecutor act).throws Throwable. Este método sería invocado automáticamente por la plataforma pasándole los parámetros, de forma que el programador podría colocar ahí el código de respuesta a dicho evento (para ejecutar una OA, navegar a otra presentación,...). Dado que la capa de presentación de MyMobileWeb está estructurada en torno a OPs y presentaciones, a la hora de manejar los eventos se sigue el mismo esquema de forma que los manejadores de eventos se buscan en las siguientes clases:
- <Handler_Package_Base>.DefaultEventHandler. En esta clase el programador especificará los manejadores globales a toda la aplicación. En la aplicación ejemplo se especifica el manejador del evento onclick sobre el enlace “Inicio”, que independientemente de la presentación en la que se pulse sobre él, siempre irá a la primera OP de la aplicación.
- <Handler_Package_Base>.<OP>.<OP>EventHandler. Aquí se especifican los manejadores de eventos que aplican a toda una OP. Si se quiere que en toda una OP
ciertos eventos se manejen de la misma forma independientemente de la presentación en la que se esté, entonces el método manejador de eventos debe colocarse en esta clase. Además en esta clase deberá colocarse el método que maneje el evento de entrada a la OP. Este método, por convenio deberá llamarse onInitOP. En ese método el programador colocará el código de inicialización de la OP, típicamente la obtención de datos para ser mostrados en la primera presentación de la OP.
- Handler_Package_Base.<OP>.<Presentation>EventHandler. Aquí se especifican los manejadores de eventos propios de una presentación dentro de una OP. Dado un control y un evento el orden de búsqueda de los manejadores va desde lo más específico (dentro del manejador de la presentación que contiene al control, hasta lo más genérico (el manejador de eventos por defecto). Si finalmente no se encontrara el manejador de eventos, la plataforma devolverá un error. Véase el documento Lenguaje de Referencia para conocer los Eventos del MyMobileWeb framework.
Ejemplo: demo.DefaultEventHandler.java
package demo;
import org.morfeo.tidmobile.server.RequestData;
import org.morfeo.tidmobile.server.flow.IActionExecutor;
public class DefaultEventHandler {
public void linicio_onclick(RequestData req,IActionExecutor act) throws Throwable {
act.callOP(“menu”,null,req);
}
}
Ejemplo: demo.menu.MenuEventHandler.java
package demo.menu;
import org.morfeo.tidmobile.server.RequestData;
import org.morfeo.tidmobile.server.flow.IActionExecutor;
public class MenuEventHandler {
public void onInitOP(RequestData req,IActionExecutor act) throws Throwable {
act.navigate(“Name_Presentation”,null,req)
}
public void m1_onclick(RequestData req,IActionExecutor act) throws Throwable {
}
}
Especificación de Operaciones de Aplicación
Una Operación de Aplicación debe implementar la interfaz org.morfeo.tidmobile.server.oa.ApplicationOperation o bien extender de la clase org.morfeo.tidmobile.server.oa.BasicApplicationOperation. La diferencia es que heredando de ésta última clase se tiene acceso al logger. En cualquier caso, se deben definir dos operaciones:
- init. Esta operación es ejecutada la primera vez que se carga la OA. Es similar al método init de un Servlet, y solo es ejecutada una única vez.
- execute(Context). Es aquí donde el desarrollador debe colocar el código de la OA. La OA recibe como único parámetro el contexto, el cual deberá consultar y modificar introduciendo nuevos datos que esperen las presentaciones. MyMobileWeb garantiza que por cada OA sólo existe una instancia de la misma en toda la aplicación. Dicha instancia será accedida a la vez por n threads, lo cual deberá tenerse en cuenta a efectos de control de concurrencia.
Ejemplo de OA: demo.oa.Nationalities.java
package demo.oa;
import org.morfeo.tidmobile.context.Context;
import org.morfeo.tidmobile.server.oa.BasicApplicationOperation;
import org.morfeo.tidmobile.server.oa.OAException;
public class Nationalities extends BasicApplicationOperation {
public void execute(Context the_context) throws OAException {
log.debug("Execute method of OA has been called");
String[][] aux = new String[3][2];
aux[0][0] = "1"; aux[0][1] = "Alemana";
aux[1][0] = "2"; aux[1][1] = "Española";
aux[2][0] = "3"; aux[2][1] = "Francesa";
aux[3][0] = "4"; aux[3][1] = "Holandesa";
the_context.setElement(“Nationalities”,aux);
log.debug(" OA has terminated succesfully");
}
}
Como se vio en la sección Configuración de OA’s, esta OA debe ser definida en el fichero de configuración de operaciones de aplicación.
OAConfig.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<OAConfiguration>
<OA id="Nationalities" class="demo.oa.Nationalities"/>
</OAConfiguration>












