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

2009年7月24日金曜日

[Apache Shindig][お勉強][OpenSocial] メモ82 DataRequest.newFetchActivitiesRequest時のopt_paramに指定できるもの

newFetchActivitiesRequest発行時のサーバ側の処理は3のメソッドにそれぞれ分岐するところ
までは分かった。

さて、分岐させるべく、Gadget側でいろいろなパラメータでnewFetchActivitiesRequestをコールしてみたいよ。

OpenSocial0.8.1のAPIリファレンスを見ると、


Object newFetchActivitiesRequest(idSpec, opt_params)
サーバーからアクティビティ ストリームを要求するアイテムを作成します。

と書いてある。
他のnewFetchシリーズと同様に第二引数でいろいろと指定できそう。

このopt_paramsに何を指定することができるかってーと、

features/opensocial-reference/datarequest.js

を見てみると書いてあった。

opensocial.DataRequest.ActivityRequestFields = {
/**
* {String} If provided will filter all activities by this app Id.
* @private - at the moment you can only request activities for your own app
*/
APP_ID : 'appId',
/**
* When paginating, the index of the first item to fetch.
* Specified as a <code>Number</code>.
*
* @member opensocial.DataRequest.ActivityRequestFields
*/
FIRST : 'first',

/**
* The maximum number of items to fetch; defaults to 20. If set to a larger
* number, a container may honor the request, or may limit the number to a
* container-specified limit of at least 20.
* Specified as a <code>Number</code>.
*
* @member opensocial.DataRequest.ActivityRequestFields
*/
MAX : 'max'
};


だって。
maxとfirstとappIdと。


maxとfirstは指定しないと、firstには0が、maxには20がセットされる。

opensocial.DataRequest.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
opt_params = opt_params || {};

var fields = opensocial.DataRequest.ActivityRequestFields;

this.addDefaultParam(opt_params, fields.FIRST, 0);
this.addDefaultParam(opt_params, fields.MAX, 20);

return opensocial.Container.get().newFetchActivitiesRequest(idSpec,
opt_params);
};

ほら。


あれ?activityIdは???
activityIdはjsonrpccontainer.jsの方で指定しているのか、
と思いきや、書いてない。。
どうも、Shindigのサンプル実装だとactivityIdは渡せないっぽい。

ということで、features/opensocial-jsonrpc/jsonrpccontainer..jsを修正。

JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
var rpc = { method : "activities.get" };
rpc.params = this.translateIdSpec(idSpec);
rpc.params.appId = "@app";
FieldTranslations.translateStandardArguments(opt_params, rpc.params);
FieldTranslations.translateNetworkDistance(idSpec, rpc.params);

return new JsonRpcRequestItem(rpc,
function(rawJson) {
rawJson = rawJson['list'];
var activities = [];
for (var i = 0; i < rawJson.length; i++) {
activities.push(new JsonActivity(rawJson[i]));
}
return new opensocial.Collection(activities);
});
};




JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
var rpc = { method : "activities.get" };
rpc.params = this.translateIdSpec(idSpec);
rpc.params.appId = "@app";
/* ここから */
if (opt_params['activityId']) {
rpc.params.activityId = opt_params['activityId'];
}
/* ここまで */
FieldTranslations.translateStandardArguments(opt_params, rpc.params);
FieldTranslations.translateNetworkDistance(idSpec, rpc.params);

return new JsonRpcRequestItem(rpc,
function(rawJson) {
/* さらに修正 ここから */
if (rawJson['list']) {
rawJson = rawJson['list'];
}
else {
rawJson = [rawJson];
}
/* さらに修正 ここまで */
var activities = [];
for (var i = 0; i < rawJson.length; i++) {
activities.push(new JsonActivity(rawJson[i]));
}
return new opensocial.Collection(activities);
});
};


に修正。


さらに、GadgetXMLも

var idspec = new opensocial.IdSpec();
idspec.setField(opensocial.IdSpec.Field.USER_ID, opensocial.IdSpec.PersonId.OWNER);
idspec.setField(opensocial.IdSpec.Field.GROUP_ID, opensocial.IdSpec.GroupId.SELF);
var params = {};
params['activityId'] = '6ng0wgx0lgb0nxc0t9t02ur03bw0hcx0';

/*===================================================================*/
/* DataRequestオブジェクトを作成し、 */
/* そこにActivity取得リクエストを追加. */
/* レスポンスを取得するときのキーは'get_activity' */
/*===================================================================*/

var req = opensocial.newDataRequest();
req.add(req.newFetchActivitiesRequest(idspec, params), 'get_activity');

として実行。

ばっちりサーバ側でactivityIdを受け取れる。
これでサーバ側3処理にそれぞれ処理を投げることができるようになった。

あと、サーバ側インタフェースを見ると、fieldsも指定できるようなシグネチャに
なっているんだけど、今のところ意図的に無視している。
なので、そこはそのまま。

さて、つづき。

--
レスポンスが返ってくるようになったけど、JsonRpcRequestItemの第二引数が
だめだったので追加で修正。

--
結局のところ、newFetchActivitiesRequestの第二引数で指定できるものは、
Shindigそのままのjsonrpccontainer.jsのサンプル実装だと、
* appId
* max
* first
サーバ側のサンプル実装だと、上記に加えて
* activityId
ぐらいか。な?




.

0 コメント: