You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2011/12/01 23:56:34 UTC

svn commit: r1209294 - in /abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model: ASBase.java ASObject.java MediaLink.java objects/BookmarkObject.java objects/FileObject.java objects/TaskObject.java

Author: jmsnell
Date: Thu Dec  1 22:56:29 2011
New Revision: 1209294

URL: http://svn.apache.org/viewvc?rev=1209294&view=rev
Log:
The activity streams implementation includes a number of non-standard experimental features... to differentiate these from the core standard features, this checkin creates a new experimental mode on the Builders that must be set prior to building Activity objects that use the experimental features.

Modified:
    abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java
    abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASObject.java
    abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/MediaLink.java
    abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/BookmarkObject.java
    abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java
    abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/TaskObject.java

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java?rev=1209294&r1=1209293&r2=1209294&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java Thu Dec  1 22:56:29 2011
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
+import java.util.logging.Logger;
 
 import org.apache.abdera2.activities.extra.Difference;
 import org.apache.abdera2.activities.extra.Extra;
@@ -45,7 +46,9 @@ import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 
 import static com.google.common.collect.Maps.filterEntries;
@@ -58,6 +61,8 @@ import static com.google.common.collect.
 public class ASBase 
   implements Iterable<String>, Cloneable {
   
+  public static Logger log = Logger.getLogger(ASBase.class.getName());
+  
   public static ASBuilder make() {
     return new ASBuilder();
   }
@@ -97,6 +102,9 @@ public class ASBase 
       ImmutableMap.builder();
     private final Function<Object[],X> con;
     private final Function<Object[],M> bld;
+    private boolean experimental = false; // true if experimental extensions have been enabled on this builder
+    private ImmutableMultimap.Builder<String, IRI> links = ImmutableMultimap.builder();
+    private boolean y = false;
     
     protected Builder(Class<X> _class, Class<M> _builder) {
       con = createInstance(_class, Map.class);
@@ -108,7 +116,28 @@ public class ASBase 
       this.map.putAll(map);
     }
     
-    public Object val(Object val) {
+    /**
+     * Enables experimental features on the builder. Abdera supports a number
+     * of non-standard, experimental features such as object reactions, $rel
+     * links and metadata conventions that are not a part of the core Activity
+     * Streams specification. In order to use the builder to work with these
+     * extensions, you must first call the experimental() method on the builder
+     * to enable them. 
+     */
+    public M experimental() {
+      log.warning(
+        String.format(
+          "Non-standard, experimental features have been enabled in a builder instance. [%s]", 
+          getClass().getSimpleName()));
+      this.experimental = true;
+      return (M)this;
+    }
+    
+    protected boolean isExperimentalEnabled() {
+      return experimental;
+    }
+    
+    protected Object val(Object val) {
       if (val == null) return null;
       else if (val instanceof Supplier)
         return val(((Supplier<?>)val).get());
@@ -182,7 +211,58 @@ public class ASBase 
       set("@base",iri);
       return (M)this;
     }
-    protected void preGet() {}
+    /**
+     * Add a new $rel style link field to the object. This is an
+     * experimental feature. You must call experimental() before
+     * calling this method
+     */
+    public M link(String rel, IRI url) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
+      y = true;
+      links.put(rel, url);
+      return (M)this;
+    }
+
+    /**
+     * Add a new $rel style link field to the object. This is an
+     * experimental feature. You must call experimental() before
+     * calling this method
+     */
+    public M link(String rel, String url) {
+      return link(rel, new IRI(checkNotNull(url)));
+    }
+    /**
+     * Add a new metadata field to the object. This is an 
+     * experimental feature. You must call experimental() before
+     * calling this method
+     */
+    public M meta(String token, Object val) {
+      return meta(token,val,false);
+    }
+    /**
+     * Add a new metadata field to the object. This is an 
+     * experimental feature. You must call experimental() before
+     * calling this method
+     */
+    public M meta(String token, Object val, boolean isPrivate) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
+      set(String.format("%s%s",isPrivate?"_":"@",token),val);
+      return (M)this;
+    }
+    protected void preGet() {
+      if (y && isExperimentalEnabled()) {
+        ImmutableMultimap<String,IRI> map = links.build();
+        for (String key : map.keySet()) {
+          Iterable<IRI> links = map.get(key);
+          if (links == null) continue;
+          int s = Iterables.size(links);
+          set(String.format("$%s",key.toLowerCase()),
+            s == 1 ? 
+              links.iterator().next() : 
+              links.iterator());
+        }
+      }
+    }
     public X get() {
       preGet();
       return con.apply(array(map.build()));
@@ -210,11 +290,13 @@ public class ASBase 
   }
   
   public Lang getLang() {
-    return getProperty("@language");
+    Object lang = getProperty("@language");
+    return lang instanceof Lang ? (Lang)lang : new Lang(lang.toString());
   }
   
   public IRI getBase() {
-    return getProperty("@base");
+    Object base = getProperty("@base");
+    return base instanceof IRI ? (IRI)base : new IRI(base.toString());
   }
   
   public <T>T getProperty(String name) {

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASObject.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASObject.java?rev=1209294&r1=1209293&r2=1209294&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASObject.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASObject.java Thu Dec  1 22:56:29 2011
@@ -35,6 +35,8 @@ import org.apache.abdera2.common.selecto
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableSet;
 
+import static com.google.common.base.Preconditions.*;
+
 /**
  * Base class for all Activity Streams Objects.
  */
@@ -107,32 +109,57 @@ public class ASObject extends ASBase {
       super(map,_class,_builder);
     }
     
+    /**
+     * Add a new reaction to the object. You must call experimental() before
+     * calling this method.
+     */
     public M reaction(Supplier<? extends TaskObject> object) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
       return reaction(object.get());
     }
     
