[opensocial-ruby-client] r36 committed - Support for OpenSocial 0.9 spec + some MySpace specific classes.

0 views
Skip to first unread message

codesite...@google.com

unread,
Nov 4, 2009, 7:44:27 PM11/4/09
to opensocial-cl...@googlegroups.com
Revision: 36
Author: zlu...@myspace.com
Date: Wed Nov 4 16:43:36 2009
Log: Support for OpenSocial 0.9 spec + some MySpace specific classes.
http://code.google.com/p/opensocial-ruby-client/source/detail?r=36

Added:
/trunk/lib/opensocial/album.rb
/trunk/lib/opensocial/media.rb
/trunk/lib/opensocial/messaging.rb
/trunk/lib/opensocial/notification.rb
/trunk/lib/opensocial/profilecomment.rb
/trunk/lib/opensocial/statusmood.rb
/trunk/lib/opensocial/statusmoodcomment.rb
Modified:
/trunk/lib/opensocial/activity.rb
/trunk/lib/opensocial/appdata.rb
/trunk/lib/opensocial/connection.rb
/trunk/lib/opensocial/group.rb
/trunk/lib/opensocial/person.rb
/trunk/lib/opensocial/request.rb

=======================================
--- /dev/null
+++ /trunk/lib/opensocial/album.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,137 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class Album < Base
+
+ def initialize(json)
+ set_values(json)
+ if @album
+ set_values(@album)
+ @album = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of albums for a given
+ # user or set of users.
+ #
+ # The FetchAlbumssRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of albums. As parameters, it accepts
+ # a user ID and selector (and optionally an ID of a particular album).
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+ class FetchAlbumsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'albums'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'albums'
+
+ # Initializes a request to fetch albums for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(Album, json['entry'])
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(Album, response['data'])
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => @@RPC_SERVICE + @@GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+
+ end
+
+ # Provides the ability to update the album for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateAlbumsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'albums'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'albums'
+
+ # Initializes a request to update(Post, Put, Delete) albums for the
specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+
+
+
+ end
+
+end
=======================================
--- /dev/null
+++ /trunk/lib/opensocial/media.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,135 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class MediaItem < Base
+
+ def initialize(json)
+ set_values(json)
+ if @mediaItem
+ set_values(@mediaItem)
+ @mediaItem = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of media items for a given
+ # user or set of users.
+ #
+ # The FetchMediaItemsRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of mediaItems. As parameters, it accepts
+ # a user ID and selector (and optionally an ID of a particular album).
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+
+ class FetchMediaItemsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'mediaItems'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'mediaItems'
+
+ # Initializes a request to fetch mediaItems for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(MediaItem, json['entry'])
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(MediaItem, response['data'])
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => @@RPC_SERVICE + @@GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+
+ end
+
+ # Provides the ability to update the mediaItem for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateMediaItemsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'mediaItems'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'mediaItems'
+
+ # Initializes a request to update mediaItem for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+ end
+
+end
=======================================
--- /dev/null
+++ /trunk/lib/opensocial/messaging.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,137 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class Message < Base
+
+ def initialize(json)
+ set_values(json)
+ if @message
+ set_values(@message)
+ @message = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of messages for a given
+ # user or set of users.
+ #
+ # *** NOTE***
+ #This operation (Get) may not be supported by the 0.9 spec. The class
+ # is provided for completeness.
+ #
+ # The FetchMessagesRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of messages. As parameters, it accepts
+ # a user ID and selector .
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+ class FetchMessagesRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'messaging'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'messaging'
+
+ # Initializes a request to fetch messages for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(Message, json['entry'])
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(Message, response['data'])
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => @@RPC_SERVICE + @@GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+ end
+
+ # Provides the ability to update the message for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateMessagesRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'messaging'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'messaging'
+
+ # Initializes a request to update message(s) for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+ end
+
+end
=======================================
--- /dev/null
+++ /trunk/lib/opensocial/notification.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,139 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class Notification < Base
+
+ def initialize(json)
+ set_values(json)
+ if @notification
+ set_values(@notification)
+ @notification = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of notifications for a
given
+ # user or set of users.
+ #
+ # *** NOTE***
+ #This operation (Get) may not be supported by the 0.9 spec. The class
+ # is provided for completeness.
+ #
+ # The FetchNotificationsRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of notifications. As parameters, it accepts
+ # a user ID and selector .
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+ class FetchNotificationsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'notifications'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'notifications'
+
+ # Initializes a request to fetch notifications for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(Notification, json['entry'])
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(Notification, response['data'])
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => @@RPC_SERVICE + @@GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+
+ end
+
+ # Provides the ability to update the notification for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateNotificationsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'notifications'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'notifications'
+
+ # Initializes a request to update notifications for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+
+ end
+
+end
=======================================
--- /dev/null
+++ /trunk/lib/opensocial/profilecomment.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,135 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class ProfileComment < Base
+
+ def initialize(json)
+ set_values(json)
+ if @profileComment
+ set_values(@profileComments)
+ @profileComment = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of profileComments for a
given
+ # user or set of users.
+ #
+ # The FetchProfileCommentsRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of profileComments. As parameters, it accepts
+ # a user ID and selector (and optionally an ID of a particular
profileComment).
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+ class FetchProfileCommentsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'profileComments'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'profileComments'
+
+ # Initializes a request to fetch profileComments for the specified user
and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return parse_response(ProfileComment, json['entry'])
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(ProfileComment, response['data'])
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => @@RPC_SERVICE + @@GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+
+ end
+
+ # Provides the ability to update the profilecomment for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateProfileCommentsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'profileComments'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'profileComments'
+
+ # Initializes a request to update profileComments for the specified user
and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+
+ end
+
+end
=======================================
--- /dev/null
+++ /trunk/lib/opensocial/statusmood.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,150 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class StatusMood < Base
+
+ def initialize(json)
+ set_values(json)
+ if @statusMood
+ set_values(@statusMood)
+ @statusMood = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of statusMoods for a given
+ # user or set of users.
+ #
+ # The FetchStatusMoodRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of statusMoods. As parameters, it accepts
+ # a user ID and selector (and optionally an ID of a particular
statusMoods).
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+ class FetchStatusMoodRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'statusMood'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'statusMood'
+
+ # Initializes a request to fetch statusMoods for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(StatusMood, json)
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(StatusMood, response['data'])
+ end
+
+ # This method is overloaded since the format of the returned data is
different than in other cases
+ def parse_response(className, response)
+ objectCollection = Collection.new
+
+ if( response.nil? )
+ return objectCollection
+ end
+
+ objectInstance = className.new(response)
+ objectCollection[objectInstance.user_id] = objectInstance
+
+ return objectCollection
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => @@RPC_SERVICE + @@GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+
+ end
+
+
+ # Provides the ability to update the statusMood for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateStatusMoodRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'statusMood'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'statusMood'
+
+ # Initializes a request to update statusMoods for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+
+ end
+
+end
=======================================
--- /dev/null
+++ /trunk/lib/opensocial/statusmoodcomment.rb Wed Nov 4 16:43:36 2009
@@ -0,0 +1,136 @@
+# Copyright (c) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+module OpenSocial #:nodoc:
+
+ class StatusMoodComment < Base
+
+ def initialize(json)
+ set_values(json)
+ if @statusMoodcomment
+ set_values(@statusMoodComment)
+ @statusMoodComment = nil
+ end
+ end
+
+ def set_values(json)
+ if json
+ json.each do |key, value|
+ proper_key = key.snake_case
+ begin
+ self.send("#{proper_key}=", value)
+ rescue NoMethodError
+ add_attr(proper_key)
+ self.send("#{proper_key}=", value)
+ end
+ end
+ end
+ end
+
+ end
+
+ # Provides the ability to request a Collection of statusMoodComments for
a given
+ # user or set of users.
+ #
+ # The FetchStatusMoodRequest wraps a simple request to an OpenSocial
+ # endpoint for a Collection of statusMoodComments. As parameters, it
accepts
+ # a user ID and selector (and optionally an ID of a particular
statusMoodComments).
+ # This request may be used, standalone, by calling send, or bundled into
+ # an RpcRequest.
+ #
+ class FetchStatusMoodCommentsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'statusMoodComments'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'statusMoodComments'
+
+ # Initializes a request to fetch statusMoodComments for the specified
user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(StatusMoodComment, json['entry'])
+ end
+
+ # Selects the appropriate fragment from the JSON response in order to
+ # create a native object.
+ def parse_rpc_response(response)
+ return parse_response(StatusMoodComment, response['data'])
+ end
+
+ # Converts the request into a JSON fragment that can be used as part of a
+ # larger RpcRequest.
+ def to_json(*a)
+ value = {
+ 'method' => RPC_SERVICE + GET,
+ 'params' => {
+ 'userId' => ["#{@guid}"],
+ 'groupId' => "#{@selector}",
+ 'appId' => "#{@pid}",
+ 'fields' => []
+ },
+ 'id' => @key
+ }.to_json(*a)
+ end
+
+ end
+
+ # Provides the ability to update the statusMoodComment for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateStatusMoodCommentsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'statusMoodComments'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'statusMoodComments'
+
+ # Initializes a request to update statusMoodComment for the specified
user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+
+ end
+
+
+end
=======================================
--- /trunk/lib/opensocial/activity.rb Mon Sep 21 11:54:56 2009
+++ /trunk/lib/opensocial/activity.rb Wed Nov 4 16:43:36 2009
@@ -61,15 +61,13 @@
# This request may be used, standalone, by calling send, or bundled into
# an RpcRequest.
#
-
-
class FetchActivitiesRequest < Request
# Defines the service fragment for use in constructing the request URL
or
# JSON
- SERVICE = 'activities'
+ @@SERVICE = 'activities'

