Публикация событий — объединение Google Таблиц, Календаря и Base

Райан Бойд, команда Google Data API
Июнь 2007 г.
  1. Введение
  2. Проектирование и реализация
  3. Получение и развертывание издателя событий
  4. Запуск приложения
  5. Дальнейшие шаги и потенциальные улучшения
  6. Приложение

Введение

Вы когда-нибудь хотели хранить большой объём информации о встречах, мероприятиях или конференциях в таблице Google, чтобы её можно было легко найти и поделиться? В Google мы делаем именно это с помощью нашего календаря мероприятий для разработчиков . Данные, которые поступают в календарь, поступают от самых разных сотрудников Google по всей компании, многие из которых имеют право редактировать таблицу Google, где эти данные хранятся. В таблице есть как неподтверждённые мероприятия, так и широко разрекламированные мероприятия. Иногда люди даже вносят информацию о потенциальных мероприятиях — ещё до того, как будет подано предложение или рассмотрено потенциальное спонсорство. «Редактор» отвечает за публикацию мероприятий и запись опубликованных мероприятий в столбце таблицы.

Почему бы нам не хранить эти мероприятия прямо в Google Календаре? Календарь отлично подходит для определения времени и места проведения мероприятия, но для хранения большого объёма структурированной информации, например, списков докладчиков, сроков подачи заявок и так далее, больше подойдёт электронная таблица.

Снимок экрана Google Таблицы с событиями
Исходная таблица Google со списком событий

Один из моих коллег-гуглеров предложил продолжить ведение мероприятий в электронных таблицах, но отказаться от ручной публикации их в нашем внешнем публичном календаре. Мне также хотелось продемонстрировать на Mashup Camp интересный проект, основанный на нескольких API Google Data (сокращенно «GData»), и так родился Event Publisher.

Event Publisher — это быстро разработанное экспериментальное приложение, которое хранит список мероприятий в электронных таблицах и публикует его как в Календаре, так и в Google Base. Google Calendar — отличный способ делиться мероприятиями и легко добавлять их в свой календарь. Хотя в Календаре есть возможность поиска мероприятий, Google Base предоставляет ещё одну площадку для публикации мероприятий и отлично подходит для хранения структурированных данных, удобных для поиска.

Таблицы, Календарь и Base предоставляют API, поддерживающие полноценные операции чтения и записи. Более того, каждый из этих сервисов предоставляет доступ к своим данным через протокол Google Data API!

Проектирование и реализация

Этап проектирования этого проекта был довольно простым: я знал, что хочу создать веб-приложение для публикации данных электронных таблиц в календаре. Долгосрочная цель заключалась в создании приложения, которое можно было бы использовать для календаря мероприятий разработчиков, а краткосрочная — в создании работающего прототипа мэшапа, который можно было бы продемонстрировать во время Mashup Camp. Учитывая эти цели, я выбрал клиентскую библиотеку Java GData, поскольку это одна из наиболее зрелых клиентских библиотек, и я знаком с написанием веб-приложений на Java. Использование одной из предоставленных клиентских библиотек избавило меня от необходимости беспокоиться о чистом протоколе GData и модели данных XML, и позволило сосредоточиться на реализации относительно простой логики приложения, необходимой для публикации событий.

Я скачал клиентскую библиотеку Java и приступил к проектированию модели классов для издателя событий. Я создал сервлет с метким названием EventPublisherServlet , который выступает в роли контроллера всех запросов, поступающих в веб-приложение. Я также создал класс EventPublisher для реализации бизнес-логики взаимодействия с календарём, базой данных и электронными таблицами. Наконец, я написал класс Bean для хранения данных о событиях. Пользовательский интерфейс приложения был разработан с использованием нескольких JSP-страниц.

Преимущество работы с несколькими сервисами GData заключается в том, что их интерфейсы согласованы, а многие клиентские библиотеки включают вспомогательные классы для ваших любимых сервисов Google. Поскольку в клиентской библиотеке были одинаковые классы Service, Entry и Feed для трёх используемых мной сервисов, я смог использовать очень похожий код для извлечения событий из Spreadsheeds и их публикации в Base и Calendar. Это значительно сократило время разработки по сравнению с тем, которое потребовалось бы при работе с тремя разными API. Вы можете изучить методы publishEventToCalendar() и publishEventToBase() в EventPublisher , чтобы увидеть сходство между ними.

Получение и развертывание издателя событий

Приложение Event Publisher распространяется в составе клиентской библиотеки Java от Google Data. После загрузки клиентской библиотеки Java найдите каталог java/mashups/eventpub . Подробнее о значении каждого файла в примере см. в разделе «Структура проекта» в приложении.

Приложение содержит ряд зависимых библиотек, которые необходимо загрузить перед сборкой Event Publisher. После настройки соответствующих параметров сборки и среды выполнения (см. файл README.TXT ) Ant можно использовать для компиляции классов Java и создания WAR-файла. Этот WAR-файл затем можно развернуть в вашем любимом движке сервлетов, например, Tomcat 5.5, который я использовал при тестировании этого приложения. Tomcat, работающий в конфигурации по умолчанию, требует только копирования сгенерированного файла deploy/EventPublisher.war в каталог webapps. После этого он будет автоматически развёрнут и доступен по адресу http://hostname:8080/EventPublisher.

Запуск приложения — процесс

