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

2009年7月22日水曜日

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

DataRequest.newUpdatePersonAppDataRequestのサーバ側実装ができた。

へぼいけどざっとこんな感じ。

  1. public void updatePersonData(UserId userId, GroupId groupId, String appId, Set<String> fields, Map<String, String> values, SecurityToken token)  
  2.      throws ProtocolException {  
  3.   logger.info("updatePersonData処理開始:"  
  4.     + "userId:[" + userId + "]:"  
  5.     + "groupId:[" + groupId + "]:"  
  6.     + "appId:[" + appId + "]:"  
  7.   );  
  8.   
  9.   assert appId != null;  
  10.   
  11.   GmsPerson viewer = getUser();  
  12.   if (viewer == null) {  
  13.     logger.info("updatePersonData処理終了:Guestは保存できない:"  
  14.       + "userId:[" + userId + "]:"  
  15.       + "groupId:[" + groupId + "]:"  
  16.       + "appId:[" + appId + "]:"  
  17.     );  
  18.     throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,  
  19.       "Guestは保存できない: 未ログイン");  
  20.   }  
  21.   
  22.   String appHashId = toStringDigest(getStringDigest(appId));  
  23.   if (logger.isDebugEnabled()) {  
  24.     logger.debug("appHashId:[" + appHashId + "]");  
  25.   }  
  26.   String loginId = userId.getUserId(token);  
  27.   if ("Guest".equalsIgnoreCase(loginId)) {  
  28.     logger.info("updatePersonData処理終了:Guestは保存できない:"  
  29.       + "userId:[" + userId + "]:"  
  30.       + "groupId:[" + groupId + "]:"  
  31.       + "appId:[" + appId + "]:"  
  32.     );  
  33.     throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,  
  34.       "Guestは保存できない: loginid:[" + loginId + "]");  
  35.   }  
  36.   List<String> userLoginIds = new ArrayList<String>();  
  37.   userLoginIds.add(loginId);  
  38.   ExtendedGmsPerson[] gmsPersons = null;  
  39.   List<String> personIds = new ArrayList<String>();  
  40.   int first = 0;  
  41.   int max = 20;  
  42.   for (;;) {  
  43.     gmsPersons = gmsPersonDao.peopleGet(  
  44.       userLoginIds,  
  45.       groupId.getType().toString(),  
  46.       groupId.getGroupId(),  
  47.       null,  
  48.       null,  
  49.       null,  
  50.       null,  
  51.       null,  
  52.       first,  
  53.       max,  
  54.       null);  
  55.     if (logger.isDebugEnabled()) {  
  56.       logger.debug("count:[" + gmsPersons.length + "]");  
  57.     }  
  58.     int length = gmsPersons.length;  
  59.     for (int ii=0; ii<length; ii++) {  
  60.       personIds.add(gmsPersons[ii].getId());  
  61.     }  
  62.     if (length < max) {  
  63.       break;  
  64.     }  
  65.     first += max;  
  66.   }  
  67.   Timestamp now = new Timestamp(System.currentTimeMillis());  
  68.   for (String personId: personIds) {  
  69.     gmsPersonDao.select(personId, true);  
  70.     for (String field: fields) {  
  71.       GmsAppdata[] appdatas = null;  
  72.       appdatas = gmsAppdataDao.selectByAppHashIdAndGmsPersonIdAndName(appHashId, personId, field);  
  73.       GmsAppdata appdata = null;  
  74.       for (int ii=0,length=appdatas.length; ii<length; ii++) {  
  75.         if (appId.equalsIgnoreCase(appdatas[ii].getApplicationId())) {  
  76.           appdata = appdatas[ii];  
  77.           break;  
  78.         }  
  79.       }  
  80.       if (appdata != null) {  
  81.         appdata.setData(values.get(field));  
  82.         appdata.setUpdatedAt(now);  
  83.         appdata.setUpdator(viewer.getId());  
  84.         gmsAppdataDao.update(appdata);  
  85.       }  
  86.       else {  
  87.         appdata = new GmsAppdata();  
  88.         appdata.setId(UuidGenerator.compress(UuidGenerator.generate()));  
  89.         appdata.setAppHashId(appHashId);  
  90.         appdata.setApplicationId(appId);  
  91.         appdata.setGmsPersonId(personId);  
  92.         appdata.setName(field);  
  93.         appdata.setData(values.get(field));  
  94.         appdata.setCreatedAt(now);  
  95.         appdata.setCreator(viewer.getId());  
  96.         appdata.setUpdatedAt(now);  
  97.         appdata.setUpdator(viewer.getId());  
  98.         gmsAppdataDao.insert(appdata);  
  99.       }  
  100.     }  
  101.   }  
  102.   
  103.   logger.info("updatePersonData処理終了:"  
  104.     + "userId:[" + userId + "]:"  
  105.     + "groupId:[" + groupId + "]:"  
  106.     + "appId:[" + appId + "]:"  
  107.   );  
  108. }  


Shindigのサンプル実装のAppDataServiceImplをまねして作ったけど、
友達がいっぱいいる人はとっても重い。友達いない人向けということで。
更新すべき人は誰かを決定するのにUserIdとGroupIdを使用するんで、
以前作ったpeople.getの処理をコールしている。
filterとかは一切なし。

GmsAppdataというValueObjectはgms_appdataというテーブルを表しているんだけど、
application_idとgms_person_idを一意のキーにしなかった。
というのは、MySQLって長い文字列をプライマリーキーにできないし、INDEXもはれないから。
(今はDerby使っているけど)
だから、面倒だけど、application_idからHASH値を求めて、そのHASH値でデータを
持ってくるようにした。。

途中で使っているgetUser()は、現在ログイン中のPersonオブジェクトを持ってくる。
ログインしていないとnullが返る。

GuestがVIEWERかOWNERの時は(ありえないけど)、データは保存しない。
そのときはorg.apache.shindig.protocol.ProtocolExceptionを投げる。

org.apache.shindig.protocol.ProtocolExceptionを投げておくと、Handler内で、いい感じのエラーJSONにしてくれる。

で、一応保存できた。


ij> select data from ROOTTEST.gms_appdata;
DATA
--------------------------------------------------------------------------------------------------------------------------------
{"param1":"データだよーん","param2":"だよーんデータ"}

1 row selected


な感じ。

そんだけ。
.

0 コメント: