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/21 02:51:37 UTC

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

Author: doll
Date: Fri Jun 20 17:51:37 2008
New Revision: 670107

URL: http://svn.apache.org/viewvc?rev=670107&view=rev
Log:
Added url templates to the dataservice handlers to simplify their code a bunch. This logic went into the RequestItem class. 

This also handles the spec format for posts now. For creating activities and app data the postdata is read directly instread of being mapped under an "entry" item. This changed the js code so I wrapped the changes in a useLegacy flag. Once the php updates to the more spec exact format we will remove this flag. 



Modified:
    incubator/shindig/trunk/features/core.io/io.js
    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/AppDataHandler.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/RequestItem.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/DataServiceServletTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/PersonHandlerTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityTest.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonDataTest.java

Modified: incubator/shindig/trunk/features/core.io/io.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core.io/io.js?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core.io/io.js (original)
+++ incubator/shindig/trunk/features/core.io/io.js Fri Jun 20 17:51:37 2008
@@ -168,7 +168,7 @@
           resp.data = resp.text;
           break;
       }
-	}
+  }
     return resp;
   }
 
@@ -184,7 +184,7 @@
    *     response from the sever before calling the callback
    */
   function makeXhrRequest(realUrl, proxyUrl, callback, paramData, method,
-      params, processResponseFunction) {
+      params, processResponseFunction, opt_contentType) {
     var xhr = makeXhr();
 
     xhr.open(method, proxyUrl, true);
@@ -193,10 +193,10 @@
           null, processResponseFunction, realUrl, callback, params, xhr);
     }
     if (paramData != null) {
-        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-        xhr.send(paramData);
+      xhr.setRequestHeader('Content-Type', opt_contentType || 'application/x-www-form-urlencoded');
+      xhr.send(paramData);
     } else {
-        xhr.send(null);
+      xhr.send(null);
     }
   }
 
@@ -339,10 +339,10 @@
     /**
      * @private
      */
-    makeNonProxiedRequest : function (relativeUrl, callback, opt_params) {
+    makeNonProxiedRequest : function (relativeUrl, callback, opt_params, opt_contentType) {
       var params = opt_params || {};
       makeXhrRequest(relativeUrl, relativeUrl, callback, params.POST_DATA,
-          params.METHOD, params, processNonProxiedResponse);
+          params.METHOD, params, processNonProxiedResponse, opt_contentType);
     },
 
     /**

Modified: incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js (original)
+++ incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js Fri Jun 20 17:51:37 2008
@@ -39,6 +39,10 @@
 
   this.securityToken_ = shindig.auth.getSecurityToken();
 
+  // TODO: Php guys delete this once you handle the new post format! ie there is no longer an
+  // "entry" field. Whatever was in the "entry" field just gets posted directly.
+  this.useLegacy_ = true;
+
   this.useBatching_ = false;
 };
 RestfulContainer.inherits(opensocial.Container);
@@ -89,8 +93,12 @@
     };
 
     if (requestObject.request.postData) {
-      makeRequestParams["POST_DATA"]
-          = gadgets.io.encodeValues(requestObject.request.postData);
+      if (this.useLegacy_) {
+        makeRequestParams["POST_DATA"] = gadgets.io.encodeValues(
+            {'entry' : gadgets.json.stringify(requestObject.request.postData)});
+      } else {
+        makeRequestParams["POST_DATA"] = gadgets.json.stringify(requestObject.request.postData);
+      }
     }
 
     var url = requestObject.request.url;
@@ -112,7 +120,8 @@
 
           checkIfFinished();
         },
-        makeRequestParams);
+        makeRequestParams,
+        this.useLegacy_ ? "application/x-www-form-urlencoded" : "application/json");
   }
 
   // may need multiple urls for one response but lets ignore that for now
@@ -132,7 +141,7 @@
       jsonBatchData[requestObject.key] = {url : requestObject.request.url,
         method : requestObject.request.method};
       if (requestObject.request.postData) {
-        jsonBatchData[requestObject.key].parameters = requestObject.request.postData;
+        jsonBatchData[requestObject.key].postData = requestObject.request.postData;
       }
     }
 
@@ -169,8 +178,16 @@
     };
 
     // TODO: get the jsonbatch url from the container config
-    new BatchRequest(this.baseUrl_ + "/jsonBatch", gadgets.json.stringify(jsonBatchData),
-        sendResponse, {'st' : shindig.auth.getSecurityToken()}).send();
+    var makeRequestParams = {
+      "CONTENT_TYPE" : "JSON",
+      "METHOD" : "POST",
+      "AUTHORIZATION" : "SIGNED",
+      "POST_DATA" : gadgets.json.stringify(jsonBatchData)
+    };
+
+  gadgets.io.makeNonProxiedRequest(
+      this.baseUrl_ + "/jsonBatch?st=" + shindig.auth.getSecurityToken(),
+      sendResponse, makeRequestParams, "application/json");
   }
 
 };
@@ -287,9 +304,7 @@
       + "/@app?fields=" + key;
   var data = {};
   data[key] = value;
-  var postData = {};
-  postData['entry'] = gadgets.json.stringify(data);
-  return new RestfulRequestItem(url, "POST", postData);
+  return new RestfulRequestItem(url, "POST", data);
 };
 
 RestfulContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
@@ -328,9 +343,7 @@
     activity) {
   var url = "/activities/" + this.translateIdSpec(idSpec)
       + "/@app"; // TODO: Handle appId correctly
-  var postData = {};
-  postData['entry'] = gadgets.json.stringify(activity.toJsonObject());
-  return new RestfulRequestItem(url, "POST", postData);
+  return new RestfulRequestItem(url, "POST", activity.toJsonObject());
 };
 
 RestfulRequestItem = function(url, method, postData, processData) {

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -17,19 +17,18 @@
  */
 package org.apache.shindig.social.dataservice;
 
-import com.google.inject.Inject;
-import com.google.common.collect.Sets;
-
-import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.opensocial.model.Activity;
 
