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

svn commit: r667308 - in /incubator/shindig/trunk: features/opensocial-current/ java/social-api/src/main/java/org/apache/shindig/social/dataservice/ java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/ java/social-api/src/test/java/...

Author: doll
Date: Thu Jun 12 18:02:31 2008
New Revision: 667308

URL: http://svn.apache.org/viewvc?rev=667308&view=rev
Log:
The dataservice json rest code now allows the special tokens @viewer, @owner and @app. These get translated behind the service layer so that containers can make optimizations based on the token. 

This involved adding a new UserId class and pulling the GroupId class to the top level. GroupId now supports arbitrary groups. Changed all interfaces to take the UserId and added tests. 


Added:
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/GroupId.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/UserId.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/GroupIdTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/UserIdTest.java
Modified:
    incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityHandler.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataHandler.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataRequestHandler.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataServiceServlet.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonHandler.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/ActivityHandlerTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/AppDataHandlerTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataRequestHandlerTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/PersonHandlerTest.java

Modified: incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js (original)
+++ incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js Thu Jun 12 18:02:31 2008
@@ -38,20 +38,9 @@
   this.baseUrl_ = baseUrl;
 
   this.securityToken_ = shindig.auth.getSecurityToken();
-  this.parseSecurityToken();
 };
 RestfulContainer.inherits(opensocial.Container);
 
-// Hopefully we can get rid of these with special @viewer and @owner tokens
-// in the restful spec, because this code is never going to work in the
-// real world.
-RestfulContainer.prototype.parseSecurityToken = function() {
-  var parts = this.securityToken_.split(":");
-  this.ownerId_ = parts[0];
-  this.viewerId_ = parts[1];
-  this.appId_ = parts[2];
-};
-
 RestfulContainer.prototype.getEnvironment = function() {
   return this.environment_;
 };
