Author: doll
Date: Fri May 23 06:15:37 2008
New Revision: 659534

URL: http://svn.apache.org/viewvc?rev=659534&view=rev
Log:
SHINDIG-303
Modified patch from David Primmer. Moves the restful format logic into a new 
ValidRequestFilter. Removed logic from adapters and JsonFilter to be replaced 
by this class. Non-valid formats are now rejected nicely. 


Added:
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/util/
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/util/ValidRequestFilter.java
    
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/ValidRequestTest.java
Modified:
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/AbstractSocialEntityCollectionAdapter.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/SocialApiProvider.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java
    
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/AbstractLargeRestfulTests.java

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/AbstractSocialEntityCollectionAdapter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/AbstractSocialEntityCollectionAdapter.java?rev=659534&r1=659533&r2=659534&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/AbstractSocialEntityCollectionAdapter.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/AbstractSocialEntityCollectionAdapter.java
 Fri May 23 06:15:37 2008
@@ -26,6 +26,8 @@
 import org.apache.shindig.social.opensocial.model.IdSpec;
 import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
 import org.apache.shindig.social.opensocial.util.BeanXmlConverter;
+import org.apache.shindig.social.abdera.util.ValidRequestFilter.Format;
+import org.apache.shindig.social.abdera.util.ValidRequestFilter;
 
 import com.google.inject.Inject;
 import org.apache.abdera.Abdera;
@@ -76,20 +78,6 @@
     factory = new Abdera().getFactory();
   }
 
-  public enum Format {
-    JSON("json"), ATOM("atom");
-
-    private final String displayValue;
-
-    private Format(String displayValue) {
-      this.displayValue = displayValue;
-    }
-
-    public String getDisplayValue() {
-      return displayValue;
-    }
-  }
-
   /**
    * All the adapters need access to the PeopleService, which has the basic
    * social graph information. Each service adapter will also add an instance
@@ -172,7 +160,7 @@
       return null;
     }
   }
-  
+
   /**
    * Gets the IDs of connections of the given user.
    *
@@ -186,23 +174,6 @@
    }
 
   /**
-   * Returns the format (jsoc or atom) from the RequestContext's URL 
parameters.
-   *
-   * @param request Abdera's RequestContext
-   * @return The format and default to Format.JSON.
-   */
-  private Format getFormatTypeFromRequest(RequestContext request) {
-    // TODO: should gracefully handle introspection if format param is missing.
-    String format = request.getTarget().getParameter("format");
-
-    if (format != null && format.equals(Format.ATOM.getDisplayValue())) {
-      return Format.ATOM;
-    } else {
-      return Format.JSON;
-    }
-  }
-
-  /**
    * @param request RequestContext
    * @param resourceRouteVariable The route variable for the entry. So, for a
    *     route pattern of /:collection/:id, with "id" resourceRouteVariable 
this
@@ -241,7 +212,7 @@
   @Override
   public Object getContent(T entity, RequestContext request)
       throws ResponseContextException {
-    Format format = getFormatTypeFromRequest(request);
+    Format format = ValidRequestFilter.getFormatTypeFromRequest(request);
     Content content = factory.newContent();
 
     switch (format) {

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/SocialApiProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/SocialApiProvider.java?rev=659534&r1=659533&r2=659534&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/SocialApiProvider.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/SocialApiProvider.java
 Fri May 23 06:15:37 2008
@@ -18,6 +18,7 @@
 package org.apache.shindig.social.abdera;
 
 import org.apache.shindig.social.abdera.json.JSONFilter;
+import org.apache.shindig.social.abdera.util.ValidRequestFilter;
 
 import com.google.inject.Inject;
 import org.apache.abdera.protocol.server.TargetType;
@@ -79,6 +80,7 @@
         ;
 
     addFilter(new JSONFilter());
+    addFilter(new ValidRequestFilter());
     targetBuilder = routeManager;
     targetResolver = routeManager;
   }

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java?rev=659534&r1=659533&r2=659534&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java
 Fri May 23 06:15:37 2008
@@ -17,7 +17,8 @@
 */
 package org.apache.shindig.social.abdera.json;
 
-import org.apache.shindig.social.abdera.AbstractSocialEntityCollectionAdapter;
+import org.apache.shindig.social.abdera.util.ValidRequestFilter.Format;
+import org.apache.shindig.social.abdera.util.ValidRequestFilter;
 
 import org.apache.abdera.Abdera;
 import org.apache.abdera.model.Document;
