You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2009/01/06 01:13:06 UTC

svn commit: r731780 - in /incubator/shindig/trunk/features/opensocial-jsonrpc: feature.xml jsonrpccontainer.js

Author: etnu
Date: Mon Jan  5 16:13:06 2009
New Revision: 731780

URL: http://svn.apache.org/viewvc?rev=731780&view=rev
Log:
Applied patch for SHINDIG-780, from Bob Evans. This patch implements requestShareApp by delegating to gadgets.rpc.


Modified:
    incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
    incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js

Modified: incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml?rev=731780&r1=731779&r2=731780&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml (original)
+++ incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml Mon Jan  5 16:13:06 2009
@@ -20,6 +20,7 @@
 <feature>
   <name>opensocial-jsonrpc</name>
   <dependency>opensocial-base</dependency>
+  <dependency>rpc</dependency>
   <gadget>   
     <script src="jsonrpccontainer.js"></script>
   </gadget>

Modified: incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js?rev=731780&r1=731779&r2=731780&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js (original)
+++ incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js Mon Jan  5 16:13:06 2009
@@ -38,338 +38,394 @@
   this.baseUrl_ = baseUrl;
 
   this.securityToken_ = shindig.auth.getSecurityToken();
-};
-JsonRpcContainer.inherits(opensocial.Container);
 
-JsonRpcContainer.prototype.getEnvironment = function() {
-  return this.environment_;
+  gadgets.rpc.register('shindig.requestShareApp_callback',
+      JsonRpcContainer.requestShareAppCallback_);
 };
 