# This is only necessary because of a spec inconsistency
- RPC_SERVICE = 'activity'
+ @@RPC_SERVICE = 'activity'

# Initializes a request to fetch activities for the specified user and
# group, or the default (@me, @self). A valid Connection is not
necessary
@@ -82,22 +80,22 @@
# Sends the request, passing in the appropriate SERVICE and specified
# instance variables.
def send
- json = send_request(SERVICE, @guid, @selector, @pid)
-
- return parse_response(json['entry'])
+ json = send_request(@@SERVICE, @guid, @selector, @pid)
+
+ return parse_response(Activity, json['entry'])
end

# Selects the appropriate fragment from the JSON response in order to
# create a native object.
def parse_rpc_response(response)
- return parse_response(response['data']['list'])
+ return parse_response(Activity, response['data']['list'])
end

# Converts the request into a JSON fragment that can be used as part
of a
# larger RpcRequest.
def to_json(*a)
value = {
- 'method' => RPC_SERVICE + GET,
+ 'method' => @@RPC_SERVICE + @@GET,
'params' => {
'userId' => ["#{@guid}"],
'groupId' => "#{@selector}",
@@ -107,18 +105,39 @@
}.to_json(*a)
end

- private
-
- # Converts the JSON response into a Collection of activities, indexed
by
- # id.
- def parse_response(response)
- activities = Collection.new
- for entry in response
- activity = Activity.new(entry)
- activities[activity.id] = activity
- end
-
- return activities
+ end
+
+ # Provides the ability to update the activity for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateActivitiesRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'activities'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'activities'
+
+ # Initializes a request to update activities for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
end
end
+
end
=======================================
--- /trunk/lib/opensocial/appdata.rb Mon Dec 8 11:25:43 2008
+++ /trunk/lib/opensocial/appdata.rb Wed Nov 4 16:43:36 2009
@@ -55,12 +55,11 @@
# a user ID and selector. This request may be used, standalone, by
calling
# send, or bundled into an RpcRequest.
#
-
-
+
class FetchAppDataRequest < Request
# Defines the service fragment for use in constructing the request URL
or
# JSON
- SERVICE = 'appdata'
+ @@SERVICE = 'appdata'

# Initializes a request to fetch appdata for the specified user and
# group, or the default (@me, @self). A valid Connection is not
necessary
@@ -74,7 +73,7 @@
# instance variables. Accepts an unescape parameter, defaulting to
true,
# if the returned data should be unescaped.
def send(unescape = true)
- json = send_request(SERVICE, @guid, @selector, @pid, unescape)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, nil, unescape)

