You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by lr...@apache.org on 2008/08/25 21:35:05 UTC

svn commit: r688838 - in /incubator/shindig/trunk: features/opensocial-0.7/ features/opensocial-current/ java/social-api/src/main/java/org/apache/shindig/social/core/model/ java/social-api/src/main/java/org/apache/shindig/social/core/util/ java/social-...

Author: lryan
Date: Mon Aug 25 12:35:04 2008
New Revision: 688838

URL: http://svn.apache.org/viewvc?rev=688838&view=rev
Log:
Fix implementation of lookingFor enum field in Java & JS including tests
Fix appId handling on jsonrpccontainer.js

Modified:
    incubator/shindig/trunk/features/opensocial-0.7/opensocial7to8.js
    incubator/shindig/trunk/features/opensocial-current/jsonperson.js
    incubator/shindig/trunk/features/opensocial-current/jsonrpccontainer.js
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/PersonImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/BeanJsonConverter.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Enum.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Person.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java
    incubator/shindig/trunk/javascript/sampledata/canonicaldb.json

Modified: incubator/shindig/trunk/features/opensocial-0.7/opensocial7to8.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-0.7/opensocial7to8.js?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-0.7/opensocial7to8.js (original)
+++ incubator/shindig/trunk/features/opensocial-0.7/opensocial7to8.js Mon Aug 25 12:35:04 2008
@@ -60,7 +60,11 @@
   var value =  this.getField_v08(key, opt_params);
   if (key == 'lookingFor' && value) {
     // The lookingFor field used to return a string instead of an enum
-    return value.getDisplayValue();
+    var returnValue = new Array(value.length);
+    for (var i = 0; i < value.length; i++) {
+      returnValue[i] = value[i].getDisplayValue();
+    }
+    return returnValue.join();
   } else {
     return value;
   }

Modified: incubator/shindig/trunk/features/opensocial-current/jsonperson.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-current/jsonperson.js?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-current/jsonperson.js (original)
+++ incubator/shindig/trunk/features/opensocial-current/jsonperson.js Mon Aug 25 12:35:04 2008
@@ -46,13 +46,14 @@
   JsonPerson.constructEnum(opt_params, "smoker");
   JsonPerson.constructEnum(opt_params, "drinker");
   JsonPerson.constructEnum(opt_params, "networkPresence");
+  JsonPerson.constructEnumArray(opt_params, "lookingFor");
 
   opensocial.Person.call(this, opt_params, opt_params['isOwner'],
       opt_params['isViewer']);
 };
 JsonPerson.inherits(opensocial.Person);
 
-// Converts the fieldName into an instance of a opensocial.Enum
+// Converts the fieldName into an instance of an opensocial.Enum
 JsonPerson.constructEnum = function(map, fieldName) {
   var fieldValue = map[fieldName];
   if (fieldValue) {
@@ -60,6 +61,16 @@
   }
 }
 
