การเผยแพร่กิจกรรม - การผสมผสาน Google สเปรดชีต, ปฏิทิน และ Base

Ryan Boyd ทีม Google Data API
มิถุนายน 2007
  1. บทนำ
  2. การออกแบบและการติดตั้งใช้งาน
  3. การขอรับและติดตั้งใช้งาน Event Publisher
  4. การเรียกใช้แอปพลิเคชัน
  5. ขั้นตอนถัดไปและการปรับปรุงที่อาจเกิดขึ้น
  6. ภาคผนวก

บทนำ

คุณเคยต้องการเก็บข้อมูลจำนวนมากเกี่ยวกับการประชุม กิจกรรม หรือการประชุมในสเปรดชีตของ Google และต้องการให้แชร์และค้นหาข้อมูลนั้นได้ง่ายๆ ไหม ที่ Google เรามีปฏิทินกิจกรรมสำหรับนักพัฒนาแอป ข้อมูลที่ป้อนลงในปฏิทินมาจาก Googler จำนวนมากทั่วทั้งบริษัท ซึ่งหลายคนมีสิทธิ์แก้ไขสเปรดชีต Google ที่เก็บข้อมูลไว้ ในสเปรดชีต เหตุการณ์ที่ยังไม่ได้รับการยืนยันจะอยู่ร่วมกับการมีส่วนร่วมที่ได้รับการเผยแพร่อย่างดี บางครั้งผู้คนยังป้อนกิจกรรมที่คาดว่าจะเกิดขึ้น แม้ว่าจะยังไม่ได้ส่งข้อเสนอหรือตรวจสอบการสนับสนุนที่อาจเกิดขึ้นก็ตาม "เอดิเตอร์" มีหน้าที่เผยแพร่กิจกรรมและบันทึกกิจกรรมที่เผยแพร่แล้วในคอลัมน์ในสเปรดชีต

เหตุใดเราจึงไม่ดูแลกิจกรรมเหล่านี้ใน Google ปฏิทินโดยตรง ปฏิทินเหมาะสำหรับการระบุเวลาและสถานที่ของกิจกรรม แต่เมื่อต้องจัดการข้อมูลที่มีโครงสร้างจำนวนมาก เช่น รายชื่อผู้พูด กำหนดเวลาส่ง และอื่นๆ สเปรดชีตจะเหมาะสมกว่า

ภาพหน้าจอของ Google สเปรดชีตที่มีกิจกรรม
สเปรดชีต Google ต้นฉบับที่มีรายการกิจกรรม

เพื่อนร่วมงานที่ Google คนหนึ่งแนะนำให้เราดูแลกิจกรรมในสเปรดชีตต่อไป แต่ให้นำกระบวนการเผยแพร่กิจกรรมไปยังปฏิทินสาธารณะภายนอกด้วยตนเองออก นอกจากนี้ ฉันยังต้องการโปรเจ็กต์ที่น่าสนใจซึ่งอิงตาม Google Data API หลายรายการ ("GData" แบบย่อ) เพื่อสาธิตที่ Mashup Camp จึงเป็นที่มาของ Event Publisher

Event Publisher เป็นแอปพลิเคชันที่พัฒนาขึ้นอย่างรวดเร็วเพื่อพิสูจน์แนวคิด ซึ่งจะดูแลรายการกิจกรรมในสเปรดชีตและเผยแพร่ไปยังทั้งปฏิทินและ Google Base Google ปฏิทินเป็นวิธีที่ยอดเยี่ยมในการแชร์กิจกรรมและช่วยให้ผู้คนสามารถรวมกิจกรรมไว้ในมุมมองปฏิทินของตนเองได้อย่างง่ายดาย แม้ว่าปฏิทินจะมีฟีเจอร์ค้นหากิจกรรม แต่ Google Base ก็เป็นอีกช่องทางหนึ่งในการประชาสัมพันธ์กิจกรรม และมีความโดดเด่นในการจัดเก็บ Structured Data ในลักษณะที่ค้นหาได้ง่าย

สเปรดชีต ปฏิทิน และ Base แต่ละรายการมี API ที่รองรับการดำเนินการอ่าน/เขียนทั้งหมด และที่ดียิ่งกว่านั้นคือแต่ละบริการเหล่านี้จะแสดงสิทธิ์เข้าถึงข้อมูลของตนโดยใช้โปรโตคอล Google Data API

