Author: doll
Date: Fri Jul 18 12:46:48 2008
New Revision: 678013

URL: http://svn.apache.org/viewvc?rev=678013&view=rev
Log:
Replaced the XmlStateFileFetcher with the JsonDbOpensocialService for the 
samplecontainer. In order to suppor this added key checking to the service and 
exposed the main db object. 

This also eliminated the need for the Basic*Services. 



Removed:
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/XmlStateFileFetcher.java
Modified:
    
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JsonDbOpensocialService.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.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/PersonService.java
    
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/SampleContainerHandler.java
    
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
    incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html

Modified: 
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
 (original)
+++ 
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
 Fri Jul 18 12:46:48 2008
@@ -17,15 +17,11 @@
  */
 package org.apache.shindig.server.endtoend;
 
-import com.google.inject.AbstractModule;
-import com.google.inject.name.Names;
-
 import org.apache.shindig.common.servlet.ParameterFetcher;
-import org.apache.shindig.social.canonical.JsonDbOpensocialService;
-import org.apache.shindig.social.dataservice.ActivityService;
-import org.apache.shindig.social.dataservice.AppDataService;
 import org.apache.shindig.social.dataservice.DataServiceServletFetcher;
-import org.apache.shindig.social.dataservice.PersonService;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.name.Names;
 
 /**
  * Guice module for the end-to-end tests.
@@ -33,9 +29,6 @@
 public class EndToEndModule extends AbstractModule {
 
   protected void configure() {
-    bind(ActivityService.class).to(JsonDbOpensocialService.class);
-    bind(PersonService.class).to(JsonDbOpensocialService.class);
-    bind(AppDataService.class).to(JsonDbOpensocialService.class);
     bind(String.class).annotatedWith(Names.named("canonical.json.db"))
         .toInstance("sampledata/canonicaldb.json");
     
bind(ParameterFetcher.class).annotatedWith(Names.named("DataServiceServlet"))

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java
 Fri Jul 18 12:46:48 2008
@@ -38,6 +38,9 @@
 
     
bind(ParameterFetcher.class).annotatedWith(Names.named("DataServiceServlet"))
         .to(DataServiceServletFetcher.class);
+
+    bind(String.class).annotatedWith(Names.named("canonical.json.db"))
+        .toInstance("sampledata/canonicaldb.json");
   }
 
 }

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JsonDbOpensocialService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JsonDbOpensocialService.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JsonDbOpensocialService.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JsonDbOpensocialService.java
 Fri Jul 18 12:46:48 2008
@@ -105,6 +105,14 @@
     this.converter = converter;
   }
 
+  public JSONObject getDb() {
+    return db;
+  }
+
+  public void setDb(JSONObject db) {
+    this.db = db;
+  }
+
   public Future<ResponseItem<RestfulCollection<Activity>>> 
getActivities(UserId userId,
       GroupId groupId, String appId, Set<String> fields, SecurityToken token) {
     List<Activity> result = Lists.newArrayList();
@@ -331,6 +339,14 @@
     // TODO: this seems redundant. No need to pass both fields and a map of 
field->value
     // TODO: According to rest, yes there is. If a field is in the param list 
but not in the map
     // that means it is a delete
+
+    for (String key : values.keySet()) {
+      if (!isValidKey(key)) {
+        return ImmediateFuture.newInstance(new 
ResponseItem<Object>(ResponseError.BAD_REQUEST,
+            "The person data key had invalid characters", null));
+      }
+    }
+
     try {
       JSONObject personData = 
db.getJSONObject(DATA_TABLE).getJSONObject(userId.getUserId(token));
       if (personData == null) {
@@ -349,6 +365,33 @@
   }
 
   /**
+   * Determines whether the input is a valid key. Valid keys match the regular
+   * expression [\w\-\.]+. The logic is not done using java.util.regex.* as
+   * that is 20X slower.
+   *
+   * @param key the key to validate.
+   * @return true if the key is a valid appdata key, false otherwise.
+   */
+  public static boolean isValidKey(String key) {
+    if (key == null || key.length() == 0) {
+      return false;
+    }
+    for (int i = 0; i < key.length(); ++i) {
+      char c = key.charAt(i);
+      if ((c >= 'a' && c <= 'z') ||
+          (c >= 'A' && c <= 'Z') ||
+          (c >= '0' && c <= '9') ||
+          (c == '-') ||
+          (c == '_') ||
+          (c == '.')) {
+        continue;
+      }
+      return false;
+    }
+    return true;
+  }
+
+  /**
    * Get the set of user id's from a user and group
    */
   private Set<String> getIdSet(UserId user, GroupId group, SecurityToken token)

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/ActivityService.java
 Fri Jul 18 12:46:48 2008
