You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by ch...@apache.org on 2008/07/13 03:27:16 UTC

svn commit: r676256 - in /incubator/shindig/trunk/php/src/socialrest: ./ converters/ http/ opensocial/ samplecontainer/

Author: chabotc
Date: Sat Jul 12 18:27:15 2008
New Revision: 676256

URL: http://svn.apache.org/viewvc?rev=676256&view=rev
Log:
First jab at Atom support, most of it seems to be working. Code is a bit quick and dirty but will be cleaned up asap

Modified:
    incubator/shindig/trunk/php/src/socialrest/ActivityHandler.php
    incubator/shindig/trunk/php/src/socialrest/DataRequestHandler.php
    incubator/shindig/trunk/php/src/socialrest/OutputConverter.php
    incubator/shindig/trunk/php/src/socialrest/PersonHandler.php
    incubator/shindig/trunk/php/src/socialrest/RestRequestItem.php
    incubator/shindig/trunk/php/src/socialrest/converters/OutputAtomConverter.php
    incubator/shindig/trunk/php/src/socialrest/converters/OutputJsonConverter.php
    incubator/shindig/trunk/php/src/socialrest/http/RestServlet.php
    incubator/shindig/trunk/php/src/socialrest/opensocial/ActivitiesService.php
    incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicActivitiesService.php
    incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicPeopleService.php

Modified: incubator/shindig/trunk/php/src/socialrest/ActivityHandler.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/ActivityHandler.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/ActivityHandler.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/ActivityHandler.php Sat Jul 12 18:27:15 2008
@@ -49,9 +49,9 @@
 		// TODO: Filter by fields
 		// TODO: do we need to add pagination and sorting support?
 		if ($optionalActivityId != null) {
-			return $this->service->getActivity($requestItem->getUser(), $requestItem->getGroup(), $optionalActivityId, $requestItem->getToken());
+			return $this->service->getActivity($requestItem->getUser(), $requestItem->getGroup(), $optionalActivityId, $requestItem->getStartIndex(), $requestItem->getCount(), $requestItem->getToken());
 		}
-		return $this->service->getActivities($requestItem->getUser(), $requestItem->getGroup(), $requestItem->getToken());
+		return $this->service->getActivities($requestItem->getUser(), $requestItem->getGroup(), $requestItem->getStartIndex(), $requestItem->getCount(), $requestItem->getToken());
 	}
 
 	/**

Modified: incubator/shindig/trunk/php/src/socialrest/DataRequestHandler.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/DataRequestHandler.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/DataRequestHandler.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/DataRequestHandler.php Sat Jul 12 18:27:15 2008
@@ -27,8 +27,8 @@
 		$method = $requestItem->getMethod();
 		if ($owner == 0 && $viewer == 0 && $method != 'GET') {
 			// Anonymous requests are only allowed to GET data (not create/edit/delete)
-			$response = new ResponseItem(BAD_REQUEST, "", null);
-		} elseif ($method == 'GET') {
+			$response = new ResponseItem(BAD_REQUEST, "[$method] not allowed for anonymous users", null);
+		} elseif ($method == 'GET') {			
 			$response = $this->handleGet($requestItem);
 		} elseif ($method == 'POST') {
 			$response = $this->handlePost($requestItem);

Modified: incubator/shindig/trunk/php/src/socialrest/OutputConverter.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/OutputConverter.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/OutputConverter.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/OutputConverter.php Sat Jul 12 18:27:15 2008
@@ -22,6 +22,6 @@
  *
  */
 abstract class OutputConverter {
-	abstract function outputResponse(ResponseItem $responseItem);
-	abstract function outputBatch(Array $responses);
+	abstract function outputResponse(ResponseItem $responseItem, RestRequestItem $requestItem);
+	abstract function outputBatch(Array $responses, SecurityToken $token);
 }

