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

2009年7月24日金曜日

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

とりあえず、requestCreateActivityに対応するサーバ側処理完成。

くそソースだけど以下な感じ。


public void createActivity(UserId userId, GroupId groupId, String appId,
Set<String> fields, Activity activity, SecurityToken token) throws ProtocolException {
GmsPerson viewer = getUser();
logger.info("createActivity開始"
+ "viewer:[" + ((viewer == null) ? "Guest" : viewer.getLoginId()) + "]:"
+ "userId:[" + userId + "]:"
+ "appId:[" + appId + "]:"
);
if (viewer == null) {
logger.info("createActivity終了:Guestは保存できない:"
+ "viewer:[" + ((viewer == null) ? "Guest" : viewer.getLoginId()) + "]:"
+ "userId:[" + userId + "]:"
+ "appId:[" + appId + "]:"
);
throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
"Guestは保存できない: 未ログイン");
}

String loginId = userId.getUserId(token);
if ("Guest".equalsIgnoreCase(loginId)) {
logger.info("createActivity終了:Guestは保存できない:"
+ "viewer:[" + ((viewer == null) ? "Guest" : viewer.getLoginId()) + "]:"
+ "userId:[" + userId + "]:"
+ "appId:[" + appId + "]:"
);
throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
"Guestは保存できない: loginid:[" + loginId + "]");
}
List<String> userLoginIds = new ArrayList<String>();
userLoginIds.add(loginId);
GmsPerson[] gmsPersons = gmsPersonDao.peopleGet(
userLoginIds,
"self",
null,
null,
null,
null,
null,
null,
0,
1,
null);
if (gmsPersons.length == 0) {
logger.info("createActivity終了:該当Personなし:"
+ "viewer:[" + ((viewer == null) ? "Guest" : viewer.getLoginId()) + "]:"
+ "userId:[" + userId + "]:"
+ "appId:[" + appId + "]:"
);
throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
"Guestは保存できない: loginid:[" + loginId + "]");
}
gmsPersonDao.select(gmsPersons[0].getId(), true);
GmsActivity target = mapToGmsActivity(gmsPersons[0], appId, activity, token);
if (supportsField(token.getContainer(), "activity", Activity.Field.MEDIA_ITEMS.toString()) && activity.getMediaItems() != null) {
for(MediaItem m : activity.getMediaItems()) {
GmsMediaItem gmsMediaItem = new GmsMediaItem();
gmsMediaItem.setId(UuidGenerator.compress(UuidGenerator.generate()));
gmsMediaItem.setActivityId(target.getId());
if (supportsField(token.getContainer(), "mediaItem", MediaItem.Field.MIME_TYPE.toString()) && m.getMimeType() != null) {
gmsMediaItem.setMimeType(m.getMimeType());
}
else {
gmsMediaItem.setMimeType("");
}
if (supportsField(token.getContainer(), "mediaItem", MediaItem.Field.TYPE.toString()) && m.getType() != null
&& (MediaItem.Type.AUDIO == m.getType() || MediaItem.Type.IMAGE == m.getType() || MediaItem.Type.VIDEO == m.getType())) {
gmsMediaItem.setMediaType(m.getType().toString());
}
else {
gmsMediaItem.setMediaType("");
}
if (supportsField(token.getContainer(), "mediaItem", MediaItem.Field.URL.toString()) && m.getUrl() != null) {
gmsMediaItem.setUrl(m.getUrl());
}
else {
gmsMediaItem.setUrl("");
}
gmsMediaItem.setAlbumId("");
Timestamp now = new Timestamp(System.currentTimeMillis());
gmsMediaItem.setCreated(now);
gmsMediaItem.setDescription("");
gmsMediaItem.setDuration(-1);
gmsMediaItem.setFileSize(-1);
gmsMediaItem.setLanguage("");
gmsMediaItem.setLastUpdated(now);
gmsMediaItem.setLocationId("");
gmsMediaItem.setNumComments(0);
gmsMediaItem.setNumViews(0);
gmsMediaItem.setNumVotes(0);
gmsMediaItem.setRating(0);
gmsMediaItem.setStartTime(now);
gmsMediaItem.setTaggedPeople("");
gmsMediaItem.setTags("");
gmsMediaItem.setThumbnailUrl("");
gmsMediaItem.setTitle("");
gmsMediaItemDao.insert(gmsMediaItem);
}
}
gmsActivityDao.insert(target);
logger.info("createActivity終了"
+ "viewer:[" + ((viewer == null) ? "Guest" : viewer.getLoginId()) + "]:"
+ "userId:[" + userId + "]:"
+ "appId:[" + appId + "]:"
);
}
public GmsActivity mapToGmsActivity(GmsPerson person, String appId, Activity activity, SecurityToken token) {
GmsActivity result = new GmsActivity();
result.setId(UuidGenerator.compress(UuidGenerator.generate()));
result.setGmsPersonId(person.getId());
result.setAppId(appId);
String appHashId = toStringDigest(getStringDigest(appId));
if (logger.isDebugEnabled()) {
logger.debug("appHashId:[" + appHashId + "]");
}
result.setAppHashId(appHashId);
if (supportsField(token.getContainer(), "activity", Activity.Field.BODY.toString()) && activity.getBody() != null) {
result.setBody(activity.getBody());
}
else {
result.setBody("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.BODY_ID.toString()) && activity.getBodyId() != null) {
result.setBodyId(activity.getBodyId());
}
else {
result.setBodyId("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.EXTERNAL_ID.toString()) && activity.getExternalId() != null) {
result.setExternalId(activity.getExternalId());
}
else {
result.setExternalId("");
}
result.setPostedTime(new Timestamp(System.currentTimeMillis())); /* 取り出すときにはlongに変換すること */
if (supportsField(token.getContainer(), "activity", Activity.Field.PRIORITY.toString()) && activity.getPriority() != null) {
result.setPriority((double)(float)activity.getPriority());
}
else {
result.setPriority(0.0d);
}
if (supportsField(token.getContainer(), "activity", Activity.Field.STREAM_FAVICON_URL.toString()) && activity.getStreamFaviconUrl() != null) {
result.setStreamFaviconUrl(activity.getStreamFaviconUrl());
}
else {
result.setStreamFaviconUrl("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.STREAM_SOURCE_URL.toString()) && activity.getStreamSourceUrl() != null) {
result.setStreamSourceUrl(activity.getStreamSourceUrl());
}
else {
result.setStreamSourceUrl("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.STREAM_TITLE.toString()) && activity.getStreamTitle() != null) {
result.setStreamTitle(activity.getTitle());
}
else {
result.setStreamTitle("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.STREAM_URL.toString()) && activity.getStreamUrl() != null) {
result.setStreamUrl(activity.getUrl());
}
else {
result.setStreamUrl("");
}
Map<String, String> params = activity.getTemplateParams();
if (supportsField(token.getContainer(), "activity", Activity.Field.TEMPLATE_PARAMS.toString()) && params != null) {
result.setTemplateParams(beanJsonConverter.convertToString(params));
}
else {
result.setTemplateParams("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.TITLE.toString()) && activity.getTitle() != null) {
result.setTitle(activity.getTitle());
}
else {
result.setTitle("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.TITLE_ID.toString()) && activity.getTitleId() != null) {
result.setTitleId(activity.getTitleId());
}
else {
result.setTitleId("");
}
if (supportsField(token.getContainer(), "activity", Activity.Field.URL.toString()) && activity.getUrl() != null) {
result.setUrl(activity.getUrl());
}
else {
result.setUrl("");
}
return result;
}



TEMPLATE_PARAMSはMapをJSON形式の文字列に変換後DBにセット。
container.jsのsupportsFieldと連動させたいのでsupportsFieldコールしまくり。

MediaItemは使用していない項目が大量にあるけど、これは0.9用らしい。


でActivityの保存ができた。

次はDataRequest.newFetchActivitiesRequest(idSpec, opt_params)のサーバ側処理を
実装してみるつもり。



--
というか、入力チェック一切行っていないのを今さら気づいた。

--
というか、hasPermissionをせっかく作ったのに使ってなかった。。

--
というか、サニタイズは?

--
簡易サニタイズつけた。
hasPermission呼ぶようにした。
.

0 コメント: