Publicación de eventos: Combinación de Hojas de cálculo de Google, Calendario y Base

Ryan Boyd, equipo de las APIs de datos de Google
Junio de 2007
  1. Introducción
  2. Diseño e implementación
  3. Cómo obtener e implementar el publicador de eventos
  4. Ejecuta la aplicación
  5. Próximos pasos y posibles mejoras
  6. Apéndice

Introducción

¿Alguna vez quisiste mantener mucha información sobre reuniones, eventos o conferencias en una hoja de cálculo de Google y que esa información se pueda compartir y buscar fácilmente? En Google, hacemos precisamente eso con nuestro Calendario de eventos para desarrolladores. Los datos que alimentan el calendario provienen de una gran variedad de Googlers de toda la empresa, muchos de los cuales tienen acceso de edición a una Hoja de cálculo de Google en la que se almacenan los datos. En la hoja de cálculo, existen eventos no confirmados junto con las interacciones bien publicitadas. A veces, las personas incluso ingresan eventos potenciales, incluso antes de que se envíe una propuesta o se investigue un posible patrocinio. Un "editor" es responsable de publicar eventos y registrarlos en una columna de la hoja de cálculo.

¿Por qué no mantenemos estos eventos directamente en el Calendario de Google? El Calendario es ideal para identificar los cuándo y los dónde de un evento, pero, cuando se trata de mantener mucha información estructurada, como listas de oradores, fechas límite de envío, etcétera, una hoja de cálculo es más adecuada.

Captura de pantalla de una hoja de cálculo de Google con eventos
La hoja de cálculo de Google de origen con la lista de eventos

Uno de mis compañeros de Google sugirió que sigamos manteniendo los eventos en Hojas de cálculo, pero que eliminemos el proceso manual de publicarlos en nuestro calendario público externo. También quería un proyecto interesante basado en varias APIs de datos de Google (o "GData", para abreviar) para mostrar en Mashup Camp, y así nació Event Publisher.

Event Publisher es una aplicación de prueba de concepto desarrollada rápidamente que mantiene una lista de eventos en Hojas de cálculo y los publica en Calendario y Google Base. El Calendario de Google es una excelente manera de compartir eventos y brindarles a las personas una forma sencilla de incluirlos en su propia vista del calendario. Si bien el Calendario permite buscar eventos, Google Base ofrece otro medio para publicarlos y se destaca por almacenar datos estructurados de una manera que facilita la búsqueda.

Hojas de cálculo, Calendar y Base proporcionan una API que admite operaciones completas de lectura y escritura. Aún mejor, cada uno de estos servicios expone el acceso a sus datos con el protocolo de la API de Google Data.

Diseño e implementación

La fase de diseño de este proyecto fue bastante simple: sabía que quería crear una aplicación web para publicar datos de hojas de cálculo en un calendario. Si bien el objetivo a largo plazo era crear una aplicación que se pudiera usar para el Calendario de eventos para desarrolladores, el objetivo a corto plazo era producir un mashup funcional como prueba de concepto que se pudiera demostrar durante Mashup Camp. Con estos objetivos en mente, elegí la biblioteca cliente de GData para Java, ya que es una de las bibliotecas cliente más desarrolladas, y estoy familiarizado con la escritura de apps web en Java. Usar una de las bibliotecas cliente proporcionadas me liberó de tener que preocuparme por el protocolo GData sin procesar y el modelo de datos XML, y me permitió concentrarme en implementar la lógica de la aplicación relativamente simple que se requiere para publicar eventos.

Descargué la biblioteca cliente de Java y comencé a diseñar el modelo de clase para el publicador de eventos. Creé un servlet, llamado acertadamente EventPublisherServlet, que actúa como el controlador de todas las solicitudes que ingresan a la aplicación web. También creé una clase llamada EventPublisher para controlar la lógica empresarial de la interacción con Calendar, Base y Spreadsheets. Por último, escribí una clase Bean para almacenar los datos de eventos. La interfaz de usuario de la aplicación se desarrolló con unos pocos archivos JSP.

La ventaja de trabajar con varios servicios de GData es que son coherentes en todas sus interfaces y muchas de las bibliotecas cliente incluyen clases de ayuda específicas del servicio para tus servicios favoritos de Google. Dado que la biblioteca cliente tenía las mismas clases de servicio, entrada y feed para los tres servicios que estaba usando, pude usar un código muy similar para recuperar eventos de Hojas de cálculo y publicarlos en Base y Calendar. Esto redujo significativamente mi tiempo de desarrollo en comparación con el que se habría requerido para trabajar con tres APIs distintas. Te recomendamos que examines los métodos publishEventToCalendar() y publishEventToBase() en EventPublisher para ver las similitudes entre los diferentes métodos.

Obtención e implementación del publicador de eventos

La aplicación Event Publisher se distribuye como parte de la descarga de la biblioteca cliente de Java de Google Data. Después de descargar la biblioteca cliente de Java, busca en el directorio java/mashups/eventpub. Consulta la sección estructura del proyecto en el apéndice para obtener más información sobre el significado de cada archivo en el ejemplo.

La aplicación tiene varias bibliotecas dependientes que se deben descargar antes de compilar Event Publisher. Después de configurar las opciones de compilación y de tiempo de ejecución adecuadas (consulta el archivo README.TXT), se puede usar Ant para compilar las clases de Java y generar un archivo WAR. Luego, este archivo WAR se puede implementar en tu motor de servlet favorito, como Tomcat 5.5, que usé para probar esta aplicación. Tomcat, que se ejecuta con una configuración predeterminada, solo requiere que el archivo deploy/EventPublisher.war generado se copie en su directorio webapps. Luego, se implementará automáticamente y se podrá acceder a él a través de http://hostname:8080/EventPublisher.

Ejecuta la aplicación: proceso

Captura de pantalla del proceso de autenticación de AuthSub
Autenticación en la cuenta de Hojas de cálculo de Google a través de AuthSub.
  • Para cargar la aplicación, visita /EventPublisher en el host que la ejecuta. En mi caso, ejecuto la aplicación en http://localhost:8080/EventPublisher
  • Autenticación para Hojas de cálculo de Google
    • El usuario hace clic en el vínculo "authenticate" que genera la función estática: AuthSubUtil.getRequestUrl().
    • Se redirecciona al usuario a los servicios de la Cuenta de Google, donde, si aún no accedió a Google, se le solicitan sus credenciales.
    • El usuario otorga permiso al publicador de eventos para acceder a sus datos de Hojas de cálculo.
    • Se redirecciona al usuario de vuelta al publicador de eventos con un token de AuthSub de un solo uso en la URL. El publicador de eventos intercambia el token de un solo uso por un token de sesión de AuthSub con el servicio AuthSubSessionToken.
    • Código: Consulta EventPublisherServlet.processAcceptAuthSubToken()
    • Documentación: Consulta la documentación de AuthSub.
  • Selecciona la hoja de cálculo
    • El Publicador de eventos redirecciona al usuario a una lista de las hojas de cálculo a las que puede acceder el usuario autorizado.
    • Después de seleccionar una hoja de cálculo de la que se deben recuperar los datos del evento, también se le solicita al usuario que seleccione la hoja de trabajo adecuada en la hoja de cálculo seleccionada.
    • Código: Consulta EventPublisher.getSsList() y EventPublisher.getWsList()
  • Captura de pantalla de los campos de asignación Captura de pantalla de los campos de asignación
    Asignación de los datos obligatorios a las columnas de la hoja de cálculo y vista previa de los eventos que se publicarán
  • Recupera y asigna encabezados de columnas
    • Luego, la aplicación usa el feed de celdas de Hojas de cálculo para recuperar la primera fila de datos de la hoja de cálculo, que representa los encabezados de las columnas. Cada dato necesario se muestra al usuario, y se le solicita que seleccione el encabezado de columna que mejor coincida con los datos. En la captura de pantalla de la derecha, cada tipo de datos necesario tiene una casilla de selección junto a él en la que elegirías el encabezado de columna correspondiente. Esta asignación se almacena en la sesión del usuario con el mecanismo de administración de sesiones del contenedor de servlet.
    • Código: Consulta EventPublisherServlet.processListEvents()
  • Recupera entradas y almacénalas en Beans
    • Una vez que se asignan las columnas, el publicador de eventos recupera el feed de la lista de hojas de cálculo que contiene una sola entrada para cada fila de la hoja de cálculo. Cada fila representa un solo evento, y los datos de la fila se propagan en instancias del Event Bean. Luego, la colección de Beans se almacena en la sesión y también se muestra en la pantalla para su confirmación, mediante la página outputEventList.jsp.
  • Publica las entradas en el Calendario o la Base
    • El usuario selecciona el destino de publicación adecuado (Calendario, Base o ambos) y hace clic en el botón "Publicar". Los eventos se envían desde la colección de objetos Event almacenados en la sesión del usuario a los servicios correspondientes con los métodos publishEventsToBase() y publishEventsToCalendar en EventPublisher. Estos métodos crean objetos de entrada de los tipos adecuados para los servicios: CalendarEventEntry y GoogleBaseEntry. Luego, estas entradas se publican a través de un HTTP POST que realizan las clases de servicio CalendarService y GoogleBaseService.
    • A medida que se publican los eventos, las URLs de edición que devuelve cada servicio de destino se almacenan en la hoja de cálculo de Google con el método EventPublisher.updateSsEventEditUrl(). En futuras iteraciones del proceso de publicación, los eventos que contengan una URL de edición para cada servicio respectivo en la hoja de cálculo se editarán en lugar de crearse. Esto evita que se dupliquen los datos de eventos.