-import java.util.Set;
-import java.util.List;
+import com.google.inject.Inject;
 
 public class ActivityHandler extends DataRequestHandler {
   private ActivityService service;
 
+  // TODO: The appId should come from the url. The spec needs to be fixed!
+  private static final String ACTIVITY_ID_PATH = "/activities/{userId}/{groupId}/{activityId}";
+  private static final String GROUP_PATH = "/activities/{userId}/{groupId}/{appId}"; // Note: not what the spec says
+
   @Inject
   public ActivityHandler(ActivityService service) {
     this.service = service;
@@ -42,16 +41,10 @@
    * /activities/john.doe/@self/1
    */
   protected ResponseItem handleDelete(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
-
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-    String activityId = segments[2];
+    request.parseUrlWithTemplate(ACTIVITY_ID_PATH);
 
-    // TODO: The appId should come from the url. The spec needs to be fixed.
-    String appId = "appId";
-
-    return service.deleteActivity(userId, groupId, appId, activityId, request.getToken());
+    return service.deleteActivity(request.getUser(), request.getGroup(),
+        request.getAppId(), request.getParameters().get("activityId"), request.getToken());
   }
 
   /**
@@ -73,24 +66,11 @@
    * - postBody is an activity object
    */
   protected ResponseItem handlePost(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
-
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-
-    String jsonActivity = request.getParameters().get("entry");
-    Activity activity = converter.convertToObject(jsonActivity, Activity.class);
-
-    // TODO: The appId should come from the url. The spec needs to be fixed.
-    String appId = "appId";
+    request.parseUrlWithTemplate(GROUP_PATH);
 
-    Set<String> fields = Sets.newHashSet();
-    List<String> urlFields = getListParam(request, "fields", null);
-    if (urlFields != null) {
-      fields = Sets.newHashSet(urlFields);
-    }
-
-    return service.createActivity(userId, groupId, appId, fields, activity, request.getToken());
+    return service.createActivity(request.getUser(), request.getGroup(),
+        request.getAppId(), request.getFields(), request.getPostData(Activity.class),
+        request.getToken());
   }
 
   /**
@@ -102,30 +82,18 @@
    * /activities/john.doe/@friends
    */
   protected ResponseItem handleGet(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
-
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-    String optionalActivityId = null;
-    if (segments.length > 2) {
-      optionalActivityId = segments[2];
-    }
+    request.parseUrlWithTemplate(ACTIVITY_ID_PATH);
+    String optionalActivityId = request.getParameters().get("activityId");
 
-    // TODO: The appId should come from the url. The spec needs to be fixed.
-    String appId = "appId";
-
-    Set<String> fields = Sets.newHashSet();
-    List<String> urlFields = getListParam(request, "fields", null);
-    if (urlFields != null) {
-      fields = Sets.newHashSet(urlFields);
-    }
-
-    // TODO: add pagination and sorting support
     if (optionalActivityId != null) {
-      return service.getActivity(userId, groupId, appId, fields, optionalActivityId,
-          request.getToken());
+      return service.getActivity(request.getUser(), request.getGroup(), request.getAppId(),
+          request.getFields(), optionalActivityId, request.getToken());
     }
-    return service.getActivities(userId, groupId, appId, fields, request.getToken());
+
+    return service.getActivities(request.getUser(), request.getGroup(), request.getAppId(),
+        // TODO: add pagination and sorting support
+        // getOrderBy(params), getFilterBy(params), getStartIndex(params), getCount(params),
+        request.getFields(), request.getToken());
   }
 
 }

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -19,16 +19,13 @@
 
 import org.apache.shindig.social.ResponseItem;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
-import java.util.List;
-import java.util.Map;
+import java.util.HashMap;
 
 public class AppDataHandler extends DataRequestHandler {
   private AppDataService service;
+  private static final String APP_DATA_PATH = "/people/{userId}/{groupId}/{appId}";
 
   @Inject
   public AppDataHandler(AppDataService service) {
@@ -49,19 +46,14 @@
    * @param request
    */
   protected ResponseItem handleDelete(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
+    request.parseUrlWithTemplate(APP_DATA_PATH);
 
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-    String appId = getAppId(segments[2], request.getToken());
-
-    List<String> fields = getListParam(request, "fields", Lists.<String>newArrayList());
-    return service.deletePersonData(userId, groupId, appId, Sets.newHashSet(fields),
-        request.getToken());
+    return service.deletePersonData(request.getUser(), request.getGroup(),
+        request.getAppId(), request.getFields(), request.getToken());
   }
 
   /**
-   * /people/{userId}/{groupId}/{appId}
+   * /appdata/{userId}/{groupId}/{appId}
    * - fields={field1, field2}
    *
    * examples:
@@ -77,7 +69,7 @@
   }
 
   /**
-   * /people/{userId}/{groupId}/{appId}
+   * /appdata/{userId}/{groupId}/{appId}
    * - fields={field1, field2}
    *
    * examples:
@@ -85,25 +77,14 @@
    * /appdata/john.doe/@self/app
    *
    * The post data should be a regular json object. All of the fields vars will
-   * be pulled from the values and set on the person object. If there are no
+   * be pulled from the values and set. If there are no
    * fields vars then all of the data will be overridden.
    */
   protected ResponseItem handlePost(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
-
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-    String appId = getAppId(segments[2], request.getToken());
-
-    List<String> fields = getListParam(request, "fields",
-        Lists.<String>newArrayList());
+    request.parseUrlWithTemplate(APP_DATA_PATH);
 
-    String jsonAppData = request.getParameters().get("entry");
-    Map<String, String> values = Maps.newHashMap();
-    values = converter.convertToObject(jsonAppData,
-        (Class<Map<String, String>>) values.getClass());
-
-    return service.updatePersonData(userId, groupId, appId, Sets.newHashSet(fields), values,
+    return service.updatePersonData(request.getUser(), request.getGroup(),
+        request.getAppId(), request.getFields(), request.getPostData(HashMap.class),
         request.getToken());
   }
 
@@ -116,19 +97,10 @@
    * /appdata/john.doe/@self/app
    */
   protected ResponseItem handleGet(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
-
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-    String appId = getAppId(segments[2], request.getToken());
-
-    // TODO: Make this field fetching common code and have the Set be the native type so
-    // we don't keep translating back and forth
-    List<String> fields = getListParam(request, "fields",
-        Lists.<String>newArrayList());
+    request.parseUrlWithTemplate(APP_DATA_PATH);
 
-    return service.getPersonData(userId, groupId, appId, Sets.newHashSet(fields),
-        request.getToken());
+    return service.getPersonData(request.getUser(), request.getGroup(),
+        request.getAppId(), request.getFields(), request.getToken());
   }
 
 }

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -17,22 +17,11 @@
  */
 package org.apache.shindig.social.dataservice;
 
-import org.apache.shindig.common.SecurityToken;
 import org.apache.shindig.social.ResponseItem;
-import org.apache.shindig.social.opensocial.util.BeanConverter;
 
-import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
 
-import java.util.List;
-
 public abstract class DataRequestHandler {
-  protected BeanConverter converter;
-  protected static final String APP_SUBSTITUTION_TOKEN = "@app";
-
-  public void setConverter(BeanConverter converter) {
-    this.converter = converter;
-  }
 
   public ResponseItem handleMethod(RequestItem request) {
     String httpMethod = request.getMethod();
@@ -62,48 +51,4 @@
   protected abstract ResponseItem handlePost(RequestItem request);
 
   protected abstract ResponseItem handleGet(RequestItem request);
-
-  protected static String[] getParamsFromRequest(RequestItem request) {
-    return getQueryPath(request).split("/");
-  }
-
-  /*package-protected*/ static String getQueryPath(RequestItem request) {
-    String pathInfo = request.getUrl();
-    int index = pathInfo.indexOf('/', 1);
-    return pathInfo.substring(index + 1);
-  }
-
-  protected static <T extends Enum<T>> T getEnumParam(RequestItem request, String paramName,
-      T defaultValue, Class<T> enumClass) {
-    String paramValue = request.getParameters().get(paramName);
-    if (paramValue != null) {
-      return Enum.valueOf(enumClass, paramValue);
-    }
-    return defaultValue;
-  }
-
-  protected static int getIntegerParam(RequestItem request, String paramName, int defaultValue) {
-    String paramValue = request.getParameters().get(paramName);
-    if (paramValue != null) {
-      return new Integer(paramValue);
-    }
-    return defaultValue;
-  }
-
-  protected static List<String> getListParam(RequestItem request, String paramName,
-      List<String> defaultValue) {
-    String paramValue = request.getParameters().get(paramName);
-    if (paramValue != null) {
-      return Lists.newArrayList(paramValue.split(","));
-    }
-    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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -29,6 +29,7 @@
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -128,8 +129,8 @@
     String method = getHttpMethodFromParameter(servletRequest.getMethod(),
         servletRequest.getParameter(X_HTTP_METHOD_OVERRIDE));
 
-    RequestItem requestItem = new RequestItem(servletRequest, token, method);
-    ResponseItem responseItem = getResponseItem(converter, requestItem);
+    RequestItem requestItem = new RequestItem(servletRequest, token, method, converter);
+    ResponseItem responseItem = getResponseItem(requestItem);
 
     if (responseItem.getError() == null) {
       PrintWriter writer = servletResponse.getWriter();
@@ -144,7 +145,8 @@
       HttpServletResponse servletResponse, SecurityToken token,
       BeanConverter converter) throws IOException, JSONException {
 
-    JSONObject requests = new JSONObject(servletRequest.getParameter("request"));
+    byte[] postedBytes = IOUtils.toByteArray(servletRequest.getInputStream());
+    JSONObject requests = new JSONObject(new String(postedBytes));
     Map<String, ResponseItem> responses = Maps.newHashMap();
 
     Iterator keys = requests.keys();
@@ -153,10 +155,10 @@
       String request = requests.getString(key);
 
       RequestItem requestItem = converter.convertToObject(request, RequestItem.class);
-      requestItem.parseUrlParamsIntoParameters();
       requestItem.setToken(token);
+      requestItem.setConverter(converter);
 
-      responses.put(key, getResponseItem(converter, requestItem));
+      responses.put(key, getResponseItem(requestItem));
     }
 
     PrintWriter writer = servletResponse.getWriter();
@@ -164,7 +166,7 @@
         Maps.immutableMap("error", false, "responses", responses)));
   }
 
-  ResponseItem getResponseItem(BeanConverter converter, RequestItem requestItem) {
+  ResponseItem getResponseItem(RequestItem requestItem) {
     String route = getRouteFromParameter(requestItem.getUrl());
     Class<? extends DataRequestHandler> handlerClass = handlers.get(route);
 
@@ -173,8 +175,6 @@
     }
 
     DataRequestHandler handler = injector.getInstance(handlerClass);
-    handler.setConverter(converter);
-
     return handler.handleMethod(requestItem);
   }
 
@@ -183,8 +183,7 @@
     try {
       token = securityTokenDecoder.createToken(servletRequest.getParameter(SECURITY_TOKEN_PARAM));
     } catch (SecurityTokenException e) {
-      throw new RuntimeException(
-          "Implement error return for bad security token.");
+      throw new RuntimeException("Implement error return for bad security token.", e);
     }
     return token;
   }

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -21,7 +21,6 @@
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.opensocial.model.Person;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
@@ -31,6 +30,12 @@
 public class PersonHandler extends DataRequestHandler {
   private PersonService personService;
 
+  private static final String PEOPLE_PATH = "/people/{userId}/{groupId}/{personId}";
+  protected static final Set<String> DEFAULT_PERSON_FIELDS = Sets.newHashSet(
+      Person.Field.ID.toString(),
+      Person.Field.NAME.toString(),
+      Person.Field.THUMBNAIL_URL.toString());
+
   @Inject
   public PersonHandler(PersonService personService) {
     this.personService = personService;
@@ -59,39 +64,24 @@
    * /people/john.doe/@self
    */
   protected ResponseItem handleGet(RequestItem request) {
-    String[] segments = getParamsFromRequest(request);
-
-    UserId userId = UserId.fromJson(segments[0]);
-    GroupId groupId = GroupId.fromJson(segments[1]);
-
-    String optionalPersonId = null;
-    if (segments.length > 2) {
-      optionalPersonId = segments[2];
-    }
+    request.parseUrlWithTemplate(PEOPLE_PATH);
 
-    Set<String> fields = Sets.newHashSet(
-        getListParam(request, "fields",
-            Lists.newArrayList(Person.Field.ID.toString(),
-                Person.Field.NAME.toString(),
-                Person.Field.THUMBNAIL_URL.toString())));
+    UserId userId = request.getUser();
+    GroupId groupId = request.getGroup();
+    String optionalPersonId = request.getParameters().get("personId");
+    Set<String> fields = request.getFields(DEFAULT_PERSON_FIELDS);
 
     if (groupId.getType() == GroupId.Type.self) {
       return personService.getPerson(userId, fields, request.getToken());
+
     } else if (optionalPersonId != null) {
-      // TODO: Add some crazy concept to handle the userId? 
+      // TODO: Add some crazy concept to handle the userId?
       return personService.getPerson(new UserId(UserId.Type.userId, optionalPersonId),
           fields, request.getToken());
     }
 
-    PersonService.SortOrder sort = getEnumParam(request, "orderBy",
-        PersonService.SortOrder.topFriends, PersonService.SortOrder.class);
-    PersonService.FilterType filter = getEnumParam(request, "filterBy",
-        PersonService.FilterType.all, PersonService.FilterType.class);
-
-    int first = getIntegerParam(request, "startIndex", 0);
-    int max = getIntegerParam(request, "count", 20);
-
-    return personService.getPeople(userId, groupId, sort, filter, first, max,
+    return personService.getPeople(userId, groupId, request.getOrderBy(),
+        request.getFilterBy(), request.getStartIndex(), request.getCount(),
         fields, request.getToken());
   }
 

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/RequestItem.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/RequestItem.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/RequestItem.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/RequestItem.java Fri Jun 20 17:51:37 2008
@@ -18,34 +18,64 @@
 package org.apache.shindig.social.dataservice;
 
 import org.apache.shindig.common.SecurityToken;
+import org.apache.shindig.social.opensocial.util.BeanConverter;
 
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.commons.io.IOUtils;
 
+import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
-import java.util.Map;
+import java.io.IOException;
 import java.util.Enumeration;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Represents the request items that come from the restful request.
  */
 public class RequestItem {
+  // Common OpenSocial RESTful fields
+  public static final String APP_ID = "appId";
+  public static final String USER_ID = "userId";
+  public static final String GROUP_ID = "groupId";
+  public static final String START_INDEX = "startIndex";
+  public static final String COUNT = "count";
+  public static final String ORDER_BY = "orderBy";
+  public static final String FILTER_BY = "filterBy";
+  public static final String FIELDS = "fields";
+
+  // OpenSocial defaults
+  public static final int DEFAULT_START_INDEX = 0;
+  public static final int DEFAULT_COUNT = 20;
+
+  public static final String APP_SUBSTITUTION_TOKEN = "@app";
+
   private String url;
   private String method;
-  private Map<String, String> parameters;
+  private Map<String, String> params;
+  private String postData;
+
   private SecurityToken token;
+  private BeanConverter converter;
 
   public RequestItem() { }
 
-  public RequestItem(String url, Map<String, String> parameters, SecurityToken token,
-      String method) {
-    this.url = url;
-    this.parameters = parameters;
+  public RequestItem(HttpServletRequest servletRequest, SecurityToken token, String method,
+      BeanConverter converter) {
+    this.url = servletRequest.getPathInfo();
+    this.params = createParameterMap(servletRequest);
     this.token = token;
+
     this.method = method;
-  }
+    this.converter = converter;
 
-  public RequestItem(HttpServletRequest servletRequest, SecurityToken token, String method) {
-    this(servletRequest.getPathInfo(), createParameterMap(servletRequest), token, method);
+    try {
+      ServletInputStream is = servletRequest.getInputStream();
+      postData = new String(IOUtils.toByteArray(is));
+    } catch (IOException e) {
+      throw new RuntimeException("Could not get the post data from the request", e);
+    }
   }
 
   private static Map<String, String> createParameterMap(HttpServletRequest servletRequest) {
@@ -65,9 +95,9 @@
    * Usually the servlet request code does this for us but the batch request calls have to do it
    * by hand.
    */
-  public void parseUrlParamsIntoParameters() {
-    if (this.parameters == null) {
-      this.parameters = Maps.newHashMap();
+  void putUrlParamsIntoParameters() {
+    if (this.params == null) {
+      this.params = Maps.newHashMap();
     }
 
     String fullUrl = this.url;
@@ -79,11 +109,91 @@
       String queryParams = fullUrl.substring(queryParamIndex + 1);
       for (String param : queryParams.split("&")) {
         String[] paramPieces = param.split("=", 2);
-        this.parameters.put(paramPieces[0], paramPieces.length == 2 ? paramPieces[1] : "");
+        this.params.put(paramPieces[0], paramPieces.length == 2 ? paramPieces[1] : "");
       }
     }
   }
 
+  /**
+   * This could definitely be cleaner..
+   * TODO: Come up with a cleaner way to handle all of this code.
+   *
+   * @param urlTemplate The template the url follows
+   */
+  public void parseUrlWithTemplate(String urlTemplate) {
+    this.putUrlParamsIntoParameters();
+
+    String[] actualUrl = this.url.split("/");
+    String[] expectedUrl = urlTemplate.split("/");
+
+    for (int i = 0; i < actualUrl.length; i++) {
+      String actualPart = actualUrl[i];
+      String expectedPart = expectedUrl[i];
+
+      if (expectedPart.startsWith("{")) {
+        this.params.put(expectedPart.substring(1, expectedPart.length() - 1), actualPart);
+      }
+    }
+  }
+
+  public String getAppId() {
+    String appId = params.get(APP_ID);
+
+    if (appId != null && appId.equals(APP_SUBSTITUTION_TOKEN)) {
+      return token.getAppId();
+    } else {
+      return appId;
+    }
+  }
+
+  public UserId getUser() {
+    return UserId.fromJson(params.get(USER_ID));
+  }
+
+  public GroupId getGroup() {
+    return GroupId.fromJson(params.get(GROUP_ID));
+  }
+
+  public int getStartIndex() {
+    String startIndex = params.get(START_INDEX);
+    return startIndex == null ? DEFAULT_START_INDEX : Integer.valueOf(startIndex);
+  }
+
+  public int getCount() {
+    String count = params.get(COUNT);
+    return count == null ? DEFAULT_COUNT : Integer.valueOf(count);
+  }
+
+  public PersonService.SortOrder getOrderBy() {
+    String orderBy = params.get(ORDER_BY);
+    return orderBy == null
+        ? PersonService.SortOrder.topFriends
+        : PersonService.SortOrder.valueOf(orderBy);
+  }
+
+  public PersonService.FilterType getFilterBy() {
+    String filterBy = params.get(FILTER_BY);
+    return filterBy == null
+        ? PersonService.FilterType.all
+        : PersonService.FilterType.valueOf(filterBy);
+  }
+
+  public Set<String> getFields() {
+    return getFields(Sets.<String>newHashSet());
+  }
+
+  public Set<String> getFields(Set<String> defaultValue) {
+    String paramValue = params.get(FIELDS);
+    if (paramValue != null) {
+      return Sets.newHashSet(paramValue.split(","));
+    }
+    return defaultValue;
+  }
+
+  public <T> T getPostData(Class<T> postDataClass) {
+    return converter.convertToObject(postData, postDataClass);
+  }
+
   public String getUrl() {
     return url;
   }
@@ -101,11 +211,19 @@
   }
 
   public Map<String, String> getParameters() {
-    return parameters;
+    return params;
   }
 
   public void setParameters(Map<String, String> parameters) {
-    this.parameters = parameters;
+    this.params = parameters;
+  }
+
+  public String getPostData() {
+    return postData;
+  }
+
+  public void setPostData(String postData) {
+    this.postData = postData;
   }
 
   public SecurityToken getToken() {
@@ -115,4 +233,12 @@
   public void setToken(SecurityToken token) {
     this.token = token;
   }
+
+  public BeanConverter getConverter() {
+    return converter;
+  }
+
+  public void setConverter(BeanConverter converter) {
+    this.converter = converter;
+  }
 }
\ No newline at end of file

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -18,7 +18,6 @@
 package org.apache.shindig.social.dataservice;
 
 import org.apache.shindig.social.ResponseItem;
-import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.opensocial.model.ActivityImpl;
 import org.apache.shindig.social.opensocial.model.Activity;
 import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
@@ -47,7 +46,6 @@
     activityService = EasyMock.createMock(ActivityService.class);
 
     handler = new ActivityHandler(activityService);
-    handler.setConverter(converter);
   }
 
   private void replay() {
@@ -61,13 +59,19 @@
   }
 
   private void setPath(String path) {
+    this.setPathAndPostData(path, null);
+  }
+
+  private void setPathAndPostData(String path, String postData) {
     Map<String, String> params = Maps.newHashMap();
     params.put("fields", null);
-    this.setPathAndParams(path, params);
-  }
 
-  private void setPathAndParams(String path, Map<String, String> params) {
-    request = new RequestItem(path, params, token, null);
+    request = new RequestItem();
+    request.setUrl(path);
+    request.setParameters(params);
+    request.setToken(token);
+    request.setConverter(converter);
+    request.setPostData(postData);
   }
 
   private void assertHandleGetForGroup(GroupId.Type group) {
@@ -76,7 +80,7 @@
     ResponseItem<RestfulCollection<Activity>> data
         = new ResponseItem<RestfulCollection<Activity>>(null);
     EasyMock.expect(activityService.getActivities(new UserId(UserId.Type.userId, "john.doe"),
-        new GroupId(group, null), "appId", Sets.<String>newHashSet(), token)).andReturn(data);
+        new GroupId(group, null), null, Sets.<String>newHashSet(), token)).andReturn(data);
 
     replay();
     assertEquals(data, handler.handleGet(request));
@@ -101,7 +105,7 @@
     ResponseItem<Activity> data = new ResponseItem<Activity>(null);
     EasyMock.expect(activityService.getActivity(new UserId(UserId.Type.userId, "john.doe"),
         new GroupId(GroupId.Type.friends, null),
-        "appId", Sets.<String>newHashSet(), "jane.doe", token)).andReturn(data);
+        null, Sets.<String>newHashSet(), "jane.doe", token)).andReturn(data);
 
     replay();
     assertEquals(data, handler.handleGet(request));
@@ -111,17 +115,14 @@
   private ResponseItem setupPostData() {
     String jsonActivity = "{title: hi mom!, etc etc}";
 
-    Map<String, String> params = Maps.newHashMap();
-    params.put("entry", jsonActivity);
-    params.put("fields", null);
-    setPathAndParams("/people/john.doe/@self", params);
+    setPathAndPostData("/people/john.doe/@self", jsonActivity);
 
     Activity activity = new ActivityImpl();
     EasyMock.expect(converter.convertToObject(jsonActivity, Activity.class)).andReturn(activity);
 
     ResponseItem data = new ResponseItem<Object>(null);
     EasyMock.expect(activityService.createActivity(new UserId(UserId.Type.userId, "john.doe"),
-        new GroupId(GroupId.Type.self, null), "appId", Sets.<String>newHashSet(),
+        new GroupId(GroupId.Type.self, null), null, Sets.<String>newHashSet(),
         activity, token)).andReturn(data);
     replay();
     return data;
@@ -144,7 +145,7 @@
 
     ResponseItem data = new ResponseItem<Object>(null);
     EasyMock.expect(activityService.deleteActivity(new UserId(UserId.Type.userId, "john.doe"),
-        new GroupId(GroupId.Type.self, null), "appId", "1", token)).andReturn(data);
+        new GroupId(GroupId.Type.self, null), null, "1", token)).andReturn(data);
 
     replay();
     assertEquals(data, handler.handleDelete(request));

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -21,7 +21,6 @@
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import junit.framework.TestCase;
@@ -45,7 +44,6 @@
     appDataService = EasyMock.createMock(AppDataService.class);
 
     handler = new AppDataHandler(appDataService);
-    handler.setConverter(converter);
   }
 
   private void replay() {
@@ -65,7 +63,16 @@
   }
 
   private void setPathAndParams(String path, Map<String, String> params) {
-    request = new RequestItem(path, params, token, null);
+    setPathAndParams(path, params, null);
+  }
+
+  private void setPathAndParams(String path, Map<String, String> params, String postData) {
+    request = new RequestItem();
+    request.setUrl(path);
+    request.setParameters(params);
+    request.setToken(token);
+    request.setConverter(converter);
+    request.setPostData(postData);
   }
 
   private void assertHandleGetForGroup(GroupId.Type group) {
@@ -113,8 +120,7 @@
 
     Map<String, String> params = Maps.newHashMap();
     params.put("fields", "pandas");
-    params.put("entry", jsonAppData);
-    setPathAndParams("/appData/john.doe/@self/appId", params);
+    setPathAndParams("/appData/john.doe/@self/appId", params, jsonAppData);
 
     HashMap<String, String> values = Maps.newHashMap();
     EasyMock.expect(converter.convertToObject(jsonAppData, HashMap.class)).andReturn(values);

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -17,15 +17,10 @@
  */
 package org.apache.shindig.social.dataservice;
 
-import org.apache.shindig.common.testing.FakeGadgetToken;
 import org.apache.shindig.social.ResponseItem;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import junit.framework.TestCase;
 
-import java.util.Map;
-
 public class DataRequestHandlerTest extends TestCase {
   private DataRequestHandler drh;
   private RequestItem request;
@@ -50,7 +45,7 @@
       }
     };
 
-    request = new RequestItem(null, null, null, null);
+    request = new RequestItem();
   }
 
   public void testHandleMethodSuccess() throws Exception {
@@ -81,75 +76,4 @@
       assertEquals("Unserviced Http method type", e.getMessage());
     }
   }