การออกแบบและการใช้งาน

ระยะการออกแบบของโปรเจ็กต์นี้ค่อนข้างเรียบง่าย ฉันรู้ว่าต้องการสร้างเว็บแอปพลิเคชันสำหรับการเผยแพร่ข้อมูลสเปรดชีตในปฏิทิน แม้ว่าเป้าหมายระยะยาวคือการสร้างแอปพลิเคชันที่ใช้กับปฏิทินกิจกรรมสำหรับนักพัฒนาแอปได้ แต่เป้าหมายระยะสั้นคือการสร้างการผสมผสานที่พิสูจน์แนวคิดที่ใช้งานได้ซึ่งสามารถสาธิตในระหว่าง Mashup Camp ด้วยเป้าหมายเหล่านี้ ผมจึงเลือกใช้ไลบรารีไคลเอ็นต์ GData Java เนื่องจากเป็นหนึ่งในไลบรารีไคลเอ็นต์ที่สมบูรณ์กว่า และผมคุ้นเคยกับการเขียนเว็บแอป Java การใช้ไลบรารีของไคลเอ็นต์ที่ให้ไว้ช่วยให้ฉันไม่ต้องกังวลเกี่ยวกับโปรโตคอล GData ดิบและโมเดลข้อมูล XML แต่หันมามุ่งเน้นที่การใช้ตรรกะของแอปพลิเคชันที่ค่อนข้างเรียบง่ายซึ่งจำเป็นต่อการเผยแพร่เหตุการณ์แทน

ฉันดาวน์โหลดไลบรารีของไคลเอ็นต์ Java และเริ่มออกแบบโมเดลคลาสสำหรับผู้เผยแพร่เหตุการณ์ ฉันสร้างเซอร์วิเล็ตชื่อ EventPublisherServlet ซึ่งทำหน้าที่เป็นตัวควบคุมสำหรับคำขอทั้งหมดที่เข้ามาในเว็บแอปพลิเคชัน นอกจากนี้ ฉันยังสร้างคลาสชื่อ EventPublisher เพื่อจัดการตรรกะทางธุรกิจสำหรับการโต้ตอบกับปฏิทิน, Base และชีต สุดท้าย ฉันเขียนคลาส Bean สำหรับจัดเก็บข้อมูลเหตุการณ์ อินเทอร์เฟซผู้ใช้ของแอปพลิเคชันได้รับการพัฒนาโดยใช้ JSP เพียงไม่กี่รายการ

ข้อดีของการทำงานกับบริการ GData หลายรายการคือบริการเหล่านี้มีความสอดคล้องกันในอินเทอร์เฟซ และไลบรารีไคลเอ็นต์จำนวนมากมีคลาสตัวช่วยเฉพาะบริการสำหรับบริการของ Google ที่คุณชื่นชอบ เนื่องจากไลบรารีของไคลเอ็นต์มีคลาส Service, Entry และ Feed เดียวกันสำหรับบริการทั้ง 3 รายการที่ฉันใช้ ฉันจึงใช้โค้ดที่คล้ายกันมากในการดึงข้อมูลเหตุการณ์จากสเปรดชีตและเผยแพร่ไปยัง Base และปฏิทินได้ ซึ่งช่วยลดเวลาในการพัฒนาได้อย่างมากเมื่อเทียบกับเวลาที่ต้องใช้ในการทำงานกับ API ที่แตกต่างกัน 3 รายการ คุณอาจต้องการตรวจสอบเมธอด publishEventToCalendar() และ publishEventToBase() ใน EventPublisher เพื่อดูความคล้ายคลึงกันระหว่างเมธอดต่างๆ

การขอรับและติดตั้งใช้งาน Event Publisher

แอปพลิเคชันผู้เผยแพร่เหตุการณ์จะเผยแพร่เป็นส่วนหนึ่งของการดาวน์โหลด Java Client Library ของ Google Data หลังจากดาวน์โหลดไลบรารีของไคลเอ็นต์ Java แล้ว ให้ดูในไดเรกทอรี java/mashups/eventpub โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับความหมายของแต่ละไฟล์ในตัวอย่างที่ส่วนโครงสร้างโปรเจ็กต์ในภาคผนวก