Modified: incubator/shindig/trunk/php/src/socialrest/PersonHandler.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/PersonHandler.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/PersonHandler.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/PersonHandler.php Sat Jul 12 18:27:15 2008
@@ -42,7 +42,7 @@
 		$parameters = $requestItem->getParameters();
 		$optionalPersonId = in_array('personId', $parameters) ? $parameters['personId'] : null;
 		$fields = $requestItem->getFieldsWithDefaultValue(self::$DEFAULT_PERSON_FIELDS);
-		if ($optionalPersonId || $requestItem->getGroup()->getType() == 'self') {
+		if ($optionalPersonId || (is_object($requestItem->getGroup()) && $requestItem->getGroup()->getType() == 'self')) {
 			//FIXME same logic as the java code here, but doesn't seem to do much with the optionalPersonId which seems odd
 			return $this->service->getPerson($requestItem->getUser(), $requestItem->getGroup(), $fields, $requestItem->getToken());
 		}
@@ -63,4 +63,4 @@
 	{
 		return new ResponseItem(NOT_IMPLEMENTED, "You can't add people right now.", null);
 	}
-}
\ No newline at end of file
+}

Modified: incubator/shindig/trunk/php/src/socialrest/RestRequestItem.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/RestRequestItem.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/RestRequestItem.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/RestRequestItem.php Sat Jul 12 18:27:15 2008
@@ -119,28 +119,29 @@
 
 	public function getAppId()
 	{
-		$appId = $this->parameters[self::$APP_ID];
-		if ($appId != null && $appId == self::$APP_SUBSTITUTION_TOKEN) {
+		if (isset($this->parameters[self::$APP_ID]) && $this->parameters[self::$APP_ID] == self::$APP_SUBSTITUTION_TOKEN) {
 			return $this->token->getAppId();
+		} elseif (isset($this->parameters[self::$APP_ID])) {
+			return $this->parameters[self::$APP_ID];
 		} else {
-			return $appId;
+			return 0;
 		}
 	}
 
 	public function getUser()
 	{
-		return UserId::fromJson($this->parameters[self::$USER_ID]);
+		return isset($this->parameters[self::$USER_ID]) ? UserId::fromJson($this->parameters[self::$USER_ID]) : false;
 	}
 
 	public function getGroup()
 	{
-		return GroupId::fromJson($this->parameters[self::$GROUP_ID]);
+		return isset($this->parameters[self::$GROUP_ID]) ? GroupId::fromJson($this->parameters[self::$GROUP_ID]) : false;
 	}
 
 	public function getStartIndex()
 	{
-		if (!empty(self::$DEFAULT_START_INDEX)) {
-			return self::$DEFAULT_START_INDEX;
+		if (!empty($this->parameters[self::$START_INDEX])) {
+			return $this->parameters[self::$START_INDEX];
 		} else {
 			return self::$DEFAULT_START_INDEX;
 		}

Modified: incubator/shindig/trunk/php/src/socialrest/converters/OutputAtomConverter.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/converters/OutputAtomConverter.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/converters/OutputAtomConverter.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/converters/OutputAtomConverter.php Sat Jul 12 18:27:15 2008
@@ -18,18 +18,197 @@
  */
 
 /**
- * Format = atom output converter
- *
+ * Format = atom output converter, for format definition see:
+ * http://www.opensocial.org/Technical-Resources/opensocial-specification----implementation-version-08/restful-api-specification
  */
 class OutputAtomConverter extends OutputConverter {
-	
-	function outputResponse(ResponseItem $responseItem)
+	private static $nameSpace = 'http://www.w3.org/2005/Atom';
+	private static $osNameSpace = 'http://ns.opensocial.org/2008/opensocial';
+	private static $xmlVersion = '1.0';
+	private static $charSet = 'UTF-8';
+	private static $formatOutput = true;
+	// this maps the REST url to the atom content type
+	private static $entryTypes = array(
+		'people' => 'person', 'appdata' => 'appdata', 'activities' => 'activity'
+	);
+
+	function outputResponse(ResponseItem $responseItem, RestRequestItem $requestItem)
 	{
+		$doc = new DOMDocument(self::$xmlVersion, self::$charSet);
+		$doc->formatOutput = self::$formatOutput;
+		$data = $responseItem->getResponse();
+		$params = $requestItem->getParameters();
+		// map the Request URL to the content type to use  
+		if (empty(self::$entryTypes[$params[0]])) {
+			throw new Exception("Unsupported request type");
+		}
+		$requestType = self::$entryTypes[$params[0]];
+		// Check to see if this is a single entry, or a collection, and construct either an atom 
+		// feed (collection) or an entry (single)
 		
-	}
+		if ($responseItem->getResponse() instanceof RestFulCollection) {
+			$entry = $doc->appendChild($doc->createElementNS(self::$nameSpace, "feed"));
+			
+			// osearch fields and next link
+			$total = $entry->appendChild($doc->createElement('osearch:totalResults'));
+			$total->appendChild($doc->createTextNode($responseItem->getResponse()->getTotalResults()));
+			$startIndex = $entry->appendChild($doc->createElement('osearch:startIndex'));
+			$startIndex->appendChild($doc->createTextNode($requestItem->getStartIndex()));
+			$itemsPerPage = $entry->appendChild($doc->createElement('osearch:itemsPerPage'));
+			$itemsPerPage->appendChild($doc->createTextNode($requestItem->getCount()));
+			
+			// fabricate a next link based on our current url if this is a pageable collection
+			if (($requestItem->getStartIndex() + $requestItem->getCount()) < $responseItem->getResponse()->getTotalResults()) {
+				$nextStartIndex = $requestItem->getStartIndex() + $requestItem->getCount();
+				if (($uri = $_SERVER['REQUEST_URI']) === false) {
+					throw new Exception("Could not parse URI : {$_SERVER['REQUEST_URI']}");
+				}
+				$uri = parse_url($uri);
+				if (isset($uri['query'])) {
+					parse_str($uri['query'], $params);
+				} else {
+					$params = array();
+				}
+				$params[RestRequestItem::$START_INDEX] = $nextStartIndex;
+				$params[RestRequestItem::$COUNT] = $requestItem->getCount();
+				foreach ($params as $paramKey => $paramVal) {
+					$outParams[] = $paramKey . '=' . $paramVal;
+				}
+				$outParams = '?' . implode('&', $outParams);
+				$nextUri = 'http://' . $_SERVER['HTTP_HOST'] . $uri['path'] . $outParams;
+				// <link rel="next" href="http://api.example.org/..." />
+				$link = $entry->appendChild($doc->createElement('link'));
+				$linkRel = $link->appendChild($doc->createAttribute('rel'));
+				$linkRel->appendChild($doc->createTextNode('next'));
+				$linkHref = $link->appendChild($doc->createAttribute('href'));
+				$linkHref->appendChild($doc->createTextNode($nextUri));
+			}
+			
+			// Atom fields
+			$title = $entry->appendChild($doc->createElement('title'));
+			$author = $entry->appendChild($doc->createElement('author'));
+			$updated = $entry->appendChild($doc->createElement('updated'));
+			$updated->appendChild($doc->createTextNode(date(DATE_ATOM)));
+			$id = $entry->appendChild($doc->createElement('id'));
+			$id->appendChild($doc->createTextNode('urn:guid:' . $requestItem->getToken()->getDomain() . ':' . htmlentities($requestItem->getUser()->getUserId($requestItem->getToken(), ENT_NOQUOTES, 'UTF-8'))));
+			
+			// Add response entries to feed
+			$responses = $responseItem->getResponse()->getEntry();
+			foreach ($responses as $response) {
+				$feedEntry = $entry->appendChild($doc->createElement("entry"));
+				$type = $feedEntry->appendChild($doc->createElement('content'));
+				if ($response instanceof Activity) {
+					// Special hoisting rules for activities
+					$updated = $feedEntry->appendChild($doc->createElement('updated'));
+					$updated->appendChild($doc->createTextNode(date(DATE_ATOM, $response->postedTime)));
+					$id = $feedEntry->appendChild($doc->createElement('id'));
+					//FIXME these should get proper URL's in the ID and link:
+					// <link rel="self" type="application/atom+xml" href="http://api.example.org/activity/feeds/.../af3778"/>
+					$id->appendChild($doc->createTextNode('urn:guid:activity:' . htmlentities($response->id, ENT_NOQUOTES, 'UTF-8')));
+					$summary = $feedEntry->appendChild($doc->createElement('summary'));
+					$summary->appendChild($doc->createTextNode(htmlentities($response->body, ENT_NOQUOTES, 'UTF-8')));
+					$title = $feedEntry->appendChild($doc->createElement('title'));
+					$title->appendChild($doc->createTextNode(htmlentities($response->title, ENT_NOQUOTES, 'UTF-8')));
+					unset($response->id);
+					unset($response->title);
+					unset($response->body);
+					unset($response->postedTime);
+				}				
+				$content = $this->addData($doc, $type, $requestType, $response, self::$osNameSpace);
+				$contentType = $type->appendChild($doc->createAttribute('type'));
+				$contentType->appendChild($doc->createTextNode('application/xml'));
+				
+				// Attempt to have a real ID field, otherwise we fall back on the idSpec id
+				$idField = is_object($response) && isset($response->id) ? $response->id : (is_array($response) && isset($response['id']) ? $response['id'] : $requestItem->getUser()->getUserId($requestItem->getToken()));
+				
+				// Author node
+				$author = $feedEntry->appendChild($doc->createElement('author'));
+				$authorUrl = $author->appendChild($doc->createElement('uri'));
+				$authorUrl->appendChild($doc->createTextNode('urn:guid:' . htmlentities($idField, ENT_NOQUOTES, 'UTF-8')));
+				// Updated node, only if it's not an activity (special case)
+				if ($response instanceof Activity) {
+					$title = $feedEntry->appendChild($doc->createElement('title'));
+					$updated = $feedEntry->appendChild($doc->createElement('updated'));
+					$updated->appendChild($doc->createTextNode(date(DATE_ATOM)));
+					$id = $feedEntry->appendChild($doc->createElement('id'));
+					$id->appendChild($doc->createTextNode('urn:guid:' . htmlentities($idField, ENT_NOQUOTES, 'UTF-8')));
+				}
+			}
+		} else {
+			// Single entry = Atom:Entry
+			$entry = $doc->appendChild($doc->createElementNS(self::$nameSpace, "entry"));
+			$type = $entry->appendChild($doc->createElement('content'));
+			
+			// addData loops through the responseItem data recursively creating a matching XML structure
+			// and appends the nodes to the $type element
+			$content = $this->addData($doc, $type, $requestType, $data, self::$osNameSpace);
+			$contentType = $type->appendChild($doc->createAttribute('type'));
+			$contentType->appendChild($doc->createTextNode('application/xml'));
+			
+			// Atom fields
+			$title = $entry->appendChild($doc->createElement('title'));
+			$author = $entry->appendChild($doc->createElement('author'));
+			$authorUri = $author->appendChild($doc->createElement('uri'));
+			$authorUri->appendChild($doc->createTextNode(htmlentities($requestItem->getUser()->getUserId($requestItem->getToken(), ENT_NOQUOTES, 'UTF-8'))));
+			$updated = $entry->appendChild($doc->createElement('updated'));
+			$updated->appendChild($doc->createTextNode(date(DATE_ATOM)));
+			$id = $entry->appendChild($doc->createElement('id'));
+			$id->appendChild($doc->createTextNode('urn:guid:' . htmlentities($requestItem->getUser()->getUserId($requestItem->getToken()), ENT_NOQUOTES, 'UTF-8')));
+		}
+		echo $doc->saveXML();
 	
-	function outputBatch(Array $responses)
+	}
+
+	function outputBatch(Array $responses, SecurityToken $token)
 	{
-		
+		//TODO once we support spec compliance batching, this needs to be added too
+	}
+
+	private function addData(DOMDocument $doc, DOMElement $element, $name, $data, $nameSpace = false)
+	{
+		if ($nameSpace) {
+			$newElement = $element->appendChild($doc->createElementNS($nameSpace, $name));
+		} else {
+			$newElement = $element->appendChild($doc->createElement($name));
+		}
+		if (is_array($data)) {
+			foreach ($data as $key => $val) {
+				if (is_array($val) || is_object($val)) {
+					// prevent invalid names.. try to guess a good one :)
+					if (is_numeric($key)) {
+						$key = is_object($val) ? get_class($val) : $key = $name;
+					}
+					$this->addData($doc, $newElement, $key, $val);
+				} else {
+					$elm = $newElement->appendChild($doc->createElement($key));
+					$elm->appendChild($doc->createTextNode(htmlentities($val, ENT_NOQUOTES, 'UTF-8')));
+				}
+			}
+		} elseif (is_object($data)) {
+			if ($data instanceof Enum) {
+				// enums are output as : <NAME key="$key">$displayValue</NAME> 
+				$keyEntry = $newElement->appendChild($doc->createAttribute('key'));
+				$keyEntry->appendChild($doc->createTextNode(htmlentities($data->key, ENT_NOQUOTES, 'UTF-8')));
+				$newElement->appendChild($doc->createTextNode(htmlentities($data->getDisplayValue(), ENT_NOQUOTES, 'UTF-8')));
+			
+			} else {
+				$vars = get_object_vars($data);
+				foreach ($vars as $key => $val) {
+					if (is_array($val) || is_object($val)) {
+						// prevent invalid names.. try to guess a good one :)
+						if (is_numeric($key)) {
+							$key = is_object($val) ? get_class($val) : $key = $name;
+						}
+						$this->addData($doc, $newElement, $key, $val);
+					} else {
+						$elm = $newElement->appendChild($doc->createElement($key));
+						$elm->appendChild($doc->createTextNode(htmlentities($val, ENT_NOQUOTES, 'UTF-8')));
+					}
+				}
+			}
+		} else {
+			$newElement->appendChild($doc->createTextNode(htmlentities($data, ENT_NOQUOTES, 'UTF-8')));
+		}
+		return $newElement;
 	}
-}
\ No newline at end of file
+}

Modified: incubator/shindig/trunk/php/src/socialrest/converters/OutputJsonConverter.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/converters/OutputJsonConverter.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/converters/OutputJsonConverter.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/converters/OutputJsonConverter.php Sat Jul 12 18:27:15 2008
@@ -23,12 +23,12 @@
  */
 class OutputJsonConverter extends OutputConverter {
 	
-	function outputResponse(ResponseItem $responseItem)
+	function outputResponse(ResponseItem $responseItem, RestRequestItem $requestItem)
 	{
 		echo json_encode($responseItem->getResponse());
 	}
 	
-	function outputBatch(Array $responses)
+	function outputBatch(Array $responses, SecurityToken $token)
 	{
 		echo json_encode(array("responses" => $responses, "error" => false));
 	}

Modified: incubator/shindig/trunk/php/src/socialrest/http/RestServlet.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/http/RestServlet.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/http/RestServlet.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/http/RestServlet.php Sat Jul 12 18:27:15 2008
@@ -78,7 +78,7 @@
 				$outputConverter = new OutputJsonConverter();
 				break;
 			case 'atom':
-				//$this->setContentType('application/xml');
+				//$this->setContentType('application/atom+xml');
 				$outputConverter = new OutputAtomConverter();
 				break;
 			default:
@@ -86,11 +86,11 @@
 				break;
 		}
 		if ($this->isBatchUrl()) {
-			$req = $this->handleBatchRequest($token);
-			$outputConverter->outputBatch($req);
+			$responses = $this->handleBatchRequest($token);
+			$outputConverter->outputBatch($responses, $token);
 		} else {
-			$responseItem = $this->handleSingleRequest($token, $method);
-			$outputConverter->outputResponse($responseItem);
+			$response = $this->handleSingleRequest($token, $method);
+			$outputConverter->outputResponse($response['response'], $response['request']);
 		}
 	}
 
