يونيو 2007
- مقدمة
- التصميم والتنفيذ
- الحصول على "ناشر الأحداث" ونشره
- تشغيل التطبيق
- الخطوات التالية والتحسينات المحتملة
- الملحق
مقدمة
هل أردت يومًا الاحتفاظ بكمية كبيرة من المعلومات حول الاجتماعات أو الفعاليات أو المؤتمرات في جدول بيانات Google وتسهيل مشاركة هذه المعلومات والبحث عنها؟ في Google، نقدّم لك تقويم فعاليات المطوّرين الذي يتيح لك الاطّلاع على أحدث الفعاليات. تأتي البيانات التي يتم إدخالها في التقويم من مجموعة كبيرة من موظفي Google في جميع أنحاء الشركة، والعديد منهم لديهم إذن تعديل في جدول بيانات Google حيث يتم تخزين البيانات. في جدول البيانات، تتوفّر أحداث غير مؤكَّدة إلى جانب تفاعلات معروفة على نطاق واسع. في بعض الأحيان، يدخل المستخدمون حتى الأحداث المحتملة، حتى قبل إرسال اقتراح أو التحقيق في رعاية محتملة. يكون "المحرّر" مسؤولاً عن نشر الأحداث وتسجيل الأحداث المنشورة في عمود في جدول البيانات.
لماذا لا نحتفظ بهذه الأحداث مباشرةً في "تقويم Google"؟ يُعدّ "تقويم Google" مناسبًا لتحديد وقت ومكان حدث معيّن، ولكن عندما يتعلّق الأمر بالاحتفاظ بالكثير من المعلومات المنظَّمة، مثل قوائم المتحدثين والمواعيد النهائية لإرسال الطلبات وما إلى ذلك، يكون جدول البيانات أكثر ملاءمةً.

