ژوئن 2007
- مقدمه
- طراحی و اجرا
- به دست آوردن و استقرار ناشر رویداد
- اجرای برنامه
- مراحل بعدی و بهبودهای بالقوه
- ضمیمه
مقدمه
آیا تا به حال خواسته اید مجموعه ای از اطلاعات مربوط به جلسات، رویدادها یا کنفرانس ها را در یک صفحه گسترده گوگل نگهداری کنید و آیا این اطلاعات به راحتی به اشتراک گذاشته و جستجو شوند؟ خوب، در Google، ما این کار را با تقویم رویداد توسعه دهندگان خود انجام می دهیم. دادههایی که به تقویم وارد میشوند از طیف گستردهای از کارمندان Google در کل شرکت میآیند -- که بسیاری از آنها به صفحهگسترده Google که در آن دادهها ذخیره میشود، دسترسی ویرایش دارند. در صفحهگسترده، رویدادهای تأییدنشده همراه با مشارکتهایی که به خوبی تبلیغ شدهاند، وجود دارند. مردم حتی گاهی اوقات وارد رویدادهای آینده نگر می شوند - حتی قبل از ارائه یک پیشنهاد یا بررسی یک حمایت مالی بالقوه. یک «ویرایشگر» مسئول انتشار رویدادها و ثبت رویدادهای منتشر شده در ستونی در صفحه گسترده است.
چرا این رویدادها را مستقیماً در تقویم Google نگهداری نمی کنیم؟ تقویم برای شناسایی زمان و مکان یک رویداد خوب است، اما زمانی که صحبت از حفظ بسیاری از اطلاعات ساختاریافته - مانند لیست سخنرانان، مهلتهای ارسال، و غیره میشود، یک صفحه گسترده مناسبتر است.

منبع صفحه گسترده Google با لیست رویدادها
یکی از همکاران Google من پیشنهاد کرد که به نگهداری رویدادها در صفحات گسترده ادامه دهیم، اما روند دستی انتشار آنها را در تقویم عمومی خارجی خود حذف کنیم. من همچنین میخواستم یک پروژه جالب بر اساس چندین API داده Google (به اختصار "GData") برای نمایش در Mashup Camp داشته باشم و بدین ترتیب Event Publisher متولد شد.
Event Publisher یک برنامه کاربردی اثبات مفهوم به سرعت توسعه یافته است که فهرستی از رویدادها را در صفحات گسترده نگهداری می کند و آنها را در تقویم و Google Base منتشر می کند. Google Calendar یک راه عالی برای اشتراکگذاری رویدادها ارائه میکند و به افراد راهی آسان برای گنجاندن رویدادها در نمای تقویم خود میدهد. در حالی که تقویم امکان جستجوی رویدادها را فراهم می کند، Google Base مکان دیگری را برای عمومی کردن رویدادها فراهم می کند و در ذخیره سازی داده های ساختاریافته به روشی که جستجوی آسان باشد، برتری می یابد.
صفحات گسترده، تقویم و پایه هر کدام یک API ارائه می کنند که از عملیات خواندن/نوشتن کامل پشتیبانی می کند. حتی بهتر از آن، هر یک از این سرویس ها با استفاده از پروتکل Google Data API دسترسی به داده های خود را در معرض دید قرار می دهند!
طراحی و اجرا
مرحله طراحی این پروژه بسیار ساده بود: میدانستم که میخواهم یک برنامه وب برای انتشار دادههای صفحهگسترده در یک تقویم بسازم. در حالی که هدف بلندمدت ساخت برنامهای بود که بتوان از آن برای تقویم رویداد توسعهدهندگان استفاده کرد، هدف کوتاهمدت تولید یک ترکیب اثبات مفهومی کارآمد بود که بتوان در طول Mashup Camp نشان داد. با در نظر گرفتن این اهداف، کتابخانه GData Java Client را انتخاب کردم زیرا یکی از بالغترین کتابخانههای مشتری است و با نوشتن برنامههای وب جاوا آشنا هستم. استفاده از یکی از کتابخانه های سرویس گیرنده ارائه شده مرا از نگرانی در مورد پروتکل خام GData و مدل داده XML رها کرد و به جای آن بر اجرای منطق برنامه نسبتاً ساده مورد نیاز برای انتشار رویدادها تمرکز کردم.
کتابخانه Java Client را دانلود کردم و شروع به طراحی مدل کلاس برای ناشر رویداد کردم. من یک سرورلت با نام مناسب EventPublisherServlet ایجاد کردم که به عنوان کنترل کننده تمام درخواست هایی که به برنامه وب وارد می شوند عمل می کند. من همچنین یک کلاس به نام EventPublisher ایجاد کردم تا منطق تجاری برای تعامل با تقویم، پایه و صفحات گسترده را مدیریت کند. در نهایت، یک کلاس Bean برای ذخیره داده های رویداد نوشتم. رابط کاربری برنامه با استفاده از تعداد انگشت شماری JSP توسعه داده شده است.
زیبایی کار با چندین سرویس GData این است که آنها در رابط های خود یکسان هستند و بسیاری از کتابخانه های سرویس گیرنده شامل کلاس های کمکی خاص برای سرویس های Google مورد علاقه شما هستند. از آنجایی که Client Library برای سه سرویسی که من استفاده میکردم کلاسهای Service، Entry و Feed یکسان داشت، میتوانم از کدهای بسیار مشابه برای بازیابی رویدادها از Spreadsheeds و انتشار آنها در پایگاه و تقویم استفاده کنم. این امر زمان توسعه من را به میزان قابل توجهی در مقایسه با آنچه که برای کار با سه API مجزا لازم بود، کوتاه کرد. ممکن است بخواهید متدهای publishEventToCalendar() و publishEventToBase() را در EventPublisher بررسی کنید تا شباهتهای بین متدهای مختلف را ببینید.
به دست آوردن و استقرار ناشر رویداد
برنامه Event Publisher به عنوان بخشی از دانلود Google Data Java Client Library توزیع شده است. پس از دانلود Java Client Library، به دایرکتوری java/mashups/eventpub نگاه کنید. لطفاً بخش ساختار پروژه را در پیوست برای اطلاعات بیشتر در مورد معنای هر فایل در مثال مشاهده کنید.
این برنامه دارای تعدادی کتابخانه وابسته است که باید قبل از ساخت Event Publisher دانلود شوند. پس از پیکربندی گزینه های ساخت و زمان اجرا مناسب (به فایل README.TXT مراجعه کنید)، می توان از Ant برای کامپایل کلاس های جاوا و تولید یک فایل WAR استفاده کرد. این فایل WAR سپس می تواند در موتور سرور مورد علاقه شما، مانند Tomcat 5.5 که من در آزمایش این برنامه استفاده کردم، مستقر شود. Tomcat که تحت یک پیکربندی پیشفرض اجرا میشود، فقط نیاز دارد که فایل deploy/EventPublisher.war ایجاد شده در فهرست برنامههای وب آن کپی شود. سپس به صورت خودکار مستقر شده و از طریق http://hostname:8080/EventPublisher قابل دسترسی خواهد بود.
اجرای برنامه - فرآیند

