Very cool :)

On Fri, Jul 18, 2008 at 12:46 PM, <[EMAIL PROTECTED]> wrote:

> 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