Author: doll
Date: Tue Aug 5 18:37:37 2008
New Revision: 683077
URL: http://svn.apache.org/viewvc?rev=683077&view=rev
Log:
Instead of throwing runtime exceptions the DataServiceServlet more properly
returns the correct ResponseError.
Modified:
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/DataServiceServlet.java
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
Modified:
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/DataServiceServlet.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/DataServiceServlet.java?rev=683077&r1=683076&r2=683077&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/DataServiceServlet.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/DataServiceServlet.java
Tue Aug 5 18:37:37 2008
@@ -22,8 +22,9 @@
import org.apache.shindig.common.SecurityTokenException;
import org.apache.shindig.common.servlet.InjectedServlet;
import org.apache.shindig.common.servlet.ParameterFetcher;
-import org.apache.shindig.social.ResponseItem;
+import org.apache.shindig.common.util.ImmediateFuture;
import org.apache.shindig.social.ResponseError;
+import org.apache.shindig.social.ResponseItem;
import com.google.common.collect.Maps;
import com.google.inject.Inject;
@@ -79,7 +80,7 @@
}
@Inject
- public void setBeanConverters(@Named("bean.converter.json") BeanConverter
jsonConverter,
+ public void setBeanConverters(@Named("bean.converter.json") BeanConverter
jsonConverter,
@Named("bean.converter.xml") BeanConverter xmlConverter) {
this.jsonConverter = jsonConverter;
this.xmlConverter = xmlConverter;
@@ -119,20 +120,36 @@
logger.finest("Handling restful request for " +
servletRequest.getPathInfo());
servletRequest.setCharacterEncoding("UTF-8");
- SecurityToken token = getSecurityToken(servletRequest);
+
+ SecurityToken token = null;
+ try {
+ // TODO: Integrate this with the oauth filter.
+ token = getSecurityToken(servletRequest);
+ } catch (SecurityTokenException e) {
+ sendError(servletResponse, new
ResponseItem<Object>(ResponseError.UNAUTHORIZED,
+ "The security token was invalid", null));
+ }
+
BeanConverter converter = getConverterForRequest(servletRequest);
if (isBatchUrl(servletRequest)) {
try {
handleBatchRequest(servletRequest, servletResponse, token, converter);
} catch (JSONException e) {
- throw new RuntimeException("Bad batch format", e);
+ sendError(servletResponse, new
ResponseItem<Object>(ResponseError.BAD_REQUEST,
+ "The batch request had an invalid format.", null));
}
} else {
handleSingleRequest(servletRequest, servletResponse, token, converter);
}
}
+ private void sendError(HttpServletResponse servletResponse, ResponseItem
responseItem)
+ throws IOException {
+ servletResponse.sendError(responseItem.getError().getHttpErrorCode(),
+ responseItem.getErrorMessage());
+ }
+
/** Handler for non-batch requests */
private void handleSingleRequest(HttpServletRequest servletRequest,
HttpServletResponse servletResponse, SecurityToken token,
@@ -147,8 +164,7 @@
PrintWriter writer = servletResponse.getWriter();
writer.write(converter.convertToString(responseItem.getResponse()));
} else {
- servletResponse.sendError(responseItem.getError().getHttpErrorCode(),
- responseItem.getErrorMessage());
+ sendError(servletResponse, responseItem);
}
}
@@ -212,7 +228,8 @@
Class<? extends DataRequestHandler> handlerClass = handlers.get(route);
if (handlerClass == null) {
- throw new RuntimeException("No handler for route: " + route);
+ return ImmediateFuture.newInstance(new
ResponseItem<Object>(ResponseError.BAD_REQUEST,
+ "The url path " + route + " is not supported", null));
}
DataRequestHandler handler = injector.getInstance(handlerClass);
@@ -223,14 +240,8 @@
return new ResponseItem<Void>(ResponseError.INTERNAL_ERROR,
t.getMessage(), null);
}
- SecurityToken getSecurityToken(HttpServletRequest servletRequest) {
- SecurityToken token;
- try {
- token =
securityTokenDecoder.createToken(parameterFetcher.fetch(servletRequest));
- } catch (SecurityTokenException e) {
- throw new RuntimeException("Implement error return for bad security
token.", e);
- }
- return token;
+ SecurityToken getSecurityToken(HttpServletRequest servletRequest) throws
SecurityTokenException {
+ return
securityTokenDecoder.createToken(parameterFetcher.fetch(servletRequest));
}
BeanConverter getConverterForRequest(HttpServletRequest servletRequest) {
Modified:
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java?rev=683077&r1=683076&r2=683077&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
Tue Aug 5 18:37:37 2008
@@ -20,20 +20,13 @@
import org.apache.shindig.common.BasicSecurityTokenDecoder;
import org.apache.shindig.common.SecurityTokenDecoder;
import org.apache.shindig.common.SecurityTokenException;
-import org.apache.shindig.common.util.ImmediateFuture;
import org.apache.shindig.common.testing.FakeGadgetToken;
+import org.apache.shindig.common.util.ImmediateFuture;
+import org.apache.shindig.social.ResponseError;
import org.apache.shindig.social.ResponseItem;
import org.apache.shindig.social.SocialApiTestsGuiceModule;
import org.apache.shindig.social.core.util.BeanJsonConverter;
import org.apache.shindig.social.core.util.BeanXmlConverter;
-import org.apache.shindig.social.opensocial.service.ActivityHandler;
-import org.apache.shindig.social.opensocial.service.AppDataHandler;
-import org.apache.shindig.social.opensocial.service.DataRequestHandler;
-import org.apache.shindig.social.opensocial.service.DataServiceServlet;
-import org.apache.shindig.social.opensocial.service.DataServiceServletFetcher;
-import org.apache.shindig.social.opensocial.service.HandlerProvider;
-import org.apache.shindig.social.opensocial.service.PersonHandler;
-import org.apache.shindig.social.opensocial.service.RequestItem;
import com.google.inject.Guice;
import com.google.inject.Injector;
@@ -43,12 +36,12 @@
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import java.io.PrintWriter;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.Collections;
import java.util.StringTokenizer;
-import java.util.concurrent.Future;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -131,7 +124,7 @@
public void testFailedRequest() throws Exception {
String route = '/' + DataServiceServlet.APPDATA_ROUTE;
setupRequest(route, "GET", null);
-
EasyMock.expect(injector.getInstance(AppDataHandler.class)).andStubReturn(appDataHandler);
+
EasyMock.expect(injector.getInstance(AppDataHandler.class)).andStubReturn(appDataHandler);
setupInjector();
EasyMock.expect(appDataHandler.handleItem(EasyMock.isA(RequestItem.class)));
@@ -158,7 +151,7 @@
String jsonObject = "my lovely json";
ResponseItem<String> response = new ResponseItem<String>(jsonObject);
-
+
EasyMock.expect(handler.handleItem(EasyMock.isA(RequestItem.class)));
EasyMock.expectLastCall().andReturn(ImmediateFuture.newInstance(response));
@@ -197,13 +190,9 @@
public void testInvalidRoute() throws Exception {
RequestItem requestItem = new RequestItem();
requestItem.setUrl("/ahhh!");
- try {
- servlet.handleRequestItem(requestItem);
- fail("The route should not have found a valid handler.");
- } catch (RuntimeException e) {
- // Yea!
- assertEquals("No handler for route: ahhh!", e.getMessage());
- }
+
+ ResponseItem responseItem = servlet.handleRequestItem(requestItem).get();
+ assertEquals(ResponseError.BAD_REQUEST, responseItem.getError());
}
public void testSecurityTokenException() throws Exception {
@@ -218,11 +207,8 @@
try {
servlet.getSecurityToken(req);
fail("The route should have thrown an exception due to the invalid
security token.");
- } catch (RuntimeException e) {
- // Yea!
- // TODO: The impl being tested here is not finished. We should return a
proper error
- // instead of just throwing an exception.
- assertEquals("Implement error return for bad security token.",
e.getMessage());
+ } catch (SecurityTokenException e) {
+ // Expected
}
EasyMock.verify(req, tokenDecoder);
}