แอปพลิเคชันมีไลบรารีที่ขึ้นต่อกันหลายรายการซึ่งต้องดาวน์โหลดก่อนสร้าง Event Publisher หลังจากกำหนดค่าตัวเลือกการสร้างและรันไทม์ที่เหมาะสมแล้ว (ดูไฟล์ README.TXT) คุณจะใช้ Ant เพื่อคอมไพล์คลาส Java และสร้างไฟล์ WAR ได้ จากนั้นคุณจะนำไฟล์ WAR นี้ไปใช้กับเครื่องมือ Servlet ที่คุณชื่นชอบได้ เช่น 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()
  • ภาพหน้าจอของช่องการแมป ภาพหน้าจอของช่องการแมป
    การแมปข้อมูลที่จำเป็นกับคอลัมน์ในสเปรดชีตและการแสดงตัวอย่างเหตุการณ์ที่จะเผยแพร่
  • ดึงและแมปส่วนหัวของคอลัมน์
    • จากนั้นแอปพลิเคชันจะใช้ฟีดเซลล์สเปรดชีตเพื่อดึงข้อมูลแถวแรกจากสเปรดชีต ซึ่งแถวแรกนี้แสดงถึงส่วนหัวของคอลัมน์ ระบบจะแสดงข้อมูลที่จำเป็นแต่ละรายการต่อผู้ใช้ และแจ้งให้ผู้ใช้เลือกส่วนหัวของคอลัมน์ที่ตรงกับข้อมูลมากที่สุด ในภาพหน้าจอทางด้านขวา ข้อมูลแต่ละประเภทที่จำเป็นจะมีช่องเลือกอยู่ข้างๆ ซึ่งคุณจะเลือกส่วนหัวของคอลัมน์ที่เกี่ยวข้องได้ ระบบจะจัดเก็บการแมปนี้ไว้ในเซสชันของผู้ใช้โดยใช้กลไกการจัดการเซสชันของคอนเทนเนอร์ Servlet
    • รหัส: ดู EventPublisherServlet.processListEvents()
  • ดึงข้อมูลรายการและจัดเก็บใน Beans
    • หลังจากแมปคอลัมน์แล้ว ผู้เผยแพร่เหตุการณ์จะดึงฟีดรายการสเปรดชีตที่มีรายการเดียวสำหรับแต่ละแถวในเวิร์กชีต แต่ละแถวแสดงถึงเหตุการณ์เดียว และระบบจะป้อนข้อมูลจากแถวลงในอินสแตนซ์ของ Event Bean จากนั้นระบบจะจัดเก็บการรวบรวม Bean ไว้ในเซสชันและแสดงผลบนหน้าจอเพื่อยืนยันโดยใช้หน้า outputEventList.jsp
  • เผยแพร่รายการไปยังปฏิทินและ/หรือ Base
    • ผู้ใช้เลือกเป้าหมายการเผยแพร่ที่เหมาะสม (ปฏิทิน ฐาน หรือทั้ง 2 อย่าง) แล้วคลิกปุ่ม "เผยแพร่" ระบบจะพุชเหตุการณ์จากการรวบรวมออบเจ็กต์เหตุการณ์ที่จัดเก็บไว้ในเซสชันของผู้ใช้ไปยังบริการที่เหมาะสมโดยใช้วิธีการ publishEventsToBase() และ publishEventsToCalendar ใน EventPublisher วิธีการเหล่านี้จะสร้างออบเจ็กต์รายการของประเภทที่เหมาะสมสำหรับบริการ CalendarEventEntry และ GoogleBaseEntry จากนั้น ระบบจะโพสต์รายการเหล่านี้ผ่านHTTP POSTที่ดำเนินการโดยคลาสบริการ CalendarService และ GoogleBaseService
    • เมื่อเผยแพร่เหตุการณ์แล้ว ระบบจะจัดเก็บ URL การแก้ไขที่บริการเป้าหมายแต่ละรายการส่งคืนในสเปรดชีตของ Google โดยใช้วิธี EventPublisher.updateSsEventEditUrl() สำหรับการทำซ้ำกระบวนการเผยแพร่ในอนาคต ระบบจะแก้ไขเหตุการณ์ที่มี URL การแก้ไขสำหรับแต่ละบริการที่เกี่ยวข้องในสเปรดชีตแทนที่จะสร้างขึ้น ซึ่งจะช่วยป้องกันไม่ให้ข้อมูลเหตุการณ์ซ้ำ

