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" : {