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
