You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by wo...@apache.org on 2011/06/14 19:19:09 UTC

svn commit: r1135710 - in /shindig/trunk/java: common/src/main/java/org/apache/shindig/protocol/conversion/ common/src/main/java/org/apache/shindig/protocol/conversion/xstream/ common/src/main/java/org/apache/shindig/protocol/model/ social-api/src/main...

Author: woodser
Date: Tue Jun 14 17:19:08 2011
New Revision: 1135710

URL: http://svn.apache.org/viewvc?rev=1135710&view=rev
Log:
Enables arbitrary extensions in Shindig's data model: https://reviews.apache.org/r/881/

Wiki documenting changes and how to use it: http://docs.opensocial.org/display/OSD/Arbitrary+Extensions+to+Apache+Shindig%27s+Data+Model

Added:
    shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/ExtendableBeanConverter.java
    shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBean.java
    shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBeanImpl.java
    shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/fixtures/ActivityEntryJsonExtension.json
Removed:
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ExtensionImpl.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/Extension.java
Modified:
    shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/MediaLinkImpl.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MediaLink.java
    shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java

Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java Tue Jun 14 17:19:08 2011
@@ -17,25 +17,6 @@
  */
 package org.apache.shindig.protocol.conversion;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.MapMaker;
