DataRequest.newUpdatePersonAppDataRequestのサーバ側実装ができた。
へぼいけどざっとこんな感じ。
- public void updatePersonData(UserId userId, GroupId groupId, String appId, Set<String> fields, Map<String, String> values, SecurityToken token)
- throws ProtocolException {
- logger.info("updatePersonData処理開始:"
- + "userId:[" + userId + "]:"
- + "groupId:[" + groupId + "]:"
- + "appId:[" + appId + "]:"
- );
- assert appId != null;
- GmsPerson viewer = getUser();
- if (viewer == null) {
- logger.info("updatePersonData処理終了:Guestは保存できない:"
- + "userId:[" + userId + "]:"
- + "groupId:[" + groupId + "]:"
- + "appId:[" + appId + "]:"
- );
- throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
- "Guestは保存できない: 未ログイン");
- }
- String appHashId = toStringDigest(getStringDigest(appId));
- if (logger.isDebugEnabled()) {
- logger.debug("appHashId:[" + appHashId + "]");
- }
- String loginId = userId.getUserId(token);
- if ("Guest".equalsIgnoreCase(loginId)) {
- logger.info("updatePersonData処理終了:Guestは保存できない:"
- + "userId:[" + userId + "]:"
- + "groupId:[" + groupId + "]:"
- + "appId:[" + appId + "]:"
- );
- throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
- "Guestは保存できない: loginid:[" + loginId + "]");
- }
- List<String> userLoginIds = new ArrayList<String>();
- userLoginIds.add(loginId);
- ExtendedGmsPerson[] gmsPersons = null;
- List<String> personIds = new ArrayList<String>();
- int first = 0;
- int max = 20;
- for (;;) {
- gmsPersons = gmsPersonDao.peopleGet(
- userLoginIds,
- groupId.getType().toString(),
- groupId.getGroupId(),
- null,
- null,
- null,
- null,
- null,
- first,
- max,
- null);
- if (logger.isDebugEnabled()) {
- logger.debug("count:[" + gmsPersons.length + "]");
- }
- int length = gmsPersons.length;
- for (int ii=0; ii<length; ii++) {
- personIds.add(gmsPersons[ii].getId());
- }
- if (length < max) {
- break;
- }
- first += max;
- }
- Timestamp now = new Timestamp(System.currentTimeMillis());
- for (String personId: personIds) {
- gmsPersonDao.select(personId, true);
- for (String field: fields) {
- GmsAppdata[] appdatas = null;
- appdatas = gmsAppdataDao.selectByAppHashIdAndGmsPersonIdAndName(appHashId, personId, field);
- GmsAppdata appdata = null;
- for (int ii=0,length=appdatas.length; ii<length; ii++) {
- if (appId.equalsIgnoreCase(appdatas[ii].getApplicationId())) {
- appdata = appdatas[ii];
- break;
- }
- }
- if (appdata != null) {
- appdata.setData(values.get(field));
- appdata.setUpdatedAt(now);
- appdata.setUpdator(viewer.getId());
- gmsAppdataDao.update(appdata);
- }
- else {
- appdata = new GmsAppdata();
- appdata.setId(UuidGenerator.compress(UuidGenerator.generate()));
- appdata.setAppHashId(appHashId);
- appdata.setApplicationId(appId);
- appdata.setGmsPersonId(personId);
- appdata.setName(field);
- appdata.setData(values.get(field));
- appdata.setCreatedAt(now);
- appdata.setCreator(viewer.getId());
- appdata.setUpdatedAt(now);
- appdata.setUpdator(viewer.getId());
- gmsAppdataDao.insert(appdata);
- }
- }
- }
- logger.info("updatePersonData処理終了:"
- + "userId:[" + userId + "]:"
- + "groupId:[" + groupId + "]:"
- + "appId:[" + appId + "]:"
- );
- }
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 コメント:
コメントを投稿