On Tue, Jul 8, 2008 at 10:12 AM, Cassie <[EMAIL PROTECTED]> wrote: > To be even more bothersome, in java we have been using OpenSocial (as > opposed to Opensocial) as we were considering it two words... At some point > we should pick one and fix all the class names...
http://opensocial.org says "OpenSocial", so my vote is for 2 words. > > > - Cassie > > > On Tue, Jul 8, 2008 at 12:32 AM, Chris Chabot <[EMAIL PROTECTED]> wrote: > > > (i think cassie already pointed this out? but just to be sure): > > > > We always use JsonOpensocialServer.java type of casing, in file names and > > class names too, so please keep that in mind for the future :) > > > > Also it seems that the committing / moving of these files caused the svn > > repo to be 'broken' for people? (something about both versions of casing > to > > be in the repo and breaking stuff), hope you can take a look at that too > > > > -- Chris > > > > > > On Jul 8, 2008, at 2:22 AM, [EMAIL PROTECTED] wrote: > > > > Author: lryan > >> Date: Mon Jul 7 17:22:19 2008 > >> New Revision: 674686 > >> > >> URL: http://svn.apache.org/viewvc?rev=674686&view=rev > >> Log: > >> Dataservice implementation backed by the canonical JSON file. > >> > >> Added: > >> > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JSONOpensocialService.java > >> > >> > incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/canonical/JSONOpensocialServiceTest.java > >> Modified: > >> > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Person.java > >> incubator/shindig/trunk/javascript/sampledata/canonicaldb.json > >> > >> Added: > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JSONOpensocialService.java > >> URL: > >> > http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JSONOpensocialService.java?rev=674686&view=auto > >> > >> > ============================================================================== > >> --- > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JSONOpensocialService.java > >> (added) > >> +++ > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/JSONOpensocialService.java > >> Mon Jul 7 17:22:19 2008 > >> @@ -0,0 +1,355 @@ > >> +/* > >> + * Licensed to the Apache Software Foundation (ASF) under one > >> + * or more contributor license agreements. See the NOTICE file > >> + * distributed with this work for additional information > >> + * regarding copyright ownership. 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. > >> + */ > >> +package org.apache.shindig.social.canonical; > >> + > >> +import com.google.common.collect.Lists; > >> +import com.google.common.collect.Maps; > >> +import com.google.common.collect.Sets; > >> +import com.google.inject.Inject; > >> +import com.google.inject.name.Named; > >> + > >> +import org.apache.commons.io.IOUtils; > >> +import org.apache.shindig.common.SecurityToken; > >> +import org.apache.shindig.social.ResponseError; > >> +import org.apache.shindig.social.ResponseItem; > >> +import org.apache.shindig.social.dataservice.ActivityService; > >> +import org.apache.shindig.social.dataservice.AppDataService; > >> +import org.apache.shindig.social.dataservice.DataCollection; > >> +import org.apache.shindig.social.dataservice.GroupId; > >> +import org.apache.shindig.social.dataservice.PersonService; > >> +import org.apache.shindig.social.dataservice.RestfulCollection; > >> +import org.apache.shindig.social.dataservice.UserId; > >> +import org.apache.shindig.social.opensocial.model.Activity; > >> +import org.apache.shindig.social.opensocial.model.Person; > >> +import org.apache.shindig.social.opensocial.util.BeanConverter; > >> +import org.json.JSONArray; > >> +import org.json.JSONException; > >> +import org.json.JSONObject; > >> + > >> +import java.util.Iterator; > >> +import java.util.List; > >> +import java.util.Map; > >> +import java.util.Set; > >> + > >> +/** > >> + * Implementation of supported services backed by a JSON DB > >> + */ > >> +public class JSONOpensocialService implements ActivityService, > >> PersonService, AppDataService { > >> + > >> + /** > >> + * The DB > >> + */ > >> + private JSONObject db; > >> + > >> + /** > >> + * The JSON<->Bean converter > >> + */ > >> + private BeanConverter converter; > >> + > >> + /** > >> + * db["activities"] -> Array<Person> > >> + */ > >> + private static final String PEOPLE_TABLE = "people"; > >> + > >> + /** > >> + * db["people"] -> Map<Person.Id, Array<Activity>> > >> + */ > >> + private static final String ACTIVITIES_TABLE = "activities"; > >> + > >> + /** > >> + * db["data"] -> Map<Person.Id, Map<String, String>> > >> + */ > >> + private static final String DATA_TABLE = "data"; > >> + > >> + /** > >> + * db["friendLinks"] -> Map<Person.Id, Array<Person.Id>> > >> + */ > >> + private static final String FRIEND_LINK_TABLE = "friendLinks"; > >> + > >> + @Inject > >> + public JSONOpensocialService(@Named("canonical.json.db")String > >> jsonLocation, > >> + BeanConverter converter) throws Exception { > >> + String content = IOUtils.toString(new > >> java.net.URL(jsonLocation).openStream(), "UTF-8"); > >> + this.db = new JSONObject(content); > >> + this.converter = converter; > >> + } > >> + > >> + public ResponseItem<RestfulCollection<Activity>> getActivities(UserId > >> userId, GroupId groupId, > >> + String appId, Set<String> fields, SecurityToken token) { > >> + List<Activity> result = Lists.newArrayList(); > >> + try { > >> + // TODO Is it really valid to read activities across multiple > users > >> in one rpc? > >> + Set<String> idSet = getIdSet(userId, groupId, token); > >> + for (String id : idSet) { > >> + if (db.getJSONObject(ACTIVITIES_TABLE).has(id)) { > >> + JSONArray activities = > >> db.getJSONObject(ACTIVITIES_TABLE).getJSONArray(id); > >> + for (int i = 0; i < activities.length(); i++) { > >> + JSONObject activity = activities.getJSONObject(i); > >> + if (appId != null && > >> activity.get(Activity.Field.APP_ID.toString()).equals(appId)) { > >> + result.add(convertToActivity(activity, fields)); > >> + } > >> + } > >> + } > >> + } > >> + return new ResponseItem<RestfulCollection<Activity>>(new > >> RestfulCollection<Activity>(result)); > >> + } catch (JSONException je) { > >> + return new > >> ResponseItem<RestfulCollection<Activity>>(ResponseError.INTERNAL_ERROR, > >> + je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem<Activity> getActivity(UserId userId, GroupId > >> groupId, String appId, > >> + Set<String> fields, String activityId, SecurityToken token) { > >> + try { > >> + if > >> (db.getJSONObject(ACTIVITIES_TABLE).has(userId.getUserId(token))) { > >> + JSONArray activities = > >> > db.getJSONObject(ACTIVITIES_TABLE).getJSONArray(userId.getUserId(token)); > >> + for (int i = 0; i < activities.length(); i++) { > >> + JSONObject activity = activities.getJSONObject(i); > >> + if (userId != null && > >> activity.get(Activity.Field.USER_ID.toString()) > >> + .equals(userId.getUserId(token)) && > >> + > >> activity.get(Activity.Field.ID.toString()).equals(activityId)) { > >> + return new > ResponseItem<Activity>(convertToActivity(activity, > >> fields)); > >> + } > >> + } > >> + } > >> + return null; > >> + } catch (JSONException je) { > >> + return new ResponseItem<Activity>(ResponseError.INTERNAL_ERROR, > >> je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem deleteActivity(UserId userId, GroupId groupId, > >> String appId, > >> + String activityId, SecurityToken token) { > >> + try { > >> + if > >> (db.getJSONObject(ACTIVITIES_TABLE).has(userId.getUserId(token))) { > >> + JSONArray activities = > >> > db.getJSONObject(ACTIVITIES_TABLE).getJSONArray(userId.getUserId(token)); > >> + if (activities != null) { > >> + JSONArray newList = new JSONArray(); > >> + for (int i = 0; i < activities.length(); i++) { > >> + JSONObject activity = activities.getJSONObject(i); > >> + if > >> (!activity.get(Activity.Field.ID.toString()).equals(activityId)) { > >> + newList.put(activity); > >> + } > >> + } > >> + > db.getJSONObject(ACTIVITIES_TABLE).put(userId.getUserId(token), > >> newList); > >> + // TODO. This seems very odd that we return no useful > response > >> in this case > >> + // There is no way to represent not-found > >> + // if (found) { ?? > >> + //} > >> + } > >> + } > >> + // What is the appropriate response here?? > >> + return new ResponseItem<Object>(null); > >> + } catch (JSONException je) { > >> + return new ResponseItem<Object>(ResponseError.INTERNAL_ERROR, > >> je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem createActivity(UserId userId, GroupId groupId, > >> String appId, > >> + Set<String> fields, Activity activity, SecurityToken token) { > >> + // Are fields really needed here? > >> + try { > >> + JSONObject jsonObject = convertFromActivity(activity, fields); > >> + if (!jsonObject.has(Activity.Field.ID.toString())) { > >> + jsonObject.put(Activity.Field.ID.toString(), > >> System.currentTimeMillis()); > >> + } > >> + JSONArray jsonArray = > >> > db.getJSONObject(ACTIVITIES_TABLE).getJSONArray(userId.getUserId(token)); > >> + if (jsonArray == null) { > >> + jsonArray = new JSONArray(); > >> + db.getJSONObject(ACTIVITIES_TABLE).put(userId.getUserId(token), > >> jsonArray); > >> + } > >> + jsonArray.put(jsonObject); > >> + // TODO ?? > >> + return null; > >> + } catch (JSONException je) { > >> + return new ResponseItem<Object>(ResponseError.INTERNAL_ERROR, > >> je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem<RestfulCollection<Person>> getPeople(UserId > userId, > >> GroupId groupId, > >> + SortOrder sortOrder, FilterType filter, int first, int max, > >> + Set<String> fields, SecurityToken token) { > >> + List<Person> result = Lists.newArrayList(); > >> + try { > >> + JSONArray people = db.getJSONArray(PEOPLE_TABLE); > >> + > >> + Set<String> idSet = getIdSet(userId, groupId, token); > >> + > >> + for (int i = 0; i < people.length(); i++) { > >> + JSONObject person = people.getJSONObject(i); > >> + if (!idSet.contains(person.get(Person.Field.ID.toString()))) { > >> + continue; > >> + } > >> + // Add group support later > >> + result.add(convertToPerson(person, fields)); > >> + } > >> + return new ResponseItem<RestfulCollection<Person>>(new > >> RestfulCollection<Person>(result)); > >> + } catch (JSONException je) { > >> + return new > >> ResponseItem<RestfulCollection<Person>>(ResponseError.INTERNAL_ERROR, > >> + je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem<Person> getPerson(UserId id, Set<String> fields, > >> SecurityToken token) { > >> + try { > >> + JSONArray people = db.getJSONArray(PEOPLE_TABLE); > >> + > >> + for (int i = 0; i < people.length(); i++) { > >> + JSONObject person = people.getJSONObject(i); > >> + if (id != null && person.get(Person.Field.ID.toString()) > >> + .equals(id.getUserId(token))) { > >> + return new ResponseItem<Person>(convertToPerson(person, > >> fields)); > >> + } > >> + } > >> + // TODO What does this mean? > >> + return null; > >> + } catch (JSONException je) { > >> + return new ResponseItem<Person>(ResponseError.INTERNAL_ERROR, > >> je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem<DataCollection> getPersonData(UserId userId, > >> GroupId groupId, String appId, > >> + Set<String> fields, SecurityToken token) { > >> + // TODO. Does fields==null imply all? > >> + try { > >> + Map<String, Map<String, String>> idToData = Maps.newHashMap(); > >> + Set<String> idSet = getIdSet(userId, groupId, token); > >> + for (String id : idSet) { > >> + JSONObject personData; > >> + if (!db.getJSONObject(DATA_TABLE).has(id)) { > >> + personData = new JSONObject(); > >> + } else { > >> + if (fields != null) { > >> + personData = new JSONObject( > >> + db.getJSONObject(DATA_TABLE).getJSONObject(id), > >> + fields.toArray(new String[fields.size()])); > >> + } else { > >> + personData = > db.getJSONObject(DATA_TABLE).getJSONObject(id); > >> + } > >> + } > >> + > >> + Iterator keys = personData.keys(); > >> + Map<String, String> data = Maps.newHashMap(); > >> + while (keys.hasNext()) { > >> + String key = (String) keys.next(); > >> + data.put(key, personData.getString(key)); > >> + } > >> + idToData.put(id, data); > >> + } > >> + return new ResponseItem<DataCollection>(new > >> DataCollection(idToData)); > >> + } catch (JSONException je) { > >> + return new > >> ResponseItem<DataCollection>(ResponseError.INTERNAL_ERROR, > je.getMessage(), > >> null); > >> + } > >> + } > >> + > >> + public ResponseItem deletePersonData(UserId userId, GroupId groupId, > >> String appId, > >> + Set<String> fields, SecurityToken token) { > >> + try { > >> + if (!db.getJSONObject(DATA_TABLE).has(userId.getUserId(token))) { > >> + return null; > >> + } > >> + JSONObject newPersonData = new JSONObject(); > >> + JSONObject oldPersonData = > >> db.getJSONObject(DATA_TABLE).getJSONObject(userId.getUserId(token)); > >> + Iterator keys = oldPersonData.keys(); > >> + while (keys.hasNext()) { > >> + String key = (String) keys.next(); > >> + if (fields != null && !fields.contains(key)) { > >> + newPersonData.put(key, oldPersonData.getString(key)); > >> + } > >> + } > >> + db.getJSONObject(DATA_TABLE).put(userId.getUserId(token), > >> newPersonData); > >> + // TODO what is the appropriate return value > >> + return null; > >> + } catch (JSONException je) { > >> + return new ResponseItem<Object>(ResponseError.INTERNAL_ERROR, > >> je.getMessage(), null); > >> + } > >> + } > >> + > >> + public ResponseItem updatePersonData(UserId userId, GroupId groupId, > >> String appId, > >> + Set<String> fields, Map<String, String> values, SecurityToken > >> token) { > >> + // TODO this seems redundant. No need to pass both fields and a map > >> of field->value > >> + try { > >> + JSONObject personData = > >> db.getJSONObject(DATA_TABLE).getJSONObject(userId.getUserId(token)); > >> + if (personData == null) { > >> + personData = new JSONObject(); > >> + db.getJSONObject(DATA_TABLE).put(userId.getUserId(token), > >> personData); > >> + } > >> + > >> + for (Map.Entry<String, String> entry : values.entrySet()) { > >> + personData.put(entry.getKey(), entry.getValue()); > >> + } > >> + // TODO what is the appropriate return value > >> + return null; > >> + } catch (JSONException je) { > >> + return new ResponseItem<Object>(ResponseError.INTERNAL_ERROR, > >> je.getMessage(), null); > >> + } > >> + } > >> + > >> + /** > >> + * Get the set of user id's from a user and group > >> + */ > >> + private Set<String> getIdSet(UserId user, GroupId group, > SecurityToken > >> token) > >> + throws JSONException { > >> + String userId = user.getUserId(token); > >> + > >> + if (group == null) { > >> + return Sets.newLinkedHashSet(userId); > >> + } > >> + > >> + Set<String> returnVal = Sets.newLinkedHashSet(); > >> + switch (group.getType()) { > >> + case all: > >> + case friends: > >> + case groupId: > >> + if (db.getJSONObject(FRIEND_LINK_TABLE).has(userId)) { > >> + JSONArray friends = > >> db.getJSONObject(FRIEND_LINK_TABLE).getJSONArray(userId); > >> + for (int i = 0; i < friends.length(); i++) { > >> + returnVal.add(friends.getString(i)); > >> + } > >> + } > >> + break; > >> + case self: > >> + returnVal.add(userId); > >> + break; > >> + } > >> + return returnVal; > >> + } > >> + > >> + private Activity convertToActivity(JSONObject object, Set<String> > >> fields) throws JSONException { > >> + if (fields != null && !fields.isEmpty()) { > >> + // Create a copy with just the specified fields > >> + object = new JSONObject(object, fields.toArray(new > >> String[fields.size()])); > >> + } > >> + return converter.convertToObject(object.toString(), > Activity.class); > >> + } > >> + > >> + private JSONObject convertFromActivity(Activity activity, Set<String> > >> fields) > >> + throws JSONException { > >> + // TODO Not using fields yet > >> + return new JSONObject(converter.convertToString(activity)); > >> + } > >> + > >> + private Person convertToPerson(JSONObject object, Set<String> fields) > >> throws JSONException { > >> + if (fields != null && !fields.isEmpty()) { > >> + // Create a copy with just the specified fields > >> + object = new JSONObject(object, fields.toArray(new > >> String[fields.size()])); > >> + } > >> + return converter.convertToObject(object.toString(), Person.class); > >> + } > >> +} > >> > >> Modified: > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Person.java > >> URL: > >> > http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Person.java?rev=674686&r1=674685&r2=674686&view=diff > >> > >> > ============================================================================== > >> --- > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Person.java > >> (original) > >> +++ > >> > incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Person.java > >> Mon Jul 7 17:22:19 2008 > >> @@ -17,8 +17,11 @@ > >> */ > >> package org.apache.shindig.social.opensocial.model; > >> > >> -import java.util.List; > >> +import org.apache.shindig.social.opensocial.util.EnumUtil; > >> + > >> import java.util.Date; > >> +import java.util.List; > >> +import java.util.Set; > >> > >> /** > >> * see > >> @@ -87,6 +90,12 @@ > >> > >> private final String jsonString; > >> > >> + public static final Set<String> DEFAULT_FIELDS = > >> + EnumUtil.getEnumStrings(ID, NAME, THUMBNAIL_URL); > >> + > >> + public static final Set<String> ALL_FIELDS = > >> + EnumUtil.getEnumStrings(Field.values()); > >> + > >> private Field(String jsonString) { > >> this.jsonString = jsonString; > >> } > >> > >> Added: > >> > incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/canonical/JSONOpensocialServiceTest.java > >> URL: > >> > http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/canonical/JSONOpensocialServiceTest.java?rev=674686&view=auto > >> > >> > ============================================================================== > >> --- > >> > incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/canonical/JSONOpensocialServiceTest.java > >> (added) > >> +++ > >> > incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/canonical/JSONOpensocialServiceTest.java > >> Mon Jul 7 17:22:19 2008 > >> @@ -0,0 +1,164 @@ > >> +/* > >> + * Licensed to the Apache Software Foundation (ASF) under one > >> + * or more contributor license agreements. See the NOTICE file > >> + * distributed with this work for additional information > >> + * regarding copyright ownership. 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. > >> + */ > >> +package org.apache.shindig.social.canonical; > >> + > >> +import com.google.common.collect.Maps; > >> +import com.google.common.collect.Sets; > >> +import com.google.inject.Guice; > >> + > >> +import junit.framework.TestCase; > >> + > >> +import org.apache.shindig.common.SecurityToken; > >> +import org.apache.shindig.common.testing.FakeGadgetToken; > >> +import org.apache.shindig.social.ResponseItem; > >> +import org.apache.shindig.social.SocialApiTestsGuiceModule; > >> +import org.apache.shindig.social.dataservice.DataCollection; > >> +import org.apache.shindig.social.dataservice.GroupId; > >> +import org.apache.shindig.social.dataservice.PersonService; > >> +import org.apache.shindig.social.dataservice.RestfulCollection; > >> +import org.apache.shindig.social.dataservice.UserId; > >> +import org.apache.shindig.social.opensocial.model.Activity; > >> +import org.apache.shindig.social.opensocial.model.Person; > >> +import org.apache.shindig.social.opensocial.util.BeanJsonConverter; > >> + > >> +/** > >> + * Test the JSONOpensocialService > >> + */ > >> +public class JSONOpensocialServiceTest extends TestCase { > >> + > >> + private JSONOpensocialService db; > >> + > >> + private static final UserId CANON_USER = new > UserId(UserId.Type.userId, > >> "canonical"); > >> + private static final GroupId SELF_GROUP = new > >> GroupId(GroupId.Type.self, null); > >> + private static final String APP_ID = "1"; > >> + > >> + private static final String CANONICAL_USER_ID = "canonical"; > >> + private SecurityToken token = new FakeGadgetToken(); > >> + > >> + > >> + @Override > >> + protected void setUp() throws Exception { > >> + BeanJsonConverter beanJsonConverter = new BeanJsonConverter( > >> + Guice.createInjector(new SocialApiTestsGuiceModule())); > >> + db = new JSONOpensocialService( > >> + > >> > "file:///home/lryan/shindig/trunk/javascript/sampledata/canonicaldb.json", > >> + beanJsonConverter); > >> + } > >> + > >> + public void testGetPersonDefaultFields() throws Exception { > >> + ResponseItem<Person> personResponseItem = db > >> + .getPerson(CANON_USER, Person.Field.DEFAULT_FIELDS, token); > >> + > >> + assertNotNull("Canonical user not found", > >> personResponseItem.getResponse()); > >> + assertNotNull("Canonical user has no id", > >> personResponseItem.getResponse().getId()); > >> + assertNotNull("Canonical user has no name", > >> personResponseItem.getResponse().getName()); > >> + assertNotNull("Canonical user has no thumbnail", > >> + personResponseItem.getResponse().getThumbnailUrl()); > >> + } > >> + > >> + public void testGetPersonAllFields() throws Exception { > >> + ResponseItem<Person> personResponseItem = db > >> + .getPerson(CANON_USER, Person.Field.ALL_FIELDS, token); > >> + assertNotNull("Canonical user not found", > >> personResponseItem.getResponse()); > >> + } > >> + > >> + public void testGetExpectedFriends() throws Exception { > >> + ResponseItem<RestfulCollection<Person>> responseItem = > db.getPeople( > >> + CANON_USER, new GroupId(GroupId.Type.friends, null), > >> PersonService.SortOrder.topFriends, > >> + PersonService.FilterType.all, 0, Integer.MAX_VALUE, null, > token); > >> + assertNotNull(responseItem.getResponse()); > >> + assertEquals(responseItem.getResponse().getTotalResults(), 4); > >> + // Test a couple of users > >> + assertEquals(responseItem.getResponse().getEntry().get(0).getId(), > >> "john.doe"); > >> + assertEquals(responseItem.getResponse().getEntry().get(1).getId(), > >> "jane.doe"); > >> + } > >> + > >> + public void testGetExpectedActivities() throws Exception { > >> + ResponseItem<RestfulCollection<Activity>> responseItem = > >> db.getActivities( > >> + CANON_USER, SELF_GROUP, APP_ID, null, new FakeGadgetToken()); > >> + assertTrue(responseItem.getResponse().getTotalResults() == 2); > >> + } > >> + > >> + public void testGetExpectedActivity() throws Exception { > >> + ResponseItem<Activity> responseItem = db.getActivity( > >> + CANON_USER, SELF_GROUP, APP_ID, > >> + Sets.newHashSet("appId", "body", "mediaItems"), APP_ID, new > >> FakeGadgetToken()); > >> + assertTrue(responseItem != null); > >> + assertTrue(responseItem.getResponse() != null); > >> + // Check that some fields are fetched and others are not > >> + assertTrue(responseItem.getResponse().getBody() != null); > >> + assertTrue(responseItem.getResponse().getBodyId() == null); > >> + } > >> + > >> + public void testDeleteExpectedActivity() throws Exception { > >> + db.deleteActivity(CANON_USER, SELF_GROUP, APP_ID, APP_ID, > >> + new FakeGadgetToken()); > >> + > >> + // Try to fetch the activity > >> + ResponseItem<Activity> responseItem = db.getActivity( > >> + CANON_USER, SELF_GROUP, APP_ID, > >> + Sets.newHashSet("appId", "body", "mediaItems"), APP_ID, new > >> FakeGadgetToken()); > >> + assertTrue(responseItem == null); > >> + } > >> + > >> + public void testGetExpectedAppData() throws Exception { > >> + ResponseItem<DataCollection> responseItem = db.getPersonData( > >> + CANON_USER, SELF_GROUP, APP_ID, null, new FakeGadgetToken()); > >> + assertTrue(!responseItem.getResponse().getEntry().isEmpty()); > >> + > >> > > assertTrue(!responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).isEmpty()); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).size() > >> == 2); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).containsKey("count")); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).containsKey("size")); > >> + } > >> + > >> + public void testDeleteExpectedAppData() throws Exception { > >> + // Delete the data > >> + db.deletePersonData(CANON_USER, SELF_GROUP, APP_ID, > >> + Sets.newHashSet("count"), new FakeGadgetToken()); > >> + > >> + //Fetch the remaining and test > >> + ResponseItem<DataCollection> responseItem = db.getPersonData( > >> + CANON_USER, SELF_GROUP, APP_ID, null, new FakeGadgetToken()); > >> + assertTrue(!responseItem.getResponse().getEntry().isEmpty()); > >> + > >> > > assertTrue(!responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).isEmpty()); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).size() > >> == 1); > >> + > >> > > assertTrue(!responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).containsKey("count")); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).containsKey("size")); > >> + } > >> + > >> + public void testUpdateExpectedAppData() throws Exception { > >> + // Delete the data > >> + db.updatePersonData(CANON_USER, SELF_GROUP, APP_ID, > >> + null, Maps.immutableMap("count", "10", "newvalue", "20"), new > >> FakeGadgetToken()); > >> + > >> + //Fetch the remaining and test > >> + ResponseItem<DataCollection> responseItem = db.getPersonData( > >> + CANON_USER, SELF_GROUP, APP_ID, null, new FakeGadgetToken()); > >> + assertTrue(!responseItem.getResponse().getEntry().isEmpty()); > >> + > >> > > assertTrue(!responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).isEmpty()); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).size() > >> == 3); > >> + > >> > > assertTrue(responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).containsKey("count")); > >> + assertTrue( > >> + > >> > > responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).get("count").equals("10")); > >> + assertTrue( > >> + > >> > > responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).containsKey("newvalue")); > >> + assertTrue( > >> + > >> > > responseItem.getResponse().getEntry().get(CANONICAL_USER_ID).get("newvalue").equals("20")); > >> + } > >> +} > >> > >> Modified: incubator/shindig/trunk/javascript/sampledata/canonicaldb.json > >> URL: > >> > http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/sampledata/canonicaldb.json?rev=674686&r1=674685&r2=674686&view=diff > >> > >> > ============================================================================== > >> --- incubator/shindig/trunk/javascript/sampledata/canonicaldb.json > >> (original) > >> +++ incubator/shindig/trunk/javascript/sampledata/canonicaldb.json Mon > Jul > >> 7 17:22:19 2008 > >> @@ -10,8 +10,8 @@ > >> // > >> // Notes: > >> // - The structure of Person, Activity MUST! match those in the > RESTful > >> spec > >> -// - Data for "canonical" user should exercise every field in the > spec. > >> And is relied on for unit-testing > >> -// so change at your peril > >> +// - Data for "canonical" user should exercise every field in the > spec. > >> And is relied on > >> +// for unit-testing so change at your peril > >> // - Consider adding a structure for Map<Person.Id, Array<appId>> to > >> represent installed gadgets > >> // > >> // TODO: > >> @@ -175,7 +175,10 @@ > >> }, > >> { > >> "id" : "john.doe", > >> - "gender" : "M", > >> + "gender" : { > >> + "key" : "MALE", > >> + "displayvalue" : "Male" > >> + }, > >> "hasApp" : true, > >> "name" : { > >> "familyName" : "Doe", > >> @@ -185,7 +188,10 @@ > >> }, > >> { > >> "id" : "jane.doe", > >> - "gender" : "F", > >> + "gender" : { > >> + "key" : "FEMALE", > >> + "displayvalue" : "Female" > >> + }, > >> "hasApp" : true, > >> "name" : { > >> "familyName" : "Doe", > >> @@ -195,7 +201,10 @@ > >> }, > >> { > >> "id" : "george.doe", > >> - "gender" : "M", > >> + "gender" : { > >> + "key" : "MALE", > >> + "displayvalue" : "Female" > >> + }, > >> "hasApp" : true, > >> "name" : { > >> "familyName" : "Doe", > >> @@ -205,7 +214,10 @@ > >> }, > >> { > >> "id" : "mario.rossi", > >> - "gender" : "M", > >> + "gender" : { > >> + "key" : "MALE", > >> + "displayvalue" : "Male" > >> + }, > >> "hasApp" : true, > >> "name" : { > >> "familyName" : "Rossi", > >> @@ -215,7 +227,10 @@ > >> }, > >> { > >> "id" : "maija.m", > >> - "gender" : "F", > >> + "gender" : { > >> + "key" : "FEMALE", > >> + "displayvalue" : "Female" > >> + }, > >> "hasApp" : true, > >> "name" : { > >> "familyName" : "Meikäläinen", > >> @@ -324,6 +339,7 @@ > >> // ----------------------------- Data > >> --------------------------------------- > >> // > >> "friendLinks" : { > >> + "canonical" : ["john.doe", "jane.doe", "george.doe", "maija.m"], > >> "john.doe" : ["jane.doe", "george.doe", "maija.m"], > >> "jane.doe" : ["john.doe"], > >> "george.doe" : ["john.doe"], > >> > >> > > >