return parse_response(json['entry'])
end
@@ -89,7 +88,7 @@
# larger RpcRequest.
def to_json(*a)
value = {
- 'method' => SERVICE + GET,
+ 'method' => @@SERVICE + @@GET,
'params' => {
'userId' => ["#{@guid}"],
'groupId' => "#{@selector}",
@@ -114,4 +113,38 @@
return appdata
end
end
+
+ # Provides the ability to update the AppData for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateAppDataRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'appdata'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'appdata'
+
+ # Initializes a request to update AppData for the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+ end
+
end
=======================================
--- /trunk/lib/opensocial/connection.rb Mon Sep 21 11:54:56 2009
+++ /trunk/lib/opensocial/connection.rb Wed Nov 4 16:43:36 2009
@@ -29,12 +29,64 @@
:content_type => 'application/json',
:post_body_signing => false,
:use_request_body_hash => true }
+
+
+ ORKUT_09_GET = { :endpoint => 'http://sandbox.orkut.com/social',
+ :rest => 'rest/',
+ :rpc => 'rpc/',
+ :base_uri => 'http://sandbox.orkut.com',
+ :request_token_path => '',
+ :authorize_path => '',
+ :access_token_path => '',
+ :http_method => :get,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }
+
+ ORKUT_09_PUT = { :endpoint => 'http://sandbox.orkut.com/social',
+ :rest => 'rest/',
+ :rpc => 'rpc/',
+ :base_uri => 'http://sandbox.orkut.com',
+ :request_token_path => '',
+ :authorize_path => '',
+ :access_token_path => '',
+ :http_method => :put,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }
+
+ ORKUT_09_POST = { :endpoint => 'http://sandbox.orkut.com/social',
+ :rest => 'rest/',
+ :rpc => 'rpc/',
+ :base_uri => 'http://sandbox.orkut.com',
+ :request_token_path => '',
+ :authorize_path => '',
+ :access_token_path => '',
+ :http_method => :post,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }
+
+ ORKUT_09_DELETE = { :endpoint => 'http://sandbox.orkut.com/social',
+ :rest => 'rest/',
+ :rpc => 'rpc/',
+ :base_uri => 'http://sandbox.orkut.com',
+ :request_token_path => '',
+ :authorize_path => '',
+ :access_token_path => '',
+ :http_method => :delete,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }
+
+
IGOOGLE = { :endpoint
=> 'http://www-opensocial-sandbox.googleusercontent.com/api',
:rest => '',
:rpc => 'rpc',
:content_type => 'application/json',
:post_body_signing => false,
:use_request_body_hash => true }
+
MYSPACE = { :endpoint => 'http://api.myspace.com/v2',
:rest => '',
:rpc => '',
@@ -46,6 +98,7 @@
:content_type => 'application/x-www-form-urlencoded',
:post_body_signing => true,
:use_request_body_hash => false }
+
MYSPACE_09_GET = { :endpoint => 'http://opensocial.myspace.com/roa/09',
:rest => '',
:rpc => '',
@@ -57,6 +110,42 @@
:content_type => 'application/json',
:post_body_signing => false,
:use_request_body_hash => false }
+
+ MYSPACE_09_POST = { :endpoint => 'http://opensocial.myspace.com/roa/09',
+ :rest => '',
+ :rpc => '',
+ :base_uri => 'http://opensocial.myspace.com',
+ :request_token_path => '/request_token',
+ :authorize_path => '/authorize',
+ :access_token_path => '/access_token',
+ :http_method => :post,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }
+
+ MYSPACE_09_PUT = { :endpoint => 'http://opensocial.myspace.com/roa/09',
+ :rest => '',
+ :rpc => '',
+ :base_uri => 'http://opensocial.myspace.com',
+ :request_token_path => '/request_token',
+ :authorize_path => '/authorize',
+ :access_token_path => '/access_token',
+ :http_method => :put,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }
+
+ MYSPACE_09_DELETE = { :endpoint => 'http://opensocial.myspace.com/roa/09',
+ :rest => '',
+ :rpc => '',
+ :base_uri => 'http://opensocial.myspace.com',
+ :request_token_path => '/request_token',
+ :authorize_path => '/authorize',
+ :access_token_path => '/access_token',
+ :http_method => :delete,
+ :content_type => 'application/json',
+ :post_body_signing => false,
+ :use_request_body_hash => false }

AUTH_HMAC = 0
AUTH_ST = 1
@@ -101,6 +190,9 @@
# Defines whether or not to sign the body using a request body hash
attr_accessor :use_request_body_hash

+ # Defines additional query parameter
+ attr_accessor :params
+
# Initializes the Connection using the supplied options hash, or the
# defaults. Verifies that the supplied authentication type has proper
# (ie. non-blank) credentials, and that the authentication type is
known.
@@ -129,11 +221,13 @@
def service_uri(service, guid, selector, pid)
uri = [@container[:endpoint], service, guid, selector, pid].compact.
join('/')
-
+ if(nil == @params)
+ @params = ''
+ end
if @auth == AUTH_HMAC && !xoauth_requestor_id.empty?
- uri << '?xoauth_requestor_id=' + @xoauth_requestor_id
+ uri << '?xoauth_requestor_id=' + @xoauth_requestor_id + @params
elsif @auth == AUTH_ST
- uri << '?st=' + self.st
+ uri << '?st=' + self.st + params
end
URI.parse(uri)
end
=======================================
--- /trunk/lib/opensocial/group.rb Mon Sep 21 11:54:56 2009
+++ /trunk/lib/opensocial/group.rb Wed Nov 4 16:43:36 2009
@@ -65,7 +65,7 @@
class FetchGroupsRequest < Request
# Defines the service fragment for use in constructing the request URL
or
# JSON
- SERVICE = 'groups'
+ @@SERVICE = 'groups'

# Initializes a request to fetch groups for the specified user, or the
# default (@me). A valid Connection is not necessary if the request is
to
@@ -77,15 +77,43 @@
# Sends the request, passing in the appropriate SERVICE and specified
# instance variables.
def send
- json = send_request(SERVICE, @guid)
-
- groups = Collection.new
- for entry in json['entry']
- group = Group.new(entry)
- groups[group.id] = group
- end
-
- return groups
+ json = send_request(@@SERVICE, @guid)
+
+ return parse_response(Group, json['entry'])
end
end
+
+ # Provides the ability to update the group for a given
+ # user or set of users.
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdateGroupsRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'groups'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'groups'
+
+ # Initializes a request to update froupfor the specified user and
+ # group, or the default (@me, @self). A valid Connection is not
necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
+ end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+ end
+
end
=======================================
--- /trunk/lib/opensocial/person.rb Mon Sep 21 11:54:56 2009
+++ /trunk/lib/opensocial/person.rb Wed Nov 4 16:43:36 2009
@@ -101,7 +101,7 @@
class FetchPersonRequest < Request
# Defines the service fragment for use in constructing the request URL
or
# JSON
- SERVICE = 'people'
+ @@SERVICE = 'people'

# Initializes a request to the specified user, or the default (@me,
@self).
# A valid Connection is not necessary if the request is to be used as
part
@@ -113,7 +113,7 @@
# Sends the request, passing in the appropriate SERVICE and specified
# instance variables.
def send
- json = send_request(SERVICE, @guid, @selector)
+ json = send_request(@@SERVICE, @guid, @selector)

