इवेंट पब्लिश करना - Google Sheets, Calendar, और Base को एक साथ इस्तेमाल करना

रायन बॉयड, Google Data APIs टीम
जून 2007
  1. शुरुआती जानकारी
  2. डिज़ाइन और लागू करना
  3. इवेंट पब्लिशर को पाना और उसे डिप्लॉय करना
  4. ऐप्लिकेशन चलाना
  5. अगले चरण और संभावित सुधार
  6. Appendix

परिचय

क्या आपको कभी ऐसा लगा कि मीटिंग, इवेंट या कॉन्फ़्रेंस के बारे में कई तरह की जानकारी को Google Sheets में सेव किया जा सकता है, ताकि उसे आसानी से शेयर किया जा सके और खोजा जा सके? Google में, हम Developers Event Calendar की मदद से ऐसा ही करते हैं. कैलेंडर में दिखने वाला डेटा, पूरी कंपनी के अलग-अलग Google कर्मचारियों से मिलता है. इनमें से कई लोगों के पास, उस Google स्प्रैडशीट को बदलने का ऐक्सेस होता है जिसमें डेटा सेव किया जाता है. स्प्रेडशीट में, पुष्टि नहीं किए गए इवेंट के साथ-साथ, अच्छी तरह से पब्लिश किए गए जुड़ाव भी मौजूद हैं. कभी-कभी लोग, संभावित इवेंट की जानकारी भी डाल देते हैं. ऐसा तब भी होता है, जब कोई प्रस्ताव सबमिट नहीं किया गया होता या संभावित स्पॉन्सरशिप की जांच नहीं की गई होती. "एडिटर" की ज़िम्मेदारी इवेंट पब्लिश करने और पब्लिश किए गए इवेंट को स्प्रेडशीट के कॉलम में रिकॉर्ड करने की होती है.

हम इन इवेंट को सीधे तौर पर Google Calendar में क्यों नहीं मैनेज करते? Calendar का इस्तेमाल, किसी इवेंट की तारीख और जगह की जानकारी देखने के लिए किया जा सकता है. हालांकि, अगर आपको स्ट्रक्चर्ड फ़ॉर्मैट में ज़्यादा जानकारी सेव करनी है, तो स्प्रेडशीट का इस्तेमाल करना बेहतर होता है. जैसे, स्पीकर की सूची, सबमिट करने की समयसीमा वगैरह.

इवेंट वाली Google स्प्रेडशीट का स्क्रीन कैप्चर
इवेंट की सूची वाली सोर्स Google स्प्रेडशीट

मेरे एक साथी ने सुझाव दिया कि हम स्प्रेडशीट में इवेंट की जानकारी बनाए रखें. हालांकि, हमें उन्हें सार्वजनिक कैलेंडर में मैन्युअल तरीके से पब्लिश करने की प्रोसेस को हटा देना चाहिए. मुझे Mashup Camp में दिखाने के लिए, कई Google Data API (संक्षेप में "GData") पर आधारित एक दिलचस्प प्रोजेक्ट भी चाहिए था. इसलिए, Event Publisher बनाया गया.

Event Publisher, कॉन्सेप्ट के सबूत के तौर पर तेज़ी से तैयार किया गया एक ऐप्लिकेशन है. यह स्प्रेडशीट में इवेंट की सूची बनाए रखता है और उन्हें Calendar और Google Base, दोनों पर पब्लिश करता है. Google Calendar, इवेंट शेयर करने का एक बेहतरीन तरीका है. इससे लोगों को इवेंट को अपने कैलेंडर में शामिल करने का आसान तरीका मिलता है. Calendar में इवेंट खोजने की सुविधा उपलब्ध है. हालांकि, Google Base में इवेंट का प्रमोशन करने की एक और सुविधा मिलती है. साथ ही, यह स्ट्रक्चर्ड डेटा को इस तरह से सेव करता है कि उसे आसानी से खोजा जा सके.