@@ -138,9 +127,9 @@
   var groupId = newIdSpec.getField('groupId');
 
   if (userId == 'OWNER') {
-    userId = this.ownerId_;
+    userId = '@owner';
   } else if (userId == 'VIEWER') {
-    userId = this.viewerId_;
+    userId = '@viewer';
   } else if (opensocial.Container.isArray(idSpec)) {
     for (var i = 0; i < idSpec.length; i++) {
       // TODO: We will need multiple urls here....don't want to think about
@@ -208,7 +197,7 @@
 
 RestfulContainer.prototype.newFetchPersonAppDataRequest = function(idSpec,
     keys) {
-  var url = "/appdata/" + this.translateIdSpec(idSpec) + "/" + this.appId_
+  var url = "/appdata/" + this.translateIdSpec(idSpec) + "/@app"
       + "?fields=" + this.getFieldsList(keys);
   return new RestfulRequestItem(url, "GET", null,
       function (appData) {
@@ -219,7 +208,7 @@
 RestfulContainer.prototype.newUpdatePersonAppDataRequest = function(id, key,
     value) {
   var url = "/appdata/" + this.translateIdSpec(this.makeIdSpec(id))
-      + "/" + this.appId_ + "?fields=" + key;
+      + "/@app?fields=" + key;
   var data = {};
   data[key] = value;
   var postData = {};
@@ -229,14 +218,14 @@
 
 RestfulContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
   var url = "/appdata/" + this.translateIdSpec(this.makeIdSpec(id))
-      + "/" + this.appId_ + "?fields=" + this.getFieldsList(keys);
+      + "/@app?fields=" + this.getFieldsList(keys);
   return new RestfulRequestItem(url, "DELETE");
 };
 
 RestfulContainer.prototype.newFetchActivitiesRequest = function(idSpec,
     opt_params) {
   var url = "/activities/" + this.translateIdSpec(idSpec)
-      + "?app=" + this.appId_;
+      + "?app=@app"; // TODO: Handle appId correctly
   return new RestfulRequestItem(url, "GET", null,
       function(rawJson) {
         rawJson = rawJson['entry'];
@@ -262,7 +251,7 @@
 RestfulContainer.prototype.newCreateActivityRequest = function(idSpec,
     activity) {
   var url = "/activities/" + this.translateIdSpec(idSpec)
-      + "/" + this.appId_;
+      + "/@app"; // TODO: Handle appId correctly
   var postData = {};
   postData['entry'] = gadgets.json.stringify(activity.toJsonObject());
   return new RestfulRequestItem(url, "POST", postData);

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityHandler.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityHandler.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityHandler.java Thu Jun 12 18:02:31 2008
@@ -64,9 +64,8 @@
       SecurityToken token) {
     String[] segments = getParamsFromRequest(servletRequest);
 
-    String userId = segments[0];
-    DataServiceServlet.GroupId groupId
-        = DataServiceServlet.GroupId.fromJson(segments[1]);
+    UserId userId = UserId.fromJson(segments[0]);
+    GroupId groupId = GroupId.fromJson(segments[1]);
     // TODO: Should we pass the groupId through to the service?
 
     String jsonActivity = servletRequest.getParameter("entry");
@@ -87,9 +86,8 @@
       SecurityToken token) {
     String[] segments = getParamsFromRequest(servletRequest);
 
-    String userId = segments[0];
-    DataServiceServlet.GroupId groupId
-        = DataServiceServlet.GroupId.fromJson(segments[1]);
+    UserId userId = UserId.fromJson(segments[0]);
+    GroupId groupId = GroupId.fromJson(segments[1]);
     String optionalActivityId = null;
     if (segments.length > 2) {
       optionalActivityId = segments[2];

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java Thu Jun 12 18:02:31 2008
@@ -31,8 +31,8 @@
    * @param token A valid SecurityToken
    * @return a response item with the list of activities.
    */
-  public ResponseItem<RestfulCollection<Activity>> getActivities(String userId,
-      DataServiceServlet.GroupId groupId, SecurityToken token);
+  public ResponseItem<RestfulCollection<Activity>> getActivities(UserId userId,
+      GroupId groupId, SecurityToken token);
 
   /**
    * Returns the activity for the passed in user and group that corresponds to
@@ -44,8 +44,8 @@
    * @param token A valid SecurityToken
    * @return a response item with the list of activities.
    */
-  public ResponseItem<Activity> getActivity(String userId,
-      DataServiceServlet.GroupId groupId, String activityId,
+  public ResponseItem<Activity> getActivity(UserId userId,
+      GroupId groupId, String activityId,
       SecurityToken token);
 
   /**
@@ -57,7 +57,7 @@
    * @param token A valid SecurityToken
    * @return a response item containing any errors
    */
-  public ResponseItem createActivity(String personId, Activity activity,
+  public ResponseItem createActivity(UserId personId, Activity activity,
       SecurityToken token);
 
 }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataHandler.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataHandler.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataHandler.java Thu Jun 12 18:02:31 2008
@@ -54,10 +54,9 @@
       SecurityToken token) {
     String[] segments = getParamsFromRequest(servletRequest);
 
-    String userId = segments[0];
-    DataServiceServlet.GroupId groupId
-        = DataServiceServlet.GroupId.fromJson(segments[1]);
-    String appId = segments[2];
+    UserId userId = UserId.fromJson(segments[0]);
+    GroupId groupId = GroupId.fromJson(segments[1]);
+    String appId = getAppId(segments[2], token);
 
     List<String> fields = getListParam(servletRequest, "fields",
         Lists.<String>newArrayList());
@@ -99,10 +98,9 @@
       SecurityToken token) {
     String[] segments = getParamsFromRequest(servletRequest);
 
-    String userId = segments[0];
-    DataServiceServlet.GroupId groupId
-        = DataServiceServlet.GroupId.fromJson(segments[1]);
-    String appId = segments[2];
+    UserId userId = UserId.fromJson(segments[0]);
+    GroupId groupId = GroupId.fromJson(segments[1]);
+    String appId = getAppId(segments[2], token);
 
     List<String> fields = getListParam(servletRequest, "fields",
         Lists.<String>newArrayList());
@@ -128,10 +126,9 @@
       SecurityToken token) {
     String[] segments = getParamsFromRequest(servletRequest);
 
-    String userId = segments[0];
-    DataServiceServlet.GroupId groupId
-        = DataServiceServlet.GroupId.fromJson(segments[1]);
-    String appId = segments[2];
+    UserId userId = UserId.fromJson(segments[0]);
+    GroupId groupId = GroupId.fromJson(segments[1]);
+    String appId = getAppId(segments[2], token);
 
     List<String> fields = getListParam(servletRequest, "fields",
         Lists.<String>newArrayList());

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java Thu Jun 12 18:02:31 2008
@@ -35,11 +35,11 @@
    * @return The data fetched
    */
   public ResponseItem<DataCollection> getPersonData(
-      String userId, DataServiceServlet.GroupId groupId,
+      UserId userId, GroupId groupId,
       List<String> fields, String appId, SecurityToken token);
 
   /**
-   * Updates app data for the specified user and group with the new values. 
+   * Updates app data for the specified user and group with the new values.
    *
    * @param userId The user
    * @param groupId The group
@@ -49,8 +49,8 @@
    * @param token The security token
    * @return an error if one occurs
    */
-  public ResponseItem updatePersonData(String userId,
-      DataServiceServlet.GroupId groupId, List<String> fields,
+  public ResponseItem updatePersonData(UserId userId,
+      GroupId groupId, List<String> fields,
       Map<String, String> values, String appId, SecurityToken token);
 
   /**
@@ -63,8 +63,8 @@
    * @param token The security token
    * @return an error if one occurs
    */
-  public ResponseItem deletePersonData(String userId,
-      DataServiceServlet.GroupId groupId, List<String> fields, String appId,
+  public ResponseItem deletePersonData(UserId userId,
+      GroupId groupId, List<String> fields, String appId,
       SecurityToken token);
 }
 

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataRequestHandler.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataRequestHandler.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataRequestHandler.java Thu Jun 12 18:02:31 2008
@@ -34,6 +34,7 @@
 
 public abstract class DataRequestHandler {
   protected BeanJsonConverter converter;
+  protected static final String APP_SUBSTITUTION_TOKEN = "@app";
 
   @Inject
   DataRequestHandler(BeanJsonConverter converter) {
@@ -78,17 +79,17 @@
   abstract ResponseItem handleGet(HttpServletRequest servletRequest,
       SecurityToken token);
 
-  protected String[] getParamsFromRequest(HttpServletRequest servletRequest) {
+  protected static String[] getParamsFromRequest(HttpServletRequest servletRequest) {
     return getQueryPath(servletRequest).split("/");
   }
 
-  /*package-protected*/ String getQueryPath(HttpServletRequest servletRequest) {
+  /*package-protected*/ static String getQueryPath(HttpServletRequest servletRequest) {
     String pathInfo = servletRequest.getPathInfo();
     int index = pathInfo.indexOf('/', 1);
     return pathInfo.substring(index + 1);
   }
 
-  protected <T extends Enum<T>> T getEnumParam(
+  protected static <T extends Enum<T>> T getEnumParam(
       HttpServletRequest servletRequest, String paramName, T defaultValue,
       Class<T> enumClass) {
     String paramValue = servletRequest.getParameter(paramName);
@@ -98,7 +99,7 @@
     return defaultValue;
   }
 
-  protected int getIntegerParam(HttpServletRequest servletRequest,
+  protected static int getIntegerParam(HttpServletRequest servletRequest,
       String paramName, int defaultValue) {
     String paramValue = servletRequest.getParameter(paramName);
     if (paramValue != null) {
@@ -107,7 +108,7 @@
     return defaultValue;
   }
 
-  protected List<String> getListParam(HttpServletRequest servletRequest,
+  protected static List<String> getListParam(HttpServletRequest servletRequest,
       String paramName, List<String> defaultValue) {
     String paramValue = servletRequest.getParameter(paramName);
     if (paramValue != null) {
@@ -115,4 +116,12 @@
     }
     return defaultValue;
   }
+
+  protected static String getAppId(String appId, SecurityToken token) {
+    if (appId.equals(APP_SUBSTITUTION_TOKEN)) {
+      return token.getAppId();
+    } else {
+      return appId;
+    }
+  }
 }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataServiceServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataServiceServlet.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataServiceServlet.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/DataServiceServlet.java Thu Jun 12 18:02:31 2008
@@ -18,6 +18,7 @@
 package org.apache.shindig.social.dataservice;
 
 import com.google.inject.Inject;
+
 import org.apache.shindig.common.SecurityTokenDecoder;
 import org.apache.shindig.common.SecurityToken;
 import org.apache.shindig.common.SecurityTokenException;
@@ -34,27 +35,6 @@
 
 public class DataServiceServlet extends InjectedServlet {
 
-  public static enum GroupId {
-    ALL("@all"),
-    FRIENDS("@friends"),
-    SELF("@self"),
-    GROUP("not supported yet");
-
-    private final String jsonString;
-
-    GroupId(String jsonString) {
-      this.jsonString = jsonString;
-    }
-
-    public String getJsonString() {
-      return jsonString;
-    }
-
-    public static GroupId fromJson(String s) {
-      return valueOf(s.substring(1).toUpperCase());
-    }
-  }
-
   protected static final String X_HTTP_METHOD_OVERRIDE
       = "X-HTTP-Method-Override";
   protected static final String SECURITY_TOKEN_PARAM = "st";

Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/GroupId.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/GroupId.java?rev=667308&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/GroupId.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/GroupId.java Thu Jun 12 18:02:31 2008
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.shindig.social.dataservice;
+
+import org.apache.commons.lang.StringUtils;
+
+public class GroupId {
+  public enum Type {
+    all, friends, self, groupId
+  }
+
+  Type type;
+  String groupId;
+
+  public GroupId(Type type, String groupId) {
+    this.groupId = groupId;
+    this.type = type;
+  }
+
+  public Type getType() {
+    return type;
+  }
+
+  public String getGroupId() {
+    // Only valid for objects with type=groupId
+    return groupId;
+  }
+
+  public static GroupId fromJson(String jsonId) {
+    try {
+      Type idSpecEnum = Type.valueOf(jsonId.substring(1));
+      return new GroupId(idSpecEnum, null);
+    } catch (IllegalArgumentException e) {
+      return new GroupId(Type.groupId, jsonId);
+    }
+  }
+
+  // These are overriden so that EasyMock doesn't throw a fit
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof GroupId)) {
+      return false;
+    }
+
+    GroupId actual = (GroupId) o;
+    return this.type == actual.type
+        && StringUtils.equals(this.groupId, actual.groupId);
+  }
+
+  @Override
+  public int hashCode() {
+    return this.type.hashCode() + this.groupId.hashCode();
+  }
+}

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonHandler.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonHandler.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonHandler.java Thu Jun 12 18:02:31 2008
@@ -70,9 +70,8 @@
       SecurityToken token) {
     String[] segments = getParamsFromRequest(servletRequest);
 
-    String userId = segments[0];
-    DataServiceServlet.GroupId groupId
-        = DataServiceServlet.GroupId.fromJson(segments[1]);
+    UserId userId = UserId.fromJson(segments[0]);
+    GroupId groupId = GroupId.fromJson(segments[1]);
 
     String optionalPersonId = null;
     if (segments.length > 2) {
@@ -80,7 +79,7 @@
     }
 
     if (optionalPersonId != null
-        || groupId == DataServiceServlet.GroupId.SELF) {
+        || groupId.getType() == GroupId.Type.self) {
       return personService.getPerson(userId, token);
     }
 

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java Thu Jun 12 18:02:31 2008
@@ -46,8 +46,7 @@
    * @param token The gadget token
    * @return a list of people.
    */
-  public ResponseItem<RestfulCollection<Person>> getPeople(String userId,
-      DataServiceServlet.GroupId groupId,
+  public ResponseItem<RestfulCollection<Person>> getPeople(UserId userId, GroupId groupId,
       SortOrder sortOrder, FilterType filter, int first, int max,
       Set<String> profileDetails, SecurityToken token);
 
@@ -58,5 +57,5 @@
    * @param token The gadget token
    * @return a list of people.
    */
-  public ResponseItem<Person> getPerson(String id, SecurityToken token);
+  public ResponseItem<Person> getPerson(UserId id, SecurityToken token);
 }

Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/UserId.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/UserId.java?rev=667308&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/UserId.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/UserId.java Thu Jun 12 18:02:31 2008
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.shindig.social.dataservice;
+
+import org.apache.shindig.common.SecurityToken;
+
+import org.apache.commons.lang.StringUtils;
+
+public class UserId {
+  public enum Type {
+    viewer, owner, userId
+  }
+
+  Type type;
+  String userId;
+
+  public UserId(Type type, String userId) {
+    this.type = type;
+    this.userId = userId;
+  }
+
+  public String getUserId(SecurityToken token) {
+    switch(type) {
+      case owner:
+        return token.getOwnerId();
+      case viewer:
+        return token.getViewerId();
+      case userId:
+        return userId;
+      default:
+        throw new IllegalStateException("The type field is not a valid enum: " + type);
+    }
+  }
+
+  public static UserId fromJson(String jsonId) {
+    try {
+      Type idSpecEnum = Type.valueOf(jsonId.substring(1));
+      return new UserId(idSpecEnum, null);
+    } catch (IllegalArgumentException e) {
+      return new UserId(Type.userId, jsonId);
+    }
+  }
+
+  // These are overriden so that EasyMock doesn't throw a fit
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof UserId)) {
+      return false;
+    }
+
+    UserId actual = (UserId) o;
+    return this.type == actual.type
+        && StringUtils.equals(this.userId, actual.userId);
+  }
+
+  @Override
+  public int hashCode() {
+    return this.type.hashCode() + this.userId.hashCode();
+  }
+}

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java Thu Jun 12 18:02:31 2008
@@ -21,11 +21,11 @@
 import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.dataservice.ActivityService;
-import org.apache.shindig.social.dataservice.DataServiceServlet;
 import org.apache.shindig.social.dataservice.RestfulCollection;
+import org.apache.shindig.social.dataservice.GroupId;
+import org.apache.shindig.social.dataservice.UserId;
 import org.apache.shindig.social.opensocial.ActivitiesService;
 import org.apache.shindig.social.opensocial.model.Activity;
-import org.apache.shindig.social.opensocial.model.ApiCollection;
 
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
@@ -76,21 +76,31 @@
         "Activity not found", null);
   }
 
+  public ResponseItem createActivity(String personId, Activity activity,
+      SecurityToken token) {
+    // TODO: Validate the activity and do any template expanding
+    activity.setUserId(personId);
+    activity.setPostedTime(new Date().getTime());
+
+    fetcher.createActivity(personId, activity);
+    return new ResponseItem<JSONObject>(new JSONObject());
+  }
+
   // New interface methods
 
-  public ResponseItem<RestfulCollection<Activity>> getActivities(String userId,
-      DataServiceServlet.GroupId groupId, SecurityToken token) {
+  public ResponseItem<RestfulCollection<Activity>> getActivities(UserId userId,
+      GroupId groupId, SecurityToken token) {
     List<String> ids = Lists.newArrayList();
-    switch (groupId) {
-      case ALL:
-      case FRIENDS:
-        List<String> friendIds = fetcher.getFriendIds().get(userId);
+    switch (groupId.getType()) {
+      case all:
+      case friends:
+        List<String> friendIds = fetcher.getFriendIds().get(userId.getUserId(token));
         if (friendIds != null) {
           ids.addAll(friendIds);
         }
         break;
-      case SELF:
-        ids.add(userId);
+      case self:
+        ids.add(userId.getUserId(token));
     }
 
     Map<String, List<Activity>> allActivities = fetcher.getActivities();
@@ -108,8 +118,8 @@
         new RestfulCollection<Activity>(activities));
   }
 
-  public ResponseItem<Activity> getActivity(String userId,
-      DataServiceServlet.GroupId groupId, String activityId,
+  public ResponseItem<Activity> getActivity(UserId userId,
+      GroupId groupId, String activityId,
       SecurityToken token) {
     RestfulCollection<Activity> allActivities = getActivities(userId, groupId,
         token).getResponse();
@@ -122,13 +132,13 @@
         "Activity not found", null);
   }
 
-  public ResponseItem createActivity(String personId, Activity activity,
+  public ResponseItem createActivity(UserId personId, Activity activity,
       SecurityToken token) {
     // TODO: Validate the activity and do any template expanding
-    activity.setUserId(personId);
+    activity.setUserId(personId.getUserId(token));
     activity.setPostedTime(new Date().getTime());
 
-    fetcher.createActivity(personId, activity);
+    fetcher.createActivity(personId.getUserId(token), activity);
     return new ResponseItem<JSONObject>(new JSONObject());
   }
 

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java Thu Jun 12 18:02:31 2008
@@ -21,8 +21,9 @@
 import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.dataservice.AppDataService;
-import org.apache.shindig.social.dataservice.DataServiceServlet;
 import org.apache.shindig.social.dataservice.DataCollection;
+import org.apache.shindig.social.dataservice.GroupId;
+import org.apache.shindig.social.dataservice.UserId;
 import org.apache.shindig.social.opensocial.DataService;
 
 import com.google.common.collect.Maps;
@@ -116,19 +117,19 @@
   // New interface methods
 
   public ResponseItem<DataCollection> getPersonData(
-      String userId, DataServiceServlet.GroupId groupId, List<String> fields,
+      UserId userId, GroupId groupId, List<String> fields,
       String appId, SecurityToken token) {
     List<String> ids = Lists.newArrayList();
-    switch (groupId) {
-      case ALL:
-      case FRIENDS:
-        List<String> friendIds = fetcher.getFriendIds().get(userId);
+    switch (groupId.getType()) {
+      case all:
+      case friends:
+        List<String> friendIds = fetcher.getFriendIds().get(userId.getUserId(token));
         if (friendIds != null) {
           ids.addAll(friendIds);
         }
         break;
-      case SELF:
-        ids.add(userId);
+      case self:
+        ids.add(userId.getUserId(token));
     }
 
     // TODO: Respect appId
@@ -137,8 +138,8 @@
     return new ResponseItem<DataCollection>(new DataCollection(data));
   }
 
-  public ResponseItem updatePersonData(String userId,
-      DataServiceServlet.GroupId groupId, List<String> fields,
+  public ResponseItem updatePersonData(UserId userId,
+      GroupId groupId, List<String> fields,
       Map<String, String> values, String appId, SecurityToken token) {
     for (String field : fields) {
       if (!isValidKey(field)) {
@@ -148,12 +149,12 @@
       }
     }
 
-    switch(groupId) {
-      case SELF:
+    switch(groupId.getType()) {
+      case self:
         for (String field : fields) {
           String value = values.get(field);
           // TODO: Respect appId
-          fetcher.setAppData(userId, field, value);
+          fetcher.setAppData(userId.getUserId(token), field, value);
         }
         break;
       default:
@@ -164,14 +165,14 @@
     return new ResponseItem<JSONObject>(new JSONObject());
   }
 
-  public ResponseItem deletePersonData(String userId,
-      DataServiceServlet.GroupId groupId, List<String> fields, String appId,
+  public ResponseItem deletePersonData(UserId userId,
+      GroupId groupId, List<String> fields, String appId,
       SecurityToken token) {
-    switch(groupId) {
-      case SELF:
+    switch(groupId.getType()) {
+      case self:
         for (String field : fields) {
           // TODO: Respect appId
-          fetcher.setAppData(userId, field, null);
+          fetcher.setAppData(userId.getUserId(token), field, null);
         }
         break;
       default:

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java Thu Jun 12 18:02:31 2008
@@ -21,8 +21,9 @@
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.dataservice.PersonService;
-import org.apache.shindig.social.dataservice.DataServiceServlet;
 import org.apache.shindig.social.dataservice.RestfulCollection;
+import org.apache.shindig.social.dataservice.GroupId;
+import org.apache.shindig.social.dataservice.UserId;
 import org.apache.shindig.social.opensocial.PeopleService;
 import org.apache.shindig.social.opensocial.model.ApiCollection;
 import org.apache.shindig.social.opensocial.model.IdSpec;
@@ -142,21 +143,21 @@
 
   // New interface methods
 
-  public ResponseItem<RestfulCollection<Person>> getPeople(String userId,
-      DataServiceServlet.GroupId groupId, PersonService.SortOrder sortOrder,
+  public ResponseItem<RestfulCollection<Person>> getPeople(UserId userId,
+      GroupId groupId, PersonService.SortOrder sortOrder,
       PersonService.FilterType filter, int first, int max,
       Set<String> profileDetails, SecurityToken token) {
     List<String> ids = Lists.newArrayList();
-    switch (groupId) {
-      case ALL:
-      case FRIENDS:
-        List<String> friendIds = fetcher.getFriendIds().get(userId);
+    switch (groupId.getType()) {
+      case all:
+      case friends:
+        List<String> friendIds = fetcher.getFriendIds().get(userId.getUserId(token));
         if (friendIds != null) {
           ids.addAll(friendIds);
         }
         break;
-      case SELF:
-        ids.add(userId);
+      case self:
+        ids.add(userId.getUserId(token));
     }
 
     List<Person> people = getPeople(ids, token);
@@ -178,4 +179,14 @@
     return new ResponseItem<RestfulCollection<Person>>(collection);
   }
 
+  public ResponseItem<Person> getPerson(UserId id, SecurityToken token) {
+    List<Person> people = getPeople(Lists.newArrayList(id.getUserId(token)), token);
+    if (people.size() == 1) {
+      return new ResponseItem<Person>(people.get(0));
+    } else {
+      return new ResponseItem<Person>(ResponseError.BAD_REQUEST,
+          "Person " + id.getUserId(token) + " not found", null);
+    }
+  }
+
 }

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/ActivityHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/ActivityHandlerTest.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/ActivityHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/ActivityHandlerTest.java Thu Jun 12 18:02:31 2008
@@ -19,7 +19,6 @@
 
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.ResponseError;
-import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.model.Activity;
 import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
 import org.apache.shindig.common.testing.FakeGadgetToken;
@@ -63,13 +62,13 @@
     EasyMock.expect(servletRequest.getPathInfo()).andReturn(path);
   }
 
-  private void assertHandleGetForGroup(DataServiceServlet.GroupId group) {
-    setPath("/activities/john.doe/" + group.getJsonString());
+  private void assertHandleGetForGroup(GroupId.Type group) {
+    setPath("/activities/john.doe/@" + group.toString());
 
     ResponseItem<RestfulCollection<Activity>> data
         = new ResponseItem<RestfulCollection<Activity>>(null);
-    EasyMock.expect(activityService.getActivities("john.doe",
-        group, token)).andReturn(data);
+    EasyMock.expect(activityService.getActivities(new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(group, null), token)).andReturn(data);
 
     replay();
     assertEquals(data, handler.handleGet(servletRequest, token));
@@ -77,22 +76,23 @@
   }
 
   public void testHandleGetAll() throws Exception {
-    assertHandleGetForGroup(DataServiceServlet.GroupId.ALL);
+    assertHandleGetForGroup(GroupId.Type.all);
   }
 
   public void testHandleGetFriends() throws Exception {
-    assertHandleGetForGroup(DataServiceServlet.GroupId.FRIENDS);
+    assertHandleGetForGroup(GroupId.Type.friends);
   }
 
   public void testHandleGetSelf() throws Exception {
-    assertHandleGetForGroup(DataServiceServlet.GroupId.SELF);
+    assertHandleGetForGroup(GroupId.Type.self);
   }
 
   public void testHandleGetActivityById() throws Exception {
     setPath("/people/john.doe/@friends/jane.doe");
 
     ResponseItem<Activity> data = new ResponseItem<Activity>(null);
-    EasyMock.expect(activityService.getActivity("john.doe", DataServiceServlet.GroupId.FRIENDS,
+    EasyMock.expect(activityService.getActivity(new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.friends, null),
         "jane.doe", token)).andReturn(data);
 
     replay();
@@ -109,7 +109,8 @@
     EasyMock.expect(converter.convertToObject(jsonActivity, Activity.class)).andReturn(activity);
 
     ResponseItem data = new ResponseItem<Object>(null);
-    EasyMock.expect(activityService.createActivity("john.doe", activity, token)).andReturn(data);
+    EasyMock.expect(activityService.createActivity(new UserId(UserId.Type.userId, "john.doe"),
+        activity, token)).andReturn(data);
     replay();
     return data;
   }

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/AppDataHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/AppDataHandlerTest.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/AppDataHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/AppDataHandlerTest.java Thu Jun 12 18:02:31 2008
@@ -28,7 +28,6 @@
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
-import java.util.Map;
 
 public class AppDataHandlerTest extends TestCase {
   private BeanJsonConverter converter;
@@ -64,12 +63,13 @@
     EasyMock.expect(servletRequest.getPathInfo()).andReturn(path);
   }
 
-  private void assertHandleGetForGroup(DataServiceServlet.GroupId group) {
-    setPath("/activities/john.doe/" + group.getJsonString() + "/appId");
+  private void assertHandleGetForGroup(GroupId.Type group) {
+    setPath("/activities/john.doe/@" + group.toString() + "/appId");
     EasyMock.expect(servletRequest.getParameter("fields")).andReturn(null);
 
     ResponseItem<DataCollection> data = new ResponseItem<DataCollection>(null);
-    EasyMock.expect(appDataService.getPersonData("john.doe", group,
+    EasyMock.expect(appDataService.getPersonData(new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(group, null),
         Lists.<String>newArrayList(), "appId", token)).andReturn(data);
 
     replay();
@@ -78,15 +78,15 @@
   }
 
   public void testHandleGetAll() throws Exception {
-    assertHandleGetForGroup(DataServiceServlet.GroupId.ALL);
+    assertHandleGetForGroup(GroupId.Type.all);
   }
 
   public void testHandleGetFriends() throws Exception {
-    assertHandleGetForGroup(DataServiceServlet.GroupId.FRIENDS);
+    assertHandleGetForGroup(GroupId.Type.friends);
   }
 
   public void testHandleGetSelf() throws Exception {
-    assertHandleGetForGroup(DataServiceServlet.GroupId.SELF);
+    assertHandleGetForGroup(GroupId.Type.self);
   }
 
   public void testHandleGetWithoutFields() throws Exception {
@@ -94,7 +94,8 @@
     EasyMock.expect(servletRequest.getParameter("fields")).andReturn("pandas");
 
     ResponseItem<DataCollection> data = new ResponseItem<DataCollection>(null);
-    EasyMock.expect(appDataService.getPersonData("john.doe", DataServiceServlet.GroupId.FRIENDS,
+    EasyMock.expect(appDataService.getPersonData(new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.friends, null),
         Lists.newArrayList("pandas"), "appId", token)).andReturn(data);
 
     replay();
@@ -112,7 +113,8 @@
     EasyMock.expect(converter.convertToObject(jsonAppData, HashMap.class)).andReturn(values);
 
     ResponseItem data = new ResponseItem<Object>(null);
-    EasyMock.expect(appDataService.updatePersonData("john.doe", DataServiceServlet.GroupId.SELF,
+    EasyMock.expect(appDataService.updatePersonData(new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.self, null),
         Lists.newArrayList("pandas"), values, "appId", token)).andReturn(data);
     replay();
     return data;
@@ -135,7 +137,8 @@
     EasyMock.expect(servletRequest.getParameter("fields")).andReturn("pandas");
 
     ResponseItem data = new ResponseItem<Object>(null);
-    EasyMock.expect(appDataService.deletePersonData("john.doe", DataServiceServlet.GroupId.SELF,
+    EasyMock.expect(appDataService.deletePersonData(new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.self, null),
         Lists.newArrayList("pandas"), "appId", token)).andReturn(data);
 
     replay();

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataRequestHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataRequestHandlerTest.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataRequestHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataRequestHandlerTest.java Thu Jun 12 18:02:31 2008
@@ -23,6 +23,7 @@
 import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
 import org.apache.shindig.common.SecurityToken;
+import org.apache.shindig.common.testing.FakeGadgetToken;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -36,36 +37,14 @@
   private DataRequestHandler drh;
   private HttpServletRequest req;
   private HttpServletResponse resp;
+  private BeanJsonConverter converter;
 
   @Override
   protected void setUp() throws Exception {
     req = EasyMock.createMock(HttpServletRequest.class);
     resp = EasyMock.createMock(HttpServletResponse.class);
-    drh = new DataRequestHandler(null) {
-      ResponseItem handleDelete(HttpServletRequest servletRequest,
-          SecurityToken token) {
-        return null;
-      }
-
-      ResponseItem handlePut(HttpServletRequest servletRequest,
-          SecurityToken token) {
-        return null;
-      }
-
-      ResponseItem handlePost(HttpServletRequest servletRequest,
-          SecurityToken token) {
-        return null;
-      }
-
-      ResponseItem handleGet(HttpServletRequest servletRequest,
-          SecurityToken token) {
-        return null;
-      }
-    };
-  }
+    converter = EasyMock.createMock(BeanJsonConverter.class);
 
-  public void testHandleMethodSuccess() throws Exception {
-    BeanJsonConverter converter = EasyMock.createMock(BeanJsonConverter.class);
     drh = new DataRequestHandler(converter) {
       ResponseItem handleDelete(HttpServletRequest servletRequest,
           SecurityToken token) {
@@ -87,7 +66,9 @@
         return new ResponseItem<String>("GET");
       }
     };
+  }
 
+  public void testHandleMethodSuccess() throws Exception {
     verifyDispatchMethodCalled("DELETE", converter);
     verifyDispatchMethodCalled("PUT", converter);
     verifyDispatchMethodCalled("POST", converter);
@@ -115,6 +96,16 @@
     verifyExceptionThrown("HEAD");
   }
 
+  private void verifyExceptionThrown(String methodName) throws IOException {
+    try {
+      drh.handleMethod(methodName, req, resp, null);
+      fail("The invalid method " + methodName + " should throw an exception.");
+    } catch (IllegalArgumentException e) {
+      // Yea! We like exeptions
+      assertEquals("Unserviced Http method type", e.getMessage());
+    }
+  }
+
   public void testHandleMethodFailure() throws Exception {
     drh = new DataRequestHandler(null) {
       ResponseItem handleDelete(HttpServletRequest servletRequest,
@@ -144,21 +135,11 @@
     EasyMock.verify(req, resp);
   }
 
-  private void verifyExceptionThrown(String methodName) throws IOException {
-    try {
-      drh.handleMethod(methodName, req, resp, null);
-      fail("The invalid method " + methodName + " should throw an exception.");
-    } catch (IllegalArgumentException e) {
-      // Yea! We like exeptions
-      assertEquals("Unserviced Http method type", e.getMessage());
-    }
-  }
-
   public void testGetParamsFromRequest() throws Exception {
     EasyMock.expect(req.getPathInfo()).andReturn("/people/5/@self");
 
     EasyMock.replay(req);
-    String[] params = drh.getParamsFromRequest(req);
+    String[] params = DataRequestHandler.getParamsFromRequest(req);
     assertEquals("5", params[0]);
     assertEquals("@self", params[1]);
     EasyMock.verify(req);
@@ -168,7 +149,7 @@
     EasyMock.expect(req.getPathInfo()).andReturn("/people/5/@self");
 
     EasyMock.replay(req);
-    assertEquals("5/@self", drh.getQueryPath(req));
+    assertEquals("5/@self", DataRequestHandler.getQueryPath(req));
     EasyMock.verify(req);
   }
 
@@ -176,7 +157,7 @@
     EasyMock.expect(req.getParameter("field")).andReturn("name");
 
     EasyMock.replay(req);
-    assertEquals(PersonService.SortOrder.name, drh.getEnumParam(req, "field",
+    assertEquals(PersonService.SortOrder.name, DataRequestHandler.getEnumParam(req, "field",
         PersonService.SortOrder.topFriends, PersonService.SortOrder.class));
     EasyMock.verify(req);
 
@@ -186,7 +167,7 @@
     EasyMock.expect(req.getParameter("field")).andReturn(null);
 
     EasyMock.replay(req);
-    assertEquals(PersonService.SortOrder.topFriends, drh.getEnumParam(req, "field",
+    assertEquals(PersonService.SortOrder.topFriends, DataRequestHandler.getEnumParam(req, "field",
         PersonService.SortOrder.topFriends, PersonService.SortOrder.class));
     EasyMock.verify(req);
   }
@@ -195,7 +176,7 @@
     EasyMock.expect(req.getParameter("field")).andReturn("5");
 
     EasyMock.replay(req);
-    assertEquals(5, drh.getIntegerParam(req, "field", 100));
+    assertEquals(5, DataRequestHandler.getIntegerParam(req, "field", 100));
     EasyMock.verify(req);
 
     EasyMock.reset(req);
@@ -204,7 +185,7 @@
     EasyMock.expect(req.getParameter("field")).andReturn(null);
 
     EasyMock.replay(req);
-    assertEquals(100, drh.getIntegerParam(req, "field", 100));
+    assertEquals(100, DataRequestHandler.getIntegerParam(req, "field", 100));
     EasyMock.verify(req);
   }
 
@@ -213,7 +194,7 @@
 
     EasyMock.replay(req);
     assertEquals(Lists.newArrayList("happy", "sad", "grumpy"),
-        drh.getListParam(req, "field", Lists.newArrayList("alpha")));
+        DataRequestHandler.getListParam(req, "field", Lists.newArrayList("alpha")));
     EasyMock.verify(req);
 
     EasyMock.reset(req);
@@ -223,7 +204,15 @@
 
     EasyMock.replay(req);
     assertEquals(Lists.newArrayList("alpha"),
-        drh.getListParam(req, "field", Lists.newArrayList("alpha")));
+        DataRequestHandler.getListParam(req, "field", Lists.newArrayList("alpha")));
     EasyMock.verify(req);
   }
+
+  public void testGetAppId() throws Exception {
+    FakeGadgetToken token = new FakeGadgetToken();
+    assertEquals(token.getAppId(), DataRequestHandler.getAppId(
+        DataRequestHandler.APP_SUBSTITUTION_TOKEN, token));
+
+    assertEquals("676", DataRequestHandler.getAppId("676", token));
+  }
 }
\ No newline at end of file

Added: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/GroupIdTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/GroupIdTest.java?rev=667308&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/GroupIdTest.java (added)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/GroupIdTest.java Thu Jun 12 18:02:31 2008
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.shindig.social.dataservice;
+
+import junit.framework.TestCase;
+
+public class GroupIdTest extends TestCase {
+
+  public void testFromJson() throws Exception {
+    GroupId all = GroupId.fromJson("@all");
+    assertEquals(GroupId.Type.all, all.getType());
+
+    GroupId friends = GroupId.fromJson("@friends");
+    assertEquals(GroupId.Type.friends, friends.getType());
+
+    GroupId self = GroupId.fromJson("@self");
+    assertEquals(GroupId.Type.self, self.getType());
+
+    GroupId group = GroupId.fromJson("superbia");
+    assertEquals(GroupId.Type.groupId, group.getType());
+    assertEquals("superbia", group.getGroupId());
+  }
+
+}
\ No newline at end of file

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/PersonHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/PersonHandlerTest.java?rev=667308&r1=667307&r2=667308&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/PersonHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/PersonHandlerTest.java Thu Jun 12 18:02:31 2008
@@ -74,8 +74,10 @@
 
     ResponseItem<RestfulCollection<Person>> data
         = new ResponseItem<RestfulCollection<Person>>(null);
-    EasyMock.expect(personService.getPeople("john.doe",
-        DataServiceServlet.GroupId.ALL, PersonService.SortOrder.topFriends,
+    EasyMock.expect(personService.getPeople(
+        new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.all, null),
+        PersonService.SortOrder.topFriends,
         PersonService.FilterType.all, 0, 20,
         Sets.newHashSet(Person.Field.ID.toString(),
             Person.Field.NAME.toString(),
@@ -98,8 +100,10 @@
 
     ResponseItem<RestfulCollection<Person>> data
         = new ResponseItem<RestfulCollection<Person>>(null);
-    EasyMock.expect(personService.getPeople("john.doe",
-        DataServiceServlet.GroupId.FRIENDS, PersonService.SortOrder.topFriends,
+    EasyMock.expect(personService.getPeople(
+        new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.friends, null),
+        PersonService.SortOrder.topFriends,
         PersonService.FilterType.all, 0, 20,
         Sets.newHashSet(Person.Field.ID.toString(),
             Person.Field.NAME.toString(),
@@ -125,7 +129,9 @@
 
     ResponseItem<RestfulCollection<Person>> data
         = new ResponseItem<RestfulCollection<Person>>(null);
-    EasyMock.expect(personService.getPeople("john.doe", DataServiceServlet.GroupId.FRIENDS, order,
+    EasyMock.expect(personService.getPeople(
+        new UserId(UserId.Type.userId, "john.doe"),
+        new GroupId(GroupId.Type.friends, null), order,
         filter, 5, 10, Sets.newHashSet("money", "fame", "fortune"), token)).andReturn(data);
 
     replay();
@@ -140,7 +146,9 @@
     // TODO: This isn't right! We should be passing both john.doe and jane.doe to the service
     // We probably need to either change the getPerson parameters or add a new method to
     // the interface
-    EasyMock.expect(personService.getPerson("john.doe", token)).andReturn(data);
+    EasyMock.expect(personService.getPerson(
+        new UserId(UserId.Type.userId, "john.doe"),
+        token)).andReturn(data);
 
     replay();
     assertEquals(data, handler.handleGet(servletRequest, token));
@@ -151,7 +159,9 @@
     setPath("/people/john.doe/@self");
 
     ResponseItem<Person> data = new ResponseItem<Person>(null);
-    EasyMock.expect(personService.getPerson("john.doe", token)).andReturn(data);
+    EasyMock.expect(personService.getPerson(
+        new UserId(UserId.Type.userId, "john.doe"),
+        token)).andReturn(data);
 
     replay();
     assertEquals(data, handler.handleGet(servletRequest, token));

Added: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/UserIdTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/UserIdTest.java?rev=667308&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/UserIdTest.java (added)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/UserIdTest.java Thu Jun 12 18:02:31 2008
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.shindig.social.dataservice;
+
+import org.apache.shindig.common.testing.FakeGadgetToken;
+
+import junit.framework.TestCase;
+
+public class UserIdTest extends TestCase {
+
+  public void testGetUserId() throws Exception {
+    UserId owner = new UserId(UserId.Type.owner, "hello");
+    assertEquals("owner", owner.getUserId(new FakeGadgetToken()));
+
+    UserId viewer = new UserId(UserId.Type.viewer, "hello");
+    assertEquals("viewer", viewer.getUserId(new FakeGadgetToken()));
+
+    UserId user = new UserId(UserId.Type.userId, "hello");
+    assertEquals("hello", user.getUserId(new FakeGadgetToken()));
+  }
+
+  public void testFromJson() throws Exception {
+    UserId owner = UserId.fromJson("@owner");
+    assertEquals(UserId.Type.owner, owner.type);
+
+    UserId viewer = UserId.fromJson("@viewer");
+    assertEquals(UserId.Type.viewer, viewer.type);
+
+    UserId user = UserId.fromJson("john.doe");
+    assertEquals(UserId.Type.userId, user.type);
+    assertEquals("john.doe", user.userId);
+  }
+
+}
\ No newline at end of file