جدول بيانات Google المصدر الذي يتضمّن قائمة الفعاليات
اقترح أحد زملائي في Google أن نواصل الاحتفاظ بالأحداث في "جداول بيانات Google" ولكن نزيل العملية اليدوية لنشرها في التقويم العام الخارجي. أردت أيضًا مشروعًا مثيرًا للاهتمام يستند إلى واجهات برمجة تطبيقات متعددة من Google Data (يُطلق عليها اختصارًا اسم "GData") لعرضه في مؤتمر Mashup Camp، وهكذا تم إنشاء Event Publisher.
Event Publisher هو تطبيق تم تطويره بسرعة لإثبات صحة الفكرة، وهو يحتفظ بقائمة من الأحداث في "جداول بيانات Google" وينشرها في كل من "تقويم Google" وGoogle Base. يوفّر "تقويم Google" طريقة رائعة لمشاركة الأحداث وتزويد المستخدمين بطريقة سهلة لتضمين الأحداث في عرض التقويم الخاص بهم. مع أنّ "تقويم Google" يتيح إمكانية البحث عن الأحداث، يوفّر Google Base وسيلة أخرى للإعلان عن الأحداث، وهو يتفوّق في تخزين البيانات المنظَّمة بطريقة يسهل البحث فيها.
توفّر "جداول بيانات Google" و"تقويم Google" وBase واجهة برمجة تطبيقات تتيح عمليات القراءة والكتابة الكاملة. والأفضل من ذلك، أنّ كلّ خدمة من هذه الخدمات تتيح الوصول إلى بياناتها باستخدام بروتوكول Google Data API.
التصميم والتنفيذ
كانت مرحلة التصميم في هذا المشروع بسيطة جدًا: كنت أعرف أنّني أريد إنشاء تطبيق ويب لنشر بيانات جدول بيانات على تقويم. على الرغم من أنّ الهدف على المدى الطويل كان إنشاء تطبيق يمكن استخدامه في "تقويم فعاليات المطوّرين"، كان الهدف على المدى القصير هو إنشاء نموذج أولي فعال يمكن عرضه أثناء فعالية Mashup Camp. مع وضع هذه الأهداف في الاعتبار، اخترت مكتبة GData Java Client Library لأنّها إحدى مكتبات البرامج الأكثر تطورًا، وأنا على دراية بكتابة تطبيقات الويب بلغة Java. وقد أتاح لي استخدام إحدى مكتبات البرامج المتوفرة عدم القلق بشأن بروتوكول GData الأولي ونموذج بيانات XML، والتركيز بدلاً من ذلك على تنفيذ منطق التطبيق البسيط نسبيًا المطلوب لنشر الأحداث.
نزّلتُ مكتبة برامج Java وبدأتُ في تصميم نموذج الفئة الخاص بناشر الأحداث. لقد أنشأتُ برنامجًا خادمًا صغيرًا، أطلقتُ عليه اسم EventPublisherServlet، وهو يعمل كوحدة تحكّم في جميع الطلبات الواردة إلى تطبيق الويب. أنشأتُ أيضًا فئة باسم EventPublisher للتعامل مع منطق النشاط التجاري للتفاعل مع "تقويم Google" وBase و"جداول بيانات Google". أخيرًا، كتبتُ فئة Bean لتخزين بيانات الأحداث. تم تطوير واجهة مستخدم التطبيق باستخدام عدد قليل من صفحات JSP.
إنّ الميزة الرائعة للعمل مع خدمات GData المتعددة هي أنّها متسقة في جميع واجهاتها، وتتضمّن العديد من مكتبات البرامج المساعدة فئات مساعدة خاصة بالخدمة لخدمات Google المفضّلة لديك. بما أنّ مكتبة البرامج لديها فئات الخدمة والإدخال والخلاصة نفسها للخدمات الثلاث التي كنت أستخدمها، تمكّنت من استخدام رمز مشابه جدًا لاسترداد الأحداث من "جداول بيانات Google" ونشرها في Base و"تقويم Google". وقد قلّل ذلك من وقت التطوير بشكل كبير مقارنةً بالوقت الذي كان سيستغرقه العمل مع ثلاث واجهات برمجة تطبيقات مختلفة. يمكنك الاطّلاع على الطريقتَين publishEventToCalendar() وpublishEventToBase() في EventPublisher للتعرّف على أوجه التشابه بين الطُرق المختلفة.
الحصول على "ناشر الأحداث" ونشره
يتم توزيع تطبيق Event Publisher كجزء من عملية تنزيل مكتبة برامج Java لواجهة Google Data. بعد تنزيل مكتبة برامج Java، ابحث في الدليل java/mashups/eventpub. يُرجى الاطّلاع على قسم بنية المشروع في الملحق للحصول على مزيد من المعلومات حول معنى كل ملف في المثال.
يحتوي التطبيق على عدد من المكتبات التابعة التي يجب تنزيلها قبل إنشاء "ناشر الأحداث". بعد ضبط خيارات الإصدار ووقت التشغيل المناسبة (راجِع ملف 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 من قبل.
- يمنح المستخدم "ناشر الأحداث" الإذن بالوصول إلى بيانات "جداول بيانات Google".
- تتم إعادة توجيه المستخدم إلى "ناشر الأحداث" مع رمز AuthSub مميّز صالح للاستخدام لمرة واحدة في عنوان URL. يستبدل "ناشر الأحداث" الرمز المميز الذي يُستخدَم لمرة واحدة برمز مميز لجلسة AuthSub باستخدام خدمة AuthSubSessionToken.
- الرمز: يُرجى الاطّلاع على
EventPublisherServlet.processAcceptAuthSubToken()
- المستندات: يمكنك الاطّلاع على مستندات AuthSub.
- اختيار جدول بيانات/ورقة عمل
- يعيد "ناشر الأحداث" توجيه المستخدم إلى قائمة جداول البيانات التي يمكن للمستخدم المفوَّض الوصول إليها.
- بعد اختيار جدول بيانات يجب استرداد بيانات الحدث منه، يُطلب من المستخدم أيضًا اختيار ورقة العمل المناسبة في جدول البيانات المحدّد.
- الرمز: اطّلِع على
EventPublisher.getSsList()
وEventPublisher.getWsList()
- استرداد رؤوس الأعمدة وربطها
- يستخدم التطبيق بعد ذلك خلاصة خلايا "جداول بيانات Google" لاسترداد الصف الأول من البيانات من جدول البيانات، ويمثّل هذا الصف الأول عناوين الأعمدة. يتم إدراج كل جزء من البيانات المطلوبة للمستخدم ويُطلب منه تحديد عنوان العمود الذي يتطابق مع البيانات على أفضل وجه. في لقطة الشاشة على اليسار، يحتوي كل نوع بيانات مطلوب على مربّع اختيار بجانبه يمكنك من خلاله اختيار عنوان العمود المناسب. يتم تخزين عملية ربط الحساب هذه في جلسة المستخدم باستخدام آلية معالجة الجلسات في حاوية servlet.
- الرمز: يُرجى الاطّلاع على
EventPublisherServlet.processListEvents()
- استرداد الإدخالات وتخزينها في Beans
- بعد ربط الأعمدة، يستردّ "ناشر الأحداث" خلاصة قائمة "جداول بيانات Google" التي تحتوي على إدخال واحد لكل صف في ورقة العمل. يمثّل كل صف حدثًا واحدًا، ويتمّ ملء البيانات من الصف في مثيلات Event Bean. يتم بعد ذلك تخزين مجموعة "حبات القهوة" في الجلسة، كما يتم عرضها على الشاشة للتأكيد باستخدام صفحة outputEventList.jsp.
- نشر الإدخالات في "تقويم Google" و/أو قاعدة البيانات
- يختار المستخدم هدف النشر المناسب (التقويم أو القاعدة أو كلاهما) وينقر على الزر "نشر". يتم إرسال الأحداث من مجموعة عناصر الأحداث المخزّنة في جلسة المستخدم إلى الخدمات المناسبة باستخدام الطريقتَين
publishEventsToBase()
وpublishEventsToCalendar
في EventPublisher. تنشئ هذه الطرق عناصر إدخال من الأنواع المناسبة للخدمات:CalendarEventEntry
وGoogleBaseEntry
. يتم بعد ذلك نشر هذه الإدخالات من خلالHTTP POST
يتم تنفيذه بواسطة فئات الخدمةCalendarService
وGoogleBaseService
. - عند نشر الأحداث، يتم تخزين عناوين URL للتعديل التي تعرضها كل خدمة مستهدَفة في "جداول بيانات Google" باستخدام طريقة
EventPublisher.updateSsEventEditUrl()
. بالنسبة إلى عمليات النشر المستقبلية، يتم تعديل الأحداث التي تحتوي على عنوان URL للتعديل لكل خدمة ذات صلة في جدول البيانات بدلاً من إنشائها. يمنع ذلك تكرار بيانات الأحداث.
- يختار المستخدم هدف النشر المناسب (التقويم أو القاعدة أو كلاهما) وينقر على الزر "نشر". يتم إرسال الأحداث من مجموعة عناصر الأحداث المخزّنة في جلسة المستخدم إلى الخدمات المناسبة باستخدام الطريقتَين


ربط البيانات المطلوبة بأعمدة جدول البيانات ومعاينة الأحداث التي سيتم نشرها
الخطوات التالية والتحسينات المحتملة
كما ذكرنا سابقًا في هذه المقالة، هذا التطبيق هو حاليًا نموذج أوّلي فقط. وهي ليست رموزًا برمجية جاهزة للاستخدام في مرحلة الإنتاج. لكي يصبح Event Publisher جاهزًا للاستخدام، يجب تضمين بعض إجراءات معالجة الأخطاء. في الوقت الحالي، يتم إرسال الأخطاء إلى stderr فقط. بدلاً من ذلك، يجب عرض الأخطاء التي تحدث أثناء الاسترداد أو النشر أو الإجراءات الأخرى في متصفّح المستخدم.
بالإضافة إلى ذلك، تجدر الإشارة إلى أنّ Google Base، للحفاظ على سلامة مجموعة البيانات، ينهي صلاحية العناصر بعد فترة زمنية معيّنة إذا لم يتم تعديلها. إذا سبق أن تمت إضافة فعالية إلى Google Base، يحاول "ناشر الفعاليات" تعديل الفعالية باستخدام عنوان URL الخاص بالتعديل والمخزّن في "جداول بيانات Google". إذا انتهت صلاحية عنصر الحدث في Base، لن يكون عنوان URL للتعديل صالحًا وسيتم عرض الخطأ 404 عند النشر. يمكنك محاولة إدراج الحدث عند تلقّي الردّ 404.
من الميزات الأخرى التي يمكن إضافتها إلى تطبيق Event Publisher إمكانية تخزين ونشر الأوقات المحدّدة للأحداث بدلاً من التاريخ فقط. بما أنّ Google Base يتطلّب إرفاق أوقات بالأحداث، سيؤدي تخزين وقت كل حدث إلى منع ربط أوقات عشوائية بالأحداث في إدخالات Base. يمكن أن يعرض "تقويم Google" الأحداث في الأوقات المناسبة أيضًا.
قد تحتاج أيضًا إلى آلية تخزين بيانات ثابتة لتخزين إعدادات جداول بيانات معيّنة، بما في ذلك عمليات ربط الأعمدة. يمكن أن يتخذ ذلك شكل جدول بيانات Google منفصل أو قاعدة بيانات أو مساحة تخزين على القرص المحلي.
آمل أن تكون هذه المقالة قد حفّزت خيالك للتوصل إلى بعض الأفكار الجديدة الرائعة للتطبيقات التي تستخدم Google Data APIs. إذا كنت مهتمًا بالاطّلاع على مصدر هذا التطبيق أو إنشائه وتعديله لتلبية احتياجاتك، يمكنك العثور عليه في مكتبة برامج Java لواجهات Google Data APIs ضمن الدليل mashups/eventpub. نرحّب أيضًا بتلقّي ملاحظاتك حول هذه المقالة في منتدى مطوّري Google Data APIs. للأسئلة المتعلقة بخدمة معيّنة، يُرجى نشرها في مجموعات المناقشة الخاصة بالخدمة.