I'll get this =) G.-
On Fri, Jul 18, 2008 at 5:12 PM, Chris Chabot <[EMAIL PROTECTED]> wrote: > I should really make this for the php side too, but as was noticeable on > the spec list i've been a bit tied up with other area's :) > > If there's any volunteers to help hurry this along on the php side (switch > from the xml over to the json db), please don't hold back! :) > > -- Chris > > > On Jul 18, 2008, at 10:07 PM, Louis Ryan wrote: > > 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)); >>> >>> >>> >>> >>> >

