Download transmission of graphics on a distributed environment using java
Document related concepts
no text concepts found
Transcript
TRANSMISSION OF GRAPHICS ON A DISTRIBUTED ENVIRONMENT USING JAVA AND XML Javier Rodeiro P, Gabriel Pérez Departamento de Informática. E.S.E. Informática. Edificio Politécnico Campus de As Lagoas. Universidad de Vigo RESUMEN Un problema que nos encontramos al hacer peticiones a una BD u hoja de cálculo remotas y obtener el resultado de manera gráfica, es el envío a través de una red del gráfico. Esto es debido a su tamaño, ya que al enviarlos a través de una red siempre interesa que sea lo menor posible. Con este proyecto se pretende reducir el flujo de datos necesario en la comunicación entre el cliente y el servidor para representar dichos resultados. Para conseguirlo, en lugar de enviar el documento resultante en un formato gráfico estándar, el servidor (servlet Java) enviará una representación en formato XML(definido mediante un DTD), para generar, a través de un applet Java, la representación gráfica de los datos. Uno de los puntos más importantes es el tamaño de los applets. Por eso gran parte del esfuerzo en el desarrollo ha ido dirigido a su optimización. Otro aspecto importante de los clientes es que no usan clases de Java para manejar documentos XML. Se ha optado por crear los applets con su propio interprete. En una conexión de 56600bits/s los applets se descargan en menos de un segundo. Si a esto le añadimos el tiempo que tarda en abrirse la pagina web que lo contiene y la ejecución del applet, el tiempo total de espera, desde que se solicita el grafico hasta que esté en pantalla, es de 1 segundo. ABSTRACT One of the problems commonly found when creating graphical results from a remote database or worksheet is to send the graphical result through the network. This is mainly due to its size and therefore it is desirable to reduce this as much as possible in order to speed the submission process. In this project we aimed to reduce the amount of data 1474 exchanged between the client and the server to represent those results. In order to achieve this, instead of sending the resulting document in a standard graphical format, the server (Java servlet) will send it in XML format (defined by DTD) and then will produce, through a Java applet, the final graph of the data. One of the most important points is the size of the applets and for this reason during the development effort was put into optimising it. Another important aspect is that the clients do not follow Java classes to manage XML documents. We then have created the applets with its own interpreter. Through a connection at 56600 bits/s the applets are downloaded in less than one second. After adding the time to open the webpage which contains the applet and its execution the final waiting since asking for the graph until this appears on the screen is one second. 1 PRIMERA FASE, gdXML 1.1 Desarrollo de la parte cliente Se ha optado por comenzar el desarrollo del proyecto por la parte cliente basada en applets Java. Esto es así ya que, una vez finalizada su implementación, nos permitirá desarrollar una primera versión del servidor centrada solo en las funciones de procesamiento XML. Esto será explicado con más detalle en la sección dedicada al desarrollo del servidor. La primera decisión, quizás la más importante, es elegir entre un applet genérico(es decir, que sea capaz de representar cualquier tipo de gráfico de datos) y una colección de applets, uno por cada tipo de gráfico de datos al que queramos dar soporte. En un comienzo se trabajó con un único applet (gdXMLapp) que interpretaba y representaba tanto gráficos angulares como de sectores(los dos primeros tipos de gráficos en ser soportados). Para ello se incluía la clase renderer, que era la encargada de crear un objeto URL para el archivo XML, abrir un flujo hacia el mismo, interpretarlo y presentarlo en el navegador. El problema que presenta esta primera solución es que el tamaño de la clase renderer crecía excesivamente, y de una manera proporcional al número de tipos de gráficos soportados. Hay que tener en cuenta que debía incluir la lógica de dibujado de todos y cada uno de los distintos tipos de gráficos a representar. 1475 Por ello, fue separada en clases específicas para cada tipo de gráfico (angulares y de sectores, en una primera fase de desarrollo). Las dos clases resultantes de esta separación fueron la clase angular y la clase circular. Pueden entenderse como una especialización de la clase renderer, ya que cada una está preparada para interpretar un tipo determinado de gráficos de datos. Con esto se consigue reducir el tamaño final al incluir tan solo las funciones de dibujado necesarias para representar el gráfico correspondiente. También es importante destacar la reducción de tamaño final del applet lograda al eliminar todo el código que se debía incluir para que la clase renderer distinguiese si lo que iba a interpretar era un tipo de gráfico u otro. Con la estructura de un applet por tipo de gráfico ya no se hace necesaria esta distinción. El funcionamiento de estos applets es el siguiente: • El applet obtiene del código de la página web el nombre del archivo a interpretar. • Crea un flujo a partir de la URL del archivo. • Llama al constructor de la clase dándole como parámetro este flujo. • El constructor obtiene los valores necesarios para representar el gráfico. • El applet hace uso de los métodos de visualización necesarios para crear la imagen en el navegador. El proceso de interpretación era un paso muy importante en el funcionamiento de estos applets. Hay que tener en cuenta que en esta primera fase se desarrolló sobre la base de un lenguaje de marcado, gdXML, en el que no se trabaja con figuras o primitivas geométricas. A continuación se expone una visión reducida del DTD que define gdXML. <!-- DTD para definir documentos XML de gráficos de datos -->\\ <!ELEMENT grafico (angular | circular)>\\ <!ELEMENT angular(nombre,ymax, nbarras, distancia, ancho, barra *)>\\ <!ELEMENT nombre (\#PCDATA)>\\ <!ELEMENT ymax (\#PCDATA)>\\ <!ELEMENT nbarras(\#PCDATA)>\\ <!ELEMENT distancia (\#PCDATA)>\\ <!ELEMENT ancho(\#PCDATA)>\\ <!ELEMENT barra EMPTY>\\ <!ATTLIST barra valor CDATA \#REQUIRED\\ 1476 índice CDATA \#REQUIRED>\\ <!ELEMENT circular (nombre, radio, nsectores, sectores \*)>\\ <!ELEMENT radio (\#PCDATA)>\\ <!ELEMENT nsectores (\#PCDATA)>\\ <!ELEMENT sectores EMPTY>\\ <!ATTLIST sectores porcentaje CDATA \#REQUIRED\\ indice CDATA \#REQUIRED>\\ En la descripción anterior se puede apreciar que el lenguaje utiliza, por una parte, valores referentes al formato del gráfico a representar y por otro los valores de las series numéricas. Esto implica que ha de ser el cliente (el applet) el encargado de transformar los elementos de las series en las primitivas que compondrán el gráfico resultante. Con esta técnica es posible reducir tanto el tamaño como el tiempo de ejecución del servidor, al simplificar la tarea de conversión a XML de las peticiones realizadas contra el servidor. Por el contrario se complica la tarea de programar los clientes ya que cada applet esta completamente especializado en un único tipo de gráfico. Esta especialización se debe, principalmente a la tarea de transformar los elementos de las series de datos en los componentes de un gráfico completo y coherente. Por ejemplo, el applet gdXMLsec (a través de la clase circular) es el encargado de representar los gráficos de sectores, separando los sectores que forman la imagen. Para poder hacer esto hay que desplazar el centro de la circunferencia que incluye al sector. La solución implementada en la clase circular es dividir la circunferencia trigonométrica en ocho zonas de 45 grados cada una y desplazar el centro de cada sector según la zona en la que esté. Para saber en que zona esta un determinado sector se toma como referencia su ángulo de comienzo. Según donde este se aplica un desplazamiento al punto que debería ser el centro. Este desplazamiento debe ser acumulativo, es decir, si dos sectores se encuentran en la misma zona no podemos aplicar un desplazamiento fijo ya que esto provocaría que apareciesen pegados en la imagen final presentada en el navegador. Esta técnica de desplazamientos presenta el problema de saber hacia donde mover el centro de cada sector que compone el gráfico resultante. 1477 En la primera zona (la que comprende desde los 0º a los 45º) si desplazamos acumulativamente el centro en el eje X obtendremos que todos los sectores que comiencen ahí estarán superpuestos, por tanto han de ser desplazados en el eje Y. Por su parte, el applet gdXMLang es el encargado de representar los gráficos de puntos, líneas y barras. Para realizar esta tarea se sirve de la clase angular que incluye los métodos necesarios tanto para interpretar el lenguaje XML, como para dibujar los elementos que componen estos tres tipos de diagramas de datos. Figura 1. Solapamiento de sectores por deplazamientos incorrectos gdXMLang + clase angular gdXMLsec + clase circular 4.23 4.63 Tabla 1. Tabla de tamaños, en KB. A pesar de lo reducido de su tamaño (menos de 5KB entre el applet y la clase), gdXMLang tiene las siguientes características: • Permite el cambio del tamaño de la fuente: Así, por ejemplo, el nombre del grafico puede tener una fuente más grande que el texto que forma la leyenda del mismo. • Ajustar la proporción del eje Y: El método hace una interpretación directa del alto de la barra, es decir, si el dato a representar es 20 la barra tendría una altura de 20 píxeles. Esto provocaría que algunos gráficos estuviesen desproporcionados en la relación alto-ancho. Para evitarlo se aplica un corrector a los datos de 1478 entrada, para que, de esta manera, el eje Y tenga aproximadamente la mitad de la longitud del eje X. Como se puede observar, uno de los puntos más importantes de este proyecto es el tamaño de los applets encargados de la interpretación de los archivos XML. Por eso una gran parte del esfuerzo en el desarrollo del código ha ido dirigidos a su optimización. Generalmente reducir el tamaño del cliente implica más trabajo a la hora del desarrollo de la parte del servidor. También es importante observar que la interpretación por parte de los applets de los datos de una manera directa complica de una manera bastante importante su codificación. A esto hay que añadirle el problema implícito de mantener y gestionar una colección creciente de applets. Otro aspecto muy importante del desarrollo de la parte cliente es que no usa clases de Java para el manejo de documentos XML. Se ha optado, como primera fase del desarrollo, por crear las clases angular y circular. Esto es así ya que cada una de ellas realiza a su vez las funciones de un interprete XML, un manejador del DOM (Document Object Model) e incluye métodos para la representación. También cabe reseñar que no es necesario el uso de un DOM en ningún momento. 1.2 Desarrollo de la parte servidora Como se indicó anteriormente se ha optado por el uso de la tecnología Java Servlet. Se ha elegido este enfoque debido a que todos los servlets asociados a un servidor se ejecutan dentro de un proceso simple. De esta manera cada vez que llega una petición al servidor, la máquina virtual de Java crea un hilo para su manejo, reduciendo de esta manera la sobrecarga del sistema. A la hora de desarrollar un servidor para este proyecto ha de hacerse teniendo en cuenta su doble funcionalidad. Por un lado debe encargarse de procesar los datos, en formato XML, que recibe y por otra ha de generar el tipo de grafico que se le ha solicitado. Esto es clave a la hora de su diseño ya que, a pesar de que las tareas de procesado de las peticiones son comunes a todos los datos que recibe, la parte encargada de construir los gráficos finales varía según el tipo concreto que ha sido solicitado. También se ha de tener en cuenta el tiempo final de ejecución del servlet, si este tiempo es excesivo no se habrá ganado tiempo de respuesta respecto a la transmisión de un gráfico en un formato como puede ser GIF, JPG, etc. La única ventaja que se habría 1479 aportado sería una reducción en el tráfico de la red ya que, con el esquema de funcionamiento del sistema basado en applets y servlets, la comunicación entre el servidor y el cliente es mínima. Por tanto la solución al problema del tiempo de ejecución del servlet se puede enfocar mediante el uso de una interfaz Java. De esta manera podríamos dejar en el código propio del servlet los métodos necesarios para el procesamiento de los documentos XML de las peticiones. Una vez procesados, se invocaría a una implementación concreta de la interfaz. Cada una de estas implementaciones sería la encargada de generar un determinado tipo de gráficos. Así, si el cliente nos envía unas series numéricas y un tipo de gráfico en el que debe de ser devueltas el servidor invocaría dinámicamente a la interfaz correspondiente. Este enlace dinámico se logra manteniendo un archivo de configuración para el servlet en el que se especifiquen todas las correspondencias entre los tipos de los gráficos y la implementación correspondiente de la interfaz. Figura2. Ejemplo de ejecución de gdXML. Como ventaja añadida cabe destacar que, cuando se desee dar soporte un nuevo tipo de gráfico, no es necesario introducir modificaciones en el código del servlet. La única tarea necesaria es la de modificar el archivo de configuración para que el servidor sea consciente del nuevo tipo soportado. 1480 2 SEGUNDA FASE, agML 2.1 Aspectos a mejorar respecto a gdXML. Una vez que se ha finalizado una versión completamente funcional del sistema podemos extraer conclusiones sobre su diseño y funcionamiento, de cara a mejorar tanto su rendimiento como sus funcionalidades. Una de las primeras conclusiones que se puede extraer es la complejidad de la implementación de los applets. El origen de esta complejidad se encuentra en el propio lenguaje utilizado para definir los gráficos. Al estar basado en el uso de etiquetas para elementos de las series numéricas los applets deben incluir métodos para transformar estos datos en primitivas de dibujado. Para evitar esta situación se puede optar por redefinir el lenguaje de marcado que se utiliza. A continuación se expone un subconjunto de la DTD que define a agML. En este lenguaje la descripción de los gráficos se basa en primitivas de dibujado, como puede ser líneas, puntos, cajas, etc. Aparte se incluyen etiquetas para la inclusión de series numéricas, utilizadas en el proceso de petición del gráfico. <!-- DTD para definir documentos \\XML de graficos de datos -->\\ <!ELEMENT agML (punto|linea|elipse|serie2d)\*>\\ <!ELEMENT punto (\#PCDATA)>\\ <!ATTLIST punto x1 CDATA \#REQUIRED\\ x2 CDATA \#REQUIRED\\ grosor CDATA \#REQUIRED>\\ <!ELEMENT linea (\#PCDATA)>\\ <!ATTLIST linea x1 CDATA \#REQUIRED\\ x2 CDATA \#REQUIRED\\ x3 CDATA \#REQUIRED\\ x4 CDATA \#REQUIRED>\\ <!ELEMENT elipse (\#PCDATA)>\\ <!ATTLIST elipse c1 CDATA \#REQUIRED\\ c2 CDATA \#REQUIRED\\ radio1 CDATA \#REQUIRED\\ radio2 CDATA \#REQUIRED>\\ <!ATTLIST serie2d valor1 CDATA \#REQUIRED\\ 1481 valor2 CDATA \#REQUIRED>\\ 2.2 Características de agML En estos momentos se esta trabajando en agML (abstract graphing Markup Language), un lenguaje que, al contrario que el actual, esta basado en primitivas gráficas. Para solucionar el envío de los datos de las series numéricas al servidor se han incluido en el lenguaje etiquetas para contener series numéricas, dando soporte, en estos momentos, a dos y tres series numéricas lo que, en un principio, es suficiente para la mayor parte de los gráficos de datos. Se puede considerar agML como un lenguaje de dos vías ya que es utilizado de distinta manera en la comunicación cliente-servidor (petición), que en la servidor-cliente (respuesta). Durante la petición el cliente enviará al servidor los datos (las series) usando agML, de esta manera podrá enviar, junto con las etiquetas correspondiente a los datos, primitivas gráficas que compongan, por ejemplo, un logotipo corporativo. Para lograr simplificar el diseño de los applets lo que realmente es útil es que las etiquetas de datos sean procesadas en el servlet y que este solo devuelva (comunicación servidor-cliente) primitivas gráficas. En este caso se puede volver a hacer uso de las interfaces Java. Se ha de tener en cuenta que la transformación de los datos en componentes básicos del gráfico resultante varia mucho según el tipo de diagrama que se haya solicitado. Esta solución es muy similar a la que ya se encuentra implementada, solo que con mas funcionalidad. Antes solo se tenia que encargar de añadir los datos de formato correspondientes al gráfico solicitado, sin embargo ahora a de procesar por completo todos los datos de las series para generar un documento XML que tan solo contenga las primitivas gráficas necesarias. Al añadir esta tarea de transformación del lado servidor se simplifica la parte cliente hasta el punto de hacer innecesaria su especialización en applets distintos, uno por tipo de gráfico. Con este nuevo diseño solo se hace necesario un applet que sea capaz de representar todas las primitivas gráficas soportadas por el lenguaje. Esto se puede lograr mediante el uso de las API Java 2D, Java 3D o incluso la API Java OpenGL para dar soporte a primitivas 3D. Es interesante observar que la salida se genera en un formato XML que solo contiene componentes básicos de dibujado (línea, polígono, arco, etc). 1482 Teniendo esto en cuenta es interesante dotar al servidor de algún mecanismo que le permita transformar la salida desde agML a otros tipos de representación, como SVG o VRML. Para lograr esto se esta implementando para el servidor una segunda interfaz, encargada de transformar la salida agML en otra, como las arriba mencionadas, a petición del cliente. El mecanismo de uso por parte del servlet de esta segunda interfaz encargada de la traducción es el mismo que el de la encargada del procesamiento de las peticiones. Tan solo ha de mantenerse un archivo de configuración para establecer la correspondencia, en tiempo de ejecución, entre el formato de salida solicitado y la implementación correspondiente de la interfaz traductora. Figura 3. Ejemplo de ejecución de gdXML 3 CONCLUSIONES El sistema implementado permite una independencia de plataforma y gestor de visualización de elementos gráficos proporcionando un sistema de elección al usuario en 1483 el cual puede decidir el formato de salida del mismo. Esto unido a la utilización de formatos intermedios de representación de la información gráfica mediante XML hace el sistema modular y abierto para cualquier ampliación que desde la comunidad científica pueda precisarse. El objetivo final de construir un sistema abierto utilizable por cualquier internauta para enviar elementos gráficos a cualquier dispositivo eligiendo el formato de visualización está cada vez más cerca. 4 REFERENCIAS [1] http://www.w3c.org, pagina del world wide web consortium. [2] D. Arnow y G. Weiss, "Introducción a la programación con Java. Un enfoque orientado a objetos", Addison Wesley, 2000. [3] J. Rodeiro y G. Pérez, "Internet client graphics generation using XML formats", Lecture Notes 2330, Springer \& Verlag, 2002. [4] http://www.adobe.com/svg/main.html, Página principal de Adobe SVG(c),,2002 [5] Benoît Marchal. "XML by example", Ed. Que, 201West 103rd street, Indianapolis, Indiana 46290, Dic 1999, ISBN 0-7897-2242-9. 5 CORRESPONDENCIA Javier Rodeiro Iglesias Departamento de Informática. E.S.E. Informática. Edificio Politécnico, Campus As Lagoas Universidad de Vigo 32004 Ourense, España e-correo: jrodeiro@uvigo.es Teléfono: 988387020 Fax: 988387001 1484