personjson = json['entry']

@@ -134,7 +134,7 @@
# larger RpcRequest.
def to_json(*a)
value = {
- 'method' => SERVICE + GET,
+ 'method' => @@SERVICE + @@GET,
'params' => {
'userId' => ["#{@guid}"],
'groupId' => "#{@selector}"
@@ -164,7 +164,7 @@
class FetchPeopleRequest < Request
# Defines the service fragment for use in constructing the request URL
or
# JSON
- SERVICE = 'people'
+ @@SERVICE = 'people'

# Initializes a request to the specified user's group, or the default
(@me,
# @friends). A valid Connection is not necessary if the request is to
be
@@ -176,22 +176,22 @@
# Sends the request, passing in the appropriate SERVICE and specified
# instance variables.
def send
- json = send_request(SERVICE, @guid, @selector)
-
- return parse_response(json['entry'])
+ json = send_request(@@SERVICE, @guid, @selector)
+
+ return parse_response(Person, json['entry'])
end

# Selects the appropriate fragment from the JSON response in order to
# create a native object.
def parse_rpc_response(response)
- return parse_response(response['data']['list'])
+ return parse_response(Person, response['data']['list'])
end

# Converts the request into a JSON fragment that can be used as part
of a
# larger RPC request.
def to_json(*a)
value = {
- 'method' => SERVICE + GET,
+ 'method' => @@SERVICE + @@GET,
'params' => {
'userId' => ["#{@guid}"],
'groupId' => "#{@selector}"
@@ -200,17 +200,40 @@
}.to_json(*a)
end

- private
-
- # Converts the JSON response into a Collection of people, indexed by
id.
- def parse_response(response)
- people = Collection.new
- for entry in response
- person = Person.new(entry)
- people[person.id] = person
- end
-
- return people
+ end
+
+ # Provides the ability to update the person data for a given
+ # user or set of users
+ #
+ # Wraps a simple Post, Put or Delete request. The parameters are the
same as
+ # in the Fetch case, + the post_data parameter, which contains the actual
+ # data to be updated.
+ #
+ class UpdatePersonRequest < Request
+
+ # Defines the service fragment for use in constructing the request URL
or
+ # JSON
+ @@SERVICE = 'people'
+
+ # This is only necessary because of a spec inconsistency
+ @@RPC_SERVICE = 'people'
+
+ # Initializes a request to update persons data for the specified user.
+ # or the default (@me, @self). A valid Connection is not necessary
+ # if the request is to be used as part of an RpcRequest.
+ def initialize(connection = nil, guid = '@me', selector = '@self',
+ pid = nil)
+ super(connection, guid, selector, pid)
end
+
+ # Sends the request, passing in the appropriate SERVICE and specified
+ # instance variables.
+ def send(post_data)
+ json = send_request(@@SERVICE, @guid, @selector, @pid, post_data)
+
+ return json['statusLink']
+ end
+
end
+
end
=======================================
--- /trunk/lib/opensocial/request.rb Fri Mar 20 15:09:26 2009
+++ /trunk/lib/opensocial/request.rb Wed Nov 4 16:43:36 2009
@@ -28,7 +28,11 @@


class Request
- GET = '.get'
+ protected
+
+ @@GET = '.get'
+
+ public

# Defines the connection that will be used in the request.
attr_accessor :connection
@@ -58,7 +62,7 @@
# OpenSocial endpoint by constructing the service URI and dispatching
the
# request. When data is returned, it is parsed as JSON after being
# optionally unescaped.
- def send_request(service, guid, selector = nil, pid = nil,
+ def send_request(service, guid, selector = nil, pid = nil, post_data =
nil,
unescape = false)
if !@connection
raise RequestException.new('Request requires a valid connection.')
@@ -66,7 +70,7 @@

uri = @connection.service_uri(@connection.container[:rest] + service,
guid, selector, pid)
- data = dispatch(uri)
+ data = dispatch(uri, post_data)

if unescape
JSON.parse(data.os_unescape)
@@ -75,6 +79,28 @@
end
end

+ # Get supported fields for the service endpoint
+ def get_supported_fields(service)
+ return send_request(service, '@supportedFields')
+ end
+
+ protected
+
+ def parse_response(className, response)
+ objectCollection = Collection.new
+
+ if( response.nil? )
+ return objectCollection
+ end
+
+ for entry in response
+ objectInstance = className.new(entry)
+ objectCollection[objectInstance.id] = objectInstance
+ end
+
+ return objectCollection
+ end
+
private

# Dispatches a request to a given URI with optional POST data. If a
@@ -154,6 +180,8 @@
end
end
end
+
+
end

# Provides a wrapper for a single RPC request to an OpenSocial endpoint,

Reply all
Reply to author
Forward
0 new messages