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"],
> >>
> >>
> >
>

Reply via email to