メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年7月25日土曜日

[Apache Shindig][お勉強][OpenSocial] メモ86 DataRequest.newFetchActivitiesRequestのサーバ側実装をしてみる(4)

DataRequest.newFetchActivitiesRequestのactivityId指定しない版できた。

まず、GadgetXMLのJavaScriptは、

  1. function getData() {  
  2.   /*===================================================================*/  
  3.   /* OWNER IdSpec                                                      */  
  4.   /*===================================================================*/  
  5.   var idspec = new opensocial.IdSpec();  
  6.   idspec.setField(opensocial.IdSpec.Field.USER_ID,  opensocial.IdSpec.PersonId.OWNER);  
  7.   idspec.setField(opensocial.IdSpec.Field.GROUP_ID, opensocial.IdSpec.GroupId.SELF);  
  8.   /*===================================================================*/  
  9.   /* DataRequestオブジェクトを作成し、                                 */  
  10.   /* そこにActivity取得リクエストを追加.                               */  
  11.   /* レスポンスを取得するときのキーは'get_activity'                    */  
  12.   /*===================================================================*/  
  13.   
  14.   var req = opensocial.newDataRequest();  
  15.   req.add(req.newFetchActivitiesRequest(idspec), 'get_activity');  
  16.   /*===================================================================*/  
  17.   /* 送信!                                                             */  
  18.   /*===================================================================*/  
  19.   req.send(function(response){  
  20.     var activity = response.get('get_activity')  
  21.     if (activity.hadError()) {  
  22.       document.getElementById('result').innerHTML  
  23.         = 'エラーだったよ:' + activity.getErrorMessage();  
  24.       return;  
  25.     }  
  26.     var out = document.createElement('ul');  
  27.     if (activity.getData().size() == 0) {  
  28.       var li = document.createElement('li');  
  29.       li.innerHTML = 'Activity0件';  
  30.       out.appendChild(li);  
  31.     }  
  32.     activity.getData().each(function(act) {  
  33.       var li = document.createElement('li');  
  34.       var title = act.getField(opensocial.Activity.Field.TITLE);  
  35.       var media = act.getField(opensocial.Activity.Field.MEDIA_ITEMS);  
  36.       if (media != undefined) {  
  37.         for (var ii=0, len = media.length; ii < len; ii++) {  
  38.           if (media[ii].getField(opensocial.MediaItem.Field.TYPE) == opensocial.MediaItem.Type.IMAGE) {  
  39.             title +=  
  40.                 '  
  41. g src="'  
  42.               + media[ii].getField(opensocial.MediaItem.Field.URL);  
  43.               + '/>';  
  44.           }  
  45.         }  
  46.       }  
  47.       li.innerHTML = title;  
  48.       out.appendChild(li);  
  49.     });  
  50.   
  51.     document.getElementById('result').appendChild(out);  
  52.   
  53.   });  
  54. }  

と、こんな感じ。
newFetchActivitiesRequestの第二引数はactivityIdを指定しないので、必要なし。

で、このリクエストに対応するサーバ側の処理は、
まずAcitivityServiceのjava、
  1. public Future<RestfulCollection<Activity>> getActivities(Set<UserId> userIds,  
  2.     GroupId groupId, String appId, Set<String> fields, CollectionOptions options, SecurityToken token)  
  3.     throws ProtocolException {  
  4.   return ImmediateFuture.newInstance(  
  5.     new RestfulCollection<Activity>(logic.getActivities(userIds,groupId,appId,fields,options,token)));  
  6.   
  7. }  

な感じ。
とりあえずパラメータはそのままlogicの方に渡す。
で、そのlogic。
  1. public List<Activity> getActivities(Set<UserId> userIds, GroupId groupId, String appId, Set<String> fields, CollectionOptions options, SecurityToken token)  
  2.     throws ProtocolException {  
  3.   GmsPerson viewer = getUser();  
  4.   List<Activity> activities = new ArrayList<Activity>();  
  5.   logger.info("アクティビティ取得(userId複数指定)開始:");  
  6.   if (viewer == null) {  
  7.     if (logger.isDebugEnabled()) {  
  8.       logger.debug("Guestは取得できない:");  
  9.     }  
  10.     throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,  
  11.       "Guestのため、取得できない:loginid:[" + viewer.getLoginId() + "]");  
  12.   }  
  13.   if (! isInstalledGadget(viewer, token.getModuleId())) {  
  14.     if (logger.isDebugEnabled()) {  
  15.       logger.debug("ガジェット未インストール:"  
  16.         + "viewerId:[" + viewer.getLoginId() + "]:"  
  17.         + "ガジェットID:[" + token.getModuleId() + "]"  
  18.       );  
  19.     }  
  20.     throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,  
  21.       "未インストールのため、取得できない:loginid:[" + viewer.getLoginId() + "]");  
  22.   }  
  23.   List<String> userLoginIds = getUserList(userIds, token);  
  24.   ExtendedGmsPerson[] gmsPersons = null;  
  25.   List<String> personIds = new ArrayList<String>();  
  26.   int first = 0;  
  27.   int max   = 20;  
  28.   for (;;) {  
  29.     gmsPersons = gmsPersonDao.peopleGet(  
  30.       userLoginIds,  
  31.       groupId.getType().toString(),  
  32.       groupId.getGroupId(),  
  33.       null,  
  34.       null,  
  35.       null,  
  36.       null,  
  37.       null,  
  38.       first,  
  39.       max,  
  40.       null);  
  41.     if (logger.isDebugEnabled()) {  
  42.       logger.debug("count:[" + gmsPersons.length + "]");  
  43.     }  
  44.     int length = gmsPersons.length;  
  45.     for (int ii=0; ii<length; ii++) {  
  46.       personIds.add(gmsPersons[ii].getId());  
  47.     }  
  48.     if (length < max) {  
  49.       break;  
  50.     }  
  51.     first += max;  
  52.   }  
  53.   ExtendedGmsActivity[] gmsActivities = gmsActivityDao.selectByGmsPersonIds(personIds, options.getFirst(), options.getMax());  
  54.   for (int ii=0,len = gmsActivities.length; ii<len; ii++) {  
  55.     activities.add(mapToActivity(gmsActivities[ii], gmsActivities[ii].getGmsPerson().getLoginId()));  
  56.   }  
  57.   logger.info("アクティビティ取得(userId複数指定)終了:");  
  58.   return activities;  
  59. }  

大したことはしていない。
まずパーミッションをチェックして、
userIdとgroupIdからUserIdのリストを取得と。
そしたら、そのUserIdとひもづくactivityを取得する。

そんだけ。

.

0 コメント: