czerwiec 2007 r.
- Wprowadzenie
- Projektowanie i wdrażanie
- Uzyskiwanie i wdrażanie narzędzia do publikowania zdarzeń
- Uruchamianie aplikacji
- Dalsze kroki i potencjalne ulepszenia
- Dodatek
Wprowadzenie
Czy zdarzyło Ci się kiedyś chcieć przechowywać w arkuszu kalkulacyjnym Google wiele informacji o spotkaniach, wydarzeniach lub konferencjach i łatwo je udostępniać oraz wyszukiwać? W Google robimy to za pomocą kalendarza wydarzeń dla deweloperów. Dane, które trafiają do kalendarza, pochodzą od wielu pracowników Google z całej firmy. Wielu z nich ma uprawnienia do edytowania arkusza kalkulacyjnego Google, w którym są przechowywane dane. W arkuszu kalkulacyjnym znajdują się niepotwierdzone wydarzenia oraz dobrze znane zaangażowania. Czasami użytkownicy wpisują nawet potencjalne wydarzenia – jeszcze przed przesłaniem propozycji lub zbadaniem możliwości sponsorowania. „Edytor” odpowiada za publikowanie wydarzeń i rejestrowanie opublikowanych wydarzeń w kolumnie arkusza kalkulacyjnego.
Dlaczego nie przechowujemy tych wydarzeń bezpośrednio w Kalendarzu Google? Kalendarz jest przydatny do określania czasu i miejsca wydarzenia, ale jeśli chodzi o przechowywanie wielu uporządkowanych informacji, takich jak listy prelegentów, terminy przesyłania zgłoszeń itp., arkusz kalkulacyjny jest bardziej odpowiedni.

Źródłowy arkusz kalkulacyjny Google z listą wydarzeń
Jeden z moich współpracowników z Google zasugerował, abyśmy nadal prowadzili listę wydarzeń w Arkuszach, ale zrezygnowali z ręcznego publikowania ich w naszym zewnętrznym kalendarzu publicznym. Chciałem też zaprezentować na Mashup Camp ciekawy projekt oparty na wielu interfejsach Google Data API (w skrócie „GData”), dlatego powstał Event Publisher.
Event Publisher to szybko opracowana aplikacja typu proof-of-concept, która przechowuje listę wydarzeń w Arkuszach i publikuje je w Kalendarzu i Google Base. Kalendarz Google to świetny sposób na udostępnianie wydarzeń i umożliwianie innym osobom łatwego dodawania ich do własnego widoku kalendarza. Kalendarz umożliwia wyszukiwanie wydarzeń, ale Baza Google to kolejne miejsce do publikowania informacji o wydarzeniach. Doskonale nadaje się do przechowywania uporządkowanych danych w sposób, który ułatwia wyszukiwanie.
Arkusze, Kalendarz i Baza danych udostępniają interfejs API, który obsługuje pełne operacje odczytu i zapisu. Co więcej, każda z tych usług udostępnia dostęp do swoich danych za pomocą protokołu Google Data API.
Projektowanie i wdrażanie
Faza projektowania tego projektu była dość prosta: wiedziałem, że chcę utworzyć aplikację internetową do publikowania danych z arkusza kalkulacyjnego w kalendarzu. Długoterminowym celem było stworzenie aplikacji, która mogłaby być używana w kalendarzu wydarzeń dla deweloperów, a krótkoterminowym – opracowanie działającego prototypu, który można by zaprezentować podczas Mashup Camp. Mając na uwadze te cele, wybrałem bibliotekę klienta GData Java, ponieważ jest to jedna z bardziej zaawansowanych bibliotek klienta, a ja znam się na pisaniu aplikacji internetowych w języku Java. Korzystanie z jednej z udostępnionych bibliotek klienta zwolniło mnie z konieczności martwienia się o protokół GData i model danych XML, dzięki czemu mogłem skupić się na wdrożeniu stosunkowo prostej logiki aplikacji wymaganej do publikowania zdarzeń.
Pobrałem bibliotekę klienta Java i zacząłem projektować model klasy dla wydawcy wydarzeń. Utworzyłem servlet o nazwie EventPublisherServlet, który pełni funkcję kontrolera wszystkich żądań przychodzących do aplikacji internetowej. Utworzyłem też klasę o nazwie EventPublisher, która obsługuje logikę biznesową interakcji z Kalendarzem, Base i Arkuszami. Na koniec napisałem klasę Bean do przechowywania danych zdarzenia. Interfejs aplikacji został opracowany przy użyciu kilku plików JSP.
Zaletą korzystania z wielu usług GData jest to, że są one spójne w ramach swoich interfejsów, a wiele bibliotek klienta zawiera klasy pomocnicze specyficzne dla ulubionych usług Google. Biblioteka klienta miała te same klasy Service, Entry i Feed dla 3 usług, z których korzystałem, więc mogłem używać bardzo podobnego kodu do pobierania wydarzeń z Arkuszy i publikowania ich w Base i Kalendarzu. Znacznie skróciło to czas programowania w porównaniu z tym, ile czasu zajęłoby mi korzystanie z 3 różnych interfejsów API. Aby zobaczyć podobieństwa między różnymi metodami, możesz sprawdzić metody publishEventToCalendar() i publishEventToBase() w klasie EventPublisher.
Pobieranie i wdrażanie wydawcy zdarzeń
Aplikacja Event Publisher jest rozpowszechniana jako część pobranego pakietu Java Client Library Google Data. Po pobraniu biblioteki klienta Java otwórz katalog java/mashups/eventpub. Więcej informacji o znaczeniu poszczególnych plików w przykładzie znajdziesz w sekcji struktura projektu w dodatku.
Aplikacja ma kilka bibliotek zależnych, które należy pobrać przed skompilowaniem narzędzia Event Publisher. Po skonfigurowaniu odpowiednich opcji kompilacji i środowiska wykonawczego (patrz plik README.TXT) możesz użyć narzędzia Ant do skompilowania klas Java i wygenerowania pliku WAR. Ten plik WAR można następnie wdrożyć w ulubionym silniku serwletów, np. Tomcat 5.5, którego użyłem do testowania tej aplikacji. Tomcat w konfiguracji domyślnej wymaga tylko skopiowania wygenerowanego pliku deploy/EventPublisher.war do katalogu webapps. Następnie zostanie on automatycznie wdrożony i będzie dostępny pod adresem http://hostname:8080/EventPublisher.
Uruchamianie aplikacji – proces

Uwierzytelnianie na koncie Arkuszy Google za pomocą AuthSub.
- Aplikację można wczytać, otwierając adres /EventPublisher na hoście, na którym jest uruchomiona. W moim przypadku aplikacja jest uruchomiona pod adresem http://localhost:8080/EventPublisher.
- Uwierzytelnianie w Arkuszach kalkulacyjnych Google
- Użytkownik klika link „authenticate” (uwierzytelnij), który jest generowany przez funkcję statyczną: AuthSubUtil.getRequestUrl().
- Użytkownik zostanie przekierowany do usług konta Google, gdzie (jeśli nie jest jeszcze zalogowany w Google) zostanie poproszony o podanie danych logowania.
- Użytkownik przyznaje wydawcy zdarzenia uprawnienia dostępu do swoich danych w Arkuszach.
- Użytkownik jest przekierowywany z powrotem do wydawcy zdarzenia z tokenem AuthSub jednorazowego użytku w adresie URL. Wydawca zdarzeń wymienia jednorazowy token na token sesji AuthSub za pomocą usługi AuthSubSessionToken.
- Kod: patrz
EventPublisherServlet.processAcceptAuthSubToken()
- Dokumentacja: zapoznaj się z dokumentacją AuthSub.
- Wybierz arkusz kalkulacyjny lub arkusz
- Wydawca zdarzeń przekierowuje użytkownika do listy arkuszy kalkulacyjnych dostępnych dla autoryzowanego użytkownika.
- Po wybraniu arkusza kalkulacyjnego, z którego mają być pobierane dane o zdarzeniach, użytkownik jest proszony o wybranie odpowiedniego arkusza w wybranym arkuszu kalkulacyjnym.
- Kod: zobacz
EventPublisher.getSsList()
iEventPublisher.getWsList()
- Pobieranie i mapowanie nagłówków kolumn
- Aplikacja używa następnie kanału komórek Arkuszy, aby pobrać pierwszy wiersz danych z arkusza kalkulacyjnego. Ten pierwszy wiersz zawiera nagłówki kolumn. Każdy rodzaj potrzebnych danych jest wyświetlany użytkownikowi, który jest proszony o wybranie nagłówka kolumny najlepiej pasującego do danych. Na zrzucie ekranu po prawej stronie obok każdego wymaganego typu danych znajduje się pole wyboru, w którym możesz wybrać odpowiedni nagłówek kolumny. To mapowanie jest przechowywane w sesji użytkownika za pomocą mechanizmu obsługi sesji kontenera serwletów.
- Kod: patrz
EventPublisherServlet.processListEvents()
- Pobieranie wpisów i zapisywanie ich w obiekcie Beans
- Po zmapowaniu kolumn wydawca zdarzeń pobiera plik danych z listą arkuszy kalkulacyjnych zawierający po jednym wpisie na każdy wiersz w arkuszu. Każdy wiersz reprezentuje pojedyncze zdarzenie, a dane z wiersza są wypełniane w instancjach komponentu Event Bean. Zebrane fasolki są następnie przechowywane w sesji i wyświetlane na ekranie w celu potwierdzenia – za pomocą strony outputEventList.jsp.
- Publikowanie wpisów w Kalendarzu lub Bazie
- Użytkownik wybiera odpowiednie miejsce publikacji (Kalendarz, Baza lub oba) i klika przycisk „Opublikuj”. Zdarzenia są przesyłane z kolekcji obiektów zdarzeń przechowywanych w sesji użytkownika do odpowiednich usług za pomocą metod
publishEventsToBase()
ipublishEventsToCalendar
w EventPublisher. Te metody tworzą obiekty wejścia odpowiednich typów dla usług:CalendarEventEntry
iGoogleBaseEntry
. Te wpisy są następnie publikowane za pomocąHTTP POST
wykonywanego przez klasy usługiCalendarService
iGoogleBaseService
. - Gdy zdarzenia są publikowane, adresy URL edycji zwracane przez każdą usługę docelową są przechowywane w Arkuszach Google za pomocą metody
EventPublisher.updateSsEventEditUrl()
. W przypadku kolejnych iteracji procesu publikowania zdarzenia zawierające adres URL edycji dla każdej usługi w arkuszu kalkulacyjnym są edytowane, a nie tworzone. Zapobiega to duplikowaniu danych zdarzeń.
- Użytkownik wybiera odpowiednie miejsce publikacji (Kalendarz, Baza lub oba) i klika przycisk „Opublikuj”. Zdarzenia są przesyłane z kolekcji obiektów zdarzeń przechowywanych w sesji użytkownika do odpowiednich usług za pomocą metod