Снимок экрана процесса аутентификации AuthSub
Аутентификация в учетной записи Google Таблиц через AuthSub.
  • Приложение загружается путем обращения к /EventPublisher на хосте, где оно запущено. В моём случае приложение запущено по адресу http://localhost:8080/EventPublisher.
  • Аутентификация для Google Таблиц
    • Пользователь нажимает на ссылку «аутентифицировать», которая генерируется статической функцией: AuthSubUtil.getRequestUrl() .
    • Пользователь перенаправляется в службу аккаунта Google, где, если он еще не вошел в систему Google, ему предлагается ввести свои учетные данные.
    • Пользователь предоставляет издателю событий разрешение на доступ к данным своих электронных таблиц.
    • Пользователь перенаправляется обратно к издателю событий с одноразовым токеном AuthSub в URL-адресе. Издатель событий обменивает одноразовый токен на токен сеанса AuthSub, используя сервис AuthSubSessionToken.
    • Код: см EventPublisherServlet .processAcceptAuthSubToken()
    • Документация: см. документацию AuthSub.
  • Выберите электронную таблицу/рабочий лист
    • Издатель событий перенаправляет пользователя к списку электронных таблиц, доступных авторизованному пользователю.
    • После выбора электронной таблицы, из которой следует извлечь данные о событиях, пользователю также предлагается выбрать соответствующий лист в выбранной электронной таблице.
    • Код: см. EventPublisher .getSsList() и EventPublisher .getWsList()
  • Снимок экрана с полями сопоставленияСнимок экрана с полями сопоставления
    Сопоставление необходимых данных со столбцами электронной таблицы и предварительный просмотр событий, подлежащих публикации.
  • Извлечение и сопоставление заголовков столбцов
    • Затем приложение использует фид ячеек электронных таблиц для извлечения первой строки данных из электронной таблицы. Эта первая строка представляет собой заголовки столбцов. Все необходимые данные отображаются для пользователя, и пользователю предлагается выбрать заголовок столбца, который наилучшим образом соответствует данным. На снимке экрана справа рядом с каждым необходимым типом данных есть поле выбора, в котором можно выбрать соответствующий заголовок столбца. Это сопоставление сохраняется в сеансе пользователя с помощью механизма обработки сеансов сервлет-контейнера.
    • Код: см EventPublisherServlet .processListEvents()
  • Извлечь записи и сохранить в Beans
    • После сопоставления столбцов публикатор событий извлекает список электронных таблиц, содержащий одну запись для каждой строки листа. Каждая строка представляет одно событие, и данные из строки заполняются экземплярами компонента Event Bean. Коллекция компонентов Bean затем сохраняется в сеансе и также выводится на экран для подтверждения с помощью страницы outputEventList.jsp .
  • Публикация записей в календаре и/или базе
    • Пользователь выбирает подходящий целевой объект публикации (Calendar, Base или оба) и нажимает кнопку «Опубликовать». События передаются из коллекции объектов Event, хранящейся в сеансе пользователя, в соответствующие сервисы с помощью методов publishEventsToBase() и publishEventsToCalendar класса EventPublisher . Эти методы создают объекты записей соответствующих типов для сервисов: CalendarEventEntry и GoogleBaseEntry . Затем эти записи публикуются с помощью HTTP POST , выполняемого классами сервисов CalendarService и GoogleBaseService
    • По мере публикации событий URL-адреса редактирования, возвращаемые каждым целевым сервисом, сохраняются в Google Таблице с помощью метода EventPublisher .updateSsEventEditUrl() . Для последующих итераций процесса публикации события, содержащие URL-адрес редактирования для каждого соответствующего сервиса в Таблице, редактируются, а не создаются. Это предотвращает дублирование данных событий.

Дальнейшие шаги и потенциальные улучшения

Как упоминалось ранее в этой статье, это приложение пока находится на стадии прототипа. Его код не предназначен для использования в промышленной эксплуатации. Чтобы подготовить Event Publisher к промышленной эксплуатации, необходимо реализовать обработку ошибок. В настоящее время ошибки отправляются только в stderr. Вместо этого ошибки, возникающие при получении, публикации или других действиях, должны отображаться в браузере пользователя.

Кроме того, следует отметить, что для поддержания целостности набора данных Google Base элементы удаляются через определённый промежуток времени, если они не обновляются. Если событие уже добавлено в Google Base, публикатор событий пытается обновить его, используя URL-адрес редактирования, сохранённый в Google Таблицах. Если срок действия элемента события в Базе истек, URL-адрес редактирования становится недействительным, и при публикации возвращается ошибка 404. Обходным решением является попытка вставки события после получения ответа 404.

Ещё одна функция, которую можно добавить в приложение Event Publisher, — это возможность хранить и публиковать точное время событий, а не только дату. Поскольку Google Base требует привязки времени к событиям, сохранение времени каждого события предотвратит привязку произвольного времени к событиям в записях базы. Календарь также может отображать события в нужное время.

Вам также может понадобиться механизм постоянного хранения данных для хранения конфигураций отдельных электронных таблиц, включая сопоставления столбцов. Это может быть отдельная таблица Google, база данных или локальное дисковое хранилище.

Надеюсь, эта статья вдохновит вас на новые интересные идеи для приложений, использующих API Google Data! Если вам интересно посмотреть на исходный код этого приложения или создать его и доработать под свои нужды, вы можете найти его в клиентской библиотеке Java для API Google Data в каталоге mashups/eventpub . Мы также будем рады вашим отзывам об этой статье на форуме разработчиков API Google Data . По вопросам, связанным с конкретным сервисом, пожалуйста, обращайтесь в соответствующие группы обсуждения .

Приложение

Дополнительные ресурсы