@@ -102,7 +102,7 @@
 		$requestParam = $this->getRequestParams();
 		$requestItem->createRequestItem($url, $token, $method, $params, $requestParam);
 		$responseItem = $this->getResponseItem($requestItem);
-		return $responseItem;
+		return array('request' => $requestItem, 'response' => $responseItem);
 	}
 
 	private function getRouteFromParameter($pathInfo)
@@ -240,7 +240,8 @@
 
 	private function getOutputFormat()
 	{
-		return !empty($_POST['format']) ? strtolowe(trim($_POST['format'])) : 'json';
+		$output = !empty($_POST['format']) ? $_POST['format'] : (!empty($_GET['format']) ? $_GET['format'] : 'json');
+		return strtolower(trim($output));
 	}
 
 	private function getListParams()

Modified: incubator/shindig/trunk/php/src/socialrest/opensocial/ActivitiesService.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/opensocial/ActivitiesService.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/opensocial/ActivitiesService.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/opensocial/ActivitiesService.php Sat Jul 12 18:27:15 2008
@@ -25,9 +25,9 @@
 	 * @param token A valid SecurityToken
 	 * @return a response item with the list of activities.
 	 */
-	abstract public function getActivities(UserId $userId, GroupId $groupId, SecurityToken $token);
+	abstract public function getActivities(UserId $userId, $groupId, $first, $max, SecurityToken $token);
 	