Spreadsheets, Calendar, और Base, हर एक के लिए एक एपीआई उपलब्ध है. यह एपीआई, पढ़ने/लिखने की सभी कार्रवाइयों को सपोर्ट करता है. इससे भी अच्छी बात यह है कि इनमें से हर सेवा, Google Data API प्रोटोकॉल का इस्तेमाल करके अपने डेटा को ऐक्सेस करने की सुविधा देती है!

डिज़ाइन और लागू करना

इस प्रोजेक्ट का डिज़ाइन फ़ेज़ काफ़ी आसान था: मुझे पता था कि मुझे कैलेंडर पर स्प्रेडशीट का डेटा पब्लिश करने के लिए, एक वेब ऐप्लिकेशन बनाना है. लंबे समय तक हमारा लक्ष्य, एक ऐसा ऐप्लिकेशन बनाना था जिसका इस्तेमाल Developers Event Calendar के लिए किया जा सके. हालांकि, कम समय में हमारा लक्ष्य, एक ऐसा कॉन्सेप्ट मैशअप तैयार करना था जिसे Mashup Camp के दौरान दिखाया जा सके. इन लक्ष्यों को ध्यान में रखते हुए, मैंने GData Java Client Library को चुना. ऐसा इसलिए, क्योंकि यह सबसे ज़्यादा इस्तेमाल की जाने वाली क्लाइंट लाइब्रेरी में से एक है. साथ ही, मुझे Java वेब ऐप्लिकेशन लिखने का अनुभव है. उपलब्ध कराई गई क्लाइंट लाइब्रेरी में से किसी एक का इस्तेमाल करने से, मुझे रॉ GData प्रोटोकॉल और XML डेटा मॉडल के बारे में चिंता करने की ज़रूरत नहीं पड़ी. इसके बजाय, मैंने इवेंट पब्लिश करने के लिए ज़रूरी, अपेक्षाकृत आसान ऐप्लिकेशन लॉजिक को लागू करने पर ध्यान दिया.

मैंने Java क्लाइंट लाइब्रेरी डाउनलोड की और इवेंट पब्लिशर के लिए क्लास मॉडल डिज़ाइन करना शुरू कर दिया. मैंने एक सर्वलेट बनाया है, जिसका नाम EventPublisherServlet है. यह वेब ऐप्लिकेशन में आने वाले सभी अनुरोधों के लिए कंट्रोलर के तौर पर काम करता है. मैंने EventPublisher नाम की एक क्लास भी बनाई है. इसका इस्तेमाल Calendar, Base, और Spreadsheets के साथ इंटरैक्ट करने के लिए, कारोबार से जुड़े लॉजिक को मैनेज करने के लिए किया जाता है. आखिर में, मैंने इवेंट डेटा को सेव करने के लिए एक Bean क्लास लिखी. ऐप्लिकेशन के यूज़र इंटरफ़ेस को कुछ ही जेएसपी का इस्तेमाल करके डेवलप किया गया था.

कई GData सेवाओं के साथ काम करने का फ़ायदा यह है कि ये सभी अपने इंटरफ़ेस पर एक जैसी होती हैं. साथ ही, कई क्लाइंट लाइब्रेरी में आपकी पसंदीदा Google सेवाओं के लिए, सेवा से जुड़ी हेल्पर क्लास शामिल होती हैं. क्लाइंट लाइब्रेरी में, इस्तेमाल की जा रही तीनों सेवाओं के लिए एक ही तरह की सेवा, एंट्री, और फ़ीड क्लास थीं. इसलिए, मुझे स्प्रेडशीट से इवेंट वापस पाने और उन्हें Base और Calendar पर पब्लिश करने के लिए, एक जैसा कोड इस्तेमाल करने में आसानी हुई. इससे मुझे डेवलपमेंट में काफ़ी कम समय लगा. अगर मुझे तीन अलग-अलग एपीआई के साथ काम करना होता, तो मुझे ज़्यादा समय लगता. अलग-अलग तरीकों के बीच समानताएं देखने के लिए, EventPublisher में publishEventToCalendar() और publishEventToBase() तरीकों की जांच करें.

इवेंट पब्लिशर को पाना और उसे डिप्लॉय करना

Event Publisher ऐप्लिकेशन, Google Data Java Client Library के डाउनलोड के तौर पर डिस्ट्रिब्यूट किया जाता है. Java Client Library डाउनलोड करने के बाद, java/mashups/eventpub डायरेक्ट्री में देखें. उदाहरण में मौजूद हर फ़ाइल के बारे में ज़्यादा जानकारी के लिए, कृपया अपेंडिक्स में प्रोजेक्ट का स्ट्रक्चर सेक्शन देखें.

ऐप्लिकेशन में कई ऐसी लाइब्रेरी हैं जो एक-दूसरे पर निर्भर हैं. इवेंट पब्लिशर बनाने से पहले, इन्हें डाउनलोड करना होगा. सही बिल्ड और रनटाइम के विकल्प कॉन्फ़िगर करने के बाद (README.TXT फ़ाइल देखें), Ant का इस्तेमाल करके Java क्लास कंपाइल की जा सकती हैं और WAR फ़ाइल जनरेट की जा सकती है. इसके बाद, इस WAR फ़ाइल को अपने पसंदीदा सर्वलेट इंजन, जैसे कि Tomcat 5.5 पर डिप्लॉय किया जा सकता है. मैंने इस ऐप्लिकेशन की टेस्टिंग के लिए इसका इस्तेमाल किया था. डिफ़ॉल्ट कॉन्फ़िगरेशन के तहत चल रहे Tomcat के लिए, सिर्फ़ जनरेट की गई deploy/EventPublisher.war फ़ाइल को webapps डायरेक्ट्री में कॉपी करना ज़रूरी है. इसके बाद, यह अपने-आप डिप्लॉय हो जाएगा और इसे http://hostname:8080/EventPublisher के ज़रिए ऐक्सेस किया जा सकेगा.

ऐप्लिकेशन चलाने की प्रोसेस