@@ -50,14 +51,11 @@
  * pojo to atom and pojo to json. Need to fix abdera!
  */
 public class JSONFilter implements Filter {
-  private final String FORMAT_FIELD = "format";
-  private final String ATOM = AbstractSocialEntityCollectionAdapter.Format
-      .ATOM.getDisplayValue();
 
   public ResponseContext filter(RequestContext request, FilterChain chain) {
     ResponseContext resp = chain.next(request);
-    String format = request.getParameter(FORMAT_FIELD);
-    if (format != null && format.equalsIgnoreCase(ATOM)) {
+    Format format = ValidRequestFilter.getFormatTypeFromRequest(request);
+    if (format == Format.ATOM) {
       return resp;
     }
     // If there is no content, it could be either due to some error such as

Added: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/util/ValidRequestFilter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/util/ValidRequestFilter.java?rev=659534&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/util/ValidRequestFilter.java
 (added)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/util/ValidRequestFilter.java
 Fri May 23 06:15:37 2008
@@ -0,0 +1,73 @@
+/*
+* 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.abdera.util;
+
+import org.apache.abdera.protocol.server.Filter;
+import org.apache.abdera.protocol.server.FilterChain;
+import org.apache.abdera.protocol.server.ProviderHelper;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.ResponseContext;
+
+
+public class ValidRequestFilter implements Filter {
+  public final static String FORMAT_FIELD = "format";
+  private final static String INVALID_FORMAT =
+    "Invalid format parameter. only atom/json are supported";
+
+  public enum Format {
+    JSON("json"), ATOM("atom");
+
+    private final String displayValue;
+
+    private Format(String displayValue) {
+      this.displayValue = displayValue;
+    }
+
+    public String getDisplayValue() {
+      return displayValue;
+    }
+  }
+
+  public ResponseContext filter(RequestContext request, FilterChain chain) {
+    Format format = getFormatTypeFromRequest(request);
+    if (format == null) {
+      return ProviderHelper.badrequest(request, INVALID_FORMAT);
+    }
+    request.setAttribute(FORMAT_FIELD, format);
+    return chain.next(request);
+  }
+
+  /**
+   * Returns the format (jsoc or atom) from the RequestContext's URL 
parameters.
+   *
+   * @param request Abdera's RequestContext
+   * @return The format and default to Format.JSON.
+   */
+  public static Format getFormatTypeFromRequest(RequestContext request) {
+    // TODO: should gracefully handle introspection if format param is missing.
+    String format = request.getTarget().getParameter(FORMAT_FIELD);
+
+    if (format == null || format.equals(Format.JSON.getDisplayValue())) {
+      return Format.JSON;
+    } else if (format.equals(Format.ATOM.getDisplayValue())) {
+      return Format.ATOM;
+    } else {
+      return null;
+    }
+  }
+}

Modified: 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/AbstractLargeRestfulTests.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/AbstractLargeRestfulTests.java?rev=659534&r1=659533&r2=659534&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/AbstractLargeRestfulTests.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/AbstractLargeRestfulTests.java
 Fri May 23 06:15:37 2008
@@ -97,15 +97,15 @@
         mimeType));
   }
 
-  protected void checkForGoodJsonResponse(ClientResponse response){
+  protected void checkForGoodJsonResponse(ClientResponse response) {
     checkForGoodResponse(response, "application/json");
   }
 
-  protected void checkForGoodAtomResponse(ClientResponse response){
+  protected void checkForGoodAtomResponse(ClientResponse response) {
     checkForGoodResponse(response, Constants.ATOM_MEDIA_TYPE);
   }
 
-  protected void checkForBadResponse(ClientResponse response){
+  protected void checkForBadResponse(ClientResponse response) {
     assertNotNull(response);
     assertEquals(Response.ResponseType.CLIENT_ERROR, response.getType());
   }

Added: 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/ValidRequestTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/ValidRequestTest.java?rev=659534&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/ValidRequestTest.java
 (added)
+++ 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/abdera/ValidRequestTest.java
 Fri May 23 06:15:37 2008
@@ -0,0 +1,35 @@
+/*
+ * 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.abdera;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+
+
+public class ValidRequestTest extends AbstractLargeRestfulTests {
+
+  @Test
+  public void testGetActivityOfUserBadFormat() throws Exception {
+    resp = client.get(BASEURL + "/people/john.doe/@self?format=zatom");
+    checkForBadResponse(resp);
+    assertEquals(400, resp.getStatus());
+  }
+
+}
\ No newline at end of file


Reply via email to