できた。
コードは、
- 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'] + '
- ' + 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()" />
- <input type="button" value="取得" onclick="getAppData()" />
- <input type="button" value="削除" onclick="removeAppData()" />
- ]]>
- </Content>
- </Module>
な感じー。
まだremoveAppDataは動かないけど。
.
0 コメント:
コメントを投稿