Termine veröffentlichen – Google Tabellen, Kalender und Base kombinieren

Ryan Boyd, Google Data APIs-Team
Juni 2007
  1. Einführung
  2. Design und Implementierung
  3. Event Publisher abrufen und bereitstellen
  4. Anwendung ausführen
  5. Nächste Schritte und mögliche Verbesserungen
  6. Anhang

Einführung

Wollten Sie schon immer Informationen zu Besprechungen, Veranstaltungen oder Konferenzen in einer Google-Tabelle verwalten und diese Informationen einfach freigeben und durchsuchen können? Bei Google machen wir genau das mit unserem Developers Event Calendar. Die Daten, die in den Kalender einfließen, stammen von einer Vielzahl von Google-Mitarbeitern im gesamten Unternehmen. Viele von ihnen haben Bearbeitungszugriff auf eine Google-Tabelle, in der die Daten gespeichert sind. In der Tabelle sind neben öffentlichkeitswirksamen Interaktionen auch unbestätigte Ereignisse enthalten. Manchmal werden sogar potenzielle Events eingegeben, bevor ein Vorschlag eingereicht oder ein potenzielles Sponsoring geprüft wird. Ein „Editor“ ist für das Veröffentlichen von Ereignissen und das Aufzeichnen der veröffentlichten Ereignisse in einer Spalte der Tabelle verantwortlich.

Warum werden diese Termine nicht direkt in Google Kalender verwaltet? Google Kalender eignet sich gut, um die Uhrzeit und den Ort eines Ereignisses zu ermitteln. Wenn es jedoch darum geht, viele strukturierte Informationen wie Rednerlisten oder Einreichungsfristen zu verwalten, ist eine Tabelle besser geeignet.

Bildschirmaufnahme einer Google-Tabelle mit Ereignissen
Die Google-Quelltabelle mit der Liste der Ereignisse

Ein Kollege hat vorgeschlagen, dass wir die Termine weiterhin in Tabellen verwalten, aber den manuellen Prozess des Veröffentlichens in unserem externen öffentlichen Kalender entfernen. Außerdem wollte ich auf dem Mashup Camp ein interessantes Projekt auf der Grundlage mehrerer Google Data APIs (kurz „GData“) vorstellen. So entstand der Event Publisher.

Event Publisher ist eine schnell entwickelte Proof-of-Concept-Anwendung, die eine Liste von Ereignissen in Tabellen verwaltet und sie sowohl in Kalender als auch in Google Base veröffentlicht. Mit Google Kalender können Sie Termine ganz einfach freigeben und anderen Nutzern die Möglichkeit geben, die Termine in ihre eigene Kalenderansicht aufzunehmen. In Google Kalender können Sie zwar nach Terminen suchen, Google Base bietet jedoch eine weitere Möglichkeit, Termine zu veröffentlichen. Außerdem lassen sich strukturierte Daten dort auf suchfreundliche Weise speichern.

Für Tabellen, Kalender und Base ist jeweils eine API verfügbar, die vollständige Lese-/Schreibvorgänge unterstützt. Noch besser: Jeder dieser Dienste bietet Zugriff auf seine Daten über das Google Data API-Protokoll.

Design und Implementierung

Die Designphase dieses Projekts war recht einfach: Ich wusste, dass ich eine Webanwendung zum Veröffentlichen von Tabellendaten in einem Kalender erstellen wollte. Das langfristige Ziel war es, eine Anwendung zu entwickeln, die für den Entwickler-Eventkalender verwendet werden kann. Das kurzfristige Ziel war es, ein funktionierendes Proof-of-Concept-Mashup zu erstellen, das während des Mashup Camp demonstriert werden konnte. Aus diesen Gründen habe ich mich für die GData Java-Clientbibliothek entschieden, da sie eine der ausgereiftesten Clientbibliotheken ist und ich mit dem Schreiben von Java-Web-Apps vertraut bin. Durch die Verwendung einer der bereitgestellten Clientbibliotheken musste ich mich nicht um das GData-Rohprotokoll und das XML-Datenmodell kümmern, sondern konnte mich auf die Implementierung der relativ einfachen Anwendungslogik konzentrieren, die zum Veröffentlichen von Ereignissen erforderlich ist.

Ich habe die Java-Clientbibliothek heruntergeladen und mit der Entwicklung des Klassenmodells für den Event-Publisher begonnen. Ich habe ein Servlet mit dem Namen EventPublisherServlet erstellt, das als Controller für alle Anfragen dient, die in die Webanwendung eingehen. Außerdem habe ich eine Klasse namens EventPublisher erstellt, um die Geschäftslogik für die Interaktion mit Kalender, Base und Tabellen zu verarbeiten. Schließlich habe ich eine Bean-Klasse zum Speichern von Ereignisdaten geschrieben. Die Benutzeroberfläche der Anwendung wurde mit einigen wenigen JSPs entwickelt.

