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

2009年7月22日水曜日

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

できた。

コードは、


public Map<String, Map<String, String>> getPersonData(Set<UserId> userIds, GroupId groupId,
String appId, Set<String> fields, SecurityToken token) throws ProtocolException {
logger.info("getPersonData開始:"
+ "groupId:[" + groupId + "]:"
+ "appId:[" + appId + "]:"
);

Map<String, Map<String, String>> results = new HashMap<String, Map<String, String>>();
String appHashId = toStringDigest(getStringDigest(appId));
if (logger.isDebugEnabled()) {
logger.debug("appHashId:[" + appHashId + "]");
}

List<String> userLoginIds = getUserList(userIds, token);
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);
Map<String, String> m = Maps.newHashMap();
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())) {
m.put(field, appdatas[ii].getData());
break;
}
}
}
results.put(personId, m);
}

logger.info("getPersonData終了:"
+ "groupId:[" + groupId + "]:"
+ "appId:[" + appId + "]:"
);
return results;
}


な感じ。

Service側は、

public Future<DataCollection> getPersonData(Set<UserId> userIds, GroupId groupId,
String appId, Set<String> fields, SecurityToken token) throws ProtocolException {
if (logger.isDebugEnabled()) {
for (UserId userId: userIds) {
logger.debug("userId:[" + userId + "]");
logger.debug("userId2:[" + userId.getUserId(token) + "]");
}
logger.debug("groupId:[" + groupId + "]");
logger.debug("appId:[" + appId + "]");
for (String field: fields) {
logger.debug("field:[" + field + "]");
}
}
Map<String, Map<String, String>> results = logic.getPersonData(userIds, groupId, appId, fields, token);
DataCollection dc = new DataCollection(results);
return ImmediateFuture.newInstance(dc);
}


な感じ。

これで、newFetchPersonAppDataRequestとnewUpdatePersonAppDataRequestに対応できた。
ちなみに、キーごとに保存できるデータの最大長は、システムの許す限り。


で、ちょっとだけ、動くように修正したガジェットXMLは、

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="AppData">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html" view="home,profile,canvas">
<![CDATA[
<script type="text/javascript">
function updateAppData() {
/*=====================================================================*/
/* これから保存したいオブジェクト */
/*=====================================================================*/
var obj = {'param1':'データだよーん', 'param2':'だよーんデータ'};
/*=====================================================================*/
/* オブジェクトを文字列に変換(OpenSocial推奨らしい) */
/*=====================================================================*/
var strObj = gadgets.json.stringify(obj);

/*=====================================================================*/
/* DataRequest生成、セットアップ */
/*=====================================================================*/
var req = opensocial.newDataRequest();
req.add(req.newUpdatePersonAppDataRequest(
opensocial.IdSpec.PersonId.VIEWER,
'key',
strObj),
'get_response');
/*=====================================================================*/
/* 送信! */
/*=====================================================================*/
req.send(function(response){
var result = response.get('get_response');
if (result.hadError()) {
document.getElementById('result').innerHTML = '失敗したよー:'
+ result.getErrorMessage();
} else {
document.getElementById('result').innerHTML
= 'newUpdatePersonAppDataRequest成功';
}
});
}
function getAppData() {
var idspec = new opensocial.IdSpec();
idspec.setField(opensocial.IdSpec.Field.USER_ID, opensocial.IdSpec.PersonId.VIEWER);
idspec.setField(opensocial.IdSpec.Field.GROUP_ID, opensocial.IdSpec.GroupId.SELF);

var req = opensocial.newDataRequest();
/*=====================================================================*/
/* まずVIEWERを取得 */
/*=====================================================================*/
req.add(
req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER),
'get_viewer');
/*=====================================================================*/
/* APPDATA取得のリクエストを生成 */
/*=====================================================================*/
req.add(
req.newFetchPersonAppDataRequest(idspec, 'key'),
'get_appdata');
/*=====================================================================*/
/* 送信 */
/*=====================================================================*/
req.send(function(response){
var viewer = response.get('get_viewer');
if (viewer.hadError()) {
document.getElementById('result').innerHTML = 'Viewerの取得に失敗したよー:'
+ viewer.getErrorMessage();
} else {
var appdata = response.get('get_appdata');
if (appdata.hadError()) {
document.getElementById('result').innerHTML = 'AppDataの取得に失敗したよー:'
+ appdata.getErrorMessage();
} else {
if (appdata.getData()[viewer.getData().getId()]) {
/*=============================================================*/
/* VIEWER固有のAppData取得 */
/*=============================================================*/
var srcObj = appdata.getData()[viewer.getData().getId()]['key'];
/*=============================================================*/
/* unescape */
/*=============================================================*/
console.log(srcObj);
var jsonStr = gadgets.util.unescapeString(srcObj);
var jsonObj = gadgets.json.parse(jsonStr);
document.getElementById('result').innerHTML = jsonObj['param1'] + '<br />' + jsonObj['param2'];
} else {
document.getElementById('result').innerHTML = 'がちょーん';
}
}
}
});
}
function removeAppData() {
var req = opensocial.newDataRequest();
req.add(
req.newRemovePersonAppDataRequest(opensocial.IdSpec.PersonId.VIEWER, 'key'),
'get_response');
/*=====================================================================*/
/* 送信 */
/*=====================================================================*/
req.send(function(response){
var result = response.get('get_response');
if (result.hadError()) {
document.getElementById('result').innerHTML = 'appDataの削除に失敗したよー:'
+ result.getErrorMessage();
} else {
document.getElementById('result').innerHTML = '削除したよー';
}
});
}
</script>
<div id="result"></div>
<input type="button" value="更新" onclick="updateAppData()" /><br />
<input type="button" value="取得" onclick="getAppData()" /><br />
<input type="button" value="削除" onclick="removeAppData()" /><br />
]]>
</Content>
</Module>


な感じー。


まだremoveAppDataは動かないけど。
.

0 コメント: