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 コメント:
コメントを投稿