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