-JsonRpcContainer.prototype.requestCreateActivity = function(activity, priority,
-    opt_callback) {
-  opt_callback = opt_callback || function(){};
-
-  var req = opensocial.newDataRequest();
-  var viewer = new opensocial.IdSpec({'userId' : 'VIEWER'});
-  req.add(this.newCreateActivityRequest(viewer, activity), 'key');
-  req.send(function(response) {
-    opt_callback(response.get('key'));
-  });
-};
+(function() {
+  var callbackIdStore = {};
 
-JsonRpcContainer.prototype.requestData = function(dataRequest, callback) {
-  callback = callback || function(){};
+  JsonRpcContainer.inherits(opensocial.Container);
 
-  var requestObjects = dataRequest.getRequestObjects();
-  var totalRequests = requestObjects.length;
+  JsonRpcContainer.prototype.getEnvironment = function() {
+    return this.environment_;
+  };
 
-  if (totalRequests == 0) {
-    window.setTimeout(function() {
-      callback(new opensocial.DataResponse({}, true));
-    }, 0);
-    return;
-  }
+  JsonRpcContainer.prototype.requestShareApp = function(recipientIds, reason,
+      opt_callback, opt_params) {
+    var callbackId = "cId_" + Math.random();
+    callbackIdStore[callbackId] = opt_callback;
+
+    var body = gadgets.util.unescapeString(reason.getField(
+        opensocial.Message.Field.BODY));
+
+    if (!body || body.length == 0) {
+      var bodyMsgKey = gadgets.util.unescapeString(reason.getField(
+        opensocial.Message.Field.BODY_ID));
+      body = gadgets.Prefs.getMsg(bodyMsgKey);
+    }
 
-  var jsonBatchData = new Array(totalRequests);
+    gadgets.rpc.call('..', 'shindig.requestShareApp',
+        null,
+        callbackId,
+        recipientIds,
+        body);
+  };
+  
 
-  for (var j = 0; j < totalRequests; j++) {
-    var requestObject = requestObjects[j];
+  /**
+   * Receives the returned results from the parent container.
+   *
+   * @param {boolean} success if false, the message will not be sent
+   * @param {string} opt_errorCode an error code if success is false
+   * @param {Array.<string>?} recipientIds an array of recipient IDs,
+   *     if success is true
+   * @private
+   */
+  JsonRpcContainer.requestShareAppCallback_ = function(callbackId,
+      success, opt_errorCode, recipientIds) {
+    callback = callbackIdStore[callbackId]
+    if (callback) {
+      callbackIdStore[callbackId] = null;
+      
+      var data = null;
+      if (recipientIds) {
+        data = {'recipientIds': recipientIds};
+      }
 
-    jsonBatchData[j] = requestObject.request.rpc;
-    if (requestObject.key) {
-      jsonBatchData[j].id = requestObject.key;
+      var responseItem = new opensocial.ResponseItem(null, data, opt_errorCode);
+      callback(responseItem);
     }
-  }
+  };
+
+
+  JsonRpcContainer.prototype.requestCreateActivity = function(activity, priority,
+      opt_callback) {
+    opt_callback = opt_callback || function(){};
+
+    var req = opensocial.newDataRequest();
+    var viewer = new opensocial.IdSpec({'userId' : 'VIEWER'});
+    req.add(this.newCreateActivityRequest(viewer, activity), 'key');
+    req.send(function(response) {
+      opt_callback(response.get('key'));
+    });
+  };
 
-  var sendResponse = function(result) {
-    if (result.errors[0]) {
-      JsonRpcContainer.generateErrorResponse(result, requestObjects, callback);
+  JsonRpcContainer.prototype.requestData = function(dataRequest, callback) {
+    callback = callback || function(){};
+
+    var requestObjects = dataRequest.getRequestObjects();
+    var totalRequests = requestObjects.length;
+
+    if (totalRequests == 0) {
+      window.setTimeout(function() {
+        callback(new opensocial.DataResponse({}, true));
+      }, 0);
       return;
     }
 
-    result = result.data;
+    var jsonBatchData = new Array(totalRequests);
 
-    var globalError = false;
-    var responseMap = {};
+    for (var j = 0; j < totalRequests; j++) {
+      var requestObject = requestObjects[j];
 
-    // Map from indices to ids.
-    for (var i = 0; i < result.length; i++) {
-      result[result[i].id] = result[i];
+      jsonBatchData[j] = requestObject.request.rpc;
+      if (requestObject.key) {
+        jsonBatchData[j].id = requestObject.key;
+      }
     }
 
-    for (var k = 0; k < requestObjects.length; k++) {
-      var request = requestObjects[k];
-      var response = result[k];
-
-      if (request.key && response.id != request.key) {
-        throw "Request key(" + request.key +
-            ") and response id(" + response.id + ") do not match";
+    var sendResponse = function(result) {
+      if (result.errors[0]) {
+        JsonRpcContainer.generateErrorResponse(result, requestObjects, callback);
+        return;
       }
 
-      var rawData = response.data;
-      var error = response.error;
-      var errorMessage = "";
+      result = result.data;
+
+      var globalError = false;
+      var responseMap = {};
 
-      if (error) {
-        errorMessage = error.message;
+      // Map from indices to ids.
+      for (var i = 0; i < result.length; i++) {
+        result[result[i].id] = result[i];
       }
 
-      var processedData = request.request.processResponse(
-          request.request, rawData, error, errorMessage);
-      globalError = globalError || processedData.hadError();
-      if (request.key) {
-        responseMap[request.key] = processedData;
+      for (var k = 0; k < requestObjects.length; k++) {
+        var request = requestObjects[k];
+        var response = result[k];
+
+        if (request.key && response.id != request.key) {
+          throw "Request key(" + request.key +
+              ") and response id(" + response.id + ") do not match";
+        }
+
+        var rawData = response.data;
+        var error = response.error;
+        var errorMessage = "";
+
+        if (error) {
+          errorMessage = error.message;
+        }
+
+        var processedData = request.request.processResponse(
+            request.request, rawData, error, errorMessage);
+        globalError = globalError || processedData.hadError();
+        if (request.key) {
+          responseMap[request.key] = processedData;
+        }
       }
+
+      var dataResponse = new opensocial.DataResponse(responseMap, globalError);
+      callback(dataResponse);
+    };
+
+    // TODO: get the jsonbatch url from the container config
+    var makeRequestParams = {
+      "CONTENT_TYPE" : "JSON",
+      "METHOD" : "POST",
+      "AUTHORIZATION" : "SIGNED",
+      "POST_DATA" : gadgets.json.stringify(jsonBatchData)
+    };
+
+    var url = [this.baseUrl_, "/rpc"];
+    var token = shindig.auth.getSecurityToken();
+    if (token) {
+      url.push("?st=", encodeURIComponent(token));
     }
 
-    var dataResponse = new opensocial.DataResponse(responseMap, globalError);
-    callback(dataResponse);
+    this.sendRequest(url.join(''), sendResponse, makeRequestParams,
+        "application/json");
   };
 
-  // TODO: get the jsonbatch url from the container config
-  var makeRequestParams = {
-    "CONTENT_TYPE" : "JSON",
-    "METHOD" : "POST",
-    "AUTHORIZATION" : "SIGNED",
-    "POST_DATA" : gadgets.json.stringify(jsonBatchData)
-  };
-
-  var url = [this.baseUrl_, "/rpc"];
-  var token = shindig.auth.getSecurityToken();
-  if (token) {
-    url.push("?st=", encodeURIComponent(token));
+  JsonRpcContainer.prototype.sendRequest = function(relativeUrl, callback, params, contentType) {
+    gadgets.io.makeNonProxiedRequest(relativeUrl, callback, params, contentType);
   }
 
-  this.sendRequest(url.join(''), sendResponse, makeRequestParams,
-      "application/json");
-};
-
-JsonRpcContainer.prototype.sendRequest = function(relativeUrl, callback, params, contentType) {
-  gadgets.io.makeNonProxiedRequest(relativeUrl, callback, params, contentType);
-}
-
-JsonRpcContainer.generateErrorResponse = function(result, requestObjects,
-    callback) {
-  var globalErrorCode =
-          JsonRpcContainer.translateHttpError(result.errors[0]
-                  || result.data.error)
-                  || opensocial.ResponseItem.Error.INTERNAL_ERROR;
-
-  var errorResponseMap = {};
-  for (var i = 0; i < requestObjects.length; i++) {
-    errorResponseMap[requestObjects[i].key] = new opensocial.ResponseItem(
-        requestObjects[i].request, null, globalErrorCode);
-  }
-  callback(new opensocial.DataResponse(errorResponseMap, true));
-};
-
-JsonRpcContainer.translateHttpError = function(httpError) {
-  if (httpError == "Error 501") {
-    return opensocial.ResponseItem.Error.NOT_IMPLEMENTED;
-  } else if (httpError == "Error 401") {
-    return opensocial.ResponseItem.Error.UNAUTHORIZED;
-  } else if (httpError == "Error 403") {
-    return opensocial.ResponseItem.Error.FORBIDDEN;
-  } else if (httpError == "Error 400") {
-    return opensocial.ResponseItem.Error.BAD_REQUEST;
-  } else if (httpError == "Error 500") {
-    return opensocial.ResponseItem.Error.INTERNAL_ERROR;
-  } else if (httpError == "Error 404") {
-    return opensocial.ResponseItem.Error.BAD_REQUEST;
-  } else if (httpError == "Error 417") {
-    return opensocial.ResponseItem.Error.LIMIT_EXCEEDED;
-  }
-};
+  JsonRpcContainer.generateErrorResponse = function(result, requestObjects,
+      callback) {
+    var globalErrorCode =
+            JsonRpcContainer.translateHttpError(result.errors[0]
+                    || result.data.error)
+                    || opensocial.ResponseItem.Error.INTERNAL_ERROR;
+
+    var errorResponseMap = {};
+    for (var i = 0; i < requestObjects.length; i++) {
+      errorResponseMap[requestObjects[i].key] = new opensocial.ResponseItem(
+          requestObjects[i].request, null, globalErrorCode);
+    }
+    callback(new opensocial.DataResponse(errorResponseMap, true));
+  };
 
-JsonRpcContainer.prototype.makeIdSpec = function(id) {
-  return new opensocial.IdSpec({'userId' : id});
-};
+  JsonRpcContainer.translateHttpError = function(httpError) {
+    if (httpError == "Error 501") {
+      return opensocial.ResponseItem.Error.NOT_IMPLEMENTED;
+    } else if (httpError == "Error 401") {
+      return opensocial.ResponseItem.Error.UNAUTHORIZED;
+    } else if (httpError == "Error 403") {
+      return opensocial.ResponseItem.Error.FORBIDDEN;
+    } else if (httpError == "Error 400") {
+      return opensocial.ResponseItem.Error.BAD_REQUEST;
+    } else if (httpError == "Error 500") {
+      return opensocial.ResponseItem.Error.INTERNAL_ERROR;
+    } else if (httpError == "Error 404") {
+      return opensocial.ResponseItem.Error.BAD_REQUEST;
+    } else if (httpError == "Error 417") {
+      return opensocial.ResponseItem.Error.LIMIT_EXCEEDED;
+    }
+  };
 
-JsonRpcContainer.prototype.translateIdSpec = function(newIdSpec) {
-  var userIds = newIdSpec.getField('userId');
-  var groupId = newIdSpec.getField('groupId');
-
-  // Upconvert to array for convenience
-  if (!opensocial.Container.isArray(userIds)) {
-    userIds = [userIds];
-  }
+  JsonRpcContainer.prototype.makeIdSpec = function(id) {
+    return new opensocial.IdSpec({'userId' : id});
+  };
 
-  for (var i = 0; i < userIds.length; i++) {
-    if (userIds[i] == 'OWNER') {
-      userIds[i] = '@owner';
-    } else if (userIds[i] == 'VIEWER') {
-      userIds[i] = '@viewer';
+  JsonRpcContainer.prototype.translateIdSpec = function(newIdSpec) {
+    var userIds = newIdSpec.getField('userId');
+    var groupId = newIdSpec.getField('groupId');
+
+    // Upconvert to array for convenience
+    if (!opensocial.Container.isArray(userIds)) {
+      userIds = [userIds];
     }
-  }
 
-  if (groupId == 'FRIENDS') {
-    groupId = "@friends";
-  } else if (groupId == 'SELF' || !groupId) {
-    groupId = "@self";
-  }
+    for (var i = 0; i < userIds.length; i++) {
+      if (userIds[i] == 'OWNER') {
+        userIds[i] = '@owner';
+      } else if (userIds[i] == 'VIEWER') {
+        userIds[i] = '@viewer';
+      }
+    }
 
-  return { userId : userIds, groupId : groupId};
-};
+    if (groupId == 'FRIENDS') {
+      groupId = "@friends";
+    } else if (groupId == 'SELF' || !groupId) {
+      groupId = "@self";
+    }
 
-JsonRpcContainer.prototype.newFetchPersonRequest = function(id, opt_params) {
-  var peopleRequest = this.newFetchPeopleRequest(
-      this.makeIdSpec(id), opt_params);
-
-  var me = this;
-  return new JsonRpcRequestItem(peopleRequest.rpc,
-          function(rawJson) {
-            return me.createPersonFromJson(rawJson);
-          });
-};
+    return { userId : userIds, groupId : groupId};
+  };
 
-JsonRpcContainer.prototype.newFetchPeopleRequest = function(idSpec,
-    opt_params) {
-  var rpc = { method : "people.get" };
-  rpc.params = this.translateIdSpec(idSpec);
-  if (opt_params['profileDetail']) {
-    FieldTranslations.translateJsPersonFieldsToServerFields(opt_params['profileDetail']);
-    rpc.params.fields = opt_params['profileDetail'];
-  }
-  if (opt_params['first']) {
-    rpc.params.startIndex = opt_params['first'];
-  }
-  if (opt_params['max']) {
-    rpc.params.count = opt_params['max'];
-  }
-  if (opt_params['sortOrder']) {
-    rpc.params.sortBy = opt_params['sortOrder'];
-  }
-  if (opt_params['filter']) {
-    rpc.params.filterBy = opt_params['filter'];
-  }
-  if (idSpec.getField('networkDistance')) {
-    rpc.params.networkDistance = idSpec.getField('networkDistance');
-  }
+  JsonRpcContainer.prototype.newFetchPersonRequest = function(id, opt_params) {
+    var peopleRequest = this.newFetchPeopleRequest(
+        this.makeIdSpec(id), opt_params);
+
+    var me = this;
+    return new JsonRpcRequestItem(peopleRequest.rpc,
+            function(rawJson) {
+              return me.createPersonFromJson(rawJson);
+            });
+  };
 
-  var me = this;
-  return new JsonRpcRequestItem(rpc,
-      function(rawJson) {
-        var jsonPeople;
-        if (rawJson['list']) {
-          // For the array of people response
-          jsonPeople = rawJson['list'];
-        } else {
-          // For the single person response
-          jsonPeople = [rawJson];
-        }
+  JsonRpcContainer.prototype.newFetchPeopleRequest = function(idSpec,
+      opt_params) {
+    var rpc = { method : "people.get" };
+    rpc.params = this.translateIdSpec(idSpec);
+    if (opt_params['profileDetail']) {
+      FieldTranslations.translateJsPersonFieldsToServerFields(opt_params['profileDetail']);
+      rpc.params.fields = opt_params['profileDetail'];
+    }
+    if (opt_params['first']) {
+      rpc.params.startIndex = opt_params['first'];
+    }
+    if (opt_params['max']) {
+      rpc.params.count = opt_params['max'];
+    }
+    if (opt_params['sortOrder']) {
+      rpc.params.sortBy = opt_params['sortOrder'];
+    }
+    if (opt_params['filter']) {
+      rpc.params.filterBy = opt_params['filter'];
+    }
+    if (idSpec.getField('networkDistance')) {
+      rpc.params.networkDistance = idSpec.getField('networkDistance');
+    }
 
-        var people = [];
-        for (var i = 0; i < jsonPeople.length; i++) {
-          people.push(me.createPersonFromJson(jsonPeople[i]));
-        }
-        return new opensocial.Collection(people,
-            rawJson['startIndex'], rawJson['totalResults']);
-      });
-};
+    var me = this;
+    return new JsonRpcRequestItem(rpc,
+        function(rawJson) {
+          var jsonPeople;
+          if (rawJson['list']) {
+            // For the array of people response
+            jsonPeople = rawJson['list'];
+          } else {
+            // For the single person response
+            jsonPeople = [rawJson];
+          }
+
+          var people = [];
+          for (var i = 0; i < jsonPeople.length; i++) {
+            people.push(me.createPersonFromJson(jsonPeople[i]));
+          }
+          return new opensocial.Collection(people,
+              rawJson['startIndex'], rawJson['totalResults']);
+        });
+  };
 
-JsonRpcContainer.prototype.createPersonFromJson = function(serverJson) {
-  FieldTranslations.translateServerPersonToJsPerson(serverJson);
-  return new JsonPerson(serverJson);
-};
+  JsonRpcContainer.prototype.createPersonFromJson = function(serverJson) {
+    FieldTranslations.translateServerPersonToJsPerson(serverJson);
+    return new JsonPerson(serverJson);
+  };
 
-JsonRpcContainer.prototype.getFieldsList = function(keys) {
-  // datarequest.js guarantees that keys is an array
-  if (this.hasNoKeys(keys) || this.isWildcardKey(keys[0])) {
-    return [];
-  } else {
-    return keys;
-  }
-};
+  JsonRpcContainer.prototype.getFieldsList = function(keys) {
+    // datarequest.js guarantees that keys is an array
+    if (this.hasNoKeys(keys) || this.isWildcardKey(keys[0])) {
+      return [];
+    } else {
+      return keys;
+    }
+  };
 
-JsonRpcContainer.prototype.hasNoKeys = function(keys) {
-  return !keys || keys.length == 0;
-};
+  JsonRpcContainer.prototype.hasNoKeys = function(keys) {
+    return !keys || keys.length == 0;
+  };
 
-JsonRpcContainer.prototype.isWildcardKey = function(key) {
-  // Some containers support * to mean all keys in the js apis.
-  // This allows the RESTful apis to be compatible with them.
-  return key == "*";
-};
+  JsonRpcContainer.prototype.isWildcardKey = function(key) {
+    // Some containers support * to mean all keys in the js apis.
+    // This allows the RESTful apis to be compatible with them.
+    return key == "*";
+  };
 
-JsonRpcContainer.prototype.newFetchPersonAppDataRequest = function(idSpec, keys,
-    opt_params) {
-  var rpc = { method : "appdata.get" };
-  rpc.params = this.translateIdSpec(idSpec);
-  rpc.params.appId = "@app";
-  rpc.params.fields = this.getFieldsList(keys);
-  if (idSpec.getField('networkDistance')) {
-    rpc.params.networkDistance = idSpec.getField('networkDistance');
-  }
+  JsonRpcContainer.prototype.newFetchPersonAppDataRequest = function(idSpec, keys,
+      opt_params) {
+    var rpc = { method : "appdata.get" };
+    rpc.params = this.translateIdSpec(idSpec);
+    rpc.params.appId = "@app";
+    rpc.params.fields = this.getFieldsList(keys);
+    if (idSpec.getField('networkDistance')) {
+      rpc.params.networkDistance = idSpec.getField('networkDistance');
+    }
 
-  return new JsonRpcRequestItem(rpc,
-      function (appData) {
-        return opensocial.Container.escape(appData, opt_params, true);
-      });
-};
+    return new JsonRpcRequestItem(rpc,
+        function (appData) {
+          return opensocial.Container.escape(appData, opt_params, true);
+        });
+  };
 
-JsonRpcContainer.prototype.newUpdatePersonAppDataRequest = function(id, key,
-    value) {
-  var rpc = { method : "appdata.update" };
-  rpc.params = this.translateIdSpec(this.makeIdSpec(id));
-  rpc.params.appId = "@app";
-  rpc.params.data = {};
-  rpc.params.data[key] = value;
-  rpc.params.fields = key;
-  return new JsonRpcRequestItem(rpc);
-};
+  JsonRpcContainer.prototype.newUpdatePersonAppDataRequest = function(id, key,
+      value) {
+    var rpc = { method : "appdata.update" };
+    rpc.params = this.translateIdSpec(this.makeIdSpec(id));
+    rpc.params.appId = "@app";
+    rpc.params.data = {};
+    rpc.params.data[key] = value;
+    rpc.params.fields = key;
+    return new JsonRpcRequestItem(rpc);
+  };
 
-JsonRpcContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
-  var rpc = { method : "appdata.delete" };
-  rpc.params = this.translateIdSpec(this.makeIdSpec(id));
-  rpc.params.appId = "@app";
-  rpc.params.fields = this.getFieldsList(keys);
+  JsonRpcContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
+    var rpc = { method : "appdata.delete" };
+    rpc.params = this.translateIdSpec(this.makeIdSpec(id));
+    rpc.params.appId = "@app";
+    rpc.params.fields = this.getFieldsList(keys);
 
-  return new JsonRpcRequestItem(rpc);
-};
+    return new JsonRpcRequestItem(rpc);
+  };
 
-JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
-    opt_params) {
-  var rpc = { method : "activities.get" };
-  rpc.params = this.translateIdSpec(idSpec);
-  rpc.params.appId = "@app";
-  if (idSpec.getField('networkDistance')) {
-    rpc.params.networkDistance = idSpec.getField('networkDistance');
-  }
+  JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
+      opt_params) {
+    var rpc = { method : "activities.get" };
+    rpc.params = this.translateIdSpec(idSpec);
+    rpc.params.appId = "@app";
+    if (idSpec.getField('networkDistance')) {
+      rpc.params.networkDistance = idSpec.getField('networkDistance');
+    }
 
-  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);
-      });
-};
+    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.newActivity = function(opt_params) {
-  return new JsonActivity(opt_params, true);
-};
+  JsonRpcContainer.prototype.newActivity = function(opt_params) {
+    return new JsonActivity(opt_params, true);
+  };
 
-JsonRpcContainer.prototype.newMediaItem = function(mimeType, url, opt_params) {
-  opt_params = opt_params || {};
-  opt_params['mimeType'] = mimeType;
-  opt_params['url'] = url;
-  return new JsonMediaItem(opt_params);
-};
+  JsonRpcContainer.prototype.newMediaItem = function(mimeType, url, opt_params) {
+    opt_params = opt_params || {};
+    opt_params['mimeType'] = mimeType;
+    opt_params['url'] = url;
+    return new JsonMediaItem(opt_params);
+  };
 
-JsonRpcContainer.prototype.newCreateActivityRequest = function(idSpec,
-    activity) {
-  var rpc = { method : "activities.create" };
-  rpc.params = this.translateIdSpec(idSpec);
-  rpc.params.appId = "@app";
-  if (idSpec.getField('networkDistance')) {
-    rpc.params.networkDistance = idSpec.getField('networkDistance');
-  }
-  rpc.params.activity = activity.toJsonObject();
+  JsonRpcContainer.prototype.newCreateActivityRequest = function(idSpec,
+      activity) {
+    var rpc = { method : "activities.create" };
+    rpc.params = this.translateIdSpec(idSpec);
+    rpc.params.appId = "@app";
+    if (idSpec.getField('networkDistance')) {
+      rpc.params.networkDistance = idSpec.getField('networkDistance');
+    }
+    rpc.params.activity = activity.toJsonObject();
 
-  return new JsonRpcRequestItem(rpc);
-};
+    return new JsonRpcRequestItem(rpc);
+  };
+})();
 
 var JsonRpcRequestItem = function(rpc, opt_processData) {
   this.rpc = rpc;



Re: svn commit: r731780 - in /incubator/shindig/trunk/features/opensocial-jsonrpc: feature.xml jsonrpccontainer.js

Posted by Kevin Brown <et...@google.com>.
On Fri, Jan 9, 2009 at 4:36 PM, Henning Schmiedehausen <
hgschmie@googlemail.com> wrote:

> That patch contains a large number of space changes / re-indents so
> that the actual functionality is not visible and IMHO not clear. What
> exactly wants this patch to achieve?


That's a strange artifact of diff. I tried to figure out why it was
happening, but it didn't make much sense to me.

What the patch actually does is implement requestShareApp using gadgets.rpc.
This allows the container to act as a gate on the actual sharing.

It occurs to me that we could leave the default implementation as a stub,
but add a new 'opensocial-requestShareApp' feature that would override it.
This way, the opensocial-0.8 feature could depend on that and containers
that chose to implement it in a different way could do that instead.

Really though, I'm not seeing why you'd want to do it a different way:

- Doing it in-gadget exposes an endpoint that the developer could spam.
- Doing it through the REST / JSON-RPC interfaces also exposes a spam point.
In addition, the REST spec doesn't define a wire format for requestShareApp
anyway.

Delegating to the container seems like the only viable option (well, other
than not supporting it).


>
>
>    Ciao
>         Henning
>
> On Mon, Jan 5, 2009 at 16:13,  <et...@apache.org> wrote:
> > Author: etnu
> > Date: Mon Jan  5 16:13:06 2009
> > New Revision: 731780
> >
> > URL: http://svn.apache.org/viewvc?rev=731780&view=rev
> > Log:
> > Applied patch for SHINDIG-780, from Bob Evans. This patch implements
> requestShareApp by delegating to gadgets.rpc.
> >
> >
> > Modified:
> >    incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
> >
>  incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js
> >
> > Modified: incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
> > URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml?rev=731780&r1=731779&r2=731780&view=diff
> >
> ==============================================================================
> > --- incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
> (original)
> > +++ incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml Mon
> Jan  5 16:13:06 2009
> > @@ -20,6 +20,7 @@
> >  <feature>
> >   <name>opensocial-jsonrpc</name>
> >   <dependency>opensocial-base</dependency>
> > +  <dependency>rpc</dependency>
> >   <gadget>
> >     <script src="jsonrpccontainer.js"></script>
> >   </gadget>
> >
> > Modified:
> incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js
> > URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js?rev=731780&r1=731779&r2=731780&view=diff
> >
> ==============================================================================
> > ---
> incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js
> (original)
> > +++
> incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js Mon
> Jan  5 16:13:06 2009
> > @@ -38,338 +38,394 @@
> >   this.baseUrl_ = baseUrl;
> >
> >   this.securityToken_ = shindig.auth.getSecurityToken();
> > -};
> > -JsonRpcContainer.inherits(opensocial.Container);
> >
> > -JsonRpcContainer.prototype.getEnvironment = function() {
> > -  return this.environment_;
> > +  gadgets.rpc.register('shindig.requestShareApp_callback',
> > +      JsonRpcContainer.requestShareAppCallback_);
> >  };
> >
> > -JsonRpcContainer.prototype.requestCreateActivity = function(activity,
> priority,
> > -    opt_callback) {
> > -  opt_callback = opt_callback || function(){};
> > -
> > -  var req = opensocial.newDataRequest();
> > -  var viewer = new opensocial.IdSpec({'userId' : 'VIEWER'});
> > -  req.add(this.newCreateActivityRequest(viewer, activity), 'key');
> > -  req.send(function(response) {
> > -    opt_callback(response.get('key'));
> > -  });
> > -};
> > +(function() {
> > +  var callbackIdStore = {};
> >
> > -JsonRpcContainer.prototype.requestData = function(dataRequest, callback)
> {
> > -  callback = callback || function(){};
> > +  JsonRpcContainer.inherits(opensocial.Container);
> >
> > -  var requestObjects = dataRequest.getRequestObjects();
> > -  var totalRequests = requestObjects.length;
> > +  JsonRpcContainer.prototype.getEnvironment = function() {
> > +    return this.environment_;
> > +  };
> >
> > -  if (totalRequests == 0) {
> > -    window.setTimeout(function() {
> > -      callback(new opensocial.DataResponse({}, true));
> > -    }, 0);
> > -    return;
> > -  }
> > +  JsonRpcContainer.prototype.requestShareApp = function(recipientIds,
> reason,
> > +      opt_callback, opt_params) {
> > +    var callbackId = "cId_" + Math.random();
> > +    callbackIdStore[callbackId] = opt_callback;
> > +
> > +    var body = gadgets.util.unescapeString(reason.getField(
> > +        opensocial.Message.Field.BODY));
> > +
> > +    if (!body || body.length == 0) {
> > +      var bodyMsgKey = gadgets.util.unescapeString(reason.getField(
> > +        opensocial.Message.Field.BODY_ID));
> > +      body = gadgets.Prefs.getMsg(bodyMsgKey);
> > +    }
> >
> > -  var jsonBatchData = new Array(totalRequests);
> > +    gadgets.rpc.call('..', 'shindig.requestShareApp',
> > +        null,
> > +        callbackId,
> > +        recipientIds,
> > +        body);
> > +  };
> > +
> >
> > -  for (var j = 0; j < totalRequests; j++) {
> > -    var requestObject = requestObjects[j];
> > +  /**
> > +   * Receives the returned results from the parent container.
> > +   *
> > +   * @param {boolean} success if false, the message will not be sent
> > +   * @param {string} opt_errorCode an error code if success is false
> > +   * @param {Array.<string>?} recipientIds an array of recipient IDs,
> > +   *     if success is true
> > +   * @private
> > +   */
> > +  JsonRpcContainer.requestShareAppCallback_ = function(callbackId,
> > +      success, opt_errorCode, recipientIds) {
> > +    callback = callbackIdStore[callbackId]
> > +    if (callback) {
> > +      callbackIdStore[callbackId] = null;
> > +
> > +      var data = null;
> > +      if (recipientIds) {
> > +        data = {'recipientIds': recipientIds};
> > +      }
> >
> > -    jsonBatchData[j] = requestObject.request.rpc;
> > -    if (requestObject.key) {
> > -      jsonBatchData[j].id = requestObject.key;
> > +      var responseItem = new opensocial.ResponseItem(null, data,
> opt_errorCode);
> > +      callback(responseItem);
> >     }
> > -  }
> > +  };
> > +
> > +
> > +  JsonRpcContainer.prototype.requestCreateActivity = function(activity,
> priority,
> > +      opt_callback) {
> > +    opt_callback = opt_callback || function(){};
> > +
> > +    var req = opensocial.newDataRequest();
> > +    var viewer = new opensocial.IdSpec({'userId' : 'VIEWER'});
> > +    req.add(this.newCreateActivityRequest(viewer, activity), 'key');
> > +    req.send(function(response) {
> > +      opt_callback(response.get('key'));
> > +    });
> > +  };
> >
> > -  var sendResponse = function(result) {
> > -    if (result.errors[0]) {
> > -      JsonRpcContainer.generateErrorResponse(result, requestObjects,
> callback);
> > +  JsonRpcContainer.prototype.requestData = function(dataRequest,
> callback) {
> > +    callback = callback || function(){};
> > +
> > +    var requestObjects = dataRequest.getRequestObjects();
> > +    var totalRequests = requestObjects.length;
> > +
> > +    if (totalRequests == 0) {
> > +      window.setTimeout(function() {
> > +        callback(new opensocial.DataResponse({}, true));
> > +      }, 0);
> >       return;
> >     }
> >
> > -    result = result.data;
> > +    var jsonBatchData = new Array(totalRequests);
> >
> > -    var globalError = false;
> > -    var responseMap = {};
> > +    for (var j = 0; j < totalRequests; j++) {
> > +      var requestObject = requestObjects[j];
> >
> > -    // Map from indices to ids.
> > -    for (var i = 0; i < result.length; i++) {
> > -      result[result[i].id] = result[i];
> > +      jsonBatchData[j] = requestObject.request.rpc;
> > +      if (requestObject.key) {
> > +        jsonBatchData[j].id = requestObject.key;
> > +      }
> >     }
> >
> > -    for (var k = 0; k < requestObjects.length; k++) {
> > -      var request = requestObjects[k];
> > -      var response = result[k];
> > -
> > -      if (request.key && response.id != request.key) {
> > -        throw "Request key(" + request.key +
> > -            ") and response id(" + response.id + ") do not match";
> > +    var sendResponse = function(result) {
> > +      if (result.errors[0]) {
> > +        JsonRpcContainer.generateErrorResponse(result, requestObjects,
> callback);
> > +        return;
> >       }
> >
> > -      var rawData = response.data;
> > -      var error = response.error;
> > -      var errorMessage = "";
> > +      result = result.data;
> > +
> > +      var globalError = false;
> > +      var responseMap = {};
> >
> > -      if (error) {
> > -        errorMessage = error.message;
> > +      // Map from indices to ids.
> > +      for (var i = 0; i < result.length; i++) {
> > +        result[result[i].id] = result[i];
> >       }
> >
> > -      var processedData = request.request.processResponse(
> > -          request.request, rawData, error, errorMessage);
> > -      globalError = globalError || processedData.hadError();
> > -      if (request.key) {
> > -        responseMap[request.key] = processedData;
> > +      for (var k = 0; k < requestObjects.length; k++) {
> > +        var request = requestObjects[k];
> > +        var response = result[k];
> > +
> > +        if (request.key && response.id != request.key) {
> > +          throw "Request key(" + request.key +
> > +              ") and response id(" + response.id + ") do not match";
> > +        }
> > +
> > +        var rawData = response.data;
> > +        var error = response.error;
> > +        var errorMessage = "";
> > +
> > +        if (error) {
> > +          errorMessage = error.message;
> > +        }
> > +
> > +        var processedData = request.request.processResponse(
> > +            request.request, rawData, error, errorMessage);
> > +        globalError = globalError || processedData.hadError();
> > +        if (request.key) {
> > +          responseMap[request.key] = processedData;
> > +        }
> >       }
> > +
> > +      var dataResponse = new opensocial.DataResponse(responseMap,
> globalError);
> > +      callback(dataResponse);
> > +    };
> > +
> > +    // TODO: get the jsonbatch url from the container config
> > +    var makeRequestParams = {
> > +      "CONTENT_TYPE" : "JSON",
> > +      "METHOD" : "POST",
> > +      "AUTHORIZATION" : "SIGNED",
> > +      "POST_DATA" : gadgets.json.stringify(jsonBatchData)
> > +    };
> > +
> > +    var url = [this.baseUrl_, "/rpc"];
> > +    var token = shindig.auth.getSecurityToken();
> > +    if (token) {
> > +      url.push("?st=", encodeURIComponent(token));
> >     }
> >
> > -    var dataResponse = new opensocial.DataResponse(responseMap,
> globalError);
> > -    callback(dataResponse);
> > +    this.sendRequest(url.join(''), sendResponse, makeRequestParams,
> > +        "application/json");
> >   };
> >
> > -  // TODO: get the jsonbatch url from the container config
> > -  var makeRequestParams = {
> > -    "CONTENT_TYPE" : "JSON",
> > -    "METHOD" : "POST",
> > -    "AUTHORIZATION" : "SIGNED",
> > -    "POST_DATA" : gadgets.json.stringify(jsonBatchData)
> > -  };
> > -
> > -  var url = [this.baseUrl_, "/rpc"];
> > -  var token = shindig.auth.getSecurityToken();
> > -  if (token) {
> > -    url.push("?st=", encodeURIComponent(token));
> > +  JsonRpcContainer.prototype.sendRequest = function(relativeUrl,
> callback, params, contentType) {
> > +    gadgets.io.makeNonProxiedRequest(relativeUrl, callback, params,
> contentType);
> >   }
> >
> > -  this.sendRequest(url.join(''), sendResponse, makeRequestParams,
> > -      "application/json");
> > -};
> > -
> > -JsonRpcContainer.prototype.sendRequest = function(relativeUrl, callback,
> params, contentType) {
> > -  gadgets.io.makeNonProxiedRequest(relativeUrl, callback, params,
> contentType);
> > -}
> > -
> > -JsonRpcContainer.generateErrorResponse = function(result,
> requestObjects,
> > -    callback) {
> > -  var globalErrorCode =
> > -          JsonRpcContainer.translateHttpError(result.errors[0]
> > -                  || result.data.error)
> > -                  || opensocial.ResponseItem.Error.INTERNAL_ERROR;
> > -
> > -  var errorResponseMap = {};
> > -  for (var i = 0; i < requestObjects.length; i++) {
> > -    errorResponseMap[requestObjects[i].key] = new
> opensocial.ResponseItem(
> > -        requestObjects[i].request, null, globalErrorCode);
> > -  }
> > -  callback(new opensocial.DataResponse(errorResponseMap, true));
> > -};
> > -
> > -JsonRpcContainer.translateHttpError = function(httpError) {
> > -  if (httpError == "Error 501") {
> > -    return opensocial.ResponseItem.Error.NOT_IMPLEMENTED;
> > -  } else if (httpError == "Error 401") {
> > -    return opensocial.ResponseItem.Error.UNAUTHORIZED;
> > -  } else if (httpError == "Error 403") {
> > -    return opensocial.ResponseItem.Error.FORBIDDEN;
> > -  } else if (httpError == "Error 400") {
> > -    return opensocial.ResponseItem.Error.BAD_REQUEST;
> > -  } else if (httpError == "Error 500") {
> > -    return opensocial.ResponseItem.Error.INTERNAL_ERROR;
> > -  } else if (httpError == "Error 404") {
> > -    return opensocial.ResponseItem.Error.BAD_REQUEST;
> > -  } else if (httpError == "Error 417") {
> > -    return opensocial.ResponseItem.Error.LIMIT_EXCEEDED;
> > -  }
> > -};
> > +  JsonRpcContainer.generateErrorResponse = function(result,
> requestObjects,
> > +      callback) {
> > +    var globalErrorCode =
> > +            JsonRpcContainer.translateHttpError(result.errors[0]
> > +                    || result.data.error)
> > +                    || opensocial.ResponseItem.Error.INTERNAL_ERROR;
> > +
> > +    var errorResponseMap = {};
> > +    for (var i = 0; i < requestObjects.length; i++) {
> > +      errorResponseMap[requestObjects[i].key] = new
> opensocial.ResponseItem(
> > +          requestObjects[i].request, null, globalErrorCode);
> > +    }
> > +    callback(new opensocial.DataResponse(errorResponseMap, true));
> > +  };
> >
> > -JsonRpcContainer.prototype.makeIdSpec = function(id) {
> > -  return new opensocial.IdSpec({'userId' : id});
> > -};
> > +  JsonRpcContainer.translateHttpError = function(httpError) {
> > +    if (httpError == "Error 501") {
> > +      return opensocial.ResponseItem.Error.NOT_IMPLEMENTED;
> > +    } else if (httpError == "Error 401") {
> > +      return opensocial.ResponseItem.Error.UNAUTHORIZED;
> > +    } else if (httpError == "Error 403") {
> > +      return opensocial.ResponseItem.Error.FORBIDDEN;
> > +    } else if (httpError == "Error 400") {
> > +      return opensocial.ResponseItem.Error.BAD_REQUEST;
> > +    } else if (httpError == "Error 500") {
> > +      return opensocial.ResponseItem.Error.INTERNAL_ERROR;
> > +    } else if (httpError == "Error 404") {
> > +      return opensocial.ResponseItem.Error.BAD_REQUEST;
> > +    } else if (httpError == "Error 417") {
> > +      return opensocial.ResponseItem.Error.LIMIT_EXCEEDED;
> > +    }
> > +  };
> >
> > -JsonRpcContainer.prototype.translateIdSpec = function(newIdSpec) {
> > -  var userIds = newIdSpec.getField('userId');
> > -  var groupId = newIdSpec.getField('groupId');
> > -
> > -  // Upconvert to array for convenience
> > -  if (!opensocial.Container.isArray(userIds)) {
> > -    userIds = [userIds];
> > -  }
> > +  JsonRpcContainer.prototype.makeIdSpec = function(id) {
> > +    return new opensocial.IdSpec({'userId' : id});
> > +  };
> >
> > -  for (var i = 0; i < userIds.length; i++) {
> > -    if (userIds[i] == 'OWNER') {
> > -      userIds[i] = '@owner';
> > -    } else if (userIds[i] == 'VIEWER') {
> > -      userIds[i] = '@viewer';
> > +  JsonRpcContainer.prototype.translateIdSpec = function(newIdSpec) {
> > +    var userIds = newIdSpec.getField('userId');
> > +    var groupId = newIdSpec.getField('groupId');
> > +
> > +    // Upconvert to array for convenience
> > +    if (!opensocial.Container.isArray(userIds)) {
> > +      userIds = [userIds];
> >     }
> > -  }
> >
> > -  if (groupId == 'FRIENDS') {
> > -    groupId = "@friends";
> > -  } else if (groupId == 'SELF' || !groupId) {
> > -    groupId = "@self";
> > -  }
> > +    for (var i = 0; i < userIds.length; i++) {
> > +      if (userIds[i] == 'OWNER') {
> > +        userIds[i] = '@owner';
> > +      } else if (userIds[i] == 'VIEWER') {
> > +        userIds[i] = '@viewer';
> > +      }
> > +    }
> >
> > -  return { userId : userIds, groupId : groupId};
> > -};
> > +    if (groupId == 'FRIENDS') {
> > +      groupId = "@friends";
> > +    } else if (groupId == 'SELF' || !groupId) {
> > +      groupId = "@self";
> > +    }
> >
> > -JsonRpcContainer.prototype.newFetchPersonRequest = function(id,
> opt_params) {
> > -  var peopleRequest = this.newFetchPeopleRequest(
> > -      this.makeIdSpec(id), opt_params);
> > -
> > -  var me = this;
> > -  return new JsonRpcRequestItem(peopleRequest.rpc,
> > -          function(rawJson) {
> > -            return me.createPersonFromJson(rawJson);
> > -          });
> > -};
> > +    return { userId : userIds, groupId : groupId};
> > +  };
> >
> > -JsonRpcContainer.prototype.newFetchPeopleRequest = function(idSpec,
> > -    opt_params) {
> > -  var rpc = { method : "people.get" };
> > -  rpc.params = this.translateIdSpec(idSpec);
> > -  if (opt_params['profileDetail']) {
> > -
>  FieldTranslations.translateJsPersonFieldsToServerFields(opt_params['profileDetail']);
> > -    rpc.params.fields = opt_params['profileDetail'];
> > -  }
> > -  if (opt_params['first']) {
> > -    rpc.params.startIndex = opt_params['first'];
> > -  }
> > -  if (opt_params['max']) {
> > -    rpc.params.count = opt_params['max'];
> > -  }
> > -  if (opt_params['sortOrder']) {
> > -    rpc.params.sortBy = opt_params['sortOrder'];
> > -  }
> > -  if (opt_params['filter']) {
> > -    rpc.params.filterBy = opt_params['filter'];
> > -  }
> > -  if (idSpec.getField('networkDistance')) {
> > -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> > -  }
> > +  JsonRpcContainer.prototype.newFetchPersonRequest = function(id,
> opt_params) {
> > +    var peopleRequest = this.newFetchPeopleRequest(
> > +        this.makeIdSpec(id), opt_params);
> > +
> > +    var me = this;
> > +    return new JsonRpcRequestItem(peopleRequest.rpc,
> > +            function(rawJson) {
> > +              return me.createPersonFromJson(rawJson);
> > +            });
> > +  };
> >
> > -  var me = this;
> > -  return new JsonRpcRequestItem(rpc,
> > -      function(rawJson) {
> > -        var jsonPeople;
> > -        if (rawJson['list']) {
> > -          // For the array of people response
> > -          jsonPeople = rawJson['list'];
> > -        } else {
> > -          // For the single person response
> > -          jsonPeople = [rawJson];
> > -        }
> > +  JsonRpcContainer.prototype.newFetchPeopleRequest = function(idSpec,
> > +      opt_params) {
> > +    var rpc = { method : "people.get" };
> > +    rpc.params = this.translateIdSpec(idSpec);
> > +    if (opt_params['profileDetail']) {
> > +
>  FieldTranslations.translateJsPersonFieldsToServerFields(opt_params['profileDetail']);
> > +      rpc.params.fields = opt_params['profileDetail'];
> > +    }
> > +    if (opt_params['first']) {
> > +      rpc.params.startIndex = opt_params['first'];
> > +    }
> > +    if (opt_params['max']) {
> > +      rpc.params.count = opt_params['max'];
> > +    }
> > +    if (opt_params['sortOrder']) {
> > +      rpc.params.sortBy = opt_params['sortOrder'];
> > +    }
> > +    if (opt_params['filter']) {
> > +      rpc.params.filterBy = opt_params['filter'];
> > +    }
> > +    if (idSpec.getField('networkDistance')) {
> > +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> > +    }
> >
> > -        var people = [];
> > -        for (var i = 0; i < jsonPeople.length; i++) {
> > -          people.push(me.createPersonFromJson(jsonPeople[i]));
> > -        }
> > -        return new opensocial.Collection(people,
> > -            rawJson['startIndex'], rawJson['totalResults']);
> > -      });
> > -};
> > +    var me = this;
> > +    return new JsonRpcRequestItem(rpc,
> > +        function(rawJson) {
> > +          var jsonPeople;
> > +          if (rawJson['list']) {
> > +            // For the array of people response
> > +            jsonPeople = rawJson['list'];
> > +          } else {
> > +            // For the single person response
> > +            jsonPeople = [rawJson];
> > +          }
> > +
> > +          var people = [];
> > +          for (var i = 0; i < jsonPeople.length; i++) {
> > +            people.push(me.createPersonFromJson(jsonPeople[i]));
> > +          }
> > +          return new opensocial.Collection(people,
> > +              rawJson['startIndex'], rawJson['totalResults']);
> > +        });
> > +  };
> >
> > -JsonRpcContainer.prototype.createPersonFromJson = function(serverJson) {
> > -  FieldTranslations.translateServerPersonToJsPerson(serverJson);
> > -  return new JsonPerson(serverJson);
> > -};
> > +  JsonRpcContainer.prototype.createPersonFromJson = function(serverJson)
> {
> > +    FieldTranslations.translateServerPersonToJsPerson(serverJson);
> > +    return new JsonPerson(serverJson);
> > +  };
> >
> > -JsonRpcContainer.prototype.getFieldsList = function(keys) {
> > -  // datarequest.js guarantees that keys is an array
> > -  if (this.hasNoKeys(keys) || this.isWildcardKey(keys[0])) {
> > -    return [];
> > -  } else {
> > -    return keys;
> > -  }
> > -};
> > +  JsonRpcContainer.prototype.getFieldsList = function(keys) {
> > +    // datarequest.js guarantees that keys is an array
> > +    if (this.hasNoKeys(keys) || this.isWildcardKey(keys[0])) {
> > +      return [];
> > +    } else {
> > +      return keys;
> > +    }
> > +  };
> >
> > -JsonRpcContainer.prototype.hasNoKeys = function(keys) {
> > -  return !keys || keys.length == 0;
> > -};
> > +  JsonRpcContainer.prototype.hasNoKeys = function(keys) {
> > +    return !keys || keys.length == 0;
> > +  };
> >
> > -JsonRpcContainer.prototype.isWildcardKey = function(key) {
> > -  // Some containers support * to mean all keys in the js apis.
> > -  // This allows the RESTful apis to be compatible with them.
> > -  return key == "*";
> > -};
> > +  JsonRpcContainer.prototype.isWildcardKey = function(key) {
> > +    // Some containers support * to mean all keys in the js apis.
> > +    // This allows the RESTful apis to be compatible with them.
> > +    return key == "*";
> > +  };
> >
> > -JsonRpcContainer.prototype.newFetchPersonAppDataRequest =
> function(idSpec, keys,
> > -    opt_params) {
> > -  var rpc = { method : "appdata.get" };
> > -  rpc.params = this.translateIdSpec(idSpec);
> > -  rpc.params.appId = "@app";
> > -  rpc.params.fields = this.getFieldsList(keys);
> > -  if (idSpec.getField('networkDistance')) {
> > -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> > -  }
> > +  JsonRpcContainer.prototype.newFetchPersonAppDataRequest =
> function(idSpec, keys,
> > +      opt_params) {
> > +    var rpc = { method : "appdata.get" };
> > +    rpc.params = this.translateIdSpec(idSpec);
> > +    rpc.params.appId = "@app";
> > +    rpc.params.fields = this.getFieldsList(keys);
> > +    if (idSpec.getField('networkDistance')) {
> > +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> > +    }
> >
> > -  return new JsonRpcRequestItem(rpc,
> > -      function (appData) {
> > -        return opensocial.Container.escape(appData, opt_params, true);
> > -      });
> > -};
> > +    return new JsonRpcRequestItem(rpc,
> > +        function (appData) {
> > +          return opensocial.Container.escape(appData, opt_params, true);
> > +        });
> > +  };
> >
> > -JsonRpcContainer.prototype.newUpdatePersonAppDataRequest = function(id,
> key,
> > -    value) {
> > -  var rpc = { method : "appdata.update" };
> > -  rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> > -  rpc.params.appId = "@app";
> > -  rpc.params.data = {};
> > -  rpc.params.data[key] = value;
> > -  rpc.params.fields = key;
> > -  return new JsonRpcRequestItem(rpc);
> > -};
> > +  JsonRpcContainer.prototype.newUpdatePersonAppDataRequest =
> function(id, key,
> > +      value) {
> > +    var rpc = { method : "appdata.update" };
> > +    rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> > +    rpc.params.appId = "@app";
> > +    rpc.params.data = {};
> > +    rpc.params.data[key] = value;
> > +    rpc.params.fields = key;
> > +    return new JsonRpcRequestItem(rpc);
> > +  };
> >
> > -JsonRpcContainer.prototype.newRemovePersonAppDataRequest = function(id,
> keys) {
> > -  var rpc = { method : "appdata.delete" };
> > -  rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> > -  rpc.params.appId = "@app";
> > -  rpc.params.fields = this.getFieldsList(keys);
> > +  JsonRpcContainer.prototype.newRemovePersonAppDataRequest =
> function(id, keys) {
> > +    var rpc = { method : "appdata.delete" };
> > +    rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> > +    rpc.params.appId = "@app";
> > +    rpc.params.fields = this.getFieldsList(keys);
> >
> > -  return new JsonRpcRequestItem(rpc);
> > -};
> > +    return new JsonRpcRequestItem(rpc);
> > +  };
> >
> > -JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
> > -    opt_params) {
> > -  var rpc = { method : "activities.get" };
> > -  rpc.params = this.translateIdSpec(idSpec);
> > -  rpc.params.appId = "@app";
> > -  if (idSpec.getField('networkDistance')) {
> > -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> > -  }
> > +  JsonRpcContainer.prototype.newFetchActivitiesRequest =
> function(idSpec,
> > +      opt_params) {
> > +    var rpc = { method : "activities.get" };
> > +    rpc.params = this.translateIdSpec(idSpec);
> > +    rpc.params.appId = "@app";
> > +    if (idSpec.getField('networkDistance')) {
> > +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> > +    }
> >
> > -  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);
> > -      });
> > -};
> > +    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.newActivity = function(opt_params) {
> > -  return new JsonActivity(opt_params, true);
> > -};
> > +  JsonRpcContainer.prototype.newActivity = function(opt_params) {
> > +    return new JsonActivity(opt_params, true);
> > +  };
> >
> > -JsonRpcContainer.prototype.newMediaItem = function(mimeType, url,
> opt_params) {
> > -  opt_params = opt_params || {};
> > -  opt_params['mimeType'] = mimeType;
> > -  opt_params['url'] = url;
> > -  return new JsonMediaItem(opt_params);
> > -};
> > +  JsonRpcContainer.prototype.newMediaItem = function(mimeType, url,
> opt_params) {
> > +    opt_params = opt_params || {};
> > +    opt_params['mimeType'] = mimeType;
> > +    opt_params['url'] = url;
> > +    return new JsonMediaItem(opt_params);
> > +  };
> >
> > -JsonRpcContainer.prototype.newCreateActivityRequest = function(idSpec,
> > -    activity) {
> > -  var rpc = { method : "activities.create" };
> > -  rpc.params = this.translateIdSpec(idSpec);
> > -  rpc.params.appId = "@app";
> > -  if (idSpec.getField('networkDistance')) {
> > -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> > -  }
> > -  rpc.params.activity = activity.toJsonObject();
> > +  JsonRpcContainer.prototype.newCreateActivityRequest = function(idSpec,
> > +      activity) {
> > +    var rpc = { method : "activities.create" };
> > +    rpc.params = this.translateIdSpec(idSpec);
> > +    rpc.params.appId = "@app";
> > +    if (idSpec.getField('networkDistance')) {
> > +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> > +    }
> > +    rpc.params.activity = activity.toJsonObject();
> >
> > -  return new JsonRpcRequestItem(rpc);
> > -};
> > +    return new JsonRpcRequestItem(rpc);
> > +  };
> > +})();
> >
> >  var JsonRpcRequestItem = function(rpc, opt_processData) {
> >   this.rpc = rpc;
> >
> >
> >
>

Re: svn commit: r731780 - in /incubator/shindig/trunk/features/opensocial-jsonrpc: feature.xml jsonrpccontainer.js

Posted by Henning Schmiedehausen <hg...@googlemail.com>.
That patch contains a large number of space changes / re-indents so
that the actual functionality is not visible and IMHO not clear. What
exactly wants this patch to achieve?

    Ciao
        Henning

On Mon, Jan 5, 2009 at 16:13,  <et...@apache.org> wrote:
> Author: etnu
> Date: Mon Jan  5 16:13:06 2009
> New Revision: 731780
>
> URL: http://svn.apache.org/viewvc?rev=731780&view=rev
> Log:
> Applied patch for SHINDIG-780, from Bob Evans. This patch implements requestShareApp by delegating to gadgets.rpc.
>
>
> Modified:
>    incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
>    incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js
>
> Modified: incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml
> URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml?rev=731780&r1=731779&r2=731780&view=diff
> ==============================================================================
> --- incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml (original)
> +++ incubator/shindig/trunk/features/opensocial-jsonrpc/feature.xml Mon Jan  5 16:13:06 2009
> @@ -20,6 +20,7 @@
>  <feature>
>   <name>opensocial-jsonrpc</name>
>   <dependency>opensocial-base</dependency>
> +  <dependency>rpc</dependency>
>   <gadget>
>     <script src="jsonrpccontainer.js"></script>
>   </gadget>
>
> Modified: incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js
> URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js?rev=731780&r1=731779&r2=731780&view=diff
> ==============================================================================
> --- incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js (original)
> +++ incubator/shindig/trunk/features/opensocial-jsonrpc/jsonrpccontainer.js Mon Jan  5 16:13:06 2009
> @@ -38,338 +38,394 @@
>   this.baseUrl_ = baseUrl;
>
>   this.securityToken_ = shindig.auth.getSecurityToken();
> -};
> -JsonRpcContainer.inherits(opensocial.Container);
>
> -JsonRpcContainer.prototype.getEnvironment = function() {
> -  return this.environment_;
> +  gadgets.rpc.register('shindig.requestShareApp_callback',
> +      JsonRpcContainer.requestShareAppCallback_);
>  };
>
> -JsonRpcContainer.prototype.requestCreateActivity = function(activity, priority,
> -    opt_callback) {
> -  opt_callback = opt_callback || function(){};
> -
> -  var req = opensocial.newDataRequest();
> -  var viewer = new opensocial.IdSpec({'userId' : 'VIEWER'});
> -  req.add(this.newCreateActivityRequest(viewer, activity), 'key');
> -  req.send(function(response) {
> -    opt_callback(response.get('key'));
> -  });
> -};
> +(function() {
> +  var callbackIdStore = {};
>
> -JsonRpcContainer.prototype.requestData = function(dataRequest, callback) {
> -  callback = callback || function(){};
> +  JsonRpcContainer.inherits(opensocial.Container);
>
> -  var requestObjects = dataRequest.getRequestObjects();
> -  var totalRequests = requestObjects.length;
> +  JsonRpcContainer.prototype.getEnvironment = function() {
> +    return this.environment_;
> +  };
>
> -  if (totalRequests == 0) {
> -    window.setTimeout(function() {
> -      callback(new opensocial.DataResponse({}, true));
> -    }, 0);
> -    return;
> -  }
> +  JsonRpcContainer.prototype.requestShareApp = function(recipientIds, reason,
> +      opt_callback, opt_params) {
> +    var callbackId = "cId_" + Math.random();
> +    callbackIdStore[callbackId] = opt_callback;
> +
> +    var body = gadgets.util.unescapeString(reason.getField(
> +        opensocial.Message.Field.BODY));
> +
> +    if (!body || body.length == 0) {
> +      var bodyMsgKey = gadgets.util.unescapeString(reason.getField(
> +        opensocial.Message.Field.BODY_ID));
> +      body = gadgets.Prefs.getMsg(bodyMsgKey);
> +    }
>
> -  var jsonBatchData = new Array(totalRequests);
> +    gadgets.rpc.call('..', 'shindig.requestShareApp',
> +        null,
> +        callbackId,
> +        recipientIds,
> +        body);
> +  };
> +
>
> -  for (var j = 0; j < totalRequests; j++) {
> -    var requestObject = requestObjects[j];
> +  /**
> +   * Receives the returned results from the parent container.
> +   *
> +   * @param {boolean} success if false, the message will not be sent
> +   * @param {string} opt_errorCode an error code if success is false
> +   * @param {Array.<string>?} recipientIds an array of recipient IDs,
> +   *     if success is true
> +   * @private
> +   */
> +  JsonRpcContainer.requestShareAppCallback_ = function(callbackId,
> +      success, opt_errorCode, recipientIds) {
> +    callback = callbackIdStore[callbackId]
> +    if (callback) {
> +      callbackIdStore[callbackId] = null;
> +
> +      var data = null;
> +      if (recipientIds) {
> +        data = {'recipientIds': recipientIds};
> +      }
>
> -    jsonBatchData[j] = requestObject.request.rpc;
> -    if (requestObject.key) {
> -      jsonBatchData[j].id = requestObject.key;
> +      var responseItem = new opensocial.ResponseItem(null, data, opt_errorCode);
> +      callback(responseItem);
>     }
> -  }
> +  };
> +
> +
> +  JsonRpcContainer.prototype.requestCreateActivity = function(activity, priority,
> +      opt_callback) {
> +    opt_callback = opt_callback || function(){};
> +
> +    var req = opensocial.newDataRequest();
> +    var viewer = new opensocial.IdSpec({'userId' : 'VIEWER'});
> +    req.add(this.newCreateActivityRequest(viewer, activity), 'key');
> +    req.send(function(response) {
> +      opt_callback(response.get('key'));
> +    });
> +  };
>
> -  var sendResponse = function(result) {
> -    if (result.errors[0]) {
> -      JsonRpcContainer.generateErrorResponse(result, requestObjects, callback);
> +  JsonRpcContainer.prototype.requestData = function(dataRequest, callback) {
> +    callback = callback || function(){};
> +
> +    var requestObjects = dataRequest.getRequestObjects();
> +    var totalRequests = requestObjects.length;
> +
> +    if (totalRequests == 0) {
> +      window.setTimeout(function() {
> +        callback(new opensocial.DataResponse({}, true));
> +      }, 0);
>       return;
>     }
>
> -    result = result.data;
> +    var jsonBatchData = new Array(totalRequests);
>
> -    var globalError = false;
> -    var responseMap = {};
> +    for (var j = 0; j < totalRequests; j++) {
> +      var requestObject = requestObjects[j];
>
> -    // Map from indices to ids.
> -    for (var i = 0; i < result.length; i++) {
> -      result[result[i].id] = result[i];
> +      jsonBatchData[j] = requestObject.request.rpc;
> +      if (requestObject.key) {
> +        jsonBatchData[j].id = requestObject.key;
> +      }
>     }
>
> -    for (var k = 0; k < requestObjects.length; k++) {
> -      var request = requestObjects[k];
> -      var response = result[k];
> -
> -      if (request.key && response.id != request.key) {
> -        throw "Request key(" + request.key +
> -            ") and response id(" + response.id + ") do not match";
> +    var sendResponse = function(result) {
> +      if (result.errors[0]) {
> +        JsonRpcContainer.generateErrorResponse(result, requestObjects, callback);
> +        return;
>       }
>
> -      var rawData = response.data;
> -      var error = response.error;
> -      var errorMessage = "";
> +      result = result.data;
> +
> +      var globalError = false;
> +      var responseMap = {};
>
> -      if (error) {
> -        errorMessage = error.message;
> +      // Map from indices to ids.
> +      for (var i = 0; i < result.length; i++) {
> +        result[result[i].id] = result[i];
>       }
>
> -      var processedData = request.request.processResponse(
> -          request.request, rawData, error, errorMessage);
> -      globalError = globalError || processedData.hadError();
> -      if (request.key) {
> -        responseMap[request.key] = processedData;
> +      for (var k = 0; k < requestObjects.length; k++) {
> +        var request = requestObjects[k];
> +        var response = result[k];
> +
> +        if (request.key && response.id != request.key) {
> +          throw "Request key(" + request.key +
> +              ") and response id(" + response.id + ") do not match";
> +        }
> +
> +        var rawData = response.data;
> +        var error = response.error;
> +        var errorMessage = "";
> +
> +        if (error) {
> +          errorMessage = error.message;
> +        }
> +
> +        var processedData = request.request.processResponse(
> +            request.request, rawData, error, errorMessage);
> +        globalError = globalError || processedData.hadError();
> +        if (request.key) {
> +          responseMap[request.key] = processedData;
> +        }
>       }
> +
> +      var dataResponse = new opensocial.DataResponse(responseMap, globalError);
> +      callback(dataResponse);
> +    };
> +
> +    // TODO: get the jsonbatch url from the container config
> +    var makeRequestParams = {
> +      "CONTENT_TYPE" : "JSON",
> +      "METHOD" : "POST",
> +      "AUTHORIZATION" : "SIGNED",
> +      "POST_DATA" : gadgets.json.stringify(jsonBatchData)
> +    };
> +
> +    var url = [this.baseUrl_, "/rpc"];
> +    var token = shindig.auth.getSecurityToken();
> +    if (token) {
> +      url.push("?st=", encodeURIComponent(token));
>     }
>
> -    var dataResponse = new opensocial.DataResponse(responseMap, globalError);
> -    callback(dataResponse);
> +    this.sendRequest(url.join(''), sendResponse, makeRequestParams,
> +        "application/json");
>   };
>
> -  // TODO: get the jsonbatch url from the container config
> -  var makeRequestParams = {
> -    "CONTENT_TYPE" : "JSON",
> -    "METHOD" : "POST",
> -    "AUTHORIZATION" : "SIGNED",
> -    "POST_DATA" : gadgets.json.stringify(jsonBatchData)
> -  };
> -
> -  var url = [this.baseUrl_, "/rpc"];
> -  var token = shindig.auth.getSecurityToken();
> -  if (token) {
> -    url.push("?st=", encodeURIComponent(token));
> +  JsonRpcContainer.prototype.sendRequest = function(relativeUrl, callback, params, contentType) {
> +    gadgets.io.makeNonProxiedRequest(relativeUrl, callback, params, contentType);
>   }
>
> -  this.sendRequest(url.join(''), sendResponse, makeRequestParams,
> -      "application/json");
> -};
> -
> -JsonRpcContainer.prototype.sendRequest = function(relativeUrl, callback, params, contentType) {
> -  gadgets.io.makeNonProxiedRequest(relativeUrl, callback, params, contentType);
> -}
> -
> -JsonRpcContainer.generateErrorResponse = function(result, requestObjects,
> -    callback) {
> -  var globalErrorCode =
> -          JsonRpcContainer.translateHttpError(result.errors[0]
> -                  || result.data.error)
> -                  || opensocial.ResponseItem.Error.INTERNAL_ERROR;
> -
> -  var errorResponseMap = {};
> -  for (var i = 0; i < requestObjects.length; i++) {
> -    errorResponseMap[requestObjects[i].key] = new opensocial.ResponseItem(
> -        requestObjects[i].request, null, globalErrorCode);
> -  }
> -  callback(new opensocial.DataResponse(errorResponseMap, true));
> -};
> -
> -JsonRpcContainer.translateHttpError = function(httpError) {
> -  if (httpError == "Error 501") {
> -    return opensocial.ResponseItem.Error.NOT_IMPLEMENTED;
> -  } else if (httpError == "Error 401") {
> -    return opensocial.ResponseItem.Error.UNAUTHORIZED;
> -  } else if (httpError == "Error 403") {
> -    return opensocial.ResponseItem.Error.FORBIDDEN;
> -  } else if (httpError == "Error 400") {
> -    return opensocial.ResponseItem.Error.BAD_REQUEST;
> -  } else if (httpError == "Error 500") {
> -    return opensocial.ResponseItem.Error.INTERNAL_ERROR;
> -  } else if (httpError == "Error 404") {
> -    return opensocial.ResponseItem.Error.BAD_REQUEST;
> -  } else if (httpError == "Error 417") {
> -    return opensocial.ResponseItem.Error.LIMIT_EXCEEDED;
> -  }
> -};
> +  JsonRpcContainer.generateErrorResponse = function(result, requestObjects,
> +      callback) {
> +    var globalErrorCode =
> +            JsonRpcContainer.translateHttpError(result.errors[0]
> +                    || result.data.error)
> +                    || opensocial.ResponseItem.Error.INTERNAL_ERROR;
> +
> +    var errorResponseMap = {};
> +    for (var i = 0; i < requestObjects.length; i++) {
> +      errorResponseMap[requestObjects[i].key] = new opensocial.ResponseItem(
> +          requestObjects[i].request, null, globalErrorCode);
> +    }
> +    callback(new opensocial.DataResponse(errorResponseMap, true));
> +  };
>
> -JsonRpcContainer.prototype.makeIdSpec = function(id) {
> -  return new opensocial.IdSpec({'userId' : id});
> -};
> +  JsonRpcContainer.translateHttpError = function(httpError) {
> +    if (httpError == "Error 501") {
> +      return opensocial.ResponseItem.Error.NOT_IMPLEMENTED;
> +    } else if (httpError == "Error 401") {
> +      return opensocial.ResponseItem.Error.UNAUTHORIZED;
> +    } else if (httpError == "Error 403") {
> +      return opensocial.ResponseItem.Error.FORBIDDEN;
> +    } else if (httpError == "Error 400") {
> +      return opensocial.ResponseItem.Error.BAD_REQUEST;
> +    } else if (httpError == "Error 500") {
> +      return opensocial.ResponseItem.Error.INTERNAL_ERROR;
> +    } else if (httpError == "Error 404") {
> +      return opensocial.ResponseItem.Error.BAD_REQUEST;
> +    } else if (httpError == "Error 417") {
> +      return opensocial.ResponseItem.Error.LIMIT_EXCEEDED;
> +    }
> +  };
>
> -JsonRpcContainer.prototype.translateIdSpec = function(newIdSpec) {
> -  var userIds = newIdSpec.getField('userId');
> -  var groupId = newIdSpec.getField('groupId');
> -
> -  // Upconvert to array for convenience
> -  if (!opensocial.Container.isArray(userIds)) {
> -    userIds = [userIds];
> -  }
> +  JsonRpcContainer.prototype.makeIdSpec = function(id) {
> +    return new opensocial.IdSpec({'userId' : id});
> +  };
>
> -  for (var i = 0; i < userIds.length; i++) {
> -    if (userIds[i] == 'OWNER') {
> -      userIds[i] = '@owner';
> -    } else if (userIds[i] == 'VIEWER') {
> -      userIds[i] = '@viewer';
> +  JsonRpcContainer.prototype.translateIdSpec = function(newIdSpec) {
> +    var userIds = newIdSpec.getField('userId');
> +    var groupId = newIdSpec.getField('groupId');
> +
> +    // Upconvert to array for convenience
> +    if (!opensocial.Container.isArray(userIds)) {
> +      userIds = [userIds];
>     }
> -  }
>
> -  if (groupId == 'FRIENDS') {
> -    groupId = "@friends";
> -  } else if (groupId == 'SELF' || !groupId) {
> -    groupId = "@self";
> -  }
> +    for (var i = 0; i < userIds.length; i++) {
> +      if (userIds[i] == 'OWNER') {
> +        userIds[i] = '@owner';
> +      } else if (userIds[i] == 'VIEWER') {
> +        userIds[i] = '@viewer';
> +      }
> +    }
>
> -  return { userId : userIds, groupId : groupId};
> -};
> +    if (groupId == 'FRIENDS') {
> +      groupId = "@friends";
> +    } else if (groupId == 'SELF' || !groupId) {
> +      groupId = "@self";
> +    }
>
> -JsonRpcContainer.prototype.newFetchPersonRequest = function(id, opt_params) {
> -  var peopleRequest = this.newFetchPeopleRequest(
> -      this.makeIdSpec(id), opt_params);
> -
> -  var me = this;
> -  return new JsonRpcRequestItem(peopleRequest.rpc,
> -          function(rawJson) {
> -            return me.createPersonFromJson(rawJson);
> -          });
> -};
> +    return { userId : userIds, groupId : groupId};
> +  };
>
> -JsonRpcContainer.prototype.newFetchPeopleRequest = function(idSpec,
> -    opt_params) {
> -  var rpc = { method : "people.get" };
> -  rpc.params = this.translateIdSpec(idSpec);
> -  if (opt_params['profileDetail']) {
> -    FieldTranslations.translateJsPersonFieldsToServerFields(opt_params['profileDetail']);
> -    rpc.params.fields = opt_params['profileDetail'];
> -  }
> -  if (opt_params['first']) {
> -    rpc.params.startIndex = opt_params['first'];
> -  }
> -  if (opt_params['max']) {
> -    rpc.params.count = opt_params['max'];
> -  }
> -  if (opt_params['sortOrder']) {
> -    rpc.params.sortBy = opt_params['sortOrder'];
> -  }
> -  if (opt_params['filter']) {
> -    rpc.params.filterBy = opt_params['filter'];
> -  }
> -  if (idSpec.getField('networkDistance')) {
> -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> -  }
> +  JsonRpcContainer.prototype.newFetchPersonRequest = function(id, opt_params) {
> +    var peopleRequest = this.newFetchPeopleRequest(
> +        this.makeIdSpec(id), opt_params);
> +
> +    var me = this;
> +    return new JsonRpcRequestItem(peopleRequest.rpc,
> +            function(rawJson) {
> +              return me.createPersonFromJson(rawJson);
> +            });
> +  };
>
> -  var me = this;
> -  return new JsonRpcRequestItem(rpc,
> -      function(rawJson) {
> -        var jsonPeople;
> -        if (rawJson['list']) {
> -          // For the array of people response
> -          jsonPeople = rawJson['list'];
> -        } else {
> -          // For the single person response
> -          jsonPeople = [rawJson];
> -        }
> +  JsonRpcContainer.prototype.newFetchPeopleRequest = function(idSpec,
> +      opt_params) {
> +    var rpc = { method : "people.get" };
> +    rpc.params = this.translateIdSpec(idSpec);
> +    if (opt_params['profileDetail']) {
> +      FieldTranslations.translateJsPersonFieldsToServerFields(opt_params['profileDetail']);
> +      rpc.params.fields = opt_params['profileDetail'];
> +    }
> +    if (opt_params['first']) {
> +      rpc.params.startIndex = opt_params['first'];
> +    }
> +    if (opt_params['max']) {
> +      rpc.params.count = opt_params['max'];
> +    }
> +    if (opt_params['sortOrder']) {
> +      rpc.params.sortBy = opt_params['sortOrder'];
> +    }
> +    if (opt_params['filter']) {
> +      rpc.params.filterBy = opt_params['filter'];
> +    }
> +    if (idSpec.getField('networkDistance')) {
> +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> +    }
>
> -        var people = [];
> -        for (var i = 0; i < jsonPeople.length; i++) {
> -          people.push(me.createPersonFromJson(jsonPeople[i]));
> -        }
> -        return new opensocial.Collection(people,
> -            rawJson['startIndex'], rawJson['totalResults']);
> -      });
> -};
> +    var me = this;
> +    return new JsonRpcRequestItem(rpc,
> +        function(rawJson) {
> +          var jsonPeople;
> +          if (rawJson['list']) {
> +            // For the array of people response
> +            jsonPeople = rawJson['list'];
> +          } else {
> +            // For the single person response
> +            jsonPeople = [rawJson];
> +          }
> +
> +          var people = [];
> +          for (var i = 0; i < jsonPeople.length; i++) {
> +            people.push(me.createPersonFromJson(jsonPeople[i]));
> +          }
> +          return new opensocial.Collection(people,
> +              rawJson['startIndex'], rawJson['totalResults']);
> +        });
> +  };
>
> -JsonRpcContainer.prototype.createPersonFromJson = function(serverJson) {
> -  FieldTranslations.translateServerPersonToJsPerson(serverJson);
> -  return new JsonPerson(serverJson);
> -};
> +  JsonRpcContainer.prototype.createPersonFromJson = function(serverJson) {
> +    FieldTranslations.translateServerPersonToJsPerson(serverJson);
> +    return new JsonPerson(serverJson);
> +  };
>
> -JsonRpcContainer.prototype.getFieldsList = function(keys) {
> -  // datarequest.js guarantees that keys is an array
> -  if (this.hasNoKeys(keys) || this.isWildcardKey(keys[0])) {
> -    return [];
> -  } else {
> -    return keys;
> -  }
> -};
> +  JsonRpcContainer.prototype.getFieldsList = function(keys) {
> +    // datarequest.js guarantees that keys is an array
> +    if (this.hasNoKeys(keys) || this.isWildcardKey(keys[0])) {
> +      return [];
> +    } else {
> +      return keys;
> +    }
> +  };
>
> -JsonRpcContainer.prototype.hasNoKeys = function(keys) {
> -  return !keys || keys.length == 0;
> -};
> +  JsonRpcContainer.prototype.hasNoKeys = function(keys) {
> +    return !keys || keys.length == 0;
> +  };
>
> -JsonRpcContainer.prototype.isWildcardKey = function(key) {
> -  // Some containers support * to mean all keys in the js apis.
> -  // This allows the RESTful apis to be compatible with them.
> -  return key == "*";
> -};
> +  JsonRpcContainer.prototype.isWildcardKey = function(key) {
> +    // Some containers support * to mean all keys in the js apis.
> +    // This allows the RESTful apis to be compatible with them.
> +    return key == "*";
> +  };
>
> -JsonRpcContainer.prototype.newFetchPersonAppDataRequest = function(idSpec, keys,
> -    opt_params) {
> -  var rpc = { method : "appdata.get" };
> -  rpc.params = this.translateIdSpec(idSpec);
> -  rpc.params.appId = "@app";
> -  rpc.params.fields = this.getFieldsList(keys);
> -  if (idSpec.getField('networkDistance')) {
> -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> -  }
> +  JsonRpcContainer.prototype.newFetchPersonAppDataRequest = function(idSpec, keys,
> +      opt_params) {
> +    var rpc = { method : "appdata.get" };
> +    rpc.params = this.translateIdSpec(idSpec);
> +    rpc.params.appId = "@app";
> +    rpc.params.fields = this.getFieldsList(keys);
> +    if (idSpec.getField('networkDistance')) {
> +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> +    }
>
> -  return new JsonRpcRequestItem(rpc,
> -      function (appData) {
> -        return opensocial.Container.escape(appData, opt_params, true);
> -      });
> -};
> +    return new JsonRpcRequestItem(rpc,
> +        function (appData) {
> +          return opensocial.Container.escape(appData, opt_params, true);
> +        });
> +  };
>
> -JsonRpcContainer.prototype.newUpdatePersonAppDataRequest = function(id, key,
> -    value) {
> -  var rpc = { method : "appdata.update" };
> -  rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> -  rpc.params.appId = "@app";
> -  rpc.params.data = {};
> -  rpc.params.data[key] = value;
> -  rpc.params.fields = key;
> -  return new JsonRpcRequestItem(rpc);
> -};
> +  JsonRpcContainer.prototype.newUpdatePersonAppDataRequest = function(id, key,
> +      value) {
> +    var rpc = { method : "appdata.update" };
> +    rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> +    rpc.params.appId = "@app";
> +    rpc.params.data = {};
> +    rpc.params.data[key] = value;
> +    rpc.params.fields = key;
> +    return new JsonRpcRequestItem(rpc);
> +  };
>
> -JsonRpcContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
> -  var rpc = { method : "appdata.delete" };
> -  rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> -  rpc.params.appId = "@app";
> -  rpc.params.fields = this.getFieldsList(keys);
> +  JsonRpcContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
> +    var rpc = { method : "appdata.delete" };
> +    rpc.params = this.translateIdSpec(this.makeIdSpec(id));
> +    rpc.params.appId = "@app";
> +    rpc.params.fields = this.getFieldsList(keys);
>
> -  return new JsonRpcRequestItem(rpc);
> -};
> +    return new JsonRpcRequestItem(rpc);
> +  };
>
> -JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
> -    opt_params) {
> -  var rpc = { method : "activities.get" };
> -  rpc.params = this.translateIdSpec(idSpec);
> -  rpc.params.appId = "@app";
> -  if (idSpec.getField('networkDistance')) {
> -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> -  }
> +  JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
> +      opt_params) {
> +    var rpc = { method : "activities.get" };
> +    rpc.params = this.translateIdSpec(idSpec);
> +    rpc.params.appId = "@app";
> +    if (idSpec.getField('networkDistance')) {
> +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> +    }
>
> -  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);
> -      });
> -};
> +    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.newActivity = function(opt_params) {
> -  return new JsonActivity(opt_params, true);
> -};
> +  JsonRpcContainer.prototype.newActivity = function(opt_params) {
> +    return new JsonActivity(opt_params, true);
> +  };
>
> -JsonRpcContainer.prototype.newMediaItem = function(mimeType, url, opt_params) {
> -  opt_params = opt_params || {};
> -  opt_params['mimeType'] = mimeType;
> -  opt_params['url'] = url;
> -  return new JsonMediaItem(opt_params);
> -};
> +  JsonRpcContainer.prototype.newMediaItem = function(mimeType, url, opt_params) {
> +    opt_params = opt_params || {};
> +    opt_params['mimeType'] = mimeType;
> +    opt_params['url'] = url;
> +    return new JsonMediaItem(opt_params);
> +  };
>
> -JsonRpcContainer.prototype.newCreateActivityRequest = function(idSpec,
> -    activity) {
> -  var rpc = { method : "activities.create" };
> -  rpc.params = this.translateIdSpec(idSpec);
> -  rpc.params.appId = "@app";
> -  if (idSpec.getField('networkDistance')) {
> -    rpc.params.networkDistance = idSpec.getField('networkDistance');
> -  }
> -  rpc.params.activity = activity.toJsonObject();
> +  JsonRpcContainer.prototype.newCreateActivityRequest = function(idSpec,
> +      activity) {
> +    var rpc = { method : "activities.create" };
> +    rpc.params = this.translateIdSpec(idSpec);
> +    rpc.params.appId = "@app";
> +    if (idSpec.getField('networkDistance')) {
> +      rpc.params.networkDistance = idSpec.getField('networkDistance');
> +    }
> +    rpc.params.activity = activity.toJsonObject();
>
> -  return new JsonRpcRequestItem(rpc);
> -};
> +    return new JsonRpcRequestItem(rpc);
> +  };
> +})();
>
>  var JsonRpcRequestItem = function(rpc, opt_processData) {
>   this.rpc = rpc;
>
>
>