มิถุนายน 2007
- บทนำ
- การออกแบบและการติดตั้งใช้งาน
- การขอรับและติดตั้งใช้งาน Event Publisher
- การเรียกใช้แอปพลิเคชัน
- ขั้นตอนถัดไปและการปรับปรุงที่อาจเกิดขึ้น
- ภาคผนวก
บทนำ
คุณเคยต้องการเก็บข้อมูลจำนวนมากเกี่ยวกับการประชุม กิจกรรม หรือการประชุมในสเปรดชีตของ Google และต้องการให้แชร์และค้นหาข้อมูลนั้นได้ง่ายๆ ไหม ที่ Google เรามีปฏิทินกิจกรรมสำหรับนักพัฒนาแอป ข้อมูลที่ป้อนลงในปฏิทินมาจาก Googler จำนวนมากทั่วทั้งบริษัท ซึ่งหลายคนมีสิทธิ์แก้ไขสเปรดชีต 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
การเรียกใช้แอปพลิเคชัน - กระบวนการ

การตรวจสอบสิทธิ์บัญชี 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 การแก้ไขสำหรับแต่ละบริการที่เกี่ยวข้องในสเปรดชีตแทนที่จะสร้างขึ้น ซึ่งจะช่วยป้องกันไม่ให้ข้อมูลเหตุการณ์ซ้ำ
- ผู้ใช้เลือกเป้าหมายการเผยแพร่ที่เหมาะสม (ปฏิทิน ฐาน หรือทั้ง 2 อย่าง) แล้วคลิกปุ่ม "เผยแพร่" ระบบจะพุชเหตุการณ์จากการรวบรวมออบเจ็กต์เหตุการณ์ที่จัดเก็บไว้ในเซสชันของผู้ใช้ไปยังบริการที่เหมาะสมโดยใช้วิธีการ


การแมปข้อมูลที่จำเป็นกับคอลัมน์ในสเปรดชีตและการแสดงตัวอย่างเหตุการณ์ที่จะเผยแพร่
ขั้นตอนถัดไปและการปรับปรุงที่อาจเกิดขึ้น
ตามที่กล่าวไว้ก่อนหน้านี้ในบทความนี้ ปัจจุบันแอปพลิเคชันนี้เป็นเพียงต้นแบบเท่านั้น ไม่ได้มีวัตถุประสงค์เพื่อเป็นโค้ดที่พร้อมใช้งานจริง คุณจะต้องรวมการจัดการข้อผิดพลาดบางอย่างเพื่อให้เครื่องมือเผยแพร่เหตุการณ์พร้อมใช้งานจริง ปัจจุบันระบบจะส่งข้อผิดพลาดไปยัง 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 หากมีคำถามเกี่ยวกับบริการใดบริการหนึ่ง โปรดโพสต์คำถามในกลุ่มสนทนาเฉพาะของบริการ