+// Converts the fieldName into an array of instances of an opensocial.Enum
+JsonPerson.constructEnumArray = function(map, fieldName) {
+  var fieldValue = map[fieldName];
+  if (fieldValue) {
+    for (var i = 0; i < fieldValue.length; i++) {
+      fieldValue[i] = new opensocial.Enum(fieldValue[i].key, fieldValue[i].displayValue);
+    }
+  }
+}
+
 // Converts the fieldName into an instance of the specified object
 JsonPerson.constructObject = function(map, fieldName, className) {
   var fieldValue = map[fieldName];

Modified: incubator/shindig/trunk/features/opensocial-current/jsonrpccontainer.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/opensocial-current/jsonrpccontainer.js?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/features/opensocial-current/jsonrpccontainer.js (original)
+++ incubator/shindig/trunk/features/opensocial-current/jsonrpccontainer.js Mon Aug 25 12:35:04 2008
@@ -284,7 +284,7 @@
     opt_params) {
   var rpc = { method : "appdata.get" };
   rpc.params = this.translateIdSpec(idSpec);
-  rpc.params.app = "@app";
+  rpc.params.appId = "@app";
   rpc.params.fields = this.getFieldsList(keys);
   if (idSpec.getField('networkDistance')) {
     rpc.params.networkDistance = idSpec.getField('networkDistance');
@@ -300,7 +300,7 @@
     value) {
   var rpc = { method : "appdata.update" };
   rpc.params = this.translateIdSpec(this.makeIdSpec(id));
-  rpc.params.app = "@app";
+  rpc.params.appId = "@app";
   rpc.params.data = {};
   rpc.params.data[key] = value;
   return new JsonRpcRequestItem(rpc);
@@ -309,7 +309,7 @@
 JsonRpcContainer.prototype.newRemovePersonAppDataRequest = function(id, keys) {
   var rpc = { method : "appdata.delete" };
   rpc.params = this.translateIdSpec(this.makeIdSpec(id));
-  rpc.params.app = "@app";
+  rpc.params.appId = "@app";
   rpc.params.keys = keys;
 
   return new JsonRpcRequestItem(rpc);
@@ -350,7 +350,7 @@
     activity) {
   var rpc = { method : "activities.create" };
   rpc.params = this.translateIdSpec(idSpec);
-  rpc.params.app = "@app";
+  rpc.params.appId = "@app";
   if (idSpec.getField('networkDistance')) {
     rpc.params.networkDistance = idSpec.getField('networkDistance');
   }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/PersonImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/PersonImpl.java?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/PersonImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/PersonImpl.java Mon Aug 25 12:35:04 2008
@@ -63,7 +63,7 @@
   private List<String> languagesSpoken;
   private Date updated;
   private String livingArrangement;
-  private String lookingFor;
+  private List<Enum<Enum.LookingFor>> lookingFor;
   private List<String> movies;
   private List<String> music;
   private Name name;
@@ -320,11 +320,11 @@
     this.livingArrangement = livingArrangement;
   }
 
-  public String getLookingFor() {
+  public List<Enum<Enum.LookingFor>> getLookingFor() {
     return lookingFor;
   }
 
-  public void setLookingFor(String lookingFor) {
+  public void setLookingFor(List<Enum<Enum.LookingFor>> lookingFor) {
     this.lookingFor = lookingFor;
   }
 

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/BeanJsonConverter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/BeanJsonConverter.java?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/BeanJsonConverter.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/BeanJsonConverter.java Mon Aug 25 12:35:04 2008
@@ -17,16 +17,16 @@
  */
 package org.apache.shindig.social.core.util;
 
+import org.apache.shindig.social.core.model.EnumImpl;
+import org.apache.shindig.social.opensocial.model.Enum;
+import org.apache.shindig.social.opensocial.service.BeanConverter;
+
 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.Injector;
 
-import org.apache.shindig.social.core.model.EnumImpl;
-import org.apache.shindig.social.opensocial.model.Enum;
-import org.apache.shindig.social.opensocial.service.BeanConverter;
-
 import org.joda.time.DateTime;
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -40,8 +40,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -252,16 +252,31 @@
     Class<?> expectedType = method.getParameterTypes()[0];
     Object value = null;
 
-    if (expectedType.equals(List.class)) {
+    if (!jsonObject.has(fieldName)) {
+      // Skip
+    } else if (expectedType.equals(List.class)) {
       ParameterizedType genericListType
           = (ParameterizedType) method.getGenericParameterTypes()[0];
-      Class<?> listElementClass
-          = (Class<?>) genericListType.getActualTypeArguments()[0];
+      Type type = genericListType.getActualTypeArguments()[0];
+      Class<?> rawType;
+      Class<?> listElementClass;
+      if (type instanceof ParameterizedType) {
+        listElementClass = (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0];
+        rawType = (Class<?>)((ParameterizedType)type).getRawType();
+      } else {
+        listElementClass = (Class<?>) type;
+        rawType = listElementClass;
+      }
 
       List<Object> list = Lists.newArrayList();
       JSONArray jsonArray = jsonObject.getJSONArray(fieldName);
       for (int i = 0; i < jsonArray.length(); i++) {
-        list.add(convertToObject(jsonArray.getString(i), listElementClass));
+        if (org.apache.shindig.social.opensocial.model.Enum.class
+            .isAssignableFrom(rawType)) {
+          list.add(convertEnum(listElementClass, jsonArray.getJSONObject(i)));
+        } else {
+          list.add(convertToObject(jsonArray.getString(i), listElementClass));
+        }
       }
 
       value = list;
@@ -289,22 +304,10 @@
     } else if (org.apache.shindig.social.opensocial.model.Enum.class
         .isAssignableFrom(expectedType)) {
       // TODO Need to stop using Enum as a class name :(
-      Class<?> enumType = (Class<?>) ((ParameterizedType) method.getGenericParameterTypes()[0])
-          .getActualTypeArguments()[0];
-      // TODO This isnt injector friendly but perhaps implementors dont need it. If they do a
-      // refactoring of the Enum handling in general is needed.
-      if (jsonObject.has(fieldName)) {
-        JSONObject jsonEnum = jsonObject.getJSONObject(fieldName);
-        if (jsonEnum.has(Enum.Field.KEY.toString())) {
-          Enum.EnumKey enumKey = (Enum.EnumKey) enumType
-              .getField(jsonEnum.getString(Enum.Field.KEY.toString())).get(null);
-          value = new EnumImpl<Enum.EnumKey>(enumKey,
-              jsonEnum.getString(Enum.Field.DISPLAY_VALUE.toString()));
-        } else {
-          value = new EnumImpl<Enum.EnumKey>(null,
-              jsonEnum.getString(Enum.Field.DISPLAY_VALUE.toString()));
-        }
-      }
+      value = convertEnum(
+          (Class<?>)((ParameterizedType) method.getGenericParameterTypes()[0]).
+              getActualTypeArguments()[0],
+          jsonObject.getJSONObject(fieldName));
     } else if (expectedType.isEnum()) {
       if (jsonObject.has(fieldName)) {
         for (Object v : expectedType.getEnumConstants()) {
@@ -342,4 +345,21 @@
       method.invoke(pojo, value);
     }
   }
+
+  private Object convertEnum(Class<?> enumKeyType, JSONObject jsonEnum)
+      throws JSONException, IllegalAccessException, NoSuchFieldException {
+    // TODO This isnt injector friendly but perhaps implementors dont need it. If they do a
+    // refactoring of the Enum handling in general is needed.
+    Object value;
+    if (jsonEnum.has(Enum.Field.KEY.toString())) {
+      Enum.EnumKey enumKey = (Enum.EnumKey) enumKeyType
+          .getField(jsonEnum.getString(Enum.Field.KEY.toString())).get(null);
+      value = new EnumImpl<Enum.EnumKey>(enumKey,
+          jsonEnum.getString(Enum.Field.DISPLAY_VALUE.toString()));
+    } else {
+      value = new EnumImpl<Enum.EnumKey>(null,
+          jsonEnum.getString(Enum.Field.DISPLAY_VALUE.toString()));
+    }
+    return value;
+  }
 }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Enum.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Enum.java?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Enum.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Enum.java Mon Aug 25 12:35:04 2008
@@ -176,6 +176,37 @@
   }
 
   /**
+   * public java.lang.Enum for opensocial.Enum.LookingFor
+   */
+  public enum LookingFor implements EnumKey {
+
+    DATING("DATING", "Dating"),
+    FRIENDS("FRIENDS", "Friends"),
+    RELATIONSHIP("RELATIONSHIP", "Relationship"),
+    NETWORKING("NETWORKING", "Networking"),
+    ACTIVITY_PARTNERS("ACTIVITY_PARTNERS", "Activity partners"),
+    RANDOM("RANDOM", "Random");
+
+    private final String jsonString;
+
+    private final String displayValue;
+
+    private LookingFor(String jsonString, String displayValue) {
+      this.jsonString = jsonString;
+      this.displayValue = displayValue;
+    }
+
+    @Override
+    public String toString() {
+      return this.jsonString;
+    }
+
+    public String getDisplayValue() {
+      return displayValue;
+    }
+  }
+
+  /**
    * Gets the value of this Enum. This is the string displayed to the user. If the container
    * supports localization, the string should be localized.
    *

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=688838&r1=688837&r2=688838&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 Aug 25 12:35:04 2008
@@ -19,13 +19,13 @@
 
 import org.apache.shindig.social.core.model.PersonImpl;
 
-import com.google.inject.ImplementedBy;
 import com.google.common.collect.Maps;
+import com.google.inject.ImplementedBy;
 
 import java.util.Date;
 import java.util.List;
-import java.util.Set;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * see http://code.google.com/apis/opensocial/docs/0.8/reference/#opensocial.Person.Field for all
@@ -641,7 +641,7 @@
    *
    * @return person's statement about who or what they are looking for
    */
-  String getLookingFor();
+  List<Enum<Enum.LookingFor>> getLookingFor();
 
   /**
    * Get a person's statement about who or what they are looking for, or what they are interested in
@@ -650,7 +650,7 @@
    *
    * @param lookingFor person's statement about who or what they are looking for
    */
-  void setLookingFor(String lookingFor);
+  void setLookingFor(List<Enum<Enum.LookingFor>> lookingFor);
 
   /**
    * Get the Person's favorite movies, specified as an List of strings. Container support for this

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonPeopleTest.java Mon Aug 25 12:35:04 2008
@@ -38,6 +38,7 @@
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -138,7 +139,11 @@
     canonical.setUpdated(new Date());
     canonical.setLanguagesSpoken(Lists.newArrayList("English", "Dutch", "Esperanto"));
     canonical.setLivingArrangement("in a house");
-    canonical.setLookingFor("patches");
+    Enum<Enum.LookingFor> lookingForRandom =
+        new EnumImpl<Enum.LookingFor>(Enum.LookingFor.RANDOM, "Random");
+    Enum<Enum.LookingFor> lookingForNetworking =
+        new EnumImpl<Enum.LookingFor>(Enum.LookingFor.NETWORKING, "Networking");
+    canonical.setLookingFor(Lists.newArrayList(lookingForRandom, lookingForNetworking));
     canonical.setMovies(Lists.newArrayList("Iron Man", "Nosferatu"));
     canonical.setMusic(Lists.newArrayList("Chieftains", "Beck"));
     canonical.setNetworkPresence(new EnumImpl<Enum.NetworkPresence>(Enum.NetworkPresence.ONLINE));
@@ -295,7 +300,7 @@
 //    assertDateField(result, canonical.getUpdated(), Person.Field.LAST_UPDATED);
     assertStringField(result, canonical.getLivingArrangement(),
         Person.Field.LIVING_ARRANGEMENT);
-    assertStringField(result, canonical.getLookingFor(),
+    assertListEnumField(result, canonical.getLookingFor(),
         Person.Field.LOOKING_FOR);
     assertStringListField(result, canonical.getMovies(), Person.Field.MOVIES);
     assertStringListField(result, canonical.getMusic(), Person.Field.MUSIC);
@@ -427,6 +432,18 @@
     assertEquals(expected.getKey().toString(), actual.getString("key"));
   }
 
+  private void assertListEnumField(JSONObject result,
+      List<? extends Enum<? extends Enum.EnumKey>> expected,
+      Person.Field field) throws JSONException {
+    JSONArray actual = result.getJSONArray(field.toString());
+    for (int i = 0; i  < actual.length(); i++) {
+      assertEquals(expected.get(i).getDisplayValue(),
+          actual.getJSONObject(i).getString("displayValue"));
+      assertEquals(expected.get(i).getKey().toString(),
+          actual.getJSONObject(i).getString("key"));
+    }
+  }
+
   /**
    * Expected response for a list of people in json:
    *

Modified: incubator/shindig/trunk/javascript/sampledata/canonicaldb.json
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/sampledata/canonicaldb.json?rev=688838&r1=688837&r2=688838&view=diff
==============================================================================
--- incubator/shindig/trunk/javascript/sampledata/canonicaldb.json (original)
+++ incubator/shindig/trunk/javascript/sampledata/canonicaldb.json Mon Aug 25 12:35:04 2008
@@ -7,6 +7,7 @@
 //    activity : Map<Person.Id, Array<Activity>>
 //    data : Map<Person.Id, Map<String,String>>
 //    friendLinks : Map<Person.Id, Array<Person.Id>>
+//    userApplications : Map<Person.Id, Array<Application.Id>>
 //  }
 //
 //  Notes:
@@ -105,7 +106,10 @@
 "languagesSpoken" : ["English","Dutch","Esperanto"],
 "updated" : "2006-06-06T12:12:12Z",
 "livingArrangement" : "in a house",
-"lookingFor" : "patches",
+"lookingFor" : [
+  { "key" : "RANDOM", "displayValue" : "Random"},
+  { "key" : "NETWORKING", "displayValue" : "Networking"}
+],
 "movies" : ["Iron Man", "Nosferatu"],
 "music" : ["Chieftains","Beck"],
 "name" : {