Der Vorteil der Verwendung mehrerer GData-Dienste besteht darin, dass sie über ihre Schnittstellen hinweg konsistent sind und viele der Clientbibliotheken dienstspezifische Hilfsklassen für Ihre bevorzugten Google-Dienste enthalten. Da die Clientbibliothek für die drei von mir verwendeten Dienste dieselben Service-, Entry- und Feed-Klassen hatte, konnte ich sehr ähnlichen Code zum Abrufen von Ereignissen aus Tabellen und zum Veröffentlichen in Base und Kalender verwenden. Dadurch wurde die Entwicklungszeit im Vergleich zur Arbeit mit drei verschiedenen APIs erheblich verkürzt. Sehen Sie sich die Methoden „publishEventToCalendar()“ und „publishEventToBase()“ in EventPublisher an, um die Ähnlichkeiten zwischen den verschiedenen Methoden zu erkennen.

Event Publisher abrufen und bereitstellen

Die Event Publisher-Anwendung wird als Teil des Downloads der Google Data Java-Clientbibliothek verteilt. Nachdem Sie die Java-Clientbibliothek heruntergeladen haben, suchen Sie im Verzeichnis java/mashups/eventpub. Weitere Informationen zur Bedeutung der einzelnen Dateien im Beispiel finden Sie im Anhang im Abschnitt Projektstruktur.

Die Anwendung hat eine Reihe von abhängigen Bibliotheken, die vor dem Erstellen des Event Publisher heruntergeladen werden müssen. Nachdem Sie die entsprechenden Build- und Laufzeitoptionen konfiguriert haben (siehe die Datei README.TXT), kann Ant verwendet werden, um die Java-Klassen zu kompilieren und eine WAR-Datei zu generieren. Diese WAR-Datei kann dann in Ihrer bevorzugten Servlet-Engine bereitgestellt werden, z. B. Tomcat 5.5, die ich zum Testen dieser Anwendung verwendet habe. Für Tomcat, das unter einer Standardkonfiguration ausgeführt wird, muss nur die generierte Datei „deploy/EventPublisher.war“ in das Verzeichnis „webapps“ kopiert werden. Sie wird dann automatisch bereitgestellt und ist über http://hostname:8080/EventPublisher zugänglich.

Anwendung ausführen – Prozess

Screenshot des AuthSub-Authentifizierungsprozesses
Authentifizierung für das Google Tabellen-Konto über AuthSub
  • Die Anwendung wird geladen, wenn Sie auf dem Host, auf dem die Anwendung ausgeführt wird, /EventPublisher aufrufen. In meinem Fall wird die Anwendung unter http://localhost:8080/EventPublisher ausgeführt.
  • Authentifizierung für Google Sheets
    • Der Nutzer klickt auf den Authentifizierungslink, der von der statischen Funktion AuthSubUtil.getRequestUrl() generiert wird.
    • Der Nutzer wird zu den Google-Kontodiensten weitergeleitet. Wenn er noch nicht bei Google angemeldet ist, wird er aufgefordert, seine Anmeldedaten einzugeben.
    • Der Nutzer erteilt dem Event Publisher die Berechtigung, auf seine Tabellendaten zuzugreifen.
    • Der Nutzer wird mit einem Einmal-AuthSub-Token in der URL zurück zum Event Publisher weitergeleitet. Der Event Publisher tauscht das Einmal-Token über den Dienst „AuthSubSessionToken“ gegen ein AuthSub-Sitzungstoken ein.
    • Code:Siehe EventPublisherServlet.processAcceptAuthSubToken()
    • Dokumentation:AuthSub-Dokumentation
  • Tabelle/Arbeitsblatt auswählen
    • Der Nutzer wird vom Event Publisher zu einer Liste der Tabellen weitergeleitet, auf die der autorisierte Nutzer zugreifen kann.
    • Nachdem der Nutzer eine Tabelle ausgewählt hat, aus der die Ereignisdaten abgerufen werden sollen, wird er aufgefordert, das entsprechende Arbeitsblatt in der ausgewählten Tabelle auszuwählen.
    • Code:Siehe EventPublisher.getSsList() und EventPublisher.getWsList()
  • Screenshot der Zuordnungsfelder Screenshot der Zuordnungsfelder
    Erforderliche Daten Tabellenspalten zuordnen und Vorschau der zu veröffentlichenden Ereignisse ansehen
  • Spaltenüberschriften abrufen und zuordnen
    • Die Anwendung ruft dann mit dem Zellenfeed für Tabellen die erste Datenzeile aus der Tabelle ab. Diese erste Zeile enthält die Spaltenüberschriften. Jeder benötigte Datentyp wird für den Nutzer aufgeführt und er wird aufgefordert, die Spaltenüberschrift auszuwählen, die am besten zu den Daten passt. Im Screenshot rechts sehen Sie neben jedem erforderlichen Datentyp ein Auswahlkästchen, in dem Sie die entsprechende Spaltenüberschrift auswählen. Diese Zuordnung wird in der Sitzung des Nutzers mithilfe des Sitzungsverwaltungsmechanismus des Servlet-Containers gespeichert.
    • Code:Siehe EventPublisherServlet.processListEvents()
  • Einträge abrufen und in Beans speichern
    • Nachdem die Spalten zugeordnet wurden, ruft Event Publisher den Feed mit der Tabellenliste ab, der einen einzelnen Eintrag für jede Zeile im Arbeitsblatt enthält. Jede Zeile stellt ein einzelnes Ereignis dar und die Daten aus der Zeile werden in Instanzen der Event-Bean eingefügt. Die Sammlung von Beans wird dann in der Sitzung gespeichert und zur Bestätigung auch auf dem Bildschirm ausgegeben – über die Seite outputEventList.jsp.
  • Einträge in Kalender und/oder Base veröffentlichen
    • Der Nutzer wählt das entsprechende Veröffentlichungsziel (Kalender, Base oder beides) aus und klickt auf die Schaltfläche „Veröffentlichen“. Ereignisse werden aus der Sammlung von Event-Objekten, die in der Sitzung des Nutzers gespeichert sind, mithilfe der Methoden publishEventsToBase() und publishEventsToCalendar in EventPublisher an die entsprechenden Dienste gesendet. Mit diesen Methoden werden Eintragsobjekte der entsprechenden Typen für die Dienste CalendarEventEntry und GoogleBaseEntry erstellt. Diese Einträge werden dann über einen HTTP POST gepostet, der von den service-Klassen CalendarService und GoogleBaseService ausgeführt wird.
    • Wenn Ereignisse veröffentlicht werden, werden die von den einzelnen Zieldiensten zurückgegebenen Bearbeitungs-URLs mit der Methode EventPublisher.updateSsEventEditUrl() in der Google-Tabelle gespeichert. Bei zukünftigen Iterationen des Veröffentlichungsprozesses werden Ereignisse, die eine Bearbeitungs-URL für den jeweiligen Dienst in der Tabelle enthalten, bearbeitet und nicht erstellt. So werden doppelte Ereignisdaten vermieden.