Próximos pasos y posibles mejoras

Como se mencionó anteriormente en este artículo, esta aplicación actualmente es solo un prototipo. No está diseñado para ser código listo para la producción. Para que el publicador de eventos esté listo para producción, se debería incluir algún control de errores. Actualmente, los errores solo se envían a stderr. En su lugar, los errores que se produzcan durante la recuperación, la publicación o cualquier otra acción deben mostrarse en el navegador del usuario.

Además, se debe tener en cuenta que Google Base, para mantener la integridad de su conjunto de datos, hace que los elementos venzan después de un período si no se actualizan. Si ya se agregó un evento a Google Base, el publicador de eventos intentará actualizarlo con la URL de edición almacenada en la hoja de cálculo de Google. Si el elemento de evento en Base venció, la URL de edición ya no será válida y se mostrará un error 404 en el momento de la publicación. Una solución alternativa sería intentar insertar el evento al recibir una respuesta 404.

Otra función que se podría agregar a la aplicación de Event Publisher es la capacidad de almacenar y publicar las horas exactas de los eventos, en lugar de solo la fecha. Como Google Base requiere que se adjunten horas a los eventos, almacenar la hora de cada evento evitaría que se asocien horas arbitrarias a los eventos en las entradas de Base. Calendario también puede presentar los eventos en los momentos adecuados.

También es posible que desees tener un mecanismo de almacenamiento de datos persistente para almacenar la configuración de hojas de cálculo específicas, incluidas las asignaciones de columnas. Esto podría tomar la forma de una hoja de cálculo de Google separada, una base de datos o un almacenamiento en disco local.

Espero que este artículo haya despertado tu imaginación para que se te ocurran nuevas ideas geniales para aplicaciones que utilicen las APIs de Google Data. Si te interesa ver el código fuente de esta aplicación, o bien compilarla y modificarla para que se adapte a tus necesidades, puedes encontrarla en la biblioteca cliente de Java de las APIs de Google Data en el directorio mashups/eventpub. También agradecemos tus comentarios sobre este artículo en el foro para desarrolladores de las APIs de datos de Google. Si tienes preguntas relacionadas con un servicio específico, publícalas en los grupos de debate específicos del servicio.

Apéndice

Recursos adicionales