Mapowanie wymaganych danych na kolumny arkusza kalkulacyjnego i wyświetlanie podglądu zdarzeń, które mają zostać opublikowane.
Dalsze kroki i możliwe ulepszenia
Jak wspomnieliśmy wcześniej w tym artykule, ta aplikacja jest obecnie tylko prototypem. Nie jest to kod gotowy do wdrożenia w środowisku produkcyjnym. Aby wydawca zdarzeń był gotowy do wdrożenia w środowisku produkcyjnym, należy uwzględnić obsługę błędów. Obecnie błędy są wysyłane tylko do stderr. Zamiast tego błędy występujące podczas pobierania, publikowania lub innych działań powinny być wyświetlane w przeglądarce użytkownika.
Należy też pamiętać, że Google Base, aby zachować spójność zestawu danych, usuwa po pewnym czasie nieaktualizowane produkty. Jeśli wydarzenie zostało już dodane do Google Base, wydawca wydarzenia próbuje je zaktualizować za pomocą adresu URL do edycji przechowywanego w Arkuszach Google. Jeśli produkt w Base wygasł, adres URL edycji nie jest już ważny i w momencie publikacji zostanie zwrócony błąd 404. Obejście tego problemu polega na próbie wstawienia zdarzenia po otrzymaniu odpowiedzi 404.
Kolejną funkcją, którą można dodać do aplikacji Event Publisher, jest możliwość przechowywania i publikowania dokładnych godzin wydarzeń, a nie tylko daty. Google Base wymaga, aby do wydarzeń były dołączone godziny, więc przechowywanie czasu każdego wydarzenia zapobiega przypisywaniu do wydarzeń w bazie danych dowolnych godzin. Kalendarz może też wyświetlać wydarzenia o odpowiednich porach.
Możesz też potrzebować trwałego mechanizmu przechowywania danych, aby zapisywać konfiguracje poszczególnych arkuszy kalkulacyjnych, w tym mapowania kolumn. Może to być osobny arkusz kalkulacyjny Google, baza danych lub lokalny dysk.
Mam nadzieję, że ten artykuł pobudził Twoją wyobraźnię i pomógł Ci wpaść na nowe, ciekawe pomysły na aplikacje korzystające z interfejsów Google Data API. Jeśli chcesz zobaczyć źródło tej aplikacji, zbudować ją i zmodyfikować zgodnie ze swoimi potrzebami, znajdziesz ją w bibliotece klienta interfejsów API Google Data w języku Java w katalogu mashups/eventpub. Czekamy też na Twoje opinie o tym artykule na forum dla deweloperów poświęconym interfejsom Google Data API. Pytania dotyczące konkretnej usługi publikuj w grupach dyskusyjnych poświęconych poszczególnym usługom.