Nächste Schritte und mögliche Verbesserungen

Wie bereits erwähnt, ist diese Anwendung derzeit nur ein Prototyp. Es handelt sich nicht um produktionsbereiten Code. Damit der Event Publisher produktionsreif ist, muss eine Fehlerbehandlung implementiert werden. Derzeit werden Fehler nur an stderr gesendet. Stattdessen sollten Fehler, die beim Abrufen, Veröffentlichen oder bei anderen Aktionen auftreten, im Browser des Nutzers angezeigt werden.

Außerdem ist zu beachten, dass Google Base zur Aufrechterhaltung der Integrität des Datasets Artikel nach einer gewissen Zeit ablaufen lässt, wenn sie nicht aktualisiert werden. Wenn ein Event bereits in Google Base hinzugefügt wurde, versucht der Veranstalter, das Event über die in der Google-Tabelle gespeicherte Bearbeitungs-URL zu aktualisieren. Wenn das Ereigniselement in Base abgelaufen ist, ist die Bearbeitungs-URL nicht mehr gültig und bei der Veröffentlichung wird ein 404-Fehler zurückgegeben. Eine mögliche Lösung wäre, das Ereignis nach Erhalt einer 404-Antwort einzufügen.

Eine weitere Funktion, die der Event Publisher-Anwendung hinzugefügt werden könnte, ist die Möglichkeit, die genauen Uhrzeiten von Veranstaltungen anstelle des Datums zu speichern und zu veröffentlichen. Da für Google Base Zeiten für Ereignisse erforderlich sind, wird durch das Speichern der Zeit jedes Ereignisses verhindert, dass den Ereignissen in den Base-Einträgen beliebige Zeiten zugeordnet werden. Google Kalender kann die Ereignisse auch zu den entsprechenden Zeiten präsentieren.

Möglicherweise benötigen Sie auch einen Mechanismus zur dauerhaften Datenspeicherung, um Konfigurationen für bestimmte Tabellen zu speichern, einschließlich Spaltenzuordnungen. Das kann in Form einer separaten Google-Tabelle, einer Datenbank oder eines lokalen Festplattenspeichers erfolgen.

Ich hoffe, dieser Artikel hat Sie dazu inspiriert, einige tolle neue Ideen für Anwendungen zu entwickeln, die die Google Data APIs nutzen. Wenn Sie sich den Quellcode dieser Anwendung ansehen oder sie erstellen und an Ihre Bedürfnisse anpassen möchten, finden Sie sie in der Java-Clientbibliothek für Google Data APIs im Verzeichnis mashups/eventpub. Wir freuen uns auch über Ihr Feedback zu diesem Artikel im Google Data APIs-Entwicklerforum. Wenn Sie Fragen zu einem bestimmten Dienst haben, posten Sie diese bitte in den dienstspezifischen Diskussionsgruppen.

Anhang

Zusätzliche Ressourcen