احراز هویت به حساب Google Spreadsheets از طریق AuthSub.
- برنامه با مراجعه به /EventPublisher در میزبانی که برنامه را اجرا می کند بارگذاری می شود. در مورد من، من برنامه را در http://localhost:8080/EventPublisher اجرا می کنم
- احراز هویت برای صفحات گسترده Google
- کاربر بر روی پیوند "Authenticate" که توسط تابع ثابت ایجاد می شود کلیک می کند: AuthSubUtil.getRequestUrl() .
- کاربر به سرویسهای حساب Google هدایت میشود، جایی که، اگر کاربر قبلاً وارد Google نشده باشد، از او خواسته میشود اعتبار خود را دریافت کند.
- کاربر به ناشر رویداد اجازه دسترسی به داده های صفحات گسترده خود را می دهد.
- کاربر با یک نشانه AuthSub یکبار مصرف در URL به ناشر رویداد هدایت می شود. Event Publisher با استفاده از سرویس AuthSubSessionToken، توکن یکبار مصرف را با یک نشانه جلسه AuthSub مبادله می کند.
- کد: به
EventPublisherServlet .processAcceptAuthSubToken()
مراجعه کنید - مستندات: به مستندات AuthSub مراجعه کنید
- صفحه گسترده/کاربرگ را انتخاب کنید
- کاربر توسط ناشر رویداد به لیستی از صفحات گسترده که توسط کاربر مجاز قابل دسترسی است هدایت می شود.
- پس از انتخاب صفحهگستردهای که دادههای رویداد باید از آن بازیابی شوند، از کاربر خواسته میشود تا کاربرگ مناسب را در صفحهگسترده انتخابی انتخاب کند.
- کد: به
EventPublisher .getSsList()
وEventPublisher .getWsList()
مراجعه کنید.
- سرصفحه های ستون را بازیابی و نقشه برداری کنید
- سپس برنامه از تغذیه سلولهای صفحهگسترده برای بازیابی اولین ردیف دادهها از صفحهگسترده استفاده میکند - این ردیف اول نشاندهنده سرصفحههای ستون است. هر بخش از دادههای مورد نیاز برای کاربر فهرست شده است و از آنها خواسته میشود سرفصل ستونی را انتخاب کنند که به بهترین وجه با دادهها مطابقت دارد. در تصویربرداری از صفحه در سمت راست، هر نوع داده مورد نیاز یک کادر انتخاب در کنار خود دارد که در آن هدر ستون مربوطه را انتخاب میکنید. این نگاشت در جلسه کاربر با استفاده از مکانیزم رسیدگی به جلسه کانتینر servlet ذخیره می شود.
- کد: به
EventPublisherServlet .processListEvents()
مراجعه کنید
- مطالب را بازیابی کنید و در Beans ذخیره کنید
- پس از نگاشت ستونها، Event Publisher فید فهرست صفحات گسترده حاوی یک ورودی برای هر ردیف در کاربرگ را بازیابی میکند. هر سطر نشان دهنده یک رویداد واحد است و داده های آن ردیف در نمونه هایی از Event Bean پر می شود. سپس مجموعه Beans در جلسه ذخیره می شود و همچنین برای تأیید به صفحه نمایش خروجی می شود - با استفاده از صفحه outputEventList.jsp .
- ورودی های تقویم و/یا پایگاه را منتشر کنید
- کاربر هدف انتشار مناسب (تقویم، پایه یا هر دو) را انتخاب می کند و روی دکمه «انتشار» کلیک می کند. رویدادها با استفاده از متدهای
publishEventsToBase()
وpublishEventsToCalendar
در EventPublisher از مجموعه اشیاء رویداد ذخیره شده در جلسه کاربر به سرویسهای مناسب منتقل میشوند. این روشها اشیاء ورودی از انواع مناسب برای سرویسها ایجاد میکنند:CalendarEventEntry
وGoogleBaseEntry
. این ورودیها سپس از طریق یکHTTP POST
که توسط کلاسهای سرویسCalendarService
وGoogleBaseService
انجام میشود، پست میشوند. - همانطور که رویدادها منتشر می شوند، URL های ویرایشی که توسط هر سرویس هدف بازگردانده می شود، با استفاده از روش
EventPublisher .updateSsEventEditUrl()
در صفحه گسترده Google ذخیره می شود. برای تکرارهای بعدی فرآیند انتشار، رویدادهایی که حاوی URL ویرایش برای هر سرویس مربوطه در صفحه گسترده هستند، به جای ایجاد، ویرایش می شوند. این از داده های رویداد تکراری جلوگیری می کند.
- کاربر هدف انتشار مناسب (تقویم، پایه یا هر دو) را انتخاب می کند و روی دکمه «انتشار» کلیک می کند. رویدادها با استفاده از متدهای


