You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by do...@apache.org on 2008/03/18 12:53:09 UTC

svn commit: r638336 - in /incubator/shindig/trunk: features/opensocial-0.7/ java/gadgets/src/main/java/org/apache/shindig/social/ java/gadgets/src/main/java/org/apache/shindig/social/opensocial/ java/gadgets/src/main/java/org/apache/shindig/social/open...

Author: doll
Date: Tue Mar 18 04:52:57 2008
New Revision: 638336

URL: http://svn.apache.org/viewvc?rev=638336&view=rev
Log:
Fetching people with opensocial now supports pagination, sorting and filtering. Created an ApiCollection object which now matches the opensocial.Collection object to facilitate this.

The OpenSocialDataHandler now logs some exceptions as info. 


Added:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/ApiCollection.java
Removed:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/OpenSocialDataType.java
Modified:
    incubator/shindig/trunk/features/opensocial-0.7/jsoncontainer.js
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractGadgetData.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java

Modified: incubator/shindig/trunk/features/opensocial-0.7/jsoncontainer.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-0.7/jsoncontainer.js?rev=638336&r1=638335&r2=638336&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-0.7/jsoncontainer.js (original)
+++ incubator/shindig/trunk/features/opensocial-0.7/jsoncontainer.js Tue Mar 18 04:52:57 2008
@@ -26,7 +26,7 @@
 
   var supportedFieldsMap = {};
   for (var objectType in supportedFieldsArray) {
-    if (supportedFieldsArray.hasOwnProperty(objectType)){
+    if (supportedFieldsArray.hasOwnProperty(objectType)) {
       supportedFieldsMap[objectType] = {};
       for (var i = 0; i < supportedFieldsArray[objectType].length; i++) {
         var supportedField = supportedFieldsArray[objectType][i];
@@ -112,20 +112,28 @@
   var me = this;
   return new RequestItem(peopleRequest.jsonParams,
       function(rawJson) {
-        return me.createPersonFromJson(rawJson[0]);
+        return me.createPersonFromJson(rawJson['items'][0]);
       });
 };
 
 JsonContainer.prototype.newFetchPeopleRequest = function(idSpec, opt_params) {
   var me = this;
   return new RequestItem(
-      {'type' : 'FETCH_PEOPLE', 'idSpec' : idSpec, 'params': opt_params},
+      {'type' : 'FETCH_PEOPLE',
+        'idSpec' : idSpec,
+        'profileDetail': opt_params['profileDetail'],
+        'sortOrder': opt_params['sortOrder'] || 'topFriends',
+        'filter': opt_params['filter'] || 'all',
+        'first': opt_params['first'] || 0,
+        'max': opt_params['max'] || 20},
       function(rawJson) {
+        var jsonPeople = rawJson['items'];
         var people = [];
-        for (var i = 0; i < rawJson.length; i++) {
-          people.push(me.createPersonFromJson(rawJson[i]));
+        for (var i = 0; i < jsonPeople.length; i++) {
+          people.push(me.createPersonFromJson(jsonPeople[i]));
         }
-        return new opensocial.Collection(people);
+        return new opensocial.Collection(people, rawJson['offset'],
+            rawJson['totalSize']);
       });
 };
 
@@ -176,6 +184,6 @@
   this.processResponse = function(originalDataRequest, rawJson, error,
       errorMessage) {
     return new opensocial.ResponseItem(originalDataRequest,
-        this.processData(rawJson), error, errorMessage);
+        error ? null : this.processData(rawJson), error, errorMessage);
   }
 };

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractGadgetData.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractGadgetData.java?rev=638336&r1=638335&r2=638336&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractGadgetData.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractGadgetData.java Tue Mar 18 04:52:57 2008
@@ -24,7 +24,6 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
-import java.util.Collection;
 import java.util.Map;
 
 /**

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java?rev=638336&r1=638335&r2=638336&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java Tue Mar 18 04:52:57 2008
@@ -20,14 +20,8 @@
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.apache.shindig.social.samplecontainer.BasicPeopleService;
-import org.apache.shindig.social.samplecontainer.BasicDataService;
 import org.apache.shindig.social.samplecontainer.StateFileDataHandler;
-import org.apache.shindig.social.opensocial.PeopleService;
-import org.apache.shindig.social.opensocial.DataService;
 import org.apache.shindig.social.opensocial.OpenSocialDataHandler;
-import org.apache.shindig.social.opensocial.model.IdSpec;
-import org.apache.shindig.social.opensocial.model.OpenSocialDataType;
 
 import java.io.IOException;
 import java.io.PrintWriter;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java?rev=638336&r1=638335&r2=638336&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java Tue Mar 18 04:52:57 2008
@@ -17,24 +17,21 @@
  */
 package org.apache.shindig.social.opensocial;
 
-import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.json.JSONArray;
 import org.apache.shindig.social.samplecontainer.BasicPeopleService;
 import org.apache.shindig.social.samplecontainer.BasicDataService;
 import org.apache.shindig.social.samplecontainer.BasicActivitiesService;
 import org.apache.shindig.social.opensocial.PeopleService;
 import org.apache.shindig.social.opensocial.DataService;
 import org.apache.shindig.social.opensocial.model.IdSpec;
-import org.apache.shindig.social.opensocial.model.OpenSocialDataType;
 import org.apache.shindig.social.opensocial.model.Activity;
 import org.apache.shindig.social.*;
 
-import java.io.IOException;
-import java.io.PrintWriter;
 import java.util.logging.Logger;
+import java.util.logging.Level;
 import java.util.List;
-import java.util.ArrayList;
 
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -54,6 +51,12 @@
   private static ActivitiesService activitiesHandler
       = new BasicActivitiesService();
 
+  public enum OpenSocialDataType {
+    FETCH_PEOPLE,
+    FETCH_PERSON_APP_DATA, UPDATE_PERSON_APP_DATA,
+    FETCH_ACTIVITIES, CREATE_ACTIVITY
+  }
+
   public boolean shouldHandle(String requestType) {
     try {
       // There should be a cleaner way to do this...
@@ -77,7 +80,18 @@
 
       switch (type) {
         case FETCH_PEOPLE :
-          response = peopleHandler.getPeople(peopleIds);
+          JSONArray profileDetail = request.getParams().getJSONArray("profileDetail");
+          PeopleService.SortOrder sortOrder = PeopleService.SortOrder.valueOf(
+              request.getParams().getString("sortOrder"));
+          PeopleService.FilterType filter = PeopleService.FilterType.valueOf(
+              request.getParams().getString("filter"));
+          int first = request.getParams().getInt("first");
+          int max = request.getParams().getInt("max");
+
+          // TODO: Should we put this in the requestitem and pass the whole
+          // thing along?
+          response = peopleHandler.getPeople(peopleIds, sortOrder, filter,
+              first, max);
           break;
 
         case FETCH_PERSON_APP_DATA :
@@ -107,12 +121,15 @@
           Activity activity = new Activity("5", personId);
           activity.setTitle("Temporary title - we don't read json right now");
           response = activitiesHandler.createActivity(personId, activity);
+          break;
       }
 
     } catch (JSONException e) {
+      logger.log(Level.INFO, e.getMessage());
       response = new ResponseItem<Object>(ResponseError.BAD_REQUEST,
           "The json request had a bad format", new JSONObject());
     } catch (IllegalArgumentException e) {
+      logger.log(Level.INFO, e.getMessage());
       response = new ResponseItem<Object>(ResponseError.BAD_REQUEST,
           "The json request had a bad idSpec", new JSONObject());
     }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java?rev=638336&r1=638335&r2=638336&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java Tue Mar 18 04:52:57 2008
@@ -20,6 +20,7 @@
 import org.json.JSONException;
 import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.model.IdSpec;
+import org.apache.shindig.social.opensocial.model.ApiCollection;
 import org.apache.shindig.social.ResponseItem;
 
 import java.util.List;
@@ -35,10 +36,23 @@
    */
   public List<String> getIds(IdSpec idSpec) throws JSONException;
 
+  public enum SortOrder {
+    topFriends, name
+  }
+
+  public enum FilterType {
+    all, hasApp
+  }
+
   /**
    * Returns a list of people that correspond to the passed in person ids.
    * @param ids The ids of the people to fetch.
+   * @param sortOrder How to sort the people
+   * @param filter How the people should be filtered.
+   * @param first The index of the first person to fetch.
+   * @param max The max number of people to fetch.
    * @return a list of people.
    */
-  public ResponseItem<List<Person>> getPeople(List<String> ids);
+  public ResponseItem<ApiCollection<Person>> getPeople(List<String> ids,
+      SortOrder sortOrder, FilterType filter, int first, int max);
 }

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/ApiCollection.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/ApiCollection.java?rev=638336&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/ApiCollection.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/ApiCollection.java Tue Mar 18 04:52:57 2008
@@ -0,0 +1,66 @@
+/*
+ * 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.opensocial.model;
+
+import org.apache.shindig.social.AbstractGadgetData;
+
+import java.util.List;
+
+/**
+ * see
+ * http://code.google.com/apis/opensocial/docs/0.7/reference/opensocial.Collection.html
+ */
+public class ApiCollection<T> extends AbstractGadgetData {
+  private List<T> items;
+  private int offset;
+  private int totalSize;
+
+  public ApiCollection(List<T> items) {
+    this(items, 0, items.size());
+  }
+
+  public ApiCollection(List<T> items, int offset, int totalSize) {
+    this.items = items;
+    this.offset = offset;
+    this.totalSize = totalSize;
+  }
+
+  public List<T> getItems() {
+    return items;
+  }
+
+  public void setItems(List<T> items) {
+    this.items = items;
+  }
+
+  public int getOffset() {
+    return offset;
+  }
+
+  public void setOffset(int offset) {
+    this.offset = offset;
+  }
+
+  public int getTotalSize() {
+    return totalSize;
+  }
+
+  public void setTotalSize(int totalSize) {
+    this.totalSize = totalSize;
+  }
+}

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java?rev=638336&r1=638335&r2=638336&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java Tue Mar 18 04:52:57 2008
@@ -21,22 +21,49 @@
 import org.apache.shindig.social.opensocial.PeopleService;
 import org.apache.shindig.social.opensocial.model.IdSpec;
 import org.apache.shindig.social.opensocial.model.Person;
+import org.apache.shindig.social.opensocial.model.ApiCollection;
 import org.json.JSONException;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Collections;
+import java.util.Comparator;
 
 public class BasicPeopleService implements PeopleService {
+  private static final Comparator<Person> NAME_COMPARATOR
+      = new Comparator<Person>() {
+    public int compare(Person person, Person person1) {
+      String name = person.getName().getUnstructured();
+      String name1 = person1.getName().getUnstructured();
+      return name.compareTo(name1);
+    }
+  };
 
-  public ResponseItem<List<Person>> getPeople(List<String> ids) {
+  public ResponseItem<ApiCollection<Person>> getPeople(List<String> ids,
+      SortOrder sortOrder, FilterType filter, int first, int max) {
     Map<String, Person> allPeople = XmlStateFileFetcher.get().getAllPeople();
 
     List<Person> people = new ArrayList<Person>();
     for (String id : ids) {
       people.add(allPeople.get(id));
     }
-    return new ResponseItem<List<Person>>(people);
+
+    // We can pretend that by default the people are in top friends order
+    if (sortOrder.equals(SortOrder.name)) {
+      Collections.sort(people, NAME_COMPARATOR);
+    }
+
+    // TODO: The samplecontainer doesn't really have the concept of HAS_APP so
+    // we can't support any filters yet. We should fix this.
+
+    int totalSize = people.size();
+    int last = first + max;
+    people = people.subList(first, Math.min(last, totalSize));
+
+    ApiCollection<Person> collection = new ApiCollection<Person>(people, first,
+        totalSize);
+    return new ResponseItem<ApiCollection<Person>>(collection);
   }
 
   public List<String> getIds(IdSpec idSpec) throws JSONException {