Author: doll
Date: Wed Jun 18 12:39:54 2008
New Revision: 669268
URL: http://svn.apache.org/viewvc?rev=669268&view=rev
Log:
The dataservice rest impl now supports a jsonBatch format. This batch format
can now be optionally turned on in the restfulcontainer.js code.
(As soon as php implements the batching stuff then we can remove the flag and
always use batching)
Added:
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/RestfulBatchTest.java
Modified:
incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js
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/RequestItem.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/integration/RestfulJsonPeopleTest.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=669268&r1=669267&r2=669268&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js
(original)
+++ incubator/shindig/trunk/features/opensocial-current/restfulcontainer.js Wed
Jun 18 12:39:54 2008
@@ -38,6 +38,8 @@
this.baseUrl_ = baseUrl;
this.securityToken_ = shindig.auth.getSecurityToken();
+
+ this.useBatching_ = false;
};
RestfulContainer.inherits(opensocial.Container);
@@ -94,7 +96,6 @@
var url = requestObject.request.url;
var separator = url.indexOf("?") != -1 ? "&" : "?";
- // TODO: Use batching instead of doing this one by one
gadgets.io.makeNonProxiedRequest(
baseUrl + url + separator + "st=" + st,
function(result) {
@@ -115,8 +116,61 @@
}
// may need multiple urls for one response but lets ignore that for now
- for (var i = 0; i < totalRequests; i++) {
- makeProxiedRequest(requestObjects[i], this.baseUrl_, this.securityToken_);
+ // TODO: Once both the php and java code decide on and implement batching
+ // the non-batching code should be deleted
+ if (!this.useBatching_) {
+ for (var i = 0; i < totalRequests; i++) {
+ makeProxiedRequest(requestObjects[i], this.baseUrl_,
this.securityToken_);
+ }
+
+ } else {
+ var jsonBatchData = {};
+
+ for (var j = 0; j < totalRequests; j++) {
+ var requestObject = requestObjects[j];
+
+ jsonBatchData[requestObject.key] = {url : requestObject.request.url,
+ method : requestObject.request.method};
+ if (requestObject.request.postData) {
+ jsonBatchData[requestObject.key].parameters =
requestObject.request.postData;
+ }
+ }
+
+ // This is slightly different than jsonContainer
+ var sendResponse = function(result) {
+ result = result.data;
+
+ if (!result || result['error']) {
+ callback(new opensocial.DataResponse({}, true));
+ return;
+ }
+
+ var responses = result['responses'] || [];
+ var globalError = false;
+
+ var responseMap = {};
+
+ for (var k = 0; k < requestObjects.length; k++) {
+ var request = requestObjects[k];
+ var response = responses[request.key];
+
+ var rawData = response['response'];
+ var error = response['error'];
+ var errorMessage = response['errorMessage'];
+
+ var processedData = request.request.processResponse(
+ request.request, rawData, error, errorMessage);
+ globalError = globalError || processedData.hadError();
+ responseMap[request.key] = processedData;
+ }
+
+ var dataResponse = new opensocial.DataResponse(responseMap, globalError);
+ callback(dataResponse);
+ };
+
+ // TODO: get the jsonbatch url from the container config
+ new BatchRequest(this.baseUrl_ + "/jsonBatch",
gadgets.json.stringify(jsonBatchData),
+ sendResponse, {'st' : shindig.auth.getSecurityToken()}).send();
}
};
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=669268&r1=669267&r2=669268&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
Wed Jun 18 12:39:54 2008
@@ -17,28 +17,31 @@
*/
package org.apache.shindig.social.dataservice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-
-import org.apache.shindig.common.SecurityTokenDecoder;
import org.apache.shindig.common.SecurityToken;
+import org.apache.shindig.common.SecurityTokenDecoder;
import org.apache.shindig.common.SecurityTokenException;
import org.apache.shindig.common.servlet.InjectedServlet;
+import org.apache.shindig.social.ResponseItem;
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 org.apache.shindig.social.ResponseItem;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import org.apache.commons.lang.StringUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
-
public class DataServiceServlet extends InjectedServlet {
protected static final String X_HTTP_METHOD_OVERRIDE =
"X-HTTP-Method-Override";
@@ -58,6 +61,7 @@
private Map<String, Class<? extends DataRequestHandler>> handlers;
private BeanJsonConverter jsonConverter;
private BeanXmlConverter xmlConverter;
+ private static final String JSON_BATCH_ROUTE = "jsonBatch";
@Inject
public void setHandlers(HandlerProvider handlers) {
@@ -65,8 +69,7 @@
}
@Inject
- public void setSecurityTokenDecoder(SecurityTokenDecoder
- securityTokenDecoder) {
+ public void setSecurityTokenDecoder(SecurityTokenDecoder
securityTokenDecoder) {
this.securityTokenDecoder = securityTokenDecoder;
}
@@ -102,12 +105,67 @@
protected void doPost(HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
throws ServletException, IOException {
- String path = servletRequest.getPathInfo();
- logger.finest("Handling restful request for " + path);
+ logger.finest("Handling restful request for " +
servletRequest.getPathInfo());
servletRequest.setCharacterEncoding("UTF-8");
+ SecurityToken token = getSecurityToken(servletRequest);
+ BeanConverter converter = getConverterForRequest(servletRequest);
- String route = getRouteFromParameter(path);
+ if (isBatchUrl(servletRequest)) {
+ try {
+ handleBatchRequest(servletRequest, servletResponse, token, converter);
+ } catch (JSONException e) {
+ throw new RuntimeException("Bad batch format", e);
+ }
+ } else {
+ handleSingleRequest(servletRequest, servletResponse, token, converter);
+ }
+ }
+
+ private void handleSingleRequest(HttpServletRequest servletRequest,
+ HttpServletResponse servletResponse, SecurityToken token,
+ BeanConverter converter) throws IOException {
+ String method = getHttpMethodFromParameter(servletRequest.getMethod(),
+ servletRequest.getParameter(X_HTTP_METHOD_OVERRIDE));
+
+ RequestItem requestItem = new RequestItem(servletRequest, token, method);
+ ResponseItem responseItem = getResponseItem(converter, requestItem);
+
+ if (responseItem.getError() == null) {
+ PrintWriter writer = servletResponse.getWriter();
+ writer.write(converter.convertToString(responseItem.getResponse()));
+ } else {
+ servletResponse.sendError(responseItem.getError().getHttpErrorCode(),
+ responseItem.getErrorMessage());
+ }
+ }
+
+ private void handleBatchRequest(HttpServletRequest servletRequest,
+ HttpServletResponse servletResponse, SecurityToken token,
+ BeanConverter converter) throws IOException, JSONException {
+
+ JSONObject requests = new
JSONObject(servletRequest.getParameter("request"));
+ Map<String, ResponseItem> responses = Maps.newHashMap();
+
+ Iterator keys = requests.keys();
+ while (keys.hasNext()) {
+ String key = (String) keys.next();
+ String request = requests.getString(key);
+
+ RequestItem requestItem = converter.convertToObject(request,
RequestItem.class);
+ requestItem.parseUrlParamsIntoParameters();
+ requestItem.setToken(token);
+
+ responses.put(key, getResponseItem(converter, requestItem));
+ }
+
+ PrintWriter writer = servletResponse.getWriter();
+ writer.write(converter.convertToString(
+ Maps.immutableMap("error", false, "responses", responses)));
+ }
+
+ ResponseItem getResponseItem(BeanConverter converter, RequestItem
requestItem) {
+ String route = getRouteFromParameter(requestItem.getUrl());
Class<? extends DataRequestHandler> handlerClass = handlers.get(route);
if (handlerClass == null) {
@@ -115,13 +173,12 @@
}
DataRequestHandler handler = injector.getInstance(handlerClass);
- BeanConverter converter = getConverterForRequest(servletRequest);
- // TODO: Move all conversions out of the handler up into the servlet layer
handler.setConverter(converter);
- String method = getHttpMethodFromParameter(servletRequest.getMethod(),
- servletRequest.getParameter(X_HTTP_METHOD_OVERRIDE));
+ return handler.handleMethod(requestItem);
+ }
+ SecurityToken getSecurityToken(HttpServletRequest servletRequest) {
SecurityToken token;
try {
token =
securityTokenDecoder.createToken(servletRequest.getParameter(SECURITY_TOKEN_PARAM));
@@ -129,20 +186,10 @@
throw new RuntimeException(
"Implement error return for bad security token.");
}
-
- ResponseItem responseItem = handler.handleMethod(
- new RequestItem(servletRequest, token, method));
-
- if (responseItem.getError() == null) {
- PrintWriter writer = servletResponse.getWriter();
- writer.write(converter.convertToString(responseItem.getResponse()));
- } else {
- servletResponse.sendError(responseItem.getError().getHttpErrorCode(),
- responseItem.getErrorMessage());
- }
+ return token;
}
- /*package-protected*/ BeanConverter
getConverterForRequest(HttpServletRequest servletRequest) {
+ BeanConverter getConverterForRequest(HttpServletRequest servletRequest) {
String formatString = servletRequest.getParameter(FORMAT_PARAM);
if (!StringUtils.isBlank(formatString) &&
formatString.equals(ATOM_FORMAT)) {
return xmlConverter;
@@ -150,8 +197,7 @@
return jsonConverter;
}
- /*package-protected*/ String getHttpMethodFromParameter(String method,
- String overrideParameter) {
+ String getHttpMethodFromParameter(String method, String overrideParameter) {
if (!StringUtils.isBlank(overrideParameter)) {
return overrideParameter;
} else {
@@ -159,11 +205,15 @@
}
}
- /*package-protected*/ String getRouteFromParameter(String pathInfo) {
+ String getRouteFromParameter(String pathInfo) {
pathInfo = pathInfo.substring(1);
int indexOfNextPathSeparator = pathInfo.indexOf("/");
return indexOfNextPathSeparator != -1 ?
pathInfo.substring(0, indexOfNextPathSeparator) :
pathInfo;
}
+
+ boolean isBatchUrl(HttpServletRequest servletRequest) {
+ return servletRequest.getPathInfo().endsWith(JSON_BATCH_ROUTE);
+ }
}
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=669268&r1=669267&r2=669268&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
Wed Jun 18 12:39:54 2008
@@ -34,6 +34,8 @@
private Map<String, String> parameters;
private SecurityToken token;
+ public RequestItem() { }
+
public RequestItem(String url, Map<String, String> parameters, SecurityToken
token,
String method) {
this.url = url;
@@ -50,7 +52,7 @@
Map<String, String> parameters = Maps.newHashMap();
Enumeration names = servletRequest.getParameterNames();
- while(names.hasMoreElements()) {
+ while (names.hasMoreElements()) {
String name = (String) names.nextElement();
parameters.put(name, servletRequest.getParameter(name));
}
@@ -58,6 +60,30 @@
return parameters;
}
+ /*
+ * Takes any url params out of the url and puts them into the param map.
+ * 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();
+ }
+
+ String fullUrl = this.url;
+ int queryParamIndex = fullUrl.indexOf("?");
+
+ if (queryParamIndex != -1) {
+ this.url = fullUrl.substring(0, queryParamIndex);
+
+ 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] : "");
+ }
+ }
+ }
+
public String getUrl() {
return url;
}
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=669268&r1=669267&r2=669268&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
Wed Jun 18 12:39:54 2008
@@ -147,37 +147,24 @@
}
public void testInvalidRoute() throws Exception {
- req.setCharacterEncoding("UTF-8");
- EasyMock.expect(req.getPathInfo()).andReturn("/ahhh!");
-
- EasyMock.replay(req);
try {
- servlet.doPost(req, res);
+ servlet.getResponseItem(null, new RequestItem("/ahhh!", null, null,
null));
fail("The route should not have found a valid handler.");
} catch (RuntimeException e) {
// Yea!
assertEquals("No handler for route: ahhh!", e.getMessage());
}
- EasyMock.verify(req);
}
public void testSecurityTokenException() throws Exception {
- req.setCharacterEncoding("UTF-8");
- EasyMock.expect(req.getPathInfo()).andReturn("/" +
DataServiceServlet.APPDATA_ROUTE);
- EasyMock.expect(req.getMethod()).andReturn("POST");
-
EasyMock.expect(req.getParameter(DataServiceServlet.X_HTTP_METHOD_OVERRIDE)).andReturn("POST");
-
EasyMock.expect(req.getParameter(DataServiceServlet.FORMAT_PARAM)).andReturn(null);
-
String tokenString = "owner:viewer:app:container.com:foo:bar";
EasyMock.expect(req.getParameter(DataServiceServlet.SECURITY_TOKEN_PARAM))
.andReturn(tokenString);
EasyMock.expect(tokenDecoder.createToken(tokenString)).andThrow(new
SecurityTokenException(""));
- setupInjector();
-
- EasyMock.replay(req, tokenDecoder, injector);
+ EasyMock.replay(req, tokenDecoder);
try {
- servlet.doPost(req, res);
+ servlet.getSecurityToken(req);
fail("The route should have thrown an exception due to the invalid
security token.");
} catch (RuntimeException e) {
// Yea!
@@ -185,7 +172,7 @@
// instead of just throwing an exception.
assertEquals("Implement error return for bad security token.",
e.getMessage());
}
- EasyMock.verify(req, tokenDecoder, injector);
+ EasyMock.verify(req, tokenDecoder);
}
public void testGetHttpMethodFromParameter() throws Exception {
@@ -202,6 +189,20 @@
assertEquals("path", servlet.getRouteFromParameter("/path/fun/yes"));
}
+ public void testIsBatchUrl() throws Exception {
+ assertBatchUrl("/jsonBatch", true);
+ assertBatchUrl("/path/to/the/jsonBatch", true);
+ assertBatchUrl("/people/normalpath", false);
+ }
+
+ private void assertBatchUrl(String url, boolean isBatch) {
+ EasyMock.expect(req.getPathInfo()).andReturn(url);
+ EasyMock.replay(req);
+ assertEquals(isBatch, servlet.isBatchUrl(req));
+ EasyMock.verify(req);
+ EasyMock.reset(req);
+ }
+
public void testGetConverterForRequest() throws Exception {
BeanJsonConverter json = new BeanJsonConverter();
BeanXmlConverter xml = new BeanXmlConverter();
Added:
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=669268&view=auto
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java
(added)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/RequestItemTest.java
Wed Jun 18 12:39:54 2008
@@ -0,0 +1,64 @@
+/*
+ * 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 junit.framework.TestCase;
+
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+
+public class RequestItemTest extends TestCase {
+
+ public void testParseUrl() throws Exception {
+ String path = "/people/john.doe/@self";
+
+ RequestItem request = new RequestItem();
+ request.setUrl(path + "?fields=huey,dewey,louie");
+
+ request.parseUrlParamsIntoParameters();
+
+ assertEquals(path, request.getUrl());
+ assertEquals("huey,dewey,louie", request.getParameters().get("fields"));
+
+ // Try it without any params
+ request = new RequestItem();
+ request.setUrl(path);
+
+ request.parseUrlParamsIntoParameters();
+
+ assertEquals(path, request.getUrl());
+ assertEquals(null, request.getParameters().get("fields"));
+ }
+
+ public void testBasicFunctions() throws Exception {
+ String url = "url";
+ Map<String, String> params = Maps.newHashMap();
+ SecurityToken token = null;
+ String method = "method";
+ RequestItem request = new RequestItem(url, params, token, method);
+
+ assertEquals(url, request.getUrl());
+ assertEquals(params, request.getParameters());
+ assertEquals(token, request.getToken());
+ assertEquals(method, request.getMethod());
+ }
+
+}
\ No newline at end of file
Added:
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=669268&view=auto
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java
(added)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulBatchTest.java
Wed Jun 18 12:39:54 2008
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. 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. For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+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 {
+
+ /**
+ * Batch format:
+ * POST to /jsonBatch
+ * {request :
+ * {friends : {url : /people/john.doe/@friends, method : GET}}
+ * {john : {url : /people/john.doe/@self, method : GET}}
+ * {updateData : {url : /appdata/john.doe/@self/appId, method : POST,
postData : {count : 1}}}
+ * }
+ *
+ *
+ * Expected response
+ *
+ * {error : false,
+ * responses : {
+ * {friends : {response : {<friend collection>}}}
+ * {john : {response : {<john.doe>}}}
+ * {updateData : {response : {}}}
+ * }
+ *
+ * Each response can possibly have .error and .errorMessage properties as
well.
+ *
+ * @throws Exception if test encounters an error
+ */
+ @Test
+ public void testGetBatchRequest() throws Exception {
+ Map<String, String> extraParams = Maps.newHashMap();
+ extraParams.put("request", "{"
+ + "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}}}"
+ + "}");
+
+ String resp = getJsonResponse("jsonBatch", "POST", extraParams);
+ JSONObject result = getJson(resp);
+
+ assertEquals(false, result.getBoolean("error"));
+
+ JSONObject jsonResponses = result.getJSONObject("responses");
+ assertEquals(3, jsonResponses.length());
+
+ // friends response
+ JSONObject jsonFriends = jsonResponses.getJSONObject("friends");
+ assertFalse(jsonFriends.has("error"));
+ assertFalse(jsonFriends.has("errorMessage"));
+
+ JSONObject jsonFriendsResponse = jsonFriends.getJSONObject("response");
+ assertEquals(2, jsonFriendsResponse.getInt("totalResults"));
+ assertEquals(0, jsonFriendsResponse.getInt("startIndex"));
+
+ // john.doe response
+ JSONObject jsonJohn = jsonResponses.getJSONObject("john");
+ assertFalse(jsonJohn.has("error"));
+ assertFalse(jsonJohn.has("errorMessage"));
+
+ JSONObject jsonJohnResponse = jsonJohn.getJSONObject("response");
+ assertEquals("john.doe", jsonJohnResponse.getString("id"));
+ assertEquals("John Doe",
jsonJohnResponse.getJSONObject("name").getString("unstructured"));
+
+ // john.doe response
+ JSONObject jsonData = jsonResponses.getJSONObject("updateData");
+ assertFalse(jsonData.has("error"));
+ assertFalse(jsonData.has("errorMessage"));
+ assertTrue(jsonData.has("response"));
+ }
+
+}
\ No newline at end of file
Modified:
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java?rev=669268&r1=669267&r2=669268&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java
Wed Jun 18 12:39:54 2008
@@ -29,7 +29,6 @@
import org.apache.shindig.social.opensocial.model.Url;
import com.google.common.collect.Maps;
-import org.easymock.classextension.EasyMock;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;