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);
   }


Reply via email to