-import com.google.common.collect.Lists;
-import com.google.common.collect.ImmutableMap;
-
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-
-import org.apache.shindig.common.JsonProperty;
-import org.apache.shindig.common.JsonSerializer;
-import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.protocol.ContentTypes;
-import org.apache.shindig.protocol.model.Enum;
-import org.apache.shindig.protocol.model.EnumImpl;
-import org.joda.time.DateTime;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -51,6 +32,25 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.shindig.common.JsonProperty;
+import org.apache.shindig.common.JsonSerializer;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.protocol.ContentTypes;
+import org.apache.shindig.protocol.model.Enum;
+import org.apache.shindig.protocol.model.EnumImpl;
+import org.apache.shindig.protocol.model.ExtendableBean;
+import org.joda.time.DateTime;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.MapMaker;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
 /**
  * Converts between JSON and java objects.
  *
@@ -261,6 +261,19 @@ public class BeanJsonConverter implement
 
   private Object convertToClass(JSONObject in, Class<?> type) {
     Object out = injector.getInstance(type);
+    
+    /*
+     * Simple hack to add support for arbitrary extensions to Shindig's data
+     * model.  It initializes keys/values of an ExtendableBean class, which is
+     * a Map under the covers.  If a class implements ExtendableBean.java, it
+     * will support arbitrary mappings to JSON & XML.
+     */
+    if (ExtendableBean.class.isAssignableFrom(type)) {
+      for (String name : JSONObject.getNames(in)) {
+        ((ExtendableBean) out).put(name, convertToObject(in.opt(name), null));
+      }
+    }
+  
     for (Map.Entry<String, Method> entry : getSetters(out.getClass()).entrySet()) {
       Object value = in.opt(entry.getKey());
       if (value != null) {

Added: shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/ExtendableBeanConverter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/ExtendableBeanConverter.java?rev=1135710&view=auto
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/ExtendableBeanConverter.java (added)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/ExtendableBeanConverter.java Tue Jun 14 17:19:08 2011
@@ -0,0 +1,73 @@
+/*
+ * 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.protocol.conversion.xstream;
+
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.shindig.protocol.model.ExtendableBeanImpl;
+
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+
+/**
+ * Serializes an ExtendableBeanImpl type as a Map instead of a POJO.
+ * 
+ * Note: For an ExtendableBean field within a POJO to be properly serialized to
+ * XML, the field must still be hardcoded into the POJO, even if the POJO itself
+ * is an ExtendableBean. This is because POJOs are still serialized to XML
+ * normally to preserve custom formatting (hence why this class ONLY converts
+ * ExtendableBeanImpl). If xstream does not expect the ExtendableBean field, it
+ * will not serialize it. This does not, however, affect JSON serialization,
+ * which always works without predefining the field when extending
+ * ExtendableBean.
+ */
+public class ExtendableBeanConverter implements Converter {
+
+	@SuppressWarnings("rawtypes")
+	public boolean canConvert(Class clazz) {
+		return clazz.equals(ExtendableBeanImpl.class);
+	}
+
+	@SuppressWarnings("rawtypes")
+	public void marshal(Object value, HierarchicalStreamWriter writer,
+			MarshallingContext context) {
+		AbstractMap map = (AbstractMap) value;
+		for (Object obj : map.entrySet()) {
+			Entry entry = (Entry) obj;
+			writer.startNode(entry.getKey().toString());
+			if (entry.getValue() instanceof String) {
+				writer.setValue(entry.getValue().toString());
+			} else if (entry.getValue() instanceof Map) {
+				marshal(entry.getValue(), writer, context);
+			} else {
+				context.convertAnother(entry.getValue());
+			}
+			writer.endNode();
+		}
+	}
+
+	public Object unmarshal(HierarchicalStreamReader reader,
+			UnmarshallingContext context) {
+		return null; // XML POST not supported
+	}
+}
\ No newline at end of file

Added: shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBean.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBean.java?rev=1135710&view=auto
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBean.java (added)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBean.java Tue Jun 14 17:19:08 2011
@@ -0,0 +1,32 @@
+/*
+ * 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.protocol.model;
+
+import java.util.Map;
+
+
+import com.google.inject.ImplementedBy;
+
+/**
+ * A generic bucket to store arbitrary extensions.
+ */
+@ImplementedBy(ExtendableBeanImpl.class)
+@Exportablebean
+public interface ExtendableBean extends Map<String, Object> {
+
+}

Added: shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBeanImpl.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBeanImpl.java?rev=1135710&view=auto
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBeanImpl.java (added)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/model/ExtendableBeanImpl.java Tue Jun 14 17:19:08 2011
@@ -0,0 +1,28 @@
+/*
+ * 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.protocol.model;
+
+import java.util.HashMap;
+
+
+/**
+ * A generic bucket to store arbitrary extensions.
+ */
+public class ExtendableBeanImpl extends HashMap<String, Object> implements ExtendableBean {
+	private static final long serialVersionUID = 1L;
+}

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java Tue Jun 14 17:19:08 2011
@@ -18,15 +18,17 @@
 
 package org.apache.shindig.social.core.model;
 
+import org.apache.shindig.protocol.model.ExtendableBean;
+import org.apache.shindig.protocol.model.ExtendableBeanImpl;
 import org.apache.shindig.social.opensocial.model.ActivityEntry;
 import org.apache.shindig.social.opensocial.model.ActivityObject;
-import org.apache.shindig.social.opensocial.model.Extension;
 
 /**
  * A simple bean implementation of an ActivityStream Entry.
  */
-public class ActivityEntryImpl implements ActivityEntry {
+public class ActivityEntryImpl extends ExtendableBeanImpl implements ActivityEntry {
   
+  private static final long serialVersionUID = 1L;
   private ActivityObject actor;
   private String content;
   private ActivityObject generator;
@@ -40,7 +42,8 @@ public class ActivityEntryImpl implement
   private String updated;
   private String url;
   private String verb;
-  private Extension openSocial;
+  private ExtendableBean openSocial;
+  private ExtendableBean extensions;
 
   /**
    * Create a new empty ActivityEntry
@@ -177,14 +180,24 @@ public class ActivityEntryImpl implement
   }
 
   /** {@inheritDoc} */
-  public Extension getOpenSocial() {
+  public ExtendableBean getOpenSocial() {
     return openSocial;
   }
 
   /** {@inheritDoc} */
-  public void setOpenSocial(Extension openSocial) {
+  public void setOpenSocial(ExtendableBean openSocial) {
     this.openSocial = openSocial;
   }
+  
+  /** {@inheritDoc} */
+  public ExtendableBean getExtensions() {
+    return extensions;
+  }
+
+  /** {@inheritDoc} */
+  public void setExtensions(ExtendableBean extensions) {
+    this.extensions = extensions;
+  }
 
   /**
    * Sorts ActivityEntries in ascending order based on publish date.

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java Tue Jun 14 17:19:08 2011
@@ -20,14 +20,17 @@ package org.apache.shindig.social.core.m
 
 import java.util.List;
 
+import org.apache.shindig.protocol.model.ExtendableBean;
+import org.apache.shindig.protocol.model.ExtendableBeanImpl;
 import org.apache.shindig.social.opensocial.model.ActivityObject;
 import org.apache.shindig.social.opensocial.model.MediaLink;
 
 /**
  * <p>ActivityObjectImpl class.</p>
  */
-public class ActivityObjectImpl implements ActivityObject {
+public class ActivityObjectImpl extends ExtendableBeanImpl implements ActivityObject {
   
+  private static final long serialVersionUID = 1L;
   private List<ActivityObject> attachments;
   private ActivityObject author;
   private String content;
@@ -41,6 +44,7 @@ public class ActivityObjectImpl implemen
   private String updated;
   private List<String> upstreamDuplicates;
   private String url;
+  private ExtendableBean openSocial;
   
   /**
    * Constructs an empty ActivityObject.
@@ -176,4 +180,14 @@ public class ActivityObjectImpl implemen
   public void setUrl(String url) {
     this.url = url;
   }
+  
+  /** {@inheritDoc} */
+  public ExtendableBean getOpenSocial() {
+    return openSocial;
+  }
+
+  /** {@inheritDoc} */
+  public void setOpenSocial(ExtendableBean openSocial) {
+    this.openSocial = openSocial;
+  }
 }
\ No newline at end of file

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/MediaLinkImpl.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/MediaLinkImpl.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/MediaLinkImpl.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/MediaLinkImpl.java Tue Jun 14 17:19:08 2011
@@ -17,18 +17,22 @@
  */
 package org.apache.shindig.social.core.model;
 
+import org.apache.shindig.protocol.model.ExtendableBean;
+import org.apache.shindig.protocol.model.ExtendableBeanImpl;
 import org.apache.shindig.social.opensocial.model.MediaLink;
 
 /**
  * <p>MediaLinkImpl class.</p>
  *
  */
-public class MediaLinkImpl implements MediaLink {
+public class MediaLinkImpl extends ExtendableBeanImpl implements MediaLink {
   
+  private static final long serialVersionUID = 1L;
   private Integer duration;
   private Integer height;
   private String url;
-  private Integer width;  
+  private Integer width;
+  private ExtendableBean openSocial;
   
   /**
    * Create a new MediaLink
@@ -75,4 +79,14 @@ public class MediaLinkImpl implements Me
   public void setWidth(Integer width) {
     this.width = width;
   }
+  
+  /** {@inheritDoc} */
+  public ExtendableBean getOpenSocial() {
+    return openSocial;
+  }
+
+  /** {@inheritDoc} */
+  public void setOpenSocial(ExtendableBean openSocial) {
+    this.openSocial = openSocial;
+  }
 }

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java Tue Jun 14 17:19:08 2011
@@ -27,6 +27,7 @@ import org.apache.shindig.protocol.DataC
 import org.apache.shindig.protocol.RestfulCollection;
 import org.apache.shindig.protocol.conversion.xstream.ClassFieldMapping;
 import org.apache.shindig.protocol.conversion.xstream.DataCollectionConverter;
+import org.apache.shindig.protocol.conversion.xstream.ExtendableBeanConverter;
 import org.apache.shindig.protocol.conversion.xstream.GuiceBeanConverter;
 import org.apache.shindig.protocol.conversion.xstream.ImplicitCollectionFieldMapping;
 import org.apache.shindig.protocol.conversion.xstream.InterfaceClassMapper;
@@ -38,6 +39,7 @@ import org.apache.shindig.protocol.conve
 import org.apache.shindig.protocol.conversion.xstream.WriterStack;
 import org.apache.shindig.protocol.conversion.xstream.XStreamConfiguration;
 import org.apache.shindig.protocol.model.EnumImpl;
+import org.apache.shindig.protocol.model.ExtendableBean;
 import org.apache.shindig.social.core.util.atom.AtomAttribute;
 import org.apache.shindig.social.core.util.atom.AtomAttributeConverter;
 import org.apache.shindig.social.core.util.atom.AtomContent;
@@ -51,8 +53,6 @@ import org.apache.shindig.social.opensoc
 import org.apache.shindig.social.opensocial.model.ActivityObject;
 import org.apache.shindig.social.opensocial.model.Address;
 import org.apache.shindig.social.opensocial.model.BodyType;
-import org.apache.shindig.social.opensocial.model.EmbeddedExperience;
-import org.apache.shindig.social.opensocial.model.Extension;
 import org.apache.shindig.social.opensocial.model.ListField;
 import org.apache.shindig.social.opensocial.model.MediaItem;
 import org.apache.shindig.social.opensocial.model.MediaLink;
@@ -175,8 +175,7 @@ public class XStream081Configuration imp
         new ClassFieldMapping("organization", Organization.class),
         new ClassFieldMapping("person", Person.class),
         new ClassFieldMapping("url", Url.class),
-        new ClassFieldMapping("openSocial", Extension.class),
-        new ClassFieldMapping("embed", EmbeddedExperience.class),
+        new ClassFieldMapping("openSocial", ExtendableBean.class),
         // this is an example of a class field mapping with context. If
         // ListField is mapped inside an element named emails, replace the element
         // name
@@ -215,8 +214,7 @@ public class XStream081Configuration imp
         new ClassFieldMapping("organization", Organization.class),
         new ClassFieldMapping("person", Person.class),
         new ClassFieldMapping("url", Url.class),
-        new ClassFieldMapping("openSocial", Extension.class),
-        new ClassFieldMapping("embed", EmbeddedExperience.class),
+        new ClassFieldMapping("openSocial", ExtendableBean.class),
         // this is an example of a class field mapping with context. If
         // ListField is mapped inside an element named emails, replace the element
         // name that would have been defiend as fqcn ListField with email
@@ -245,6 +243,7 @@ public class XStream081Configuration imp
         .put("activity", Activity.class)
         .put("activityEntry", ActivityEntry.class)
         .put("object", ActivityObject.class)
+        .put("openSocial", ExtendableBean.class)
         .put("mediaLink", MediaLink.class)
         .put("account", Account.class)
         .put("address", Address.class)
@@ -256,8 +255,6 @@ public class XStream081Configuration imp
         .put("organization", Organization.class)
         .put("person", Person.class)
         .put("url", Url.class)
-        .put("openSocial", Extension.class)
-        .put("embed", EmbeddedExperience.class)
         .put("listField", ListField.class).build()
     );
 
@@ -297,7 +294,6 @@ public class XStream081Configuration imp
         
         new ImplicitCollectionFieldMapping(ActivityObject.class, "downstreamDuplicates", String.class, "downstreamDuplicate"),
         new ImplicitCollectionFieldMapping(ActivityObject.class, "upstreamDuplicates", String.class, "upstreamDuplicate"),
-        //new ImplicitCollectionFieldMapping(ActivityObject.class, "attachments", ActivityObject.class, "attachment"),
 
         new ImplicitCollectionFieldMapping(Activity.class, "mediaItems", MediaItem.class, "mediaItems"))
     );
@@ -357,6 +353,7 @@ public class XStream081Configuration imp
     xstream.registerConverter(new ISO8601SqlTimestampConverter());
     xstream.registerConverter(new GuiceBeanConverter(fmapper, injector));
     xstream.registerConverter(new AtomAttributeConverter());
+    xstream.registerConverter(new ExtendableBeanConverter(), XStream.PRIORITY_VERY_HIGH);
     xstream.setMode(XStream.NO_REFERENCES);
 
     amapper.addAttributeFor(AtomAttribute.class);

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java Tue Jun 14 17:19:08 2011
@@ -19,6 +19,7 @@
 package org.apache.shindig.social.opensocial.model;
 
 import org.apache.shindig.protocol.model.Exportablebean;
+import org.apache.shindig.protocol.model.ExtendableBean;
 import org.apache.shindig.social.core.model.ActivityEntryImpl;
 
 import com.google.inject.ImplementedBy;
@@ -29,7 +30,7 @@ import com.google.inject.ImplementedBy;
  */
 @ImplementedBy(ActivityEntryImpl.class)
 @Exportablebean
-public interface ActivityEntry extends Comparable<ActivityEntry> {
+public interface ActivityEntry extends Comparable<ActivityEntry>, ExtendableBean {
   
   /**
    * Fields that represent the JSON elements.
@@ -257,14 +258,28 @@ public interface ActivityEntry extends C
   /**
    * <p>getOpenSocial</p>
    * 
-   * @return a {@link org.apache.shindig.social.opensocial.model.Extension} object
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
    */
-  Extension getOpenSocial();
+  ExtendableBean getOpenSocial();
   
   /**
    * <p>setOpenSocial</p>
    * 
-   * @return a {@link org.apache.shindig.social.opensocial.model.Extension} object
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
    */
-  void setOpenSocial(Extension opensocial);
+  void setOpenSocial(ExtendableBean opensocial);
+  
+  /**
+   * <p>getExtensions</p>
+   * 
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
+   */
+  ExtendableBean getExtensions();
+  
+  /**
+   * <p>setOpenSocial</p>
+   * 
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
+   */
+  void setExtensions(ExtendableBean extensions);
 }

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java Tue Jun 14 17:19:08 2011
@@ -21,6 +21,7 @@ package org.apache.shindig.social.openso
 import java.util.List;
 
 import org.apache.shindig.protocol.model.Exportablebean;
+import org.apache.shindig.protocol.model.ExtendableBean;
 import org.apache.shindig.social.core.model.ActivityObjectImpl;
 
 import com.google.inject.ImplementedBy;
@@ -34,7 +35,7 @@ import com.google.inject.ImplementedBy;
  */
 @ImplementedBy(ActivityObjectImpl.class)
 @Exportablebean
-public interface ActivityObject {
+public interface ActivityObject extends ExtendableBean {
   
   /**
    * Fields that represent the JSON elements.
@@ -53,7 +54,8 @@ public interface ActivityObject {
     SUMMARY("summary"),
     UPDATED("updated"),
     UPSTREAM_DUPLICATES("upstreamDuplicates"),
-    URL("url");
+    URL("url"),
+    OPENSOCIAL("openSocial");
     
     // The name of the JSON element
     private final String jsonString;
@@ -258,4 +260,18 @@ public interface ActivityObject {
    * @param url a {@link java.lang.String} object.
    */
   void setUrl(String url);
+  
+  /**
+   * <p>getOpenSocial</p>
+   * 
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
+   */
+  ExtendableBean getOpenSocial();
+  
+  /**
+   * <p>setOpenSocial</p>
+   * 
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
+   */
+  void setOpenSocial(ExtendableBean opensocial);
 }

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MediaLink.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MediaLink.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MediaLink.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/MediaLink.java Tue Jun 14 17:19:08 2011
@@ -18,6 +18,7 @@
 package org.apache.shindig.social.opensocial.model;
 
 import org.apache.shindig.protocol.model.Exportablebean;
+import org.apache.shindig.protocol.model.ExtendableBean;
 import org.apache.shindig.social.core.model.MediaLinkImpl;
 
 import com.google.inject.ImplementedBy;
@@ -27,7 +28,7 @@ import com.google.inject.ImplementedBy;
  */
 @ImplementedBy(MediaLinkImpl.class)
 @Exportablebean
-public interface MediaLink {
+public interface MediaLink extends ExtendableBean {
 
   /**
    * Fields that represent the JSON elements.
@@ -36,7 +37,8 @@ public interface MediaLink {
     DURATION("duration"),
     HEIGHT("height"),
     URL("url"),
-    WIDTH("width");
+    WIDTH("width"),
+    OPENSOCIAL("openSocial");
     
     // The name of the JSON element
     private final String jsonString;
@@ -115,4 +117,18 @@ public interface MediaLink {
    * @param width is the target's width
    */
   void setWidth(Integer width);
+  
+  /**
+   * <p>getOpenSocial</p>
+   * 
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
+   */
+  ExtendableBean getOpenSocial();
+  
+  /**
+   * <p>setOpenSocial</p>
+   * 
+   * @return a {@link org.apache.shindig.protocol.model.ExtendableBean} object
+   */
+  void setOpenSocial(ExtendableBean opensocial);
 }

Modified: shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java?rev=1135710&r1=1135709&r2=1135710&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java (original)
+++ shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java Tue Jun 14 17:19:08 2011
@@ -83,7 +83,7 @@ public class RestfulJsonActivityEntryTes
   
   @Test
   public void testCreateActivityEntryJson() throws Exception {
-    String expected = TestUtils.loadTestFixture(FIXTURE_LOC + "ActivityEntryJsonCreated.json");;
+    String expected = TestUtils.loadTestFixture(FIXTURE_LOC + "ActivityEntryJsonCreated.json");
     
     // Create activity
     String postData = "{id: 'activityCreated', title : 'Super Created Activity', actor: {id: 'john.doe'}, object : {id: 'objectCreated'}}";
@@ -96,6 +96,20 @@ public class RestfulJsonActivityEntryTes
   }
   
   @Test
+  public void testActivityEntryExtensionJson() throws Exception {
+    String expected = TestUtils.loadTestFixture(FIXTURE_LOC + "ActivityEntryJsonExtension.json");
+
+    // Create activity with extensions
+    String postData = "{extension1: 'extension1Value', id: 'activityCreated', title : 'Super Created Activity', actor: {id: 'john.doe', extension2: 'extension2Value'}, object : {extension3: [{ext1: 'ext1Value'}], id: 'objectCreated'}}";
+    String postResp = getResponse("/activitystreams/john.doe/@self/1", "POST", postData, null, ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
+    assertTrue(TestUtils.jsonsEqual(expected, postResp));
+
+    // Retrieve created activity & test
+    String getResp = getResponse("/activitystreams/john.doe/@self/1/activityCreated", "GET", null, ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
+    assertTrue(TestUtils.jsonsEqual(expected, getResp));
+  }
+  
+  @Test
   public void testGetActivityEntrySupportedFields() throws Exception {
     String resp = getResponse("/activitystreams/@supportedFields", "GET", null, ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
     String expected = TestUtils.loadTestFixture(FIXTURE_LOC + "ActivityStreamsSupportedFields.json");;

Added: shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/fixtures/ActivityEntryJsonExtension.json
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/fixtures/ActivityEntryJsonExtension.json?rev=1135710&view=auto
==============================================================================
--- shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/fixtures/ActivityEntryJsonExtension.json (added)
+++ shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/fixtures/ActivityEntryJsonExtension.json Tue Jun 14 17:19:08 2011
@@ -0,0 +1,19 @@
+{
+   "entry": {
+	  id: "activityCreated",
+	  title: "Super Created Activity",
+	  extension1: "extension1Value",
+	  object: {
+	    extension3: [
+	      {
+	        ext1: "ext1Value"
+	      }
+	    ],
+	    id: "objectCreated"
+	  },
+	  actor: {
+	    id: "john.doe",
+	    extension2: "extension2Value"
+	  }
+   }
+}
\ No newline at end of file