AuthSub की पुष्टि करने की प्रोसेस का स्क्रीन कैप्चर
AuthSub के ज़रिए Google Sheets खाते की पुष्टि की जा रही है.
  • ऐप्लिकेशन को ऐप्लिकेशन चलाने वाले होस्ट पर /EventPublisher पर जाकर लोड किया जाता है. मेरे मामले में, ऐप्लिकेशन को http://localhost:8080/EventPublisher पर चलाया जा रहा है
  • Google Sheets के लिए पुष्टि करने की सुविधा
    • उपयोगकर्ता, स्टैटिक फ़ंक्शन AuthSubUtil.getRequestUrl() से जनरेट किए गए "authenticate" लिंक पर क्लिक करता है.
    • उपयोगकर्ता को Google खाते की सेवाओं पर रीडायरेक्ट किया जाता है. अगर उपयोगकर्ता ने पहले से ही Google में लॉग इन नहीं किया है, तो उसे अपने क्रेडेंशियल डालने के लिए कहा जाता है.
    • उपयोगकर्ता, इवेंट पब्लिशर को अपनी स्प्रेडशीट का डेटा ऐक्सेस करने की अनुमति देता है.
    • उपयोगकर्ता को यूआरएल में एक बार इस्तेमाल किया जा सकने वाला AuthSub टोकन के साथ, इवेंट पब्लिशर पर वापस रीडायरेक्ट किया जाता है. इवेंट पब्लिशर, AuthSubSessionToken सेवा का इस्तेमाल करके, एक बार इस्तेमाल किए जाने वाले टोकन को AuthSub सेशन टोकन के लिए बदलता है.
    • कोड: EventPublisherServlet.processAcceptAuthSubToken() देखें
    • दस्तावेज़: AuthSub से जुड़े दस्तावेज़ देखें
  • स्प्रेडशीट/वर्कशीट चुनें
    • इवेंट पब्लिशर, उपयोगकर्ता को उन स्प्रेडशीट की सूची पर रीडायरेक्ट करता है जिन्हें अनुमति पा चुके उपयोगकर्ता ऐक्सेस कर सकते हैं.
    • जिस स्प्रैडशीट से इवेंट डेटा पाना है उसे चुनने के बाद, उपयोगकर्ता को चुनी गई स्प्रैडशीट में सही वर्कशीट चुनने के लिए भी कहा जाता है.
    • कोड: EventPublisher.getSsList() और EventPublisher.getWsList() देखें
  • मैपिंग फ़ील्ड का स्क्रीन कैप्चर मैपिंग फ़ील्ड का स्क्रीन कैप्चर
    स्प्रेडशीट के कॉलम में ज़रूरी डेटा मैप करना और पब्लिश किए जाने वाले इवेंट की झलक देखना.
  • कॉलम हेडर वापस पाना और उन्हें मैप करना
    • इसके बाद, ऐप्लिकेशन, स्प्रेडशीट के सेल फ़ीड का इस्तेमाल करके, स्प्रेडशीट से डेटा की पहली लाइन को वापस पाता है. यह पहली लाइन, कॉलम के हेडर को दिखाती है. उपयोगकर्ता को ज़रूरी डेटा की हर जानकारी दिखाई जाती है. साथ ही, उन्हें उस कॉलम हेडर को चुनने के लिए कहा जाता है जो डेटा से सबसे ज़्यादा मेल खाता हो. दाईं ओर दिए गए स्क्रीन कैप्चर में, हर ज़रूरी डेटा टाइप के बगल में एक चुनने का बॉक्स दिया गया है. इसमें आपको कॉलम हेडर चुनना होगा. यह मैपिंग, उपयोगकर्ता के सेशन में सेव की जाती है. इसके लिए, सर्वलेट कंटेनर के सेशन हैंडलिंग सिस्टम का इस्तेमाल किया जाता है.
    • कोड: EventPublisherServlet.processListEvents() देखें
  • एंट्री वापस पाना और उन्हें Beans में सेव करना
    • कॉलम मैप होने के बाद, इवेंट पब्लिशर, स्प्रेडशीट की सूची वाला फ़ीड वापस पाता है. इसमें वर्कशीट की हर लाइन के लिए एक एंट्री होती है. हर लाइन किसी एक इवेंट को दिखाती है. साथ ही, लाइन में मौजूद डेटा को इवेंट बीन के इंस्टेंस में भरा जाता है. इसके बाद, बीन्स के कलेक्शन को सेशन में सेव कर दिया जाता है. साथ ही, इसकी पुष्टि करने के लिए इसे स्क्रीन पर भी दिखाया जाता है. इसके लिए, outputEventList.jsp पेज का इस्तेमाल किया जाता है.
  • Calendar और/या Base में एंट्री पब्लिश करना
    • उपयोगकर्ता, पब्लिश करने का सही टारगेट (कैलेंडर, बेस या दोनों) चुनता है. इसके बाद, 'पब्लिश करें' बटन पर क्लिक करता है. इवेंट को उपयोगकर्ता के सेशन में सेव किए गए इवेंट ऑब्जेक्ट के कलेक्शन से, सही सेवाओं में पुश किया जाता है. इसके लिए, EventPublisher में publishEventsToBase() और publishEventsToCalendar तरीकों का इस्तेमाल किया जाता है. इन तरीकों से, सेवाओं के लिए सही टाइप के entry objects बनाए जाते हैं: CalendarEventEntry और GoogleBaseEntry. इसके बाद, इन एंट्री को HTTP POST के ज़रिए पोस्ट किया जाता है. यह काम service क्लास CalendarService और GoogleBaseService करती हैं
    • इवेंट पब्लिश होने पर, हर टारगेट सेवा से मिले बदलाव करने के यूआरएल, Google Sheets में EventPublisher.updateSsEventEditUrl() तरीके का इस्तेमाल करके सेव किए जाते हैं. पब्लिश करने की प्रोसेस के आने वाले वर्शन के लिए, स्प्रेडशीट में मौजूद हर सेवा के लिए, बदलाव करने वाले यूआरएल वाले इवेंट बनाए नहीं जाते, बल्कि उनमें बदलाव किया जाता है. इससे इवेंट डेटा के डुप्लीकेट होने से रोका जा सकता है.