@@ -19,15 +19,15 @@
 
 import org.apache.shindig.common.SecurityToken;
 import org.apache.shindig.social.ResponseItem;
-import org.apache.shindig.social.samplecontainer.BasicActivitiesService;
+import org.apache.shindig.social.canonical.JsonDbOpensocialService;
 import org.apache.shindig.social.opensocial.model.Activity;
 
+import com.google.inject.ImplementedBy;
+
 import java.util.Set;
 import java.util.concurrent.Future;
 
-import com.google.inject.ImplementedBy;
-
[EMAIL PROTECTED](BasicActivitiesService.class)
[EMAIL PROTECTED](JsonDbOpensocialService.class)
 
 public interface ActivityService {
 

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/AppDataService.java
 Fri Jul 18 12:46:48 2008
@@ -19,15 +19,15 @@
 
 import org.apache.shindig.common.SecurityToken;
 import org.apache.shindig.social.ResponseItem;
-import org.apache.shindig.social.samplecontainer.BasicDataService;
+import org.apache.shindig.social.canonical.JsonDbOpensocialService;
+
+import com.google.inject.ImplementedBy;
 
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Future;
 
-import com.google.inject.ImplementedBy;
-
[EMAIL PROTECTED](BasicDataService.class)
[EMAIL PROTECTED](JsonDbOpensocialService.class)
 public interface AppDataService {
 
   /**

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=678013&r1=678012&r2=678013&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 Jul 18 12:46:48 2008
@@ -206,7 +206,7 @@
 
   /**
    * Delivers a request item to the appropriate DataRequestHandler.
-   * 
+   *
    * @return the resulting ResponseItem
    */
   Future<? extends ResponseItem> handleRequestItem(RequestItem requestItem) {

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/dataservice/PersonService.java
 Fri Jul 18 12:46:48 2008
@@ -19,15 +19,15 @@
 
 import org.apache.shindig.common.SecurityToken;
 import org.apache.shindig.social.ResponseItem;
-import org.apache.shindig.social.samplecontainer.BasicPeopleService;
+import org.apache.shindig.social.canonical.JsonDbOpensocialService;
 import org.apache.shindig.social.opensocial.model.Person;
 
+import com.google.inject.ImplementedBy;
+
 import java.util.Set;
 import java.util.concurrent.Future;
 
-import com.google.inject.ImplementedBy;
-
[EMAIL PROTECTED](BasicPeopleService.class)
[EMAIL PROTECTED](JsonDbOpensocialService.class)
 
 public interface PersonService {
 

Modified: 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/SampleContainerHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/SampleContainerHandler.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/SampleContainerHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/samplecontainer/SampleContainerHandler.java
 Fri Jul 18 12:46:48 2008
@@ -21,25 +21,27 @@
 import org.apache.shindig.common.util.ImmediateFuture;
 import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.ResponseItem;
+import org.apache.shindig.social.canonical.JsonDbOpensocialService;
 import org.apache.shindig.social.dataservice.DataRequestHandler;
 import org.apache.shindig.social.dataservice.RequestItem;
 
-import com.google.common.collect.Maps;
 import com.google.inject.Inject;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.json.JSONException;
+import org.json.JSONObject;
 
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Map;
+import java.io.IOException;
 import java.util.concurrent.Future;
 
-// TODO(doll): This class won't be needed anymore once we switch to the 
canonical data set
 public class SampleContainerHandler extends DataRequestHandler {
-  private final XmlStateFileFetcher fetcher;
+  private final JsonDbOpensocialService service;
   private static final String POST_PATH = "/samplecontainer/{type}/{doevil}";
 
   @Inject
-  public SampleContainerHandler(XmlStateFileFetcher fetcher) {
-    this.fetcher = fetcher;
+  public SampleContainerHandler(JsonDbOpensocialService dbService) {
+    this.service = dbService;
   }
 
   /**
@@ -56,18 +58,6 @@
     return handlePost(request);
   }
 
-  public static class SetStateInput {
-    public String fileUrl;
-
-    public String getFileUrl() {
-      return fileUrl;
-    }
-
-    public void setFileUrl(String fileUrl) {
-      this.fileUrl = fileUrl;
-    }
-  }
-
   /**
    * Handles /samplecontainer/setstate and 
/samplecontainer/setevilness/{doevil}
    * TODO(doll): These urls aren't very resty. Consider changing the 
samplecontainer.html calls
@@ -81,14 +71,14 @@
     if (type.equals("setstate")) {
       try {
         String stateFile = request.getParameters().get("fileurl");
-        fetcher.resetStateFile(new URI(stateFile));
-      } catch (URISyntaxException e) {
+        service.setDb(new JSONObject(fetchStateDocument(stateFile)));
+      } catch (JSONException e) {
         response = new ResponseItem<Object>(ResponseError.BAD_REQUEST,
-            "The state file was not a valid url", null);
+            "The json state file was not valid json", null);
       }
     } else if (type.equals("setevilness")) {
-      String doEvil = request.getParameters().get("doevil");
-      fetcher.setEvilness(Boolean.valueOf(doEvil));
+      response = new ResponseItem<Object>(ResponseError.NOT_IMPLEMENTED,
+          "evil data has not been implemented yet", null);
     }
 
     return ImmediateFuture.newInstance(response);
@@ -98,11 +88,26 @@
    * Handles /samplecontainer/dumpstate
    */
   protected Future<? extends ResponseItem> handleGet(RequestItem request) {
-    Map<String, Object> state = Maps.newHashMap();
-    state.put("people", fetcher.getAllPeople());
-    state.put("friendIds", fetcher.getFriendIds());
-    state.put("data", fetcher.getAppData());
-    state.put("activities", fetcher.getActivities());
-    return ImmediateFuture.newInstance(new ResponseItem<Object>(state));
+    return ImmediateFuture.newInstance(new 
ResponseItem<Object>(service.getDb()));
+  }
+
+  private String fetchStateDocument(String stateFileLocation) {
+    String errorMessage = "The json state file " + stateFileLocation
+        + " could not be fetched and parsed.";
+
+    HttpMethod jsonState = new GetMethod(stateFileLocation);
+    HttpClient client = new HttpClient();
+    try {
+      client.executeMethod(jsonState);
+
+      if (jsonState.getStatusCode() != 200) {
+        throw new RuntimeException(errorMessage);
+      }
+      return jsonState.getResponseBodyAsString();
+    } catch (IOException e) {
+      throw new RuntimeException(errorMessage, e);
+    } finally {
+      jsonState.releaseConnection();
+    }
   }
 }
\ No newline at end of file

Modified: 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
 (original)
+++ 
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
 Fri Jul 18 12:46:48 2008
@@ -19,11 +19,7 @@
 package org.apache.shindig.social;
 
 import org.apache.shindig.common.servlet.ParameterFetcher;
-import org.apache.shindig.social.canonical.JsonDbOpensocialService;
-import org.apache.shindig.social.dataservice.ActivityService;
-import org.apache.shindig.social.dataservice.AppDataService;
 import org.apache.shindig.social.dataservice.DataServiceServletFetcher;
-import org.apache.shindig.social.dataservice.PersonService;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.name.Names;
@@ -42,9 +38,6 @@
     
bind(ParameterFetcher.class).annotatedWith(Names.named("DataServiceServlet"))
         .to(DataServiceServletFetcher.class);
 
-    bind(ActivityService.class).to(JsonDbOpensocialService.class);
-    bind(PersonService.class).to(JsonDbOpensocialService.class);
-    bind(AppDataService.class).to(JsonDbOpensocialService.class);
     bind(String.class).annotatedWith(Names.named("canonical.json.db"))
         .toInstance("sampledata/canonicaldb.json");
   }

Modified: 
incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html?rev=678013&r1=678012&r2=678013&view=diff
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html 
(original)
+++ incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html Fri 
Jul 18 12:46:48 2008
@@ -48,7 +48,7 @@
 var gadgetUrl = baseUrl + 'examples/SocialHelloWorld.xml';
 var gadgetUrlCookie = 'sampleContainerGadgetUrl';
 
-var stateFileUrl = baseUrl + 'state-basicfriendlist.xml';
+var stateFileUrl = baseUrl + '../sampledata/canonicaldb.json';
 var stateFileUrlCookie = 'sampleContainerStateFileUrl';
 
 var useCaja;
@@ -114,7 +114,7 @@
   ownerId = document.getElementById("ownerId").value;
   gadgetUrl = document.getElementById("gadgetUrl").value;
 
-  gadget.secureToken = escape(generateSecureToken());  
+  gadget.secureToken = escape(generateSecureToken());
   gadget.specUrl = gadgetUrl;
   goog.net.cookies.set(gadgetUrlCookie, encodeURIComponent(gadgetUrl));
 


Reply via email to