نگاشت داده های مورد نیاز به ستون های صفحه گسترده و پیش نمایش رویدادهایی که باید منتشر شوند.
مراحل بعدی و بهبودهای بالقوه
همانطور که قبلا در این مقاله ذکر شد، این برنامه در حال حاضر تنها یک نمونه اولیه است. در نظر گرفته نشده است که کد آماده تولید باشد. به منظور آماده ساختن ناشر رویداد، باید برخی از رسیدگی به خطاها را در نظر گرفت. در حال حاضر، خطاها فقط به stderr ارسال می شوند. در عوض، خطاهایی که در حین بازیابی، انتشار یا سایر اقدامات رخ می دهد باید در مرورگر کاربر نمایش داده شود.
علاوه بر این، لازم به ذکر است که Google Base برای حفظ یکپارچگی مجموعه داده های خود، در صورت به روز نشدن موارد، پس از مدتی منقضی می شود. اگر رویدادی قبلاً به Google Base اضافه شده باشد، ناشر رویداد تلاش میکند با استفاده از URL ویرایش ذخیره شده در صفحه گسترده Google، رویداد را بهروزرسانی کند. اگر مورد رویداد در Base منقضی شده باشد، URL ویرایش دیگر معتبر نیست و خطای 404 در زمان انتشار برگردانده خواهد شد. یک راه حل، تلاش برای درج رویداد پس از دریافت پاسخ 404 است.
ویژگی دیگری که میتوان به برنامه Event Publisher اضافه کرد، امکان ذخیره و انتشار زمانهای دقیق رویدادها به جای تاریخ است. از آنجایی که Google Base به زمانهایی برای پیوست شدن به رویدادها نیاز دارد، ذخیره زمان هر رویداد از مرتبط شدن زمانهای دلخواه با رویدادهای ورودیهای پایه جلوگیری میکند. تقویم همچنین می تواند رویدادها را در زمان های مناسب ارائه دهد.
همچنین ممکن است بخواهید یک مکانیسم ذخیره سازی داده های مداوم برای ذخیره تنظیمات برای صفحات گسترده خاص - از جمله نگاشت ستون ها داشته باشید. این می تواند به شکل یک صفحه گسترده Google جداگانه، یک پایگاه داده یا ذخیره سازی دیسک محلی باشد.
امیدوارم این مقاله تخیل شما را برای ارائه ایدههای جدید عالی برای برنامههای کاربردی با استفاده از Google Data API تحریک کند! اگر مایلید منبع این برنامه را ببینید یا آن را بسازید و آن را برای رفع نیازهای خود تغییر دهید، میتوانید آن را در کتابخانه Google Data APIs Java Client در فهرست mashups/eventpub پیدا کنید. همچنین، از بازخورد شما در مورد این مقاله در انجمن توسعهدهندگان Google Data API استقبال میکنیم. برای سؤالات مربوط به یک سرویس خاص، لطفاً آنها را در گروه های بحث ویژه سرویس پست کنید.