-	abstract public function getActivity(UserId $userId, GroupId $groupId, $activityId, SecurityToken $token);
+	abstract public function getActivity(UserId $userId, $groupId, $activityId, $first, $max, SecurityToken $token);
 
 	/**
 	 * Creates the passed in activity for the given user. Once createActivity is

Modified: incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicActivitiesService.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicActivitiesService.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicActivitiesService.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicActivitiesService.php Sat Jul 12 18:27:15 2008
@@ -19,7 +19,7 @@
 
 class BasicActivitiesService extends ActivitiesService {
 
-	public function getActivity(UserId $userId, GroupId $groupId, $activityId, SecurityToken $token)
+	public function getActivity(UserId $userId, $groupId, $activityId, $first, $max, SecurityToken $token)
 	{
 		$activities = $this->getActivities($userId, $groupId, $token);
 		$activities = $activities->getResponse();
@@ -34,10 +34,11 @@
 		return new ResponseItem(NOT_FOUND, "Activity not found", null);
 	}
 	
-	public function getActivities(UserId $userId, GroupId $groupId, SecurityToken $token)
+	public function getActivities(UserId $userId, $groupId, $first, $max, SecurityToken $token)
 	{
 		$ids = array();
-		switch ($groupId->getType()) {
+		$type = is_object($groupId) ? $groupId->getType() : 'self';
+		switch ($type) {
 			case 'all':
 			case 'friends':
         		$friendIds = XmlStateFileFetcher::get()->getFriendIds();

Modified: incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicPeopleService.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicPeopleService.php?rev=676256&r1=676255&r2=676256&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicPeopleService.php (original)
+++ incubator/shindig/trunk/php/src/socialrest/samplecontainer/BasicPeopleService.php Sat Jul 12 18:27:15 2008
@@ -43,7 +43,8 @@
 	public function getPeople($userId, $groupId, $sortOrder, $filter, $first, $max, $profileDetails, SecurityToken $token)
 	{
 		$ids = array();
-		switch ($groupId->getType()) {
+		$group = is_object($groupId) ? $groupId->getType() : '';
+		switch ($group) {
 			case 'all':
 			case 'friends':
 				$friendIds = XmlStateFileFetcher::get()->getFriendIds();