-
-  public void testGetParamsFromRequest() throws Exception {
-    String[] params = DataRequestHandler.getParamsFromRequest(
-        new RequestItem("/people/5/@self", null, null, null));
-    assertEquals("5", params[0]);
-    assertEquals("@self", params[1]);
-  }
-
-  public void testGetQueryPath() throws Exception {
-    assertEquals("5/@self", DataRequestHandler.getQueryPath(
-        new RequestItem("/people/5/@self", null, null, null)));
-  }
-
-  public void testGetEnumParam() throws Exception {
-    Map<String, String> parameters = Maps.newHashMap();
-    parameters.put("field", "name");
-
-    assertEquals(PersonService.SortOrder.name, DataRequestHandler.getEnumParam(
-        new RequestItem(null, parameters, null, null), "field",
-        PersonService.SortOrder.topFriends, PersonService.SortOrder.class));
-
-    // Should return the default value if the parameter is null
-    parameters = Maps.newHashMap();
-    parameters.put("field", null);
-
-    assertEquals(PersonService.SortOrder.topFriends, DataRequestHandler.getEnumParam(
-        new RequestItem(null, parameters, null, null), "field",
-        PersonService.SortOrder.topFriends, PersonService.SortOrder.class));
-  }
-
-  public void testGetIntegerParam() throws Exception {
-    Map<String, String> parameters = Maps.newHashMap();
-    parameters.put("field", "5");
-
-    assertEquals(5, DataRequestHandler.getIntegerParam(
-        new RequestItem(null, parameters, null, null), "field", 100));
-
-    // Should return the default value if the parameter is null
-    parameters = Maps.newHashMap();
-    parameters.put("field", null);
-
-    assertEquals(100, DataRequestHandler.getIntegerParam(
-        new RequestItem(null, parameters, null, null), "field", 100));
-  }
-
-  public void testGetListParam() throws Exception {
-    Map<String, String> parameters = Maps.newHashMap();
-    parameters.put("field", "happy,sad,grumpy");
-
-    assertEquals(Lists.newArrayList("happy", "sad", "grumpy"),
-        DataRequestHandler.getListParam(
-            new RequestItem(null, parameters, null, null),
-            "field", Lists.newArrayList("alpha")));
-
-    // Should return the default value if the parameter is null
-    parameters = Maps.newHashMap();
-    parameters.put("field", null);
-
-    assertEquals(Lists.newArrayList("alpha"),
-        DataRequestHandler.getListParam(
-            new RequestItem(null, parameters, null, null),
-            "field", Lists.newArrayList("alpha")));
-  }
-
-  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

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataServiceServletTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataServiceServletTest.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataServiceServletTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/DataServiceServletTest.java Fri Jun 20 17:51:37 2008
@@ -20,21 +20,22 @@
 import org.apache.shindig.common.BasicSecurityTokenDecoder;
 import org.apache.shindig.common.SecurityTokenException;
 import org.apache.shindig.common.testing.FakeGadgetToken;
-import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
-import org.apache.shindig.social.opensocial.util.BeanXmlConverter;
-import org.apache.shindig.social.opensocial.util.BeanConverter;
 import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.SocialApiTestsGuiceModule;
+import org.apache.shindig.social.opensocial.util.BeanConverter;
+import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
+import org.apache.shindig.social.opensocial.util.BeanXmlConverter;
 
-import com.google.inject.Injector;
 import com.google.inject.Guice;
-import com.google.common.collect.Maps;
+import com.google.inject.Injector;
 import junit.framework.TestCase;
 import org.easymock.classextension.EasyMock;
 
+import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
+import java.io.IOException;
 import java.util.Enumeration;
 import java.util.StringTokenizer;
 
@@ -50,6 +51,12 @@
   private BeanJsonConverter jsonConverter;
   private BeanXmlConverter xmlConverter;
 
+  private final ServletInputStream dummyPostData = new ServletInputStream() {
+    public int read() throws IOException {
+      return -1;
+    }
+  };
+
   protected void setUp() throws Exception {
     servlet = new DataServiceServlet();
     req = EasyMock.createMock(HttpServletRequest.class);
@@ -115,6 +122,7 @@
       String actualMethod, String overrideMethod, String expectedMethod) throws Exception {
     req.setCharacterEncoding("UTF-8");
 
+    EasyMock.expect(req.getInputStream()).andStubReturn(dummyPostData);
     EasyMock.expect(req.getPathInfo()).andStubReturn(pathInfo);
     EasyMock.expect(req.getMethod()).andStubReturn(actualMethod);
     EasyMock.expect(req.getParameterNames()).andStubReturn((Enumeration) new StringTokenizer(""));
@@ -136,7 +144,6 @@
         .andReturn(new ResponseItem<String>(jsonObject));
 
     EasyMock.expect(jsonConverter.convertToString(jsonObject)).andReturn(jsonObject);
-    handler.setConverter(jsonConverter);
 
     PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
     EasyMock.expect(res.getWriter()).andReturn(writerMock);
@@ -149,8 +156,10 @@
   }
 
   public void testInvalidRoute() throws Exception {
+    RequestItem requestItem = new RequestItem();
+    requestItem.setUrl("/ahhh!");
     try {
-      servlet.getResponseItem(null, new RequestItem("/ahhh!", null, null, null));
+      servlet.getResponseItem(requestItem);
       fail("The route should not have found a valid handler.");
     } catch (RuntimeException e) {
       // Yea!

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=670107&r1=670106&r2=670107&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 Fri Jun 20 17:51:37 2008
@@ -66,7 +66,10 @@
   }
 
   private void setPathAndParams(String path, Map<String, String> params) {
-    request = new RequestItem(path, params, token, null);
+    request = new RequestItem();
+    request.setUrl(path);
+    request.setParameters(params);
+    request.setToken(token);
   }
 
   public void testHandleGetAllNoParams() throws Exception {

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java Fri Jun 20 17:51:37 2008
@@ -18,13 +18,14 @@
 package org.apache.shindig.social.dataservice;
 
 import org.apache.shindig.common.SecurityToken;
+import org.apache.shindig.common.testing.FakeGadgetToken;
 
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import junit.framework.TestCase;
 
 import java.util.Map;
 
-import com.google.common.collect.Maps;
-
 public class RequestItemTest extends TestCase {
 
   public void testParseUrl() throws Exception {
@@ -33,7 +34,7 @@
     RequestItem request = new RequestItem();
     request.setUrl(path + "?fields=huey,dewey,louie");
 
-    request.parseUrlParamsIntoParameters();
+    request.putUrlParamsIntoParameters();
 
     assertEquals(path, request.getUrl());
     assertEquals("huey,dewey,louie", request.getParameters().get("fields"));
@@ -42,7 +43,7 @@
     request = new RequestItem();
     request.setUrl(path);
 
-    request.parseUrlParamsIntoParameters();
+    request.putUrlParamsIntoParameters();
 
     assertEquals(path, request.getUrl());
     assertEquals(null, request.getParameters().get("fields"));
@@ -53,12 +54,95 @@
     Map<String, String> params = Maps.newHashMap();
     SecurityToken token = null;
     String method = "method";
-    RequestItem request = new RequestItem(url, params, token, method);
+    RequestItem request = new RequestItem();
 
+    request.setUrl(url);
     assertEquals(url, request.getUrl());
+
+    request.setParameters(params);
     assertEquals(params, request.getParameters());
-    assertEquals(token, request.getToken());
+
+    request.setMethod(method);
     assertEquals(method, request.getMethod());
+
+    request.setToken(token);
+    assertEquals(token, request.getToken());
+  }
+
+  public void testGetAppId() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.immutableMap("appId", "100"));
+    assertEquals("100", request.getAppId());
+
+    FakeGadgetToken token = new FakeGadgetToken();
+    request.setToken(token);
+    request.setParameters(Maps.immutableMap("appId", "@app"));
+    assertEquals(token.getAppId(), request.getAppId());
+  }
+
+  public void testGetUser() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.immutableMap("userId", "@owner"));
+    assertEquals(UserId.Type.owner, request.getUser().type);
+  }
+
+  public void testGetGroup() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.immutableMap("groupId", "@self"));
+    assertEquals(GroupId.Type.self, request.getGroup().getType());
+  }
+
+  public void testStartIndex() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.<String, String>immutableMap("startIndex", null));
+    assertEquals(0, request.getStartIndex());
+
+    request.setParameters(Maps.immutableMap("startIndex", "5"));
+    assertEquals(5, request.getStartIndex());
+  }
+
+  public void testCount() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.<String, String>immutableMap("count", null));
+    assertEquals(20, request.getCount());
+
+    request.setParameters(Maps.immutableMap("count", "5"));
+    assertEquals(5, request.getCount());
+  }
+
+  public void testOrderBy() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.<String, String>immutableMap("orderBy", null));
+    assertEquals(PersonService.SortOrder.topFriends, request.getOrderBy());
+
+    request.setParameters(Maps.immutableMap("orderBy", "name"));
+    assertEquals(PersonService.SortOrder.name, request.getOrderBy());
+  }
+
+  public void testFilterBy() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.<String, String>immutableMap("filterBy", null));
+    assertEquals(PersonService.FilterType.all, request.getFilterBy());
+
+    request.setParameters(Maps.immutableMap("filterBy", "hasApp"));
+    assertEquals(PersonService.FilterType.hasApp, request.getFilterBy());
+  }
+
+  public void testFields() throws Exception {
+    RequestItem request = new RequestItem();
+
+    request.setParameters(Maps.<String, String>immutableMap("fields", null));
+    assertEquals(Sets.<String>newHashSet(), request.getFields());
+
+    request.setParameters(Maps.immutableMap("fields", "happy,sad,grumpy"));
+    assertEquals(Sets.newHashSet("happy", "sad", "grumpy"), request.getFields());
   }
 
 }