+    /**
+     * Add a new reaction to the object. You must call experimental() before
+     * calling this method.
+     */
     public M reaction(TaskObject object) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
       if (object == null) return (M)this;
       z = true;
       tasks.add(object);
       return (M)this;
     }
     
+    /**
+     * Add a new reaction to the object. You must call experimental() before
+     * calling this method.
+     */
     public M reaction(Supplier<? extends TaskObject>... objects) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
       if (objects == null) return (M)this;
       for (Supplier<? extends TaskObject> object : objects)
         reaction(object.get());
       return (M)this;
     }
     
+    /**
+     * Add a new reaction to the object. You must call experimental() before
+     * calling this method.
+     */
     public M reaction(TaskObject... objects) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
       if (objects == null) return (M)this;
       for (TaskObject obj : objects)
         reaction(obj);
       return (M)this;
     }
     
+    /**
+     * Add a new reaction to the object. You must call experimental() before
+     * calling this method.
+     */
     public M reaction(Iterable<? extends TaskObject> objects) {
+      checkState(isExperimentalEnabled(),"Experimental features not yet enabled. Call experimental() first.");
       if (objects == null) return (M)this;
       for (TaskObject obj : objects)
         reaction(obj);
@@ -325,6 +352,11 @@ public class ASObject extends ASBase {
       return (M)this;
     }
     
+    public M id(IRI id) {
+      set(ID,checkNotNull(id).toString());
+      return (M)this;
+    }
+    
     public M image(Supplier<MediaLink> object) {
       return image(object.get());
     }
@@ -396,6 +428,10 @@ public class ASObject extends ASBase {
     
     public M url(IRI url) {
       set(URL,url);
+      try {
+        if (isExperimentalEnabled())
+          link("alternate",url);
+      } catch (IllegalStateException t) {}
       return (M)this;
     }
     

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/MediaLink.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/MediaLink.java?rev=1209294&r1=1209293&r2=1209294&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/MediaLink.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/MediaLink.java Thu Dec  1 22:56:29 2011
@@ -97,6 +97,10 @@ public final class MediaLink extends ASB
     
     public Builder url(IRI iri) {
       set(URL,iri);
+      try {
+        if (isExperimentalEnabled())
+          link("alternate",iri);
+      } catch (IllegalStateException e) {}
       return this;
     }
     

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/BookmarkObject.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/BookmarkObject.java?rev=1209294&r1=1209293&r2=1209294&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/BookmarkObject.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/BookmarkObject.java Thu Dec  1 22:56:29 2011
@@ -83,6 +83,10 @@ public class BookmarkObject 
     }
     public M targetUrl(IRI uri) {
       set(TARGETURL,uri);
+      try {
+        if (isExperimentalEnabled())
+          link("bookmark",uri);
+      } catch (IllegalStateException e) {}
       return (M)this;
     }    
   }

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java?rev=1209294&r1=1209293&r2=1209294&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java Thu Dec  1 22:56:29 2011
@@ -123,6 +123,10 @@ public class FileObject 
     }
     public M fileUrl(IRI iri) {
       set(FILEURL,iri);
+      try {
+        if (isExperimentalEnabled())
+          link("enclosure",iri);
+      } catch (IllegalStateException e) {}
       return (M)this;
     }
     public M fileUrl(String uri) {

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/TaskObject.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/TaskObject.java?rev=1209294&r1=1209293&r2=1209294&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/TaskObject.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/TaskObject.java Thu Dec  1 22:56:29 2011
@@ -91,12 +91,15 @@ public class TaskObject extends ASObject
     
     public Builder(Class<X>_class,Class<M>_builder) {
       super(_class,_builder);
+      experimental();
     }
     public Builder(String objectType,Class<X>_class,Class<M>_builder) {
       super(objectType,_class,_builder);
+      experimental();
     }
     public Builder(Map<String,Object> map,Class<X>_class,Class<M>_builder) {
       super(map,_class,_builder);
+      experimental();
     }
     public M object(Supplier<? extends ASObject> object) {
       return object(object.get());
@@ -134,6 +137,7 @@ public class TaskObject extends ASObject
     }
     public M selfLink(IRI iri) {
       set("selfLink", iri);
+      link("self",iri);
       return (M)this;
     }
     public M selfLink(String iri) {
@@ -145,6 +149,7 @@ public class TaskObject extends ASObject
     }
     public M resourceLink(IRI iri) {
       set("resourceLink",iri);
+      link("alternate",iri);
       return (M)this;
     }
     public M resourceLink(String iri) {