अगले चरण और संभावित सुधार

इस लेख में पहले बताया गया है कि फ़िलहाल, यह ऐप्लिकेशन सिर्फ़ एक प्रोटोटाइप है. इसे प्रोडक्शन के लिए तैयार कोड के तौर पर इस्तेमाल नहीं किया जा सकता. इवेंट पब्लिशर को प्रोडक्शन के लिए तैयार करने के लिए, गड़बड़ी ठीक करने की सुविधा को शामिल करना होगा. फ़िलहाल, गड़बड़ियों की जानकारी सिर्फ़ stderr को भेजी जाती है. इसके बजाय, डेटा वापस पाने, पब्लिश करने या अन्य कार्रवाइयों के दौरान होने वाली गड़बड़ियां, उपयोगकर्ता के ब्राउज़र में दिखनी चाहिए.

इसके अलावा, यह भी ध्यान रखना चाहिए कि Google Base, अपने डेटा सेट की अखंडता बनाए रखने के लिए, कुछ समय बाद उन आइटम की समयसीमा खत्म कर देता है जिन्हें अपडेट नहीं किया गया है. अगर कोई इवेंट पहले ही Google Base में जोड़ा जा चुका है, तो इवेंट पब्लिशर, Google स्प्रेडशीट में सेव किए गए 'बदलाव करने के लिए यूआरएल' का इस्तेमाल करके इवेंट को अपडेट करने की कोशिश करता है. अगर Base में मौजूद इवेंट आइटम की समयसीमा खत्म हो गई है, तो बदलाव करने का यूआरएल अब मान्य नहीं होगा. साथ ही, पब्लिश करते समय 404 गड़बड़ी दिखेगी. इस समस्या को हल करने के लिए, 404 गड़बड़ी का मैसेज मिलने पर इवेंट को फिर से डालने की कोशिश करें.

इवेंट पब्लिशर ऐप्लिकेशन में एक और सुविधा जोड़ी जा सकती है. यह सुविधा, इवेंट की सिर्फ़ तारीख के बजाय, उसके शुरू और खत्म होने का सटीक समय सेव और पब्लिश करने की है. Google Base को इवेंट के साथ समय की जानकारी अटैच करने की ज़रूरत होती है. इसलिए, हर इवेंट का समय सेव करने से, Base की एंट्री में इवेंट के साथ कोई भी समय नहीं जोड़ा जा सकेगा. Calendar, इवेंट को सही समय पर भी दिखा सकता है.

आपको किसी खास स्प्रेडशीट के कॉन्फ़िगरेशन सेव करने के लिए, डेटा सेव करने के ऐसे तरीके की ज़रूरत पड़ सकती है जो लंबे समय तक काम करे. इसमें कॉलम मैपिंग भी शामिल है. यह अलग Google स्प्रैडशीट, डेटाबेस या लोकल डिस्क स्टोरेज के तौर पर हो सकता है.

हमें उम्मीद है कि इस लेख को पढ़ने के बाद, आपको Google Data API का इस्तेमाल करने वाले ऐप्लिकेशन के लिए कुछ नए और बेहतरीन आइडिया मिले होंगे! अगर आपको इस ऐप्लिकेशन का सोर्स कोड देखना है या इसे अपनी ज़रूरतों के हिसाब से बनाना और बदलना है, तो आपको यह Google Data APIs की Java Client Library में mashups/eventpub डायरेक्ट्री में मिलेगा. इसके अलावा, हम Google Data APIs डेवलपर फ़ोरम में इस लेख के बारे में आपके सुझाव, शिकायत या राय का स्वागत करते हैं. किसी सेवा से जुड़े सवालों के लिए, कृपया उन्हें सेवा से जुड़े चर्चा ग्रुप में पोस्ट करें.

अन्य जानकारी

अतिरिक्त संसाधन