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/07/03 23:20:24 UTC

svn commit: r673815 - in /incubator/shindig/trunk/java/social-api/src: main/java/org/apache/shindig/social/ main/java/org/apache/shindig/social/canonical/ main/java/org/apache/shindig/social/opensocial/ main/java/org/apache/shindig/social/opensocial/mo...

Author: lryan
Date: Thu Jul  3 14:20:23 2008
New Revision: 673815

URL: http://svn.apache.org/viewvc?rev=673815&view=rev
Log:
lots of misc fixes to the Bean<->JSON binder including full roundtrip support for all model objects.

Added:
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/canonical/
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/DefaultModelGuiceModule.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/EnumUtil.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/canonical/
Modified:
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/AddressImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EmailImpl.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/EnumImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MessageImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/NameImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PersonImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PhoneImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/UrlImpl.java
    incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/BeanJsonConverter.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
    incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonConverterTest.java

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/SocialApiGuiceModule.java Thu Jul  3 14:20:23 2008
@@ -18,6 +18,12 @@
  */
 package org.apache.shindig.social;
 
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+
 import org.apache.shindig.common.servlet.ParameterFetcher;
 import org.apache.shindig.social.abdera.SocialRouteManager;
 import org.apache.shindig.social.dataservice.ActivityService;
@@ -26,31 +32,21 @@
 import org.apache.shindig.social.dataservice.PersonService;
 import org.apache.shindig.social.opensocial.ActivitiesService;
 import org.apache.shindig.social.opensocial.DataService;
+import org.apache.shindig.social.opensocial.DefaultModelGuiceModule;
 import org.apache.shindig.social.opensocial.OpenSocialDataHandler;
 import org.apache.shindig.social.opensocial.PeopleService;
-import org.apache.shindig.social.opensocial.model.Activity;
-import org.apache.shindig.social.opensocial.model.ActivityImpl;
-import org.apache.shindig.social.opensocial.model.MediaItem;
-import org.apache.shindig.social.opensocial.model.MediaItemImpl;
 import org.apache.shindig.social.samplecontainer.BasicActivitiesService;
 import org.apache.shindig.social.samplecontainer.BasicDataService;
 import org.apache.shindig.social.samplecontainer.BasicPeopleService;
 import org.apache.shindig.social.samplecontainer.SampleContainerRouteManager;
 import org.apache.shindig.social.samplecontainer.StateFileDataHandler;
 
-import com.google.common.collect.Lists;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Names;
-
 import java.util.List;
 
 /**
  * Provides social api component injection
  */