\ No newline at end of file

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java Fri Jun 20 17:51:37 2008
@@ -34,6 +34,7 @@
 import org.easymock.classextension.EasyMock;
 import org.json.JSONObject;
 
+import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.xml.stream.XMLInputFactory;
@@ -42,7 +43,9 @@
 import javax.xml.stream.XMLStreamReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 import java.io.PrintWriter;
+import java.io.IOException;
 import java.util.Map;
 import java.util.Vector;
 
@@ -70,11 +73,20 @@
   }
 
   protected String getJsonResponse(String path, String method) throws Exception {
-    return getJsonResponse(path, method, Maps.<String, String>newHashMap());
+    return getJsonResponse(path, method, Maps.<String, String>newHashMap(), "");
   }
 
-  protected String getJsonResponse(String path, String method, Map<String, String> extraParams)
-      throws Exception {
+  protected String getJsonResponse(String path, String method,
+      Map<String, String> extraParams) throws Exception {
+    return getJsonResponse(path, method, extraParams, "");
+  }
+
+  protected String getJsonResponse(String path, String method, String postData) throws Exception {
+    return getJsonResponse(path, method, Maps.<String, String>newHashMap(), postData);
+  }
+
+  protected String getJsonResponse(String path, String method, Map<String, String> extraParams,
+      String postData) throws Exception {
     req.setCharacterEncoding("UTF-8");
 
     EasyMock.expect(req.getPathInfo()).andStubReturn(path);
@@ -91,6 +103,18 @@
       EasyMock.expect(req.getParameter(entry.getKey())).andStubReturn(entry.getValue());
     }
 
+    if (postData == null) {
+      postData = "";
+    }
+
+    final InputStream stream = new ByteArrayInputStream(postData.getBytes());
+    ServletInputStream servletStream = new ServletInputStream () {
+      public int read() throws IOException {
+        return stream.read();
+      }
+    };
+    EasyMock.expect(req.getInputStream()).andReturn(servletStream);
+
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     PrintWriter writer = new PrintWriter(outputStream);
     EasyMock.expect(res.getWriter()).andReturn(writer);

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java Fri Jun 20 17:51:37 2008
@@ -17,12 +17,9 @@
  */
 package org.apache.shindig.social.dataservice.integration;
 
-import com.google.common.collect.Maps;
 import org.json.JSONObject;
 import org.junit.Test;
 
-import java.util.Map;
-
 public class RestfulBatchTest extends AbstractLargeRestfulTests {
 
   /**
@@ -50,14 +47,13 @@
    */
   @Test
   public void testGetBatchRequest() throws Exception {
-    Map<String, String> extraParams = Maps.newHashMap();
-    extraParams.put("request", "{"
+    String postData = "{"
         + "friends : {url : '/people/john.doe/@friends', method : 'GET'}, "
         + "john : {url : '/people/john.doe/@self', method : 'GET'}, "
-        + "updateData : {url : '/appdata/john.doe/@self/a', method : 'POST', parameters : {entry : {count : 1}}}"
-        + "}");
+        + "updateData : {url : '/appdata/john.doe/@self/a', method : 'POST', postData : {count : 1}}}"
+        + "}";
 
-    String resp = getJsonResponse("jsonBatch", "POST", extraParams);
+    String resp = getJsonResponse("jsonBatch", "POST", postData);
     JSONObject result = getJson(resp);
 
     assertEquals(false, result.getBoolean("error"));

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityTest.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityTest.java Fri Jun 20 17:51:37 2008
@@ -20,15 +20,11 @@
 import org.apache.shindig.social.SocialApiTestsGuiceModule;
 import org.apache.shindig.social.opensocial.model.Activity;
 
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.json.JSONArray;
 import org.junit.Test;
 
-import java.util.Map;
-
-import com.google.common.collect.Maps;
-
 public class RestfulJsonActivityTest extends AbstractLargeRestfulTests {
 
   /**
@@ -120,9 +116,8 @@
 
   @Test
   public void testCreateActivity() throws Exception {
-    Map<String, String> extraParams = Maps.newHashMap();
-    extraParams.put("entry", "{title : 'hi mom!', body : 'and dad.'}");
-    getJsonResponse("/activities/john.doe/@self", "POST", extraParams);
+    String postData = "{title : 'hi mom!', body : 'and dad.'}";
+    getJsonResponse("/activities/john.doe/@self", "POST", postData);
 
      String resp = getJsonResponse("/activities/john.doe/@self", "GET");
     JSONObject result = getJson(resp);

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonDataTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonDataTest.java?rev=670107&r1=670106&r2=670107&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonDataTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonDataTest.java Fri Jun 20 17:51:37 2008
@@ -19,13 +19,12 @@
 
 import org.apache.shindig.social.SocialApiTestsGuiceModule.MockXmlStateFileFetcher;
 
+import com.google.common.collect.Maps;
 import org.json.JSONObject;
 import org.junit.Test;
 
 import java.util.Map;
 
-import com.google.common.collect.Maps;
-
 
 public class RestfulJsonDataTest extends AbstractLargeRestfulTests {
 
@@ -166,8 +165,8 @@
 
     Map<String, String> extraParams = Maps.newHashMap();
     extraParams.put("fields", "count");
-    extraParams.put("entry", "{count : 5}");
-    getJsonResponse("/appdata/john.doe/@self/app", "POST", extraParams);
+    String postData = "{count : 5}";
+    getJsonResponse("/appdata/john.doe/@self/app", "POST", extraParams, postData);
 
     assertCount("5");
   }