ขั้นตอนถัดไปและการปรับปรุงที่อาจเกิดขึ้น

ตามที่กล่าวไว้ก่อนหน้านี้ในบทความนี้ ปัจจุบันแอปพลิเคชันนี้เป็นเพียงต้นแบบเท่านั้น ไม่ได้มีวัตถุประสงค์เพื่อเป็นโค้ดที่พร้อมใช้งานจริง คุณจะต้องรวมการจัดการข้อผิดพลาดบางอย่างเพื่อให้เครื่องมือเผยแพร่เหตุการณ์พร้อมใช้งานจริง ปัจจุบันระบบจะส่งข้อผิดพลาดไปยัง stderr เท่านั้น แต่ควรแสดงข้อผิดพลาดที่เกิดขึ้นระหว่างการดึงข้อมูล การเผยแพร่ หรือการดำเนินการอื่นๆ ในเบราว์เซอร์ของผู้ใช้

นอกจากนี้ โปรดทราบว่า Google Base จะทำให้สินค้าหมดอายุหลังจากระยะเวลาหนึ่งหากไม่มีการอัปเดต เพื่อรักษาความสมบูรณ์ของชุดข้อมูล หากมีการเพิ่มกิจกรรมลงใน Google Base แล้ว ผู้เผยแพร่กิจกรรมจะพยายามอัปเดตกิจกรรมโดยใช้ URL การแก้ไขที่จัดเก็บไว้ในสเปรดชีตของ Google หากรายการกิจกรรมใน Base หมดอายุแล้ว URL การแก้ไขจะใช้ไม่ได้อีกต่อไป และระบบจะแสดงข้อผิดพลาด 404 ในเวลาที่เผยแพร่ วิธีแก้ปัญหาคือพยายามแทรกเหตุการณ์เมื่อได้รับคำตอบ 404

อีกฟีเจอร์หนึ่งที่อาจเพิ่มลงในแอปพลิเคชันผู้เผยแพร่กิจกรรมคือความสามารถในการจัดเก็บและเผยแพร่เวลาที่แน่นอนของกิจกรรมแทนที่จะเป็นเพียงวันที่ เนื่องจาก Google Base กำหนดให้ต้องแนบเวลาไว้กับกิจกรรม การจัดเก็บเวลาของแต่ละกิจกรรมจะป้องกันไม่ให้มีการเชื่อมโยงเวลาที่กำหนดเองกับกิจกรรมในรายการ Base นอกจากนี้ ปฏิทินยังแสดงกิจกรรมในเวลาที่เหมาะสมได้ด้วย

นอกจากนี้ คุณอาจต้องการมีกลไกการจัดเก็บข้อมูลแบบถาวรเพื่อจัดเก็บการกำหนดค่าสำหรับสเปรดชีตที่เฉพาะเจาะจง ซึ่งรวมถึงการแมปคอลัมน์ ซึ่งอาจอยู่ในรูปแบบของสเปรดชีต Google แยกต่างหาก ฐานข้อมูล หรือที่เก็บข้อมูลในเครื่อง

เราหวังว่าบทความนี้จะช่วยกระตุ้นจินตนาการของคุณให้คิดไอเดียใหม่ๆ สำหรับแอปพลิเคชันที่ใช้ Google Data APIs ได้ หากสนใจดูแหล่งที่มาของแอปพลิเคชันนี้ หรือสร้างและแก้ไขแอปพลิเคชันให้ตรงกับความต้องการของคุณ คุณจะดูได้ใน Java Client Library ของ Google Data APIs ในไดเรกทอรี mashups/eventpub นอกจากนี้ เรายังยินดีรับฟังความคิดเห็นของคุณเกี่ยวกับบทความนี้ในฟอรัมนักพัฒนาซอฟต์แวร์ Google Data APIs หากมีคำถามเกี่ยวกับบริการใดบริการหนึ่ง โปรดโพสต์คำถามในกลุ่มสนทนาเฉพาะของบริการ

ภาคผนวก

แหล่งข้อมูลเพิ่มเติม