-public class SocialApiGuiceModule extends AbstractModule {
+public class SocialApiGuiceModule extends DefaultModelGuiceModule {
 
   /** {@inheritDoc} */
   @Override
@@ -70,9 +66,6 @@
 
     bind(ParameterFetcher.class).annotatedWith(Names.named("GadgetDataServlet")).to(GadgetDataServletFetcher.class);
     bind(ParameterFetcher.class).annotatedWith(Names.named("DataServiceServlet")).to(DataServiceServletFetcher.class);
-
-    bind(Activity.class).to(ActivityImpl.class);
-    bind(MediaItem.class).to(MediaItemImpl.class);
   }
 
   public static class GadgetDataHandlersProvider

Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/DefaultModelGuiceModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/DefaultModelGuiceModule.java?rev=673815&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/DefaultModelGuiceModule.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/DefaultModelGuiceModule.java Thu Jul  3 14:20:23 2008
@@ -0,0 +1,63 @@
+/*
+ * 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;
+
+import com.google.inject.AbstractModule;
+
+import org.apache.shindig.social.opensocial.model.Activity;
+import org.apache.shindig.social.opensocial.model.ActivityImpl;
+import org.apache.shindig.social.opensocial.model.Address;
+import org.apache.shindig.social.opensocial.model.AddressImpl;
+import org.apache.shindig.social.opensocial.model.BodyType;
+import org.apache.shindig.social.opensocial.model.BodyTypeImpl;
+import org.apache.shindig.social.opensocial.model.Email;
+import org.apache.shindig.social.opensocial.model.EmailImpl;
+import org.apache.shindig.social.opensocial.model.MediaItem;
+import org.apache.shindig.social.opensocial.model.MediaItemImpl;
+import org.apache.shindig.social.opensocial.model.Message;
+import org.apache.shindig.social.opensocial.model.MessageImpl;
+import org.apache.shindig.social.opensocial.model.Name;
+import org.apache.shindig.social.opensocial.model.NameImpl;
+import org.apache.shindig.social.opensocial.model.Organization;
+import org.apache.shindig.social.opensocial.model.OrganizationImpl;
+import org.apache.shindig.social.opensocial.model.Person;
+import org.apache.shindig.social.opensocial.model.PersonImpl;
+import org.apache.shindig.social.opensocial.model.Phone;
+import org.apache.shindig.social.opensocial.model.PhoneImpl;
+import org.apache.shindig.social.opensocial.model.Url;
+import org.apache.shindig.social.opensocial.model.UrlImpl;
+
+/**
+ * Module for binding standard model implementations
+ */
+public class DefaultModelGuiceModule extends AbstractModule {
+
+  protected void configure() {
+    bind(Activity.class).to(ActivityImpl.class);
+    bind(Address.class).to(AddressImpl.class);
+    bind(BodyType.class).to(BodyTypeImpl.class);
+    bind(Email.class).to(EmailImpl.class);
+    bind(MediaItem.class).to(MediaItemImpl.class);
+    bind(Message.class).to(MessageImpl.class);
+    bind(Name.class).to(NameImpl.class);
+    bind(Organization.class).to(OrganizationImpl.class);
+    bind(Person.class).to(PersonImpl.class);
+    bind(Phone.class).to(PhoneImpl.class);
+    bind(Url.class).to(UrlImpl.class);
+  }
+}

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/AddressImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/AddressImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/AddressImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/AddressImpl.java Thu Jul  3 14:20:23 2008
@@ -31,6 +31,9 @@
   private String type;
   private String unstructuredAddress;
 
+  public AddressImpl() {
+  }
+
   public AddressImpl(String unstructuredAddress) {
     this.unstructuredAddress = unstructuredAddress;
   }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EmailImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EmailImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EmailImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EmailImpl.java Thu Jul  3 14:20:23 2008
@@ -22,6 +22,9 @@
   private String address;
   private String type;
 
+  public EmailImpl() {
+  }
+
   public EmailImpl(String address, String type) {
     this.address = address;
     this.type = type;

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=673815&r1=673814&r2=673815&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 Thu Jul  3 14:20:23 2008
@@ -27,6 +27,26 @@
  */
 public interface Enum<E extends Enum.EnumKey> {
 
+  /**
+   * Set of fields associated with an Enum object
+   */
+  public static enum Field {
+    KEY("key"),
+    // TODO Shouldnt this be 'displayValue'
+    DISPLAY_VALUE("displayvalue");
+
+    private final String jsonString;
+
+    private Field(String jsonString) {
+      this.jsonString = jsonString;
+    }
+
+    @Override
+    public String toString() {
+      return this.jsonString;
+    }
+  }
+
   public interface EnumKey {
     String getDisplayValue();
   }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EnumImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EnumImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EnumImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/EnumImpl.java Thu Jul  3 14:20:23 2008
@@ -17,7 +17,7 @@
  */
 package org.apache.shindig.social.opensocial.model;
 
-public final class EnumImpl<E extends EnumImpl.EnumKey> implements Enum<E> {
+public final class EnumImpl<E extends Enum.EnumKey> implements Enum<E> {
   private String displayValue;
   private E key = null;
 

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MessageImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MessageImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MessageImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MessageImpl.java Thu Jul  3 14:20:23 2008
@@ -23,6 +23,9 @@
   private String title;
   private Type type;
 
+  public MessageImpl() {
+  }
+
   public MessageImpl(String initBody, String initTitle, Type initType) {
     this.body = initBody;
     this.title = initTitle;

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/NameImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/NameImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/NameImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/NameImpl.java Thu Jul  3 14:20:23 2008
@@ -26,6 +26,9 @@
   private String honorificSuffix;
   private String unstructured;
 
+  public NameImpl() {
+  }
+
   public NameImpl(String unstructured) {
     this.unstructured = unstructured;
   }

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PersonImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PersonImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PersonImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PersonImpl.java Thu Jul  3 14:20:23 2008
@@ -82,6 +82,9 @@
   private boolean isOwner = false;
   private boolean isViewer = false;
 
+  public PersonImpl() {
+  }
+
   public PersonImpl(String id, Name name) {
     this.id = id;
     this.name = name;

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PhoneImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PhoneImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PhoneImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/PhoneImpl.java Thu Jul  3 14:20:23 2008
@@ -22,6 +22,9 @@
   private String number;
   private String type;
 
+  public PhoneImpl() {
+  }
+
   public PhoneImpl(String number, String type) {
     super();
     this.number = number;

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/UrlImpl.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/UrlImpl.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/UrlImpl.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/UrlImpl.java Thu Jul  3 14:20:23 2008
@@ -27,6 +27,9 @@
   private String linkText;
   private String type;
 
+  public UrlImpl() {
+  }
+  
   public UrlImpl(String address, String linkText, String type) {
     this.address = address;
     this.linkText = linkText;

Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/BeanJsonConverter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/BeanJsonConverter.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/BeanJsonConverter.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/BeanJsonConverter.java Thu Jul  3 14:20:23 2008
@@ -19,9 +19,13 @@
 
 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.opensocial.model.Enum;
+import org.apache.shindig.social.opensocial.model.EnumImpl;
+import org.joda.time.DateTime;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -34,6 +38,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -44,7 +49,7 @@
 public class BeanJsonConverter implements BeanConverter {
 
   private static final Object[] EMPTY_OBJECT = {};
-  private static final String EXCLUDED_FIELDS = "class";
+  private static final Set<String> EXCLUDED_FIELDS = Sets.newHashSet("class", "declaringclass");
   private static final Pattern GETTER = Pattern.compile("^get([a-zA-Z]+)$");
   private static final Pattern SETTER = Pattern.compile("^set([a-zA-Z]+)$");
   private Injector injector;
@@ -102,12 +107,13 @@
       }
       return map;
 
+    } else if (val != null && val.getClass().isEnum()) {
+      return val.toString();
     } else if (val instanceof String
         || val instanceof Boolean
         || val instanceof Integer
         || val instanceof Date
         || val instanceof Long
-        || val instanceof Enum
         || val instanceof Float
         || val instanceof JSONObject
         || val instanceof JSONArray
@@ -129,17 +135,20 @@
 
     JSONObject toReturn = new JSONObject();
     for (MethodPair getter : availableGetters) {
-      String errorMessage = "Could not encode the " + getter.method + " method.";
+      String errorMessage = "Could not encode the " + getter.method + " method on " +
+          pojo.getClass().getName();
       try {
         Object val = getter.method.invoke(pojo, EMPTY_OBJECT);
         if (val != null) {
           toReturn.put(getter.fieldName, translateObjectToJson(val));
         }
-      } catch(JSONException e) {
+      } catch (JSONException e) {
         throw new RuntimeException(errorMessage, e);
-      } catch(IllegalAccessException e) {
+      } catch (IllegalAccessException e) {
         throw new RuntimeException(errorMessage, e);
-      } catch(InvocationTargetException e) {
+      } catch (InvocationTargetException e) {
+        throw new RuntimeException(errorMessage, e);
+      } catch (IllegalArgumentException e) {
         throw new RuntimeException(errorMessage, e);
       }
     }
@@ -168,7 +177,7 @@
 
       String name = matcher.group();
       String fieldName = name.substring(3, 4).toLowerCase() + name.substring(4);
-      if (fieldName.equalsIgnoreCase(EXCLUDED_FIELDS)) {
+      if (EXCLUDED_FIELDS.contains(fieldName.toLowerCase())) {
         continue;
       }
       availableGetters.add(new MethodPair(method, fieldName));
@@ -190,12 +199,14 @@
       throw new RuntimeException(errorMessage, e);
     } catch (InstantiationException e) {
       throw new RuntimeException(errorMessage, e);
+    } catch (NoSuchFieldException e) {
+      throw new RuntimeException(errorMessage, e);
     }
   }
 
   private <T> T convertToObject(String json, T pojo)
       throws JSONException, InvocationTargetException, IllegalAccessException,
-      InstantiationException {
+      InstantiationException, NoSuchFieldException {
 
     if (pojo instanceof String) {
       pojo = (T) json; // This is a weird cast...
@@ -233,7 +244,8 @@
 
   private <T> void callSetterWithValue(T pojo, Method method,
       JSONObject jsonObject, String fieldName)
-      throws IllegalAccessException, InvocationTargetException, JSONException {
+      throws IllegalAccessException, InvocationTargetException, NoSuchFieldException,
+      JSONException {
 
     Class<?> expectedType = method.getParameterTypes()[0];
     Object value = null;
@@ -272,20 +284,50 @@
 
       value = map;
 
-    } else if (Enum.class.isAssignableFrom(expectedType)) {
-      String enumString = jsonObject.getString(fieldName);
-      value = Enum.valueOf((Class<? extends Enum>) expectedType, enumString);
-
+    } 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()));
+        }
+      }
+    } else if (expectedType.isEnum()) {
+      if (jsonObject.has(fieldName)) {
+        for (Object v : expectedType.getEnumConstants()) {
+          if (v.toString().equals(jsonObject.getString(fieldName))) {
+            value = v;
+            break;
+          }
+        }
+        if (value == null) {
+          throw new IllegalArgumentException(
+              "No enum value  '" + jsonObject.getString(fieldName) +
+                  "' in " + expectedType.getName());
+        }
+      }
     } else if (expectedType.equals(String.class)) {
       value = jsonObject.getString(fieldName);
-
     } else if (expectedType.equals(Date.class)) {
-      Long time = jsonObject.getLong(fieldName);
-      value = new Date(time);
-
+      // Use JODA ISO parsing for the conversion
+      value = new DateTime(jsonObject.getString(fieldName)).toDate();
     } else if (expectedType.equals(Long.class)) {
       value = jsonObject.getLong(fieldName);
-
+    } else if (expectedType.equals(Integer.class)) {
+      value = jsonObject.getInt(fieldName);
+    } else if (expectedType.equals(Boolean.class)) {
+      value = jsonObject.getBoolean(fieldName);
     } else if (expectedType.equals(Float.class)) {
       String stringFloat = jsonObject.getString(fieldName);
       value = new Float(stringFloat);

Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/EnumUtil.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/EnumUtil.java?rev=673815&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/EnumUtil.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/util/EnumUtil.java Thu Jul  3 14:20:23 2008
@@ -0,0 +1,27 @@
+package org.apache.shindig.social.opensocial.util;
+
+import com.google.common.collect.Sets;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Utility class for OpenSocial enums
+ */
+public class EnumUtil {
+
+  /**
+   * @param vals array of enums
+   * @return a set of the names for a list of Enum values defined by toString
+   */
+  public static Set<String> getEnumStrings(Enum... vals) {
+    Set<String> result = Sets.newHashSet();
+    for (Enum v : vals) {
+      result.add(v.toString());
+    }
+    if (result.size() != vals.length) {
+      throw new IllegalArgumentException("Enum names are not disjoint set");
+    }
+    return Collections.unmodifiableSet(result);
+  }
+}

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java Thu Jul  3 14:20:23 2008
@@ -18,6 +18,11 @@
  */
 package org.apache.shindig.social;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+
 import org.apache.shindig.common.BasicSecurityTokenDecoder;
 import org.apache.shindig.common.SecurityTokenDecoder;
 import org.apache.shindig.common.servlet.ParameterFetcher;
@@ -28,6 +33,7 @@
 import org.apache.shindig.social.dataservice.PersonService;
 import org.apache.shindig.social.opensocial.ActivitiesService;
 import org.apache.shindig.social.opensocial.DataService;
+import org.apache.shindig.social.opensocial.DefaultModelGuiceModule;
 import org.apache.shindig.social.opensocial.PeopleService;
 import org.apache.shindig.social.opensocial.model.Activity;
 import org.apache.shindig.social.opensocial.model.ActivityImpl;
@@ -39,8 +45,6 @@
 import org.apache.shindig.social.opensocial.model.EmailImpl;
 import org.apache.shindig.social.opensocial.model.Enum;
 import org.apache.shindig.social.opensocial.model.EnumImpl;
-import org.apache.shindig.social.opensocial.model.MediaItem;
-import org.apache.shindig.social.opensocial.model.MediaItemImpl;
 import org.apache.shindig.social.opensocial.model.NameImpl;
 import org.apache.shindig.social.opensocial.model.Organization;
 import org.apache.shindig.social.opensocial.model.OrganizationImpl;
@@ -55,12 +59,6 @@
 import org.apache.shindig.social.samplecontainer.SampleContainerRouteManager;
 import org.apache.shindig.social.samplecontainer.XmlStateFileFetcher;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.inject.AbstractModule;
-import com.google.inject.Singleton;
-import com.google.inject.name.Names;
-
 import java.net.URI;
 import java.util.Date;
 import java.util.HashMap;
@@ -71,12 +69,13 @@
 /**
  * Provides social api component injection for all large tests
  */
-public class SocialApiTestsGuiceModule extends AbstractModule {
+public class SocialApiTestsGuiceModule extends DefaultModelGuiceModule {
   private static Logger logger =
       Logger.getLogger(SocialApiTestsGuiceModule.class.getName());
 
   @Override
   protected void configure() {
+    super.configure();
     bind(PeopleService.class).to(BasicPeopleService.class);
     bind(DataService.class).to(BasicDataService.class);
     bind(ActivitiesService.class).to(BasicActivitiesService.class);
@@ -92,9 +91,6 @@
 
     bind(ParameterFetcher.class).annotatedWith(Names.named("GadgetDataServlet")).to(GadgetDataServletFetcher.class);
     bind(ParameterFetcher.class).annotatedWith(Names.named("DataServiceServlet")).to(DataServiceServletFetcher.class);
-
-    bind(Activity.class).to(ActivityImpl.class);
-    bind(MediaItem.class).to(MediaItemImpl.class);
   }
 
   @Singleton

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonConverterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonConverterTest.java?rev=673815&r1=673814&r2=673815&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonConverterTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/util/BeanJsonConverterTest.java Thu Jul  3 14:20:23 2008
@@ -17,26 +17,27 @@
  */
 package org.apache.shindig.social.opensocial.util;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+
+import junit.framework.TestCase;
+
+import org.apache.shindig.social.SocialApiTestsGuiceModule;
 import org.apache.shindig.social.opensocial.model.Activity;
-import org.apache.shindig.social.opensocial.model.Email;
-import org.apache.shindig.social.opensocial.model.MediaItem;
-import org.apache.shindig.social.opensocial.model.Person;
-import org.apache.shindig.social.opensocial.model.Phone;
-import org.apache.shindig.social.opensocial.model.DataCollection;
 import org.apache.shindig.social.opensocial.model.ActivityImpl;
+import org.apache.shindig.social.opensocial.model.Address;
 import org.apache.shindig.social.opensocial.model.AddressImpl;
+import org.apache.shindig.social.opensocial.model.DataCollection;
+import org.apache.shindig.social.opensocial.model.Email;
 import org.apache.shindig.social.opensocial.model.EmailImpl;
+import org.apache.shindig.social.opensocial.model.MediaItem;
 import org.apache.shindig.social.opensocial.model.MediaItemImpl;
 import org.apache.shindig.social.opensocial.model.NameImpl;
+import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.model.PersonImpl;
+import org.apache.shindig.social.opensocial.model.Phone;
 import org.apache.shindig.social.opensocial.model.PhoneImpl;
-import org.apache.shindig.social.opensocial.model.Address;
-import org.apache.shindig.social.SocialApiTestsGuiceModule;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.inject.Guice;
-import junit.framework.TestCase;
 import org.json.JSONArray;
 import org.json.JSONObject;
 
@@ -189,7 +190,7 @@
 
   public void testJsonToActivity() throws Exception {
     String jsonActivity = "{userId : 5, id : 6, mediaItems : [" +
-        "{url : 'hello', mimeType : 'mimey', type : 'VIDEO'}" +
+        "{url : 'hello', mimeType : 'mimey', type : 'video'}" +
         "]}";
     // TODO: rename the enums to be lowercase
     Activity result = beanJsonConverter.convertToObject(jsonActivity,