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/11/10 22:48:48 UTC

svn commit: r1200583 [5/5] - in /abdera/abdera2: activities/src/main/java/org/apache/abdera2/activities/client/ activities/src/main/java/org/apache/abdera2/activities/extra/ activities/src/main/java/org/apache/abdera2/activities/io/gson/ activities/src...

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/VideoObject.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/VideoObject.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/VideoObject.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/VideoObject.java Thu Nov 10 21:48:45 2011
@@ -17,58 +17,71 @@
  */
 package org.apache.abdera2.activities.model.objects;
 
+import java.util.Map;
+
 import org.apache.abdera2.activities.model.ASObject;
 import org.apache.abdera2.activities.model.MediaLink;
 import org.apache.abdera2.common.anno.Name;
-@Name("video")
+
 public class VideoObject 
   extends ASObject {
-
-  private static final long serialVersionUID = 5394642824444623984L;
+ 
   public static final String EMBEDCODE = "embedCode";
   public static final String STREAM = "stream";
-  
-  public VideoObject() {}
-  
-  public VideoObject(String displayName) {
-    setDisplayName(displayName);
+
+  public static VideoBuilder makeVideo() {
+    return new VideoBuilder("video");
   }
   
-  public String getEmbedCode() {
-    return getProperty(EMBEDCODE);
+  @Name("video")
+  public static final class VideoBuilder extends Builder<VideoObject,VideoBuilder> {
+    public VideoBuilder() {
+      super(VideoObject.class,VideoBuilder.class);
+    }
+    public VideoBuilder(Map<String, Object> map) {
+      super(map, VideoObject.class,VideoBuilder.class);
+    }
+    public VideoBuilder(String objectType) {
+      super(objectType,VideoObject.class,VideoBuilder.class);
+    }
   }
   
-  public void setEmbedCode(String embedCode) {
-    setProperty(EMBEDCODE, embedCode);
+  @SuppressWarnings("unchecked")
+  public static abstract class Builder<X extends VideoObject,M extends Builder<X,M>>
+    extends ASObject.Builder<X,M> {
+    protected Builder(Class<X> _class,Class<M> _builder) { 
+      super(_class,_builder);
+    }
+    protected Builder(String objectType,Class<X> _class,Class<M> _builder) {
+      super(objectType,_class,_builder);
+    }
+    protected Builder(Map<String,Object> map,Class<X> _class,Class<M> _builder) {
+      super(map,_class,_builder);
+    }
+    public M embedCode(String code) {
+      set(EMBEDCODE,code);
+      return (M)this;
+    }
+    public M stream(MediaLink stream) {
+      set(STREAM,stream);
+      return (M)this;
+    }
   }
   
-  public MediaLink getStream() {
-    return getProperty(STREAM);
+  public VideoObject(Map<String,Object> map) {
+    super(map,VideoBuilder.class,VideoObject.class);
   }
   
-  public void setStream(MediaLink stream) {
-    setProperty(STREAM, stream);
+  public <X extends VideoObject, M extends Builder<X,M>>VideoObject(Map<String,Object> map, Class<M> _class, Class<X>_obj) {
+    super(map,_class,_obj);
   }
   
-  public static <T extends VideoObject>VideoObjectGenerator<T> makeVideo() {
-    return new VideoObjectGenerator<T>();
+  public String getEmbedCode() {
+    return getProperty(EMBEDCODE);
   }
   
-  @SuppressWarnings("unchecked")
-  public static class VideoObjectGenerator<T extends VideoObject> extends ASObjectGenerator<T> {
-    public VideoObjectGenerator() {
-      super((Class<? extends T>) VideoObject.class);
-    }
-    public VideoObjectGenerator(Class<T> _class) {
-      super(_class);
-    }
-    public <X extends VideoObjectGenerator<T>>X embedCode(String code) {
-      item.setEmbedCode(code);
-      return (X)this;
-    }
-    public <X extends VideoObjectGenerator<T>>X stream(MediaLink stream) {
-      item.setStream(stream);
-      return (X)this;
-    }
+  public MediaLink getStream() {
+    return getProperty(STREAM);
   }
+  
 }

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesCollectionAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesCollectionAdapter.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesCollectionAdapter.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesCollectionAdapter.java Thu Nov 10 21:48:45 2011
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import org.apache.abdera2.activities.model.ASBase;
 import org.apache.abdera2.activities.model.ASObject;
 import org.apache.abdera2.activities.model.Collection;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
 import org.apache.abdera2.activities.model.objects.PersonObject;
 import org.apache.abdera2.activities.model.objects.ServiceObject;
 import org.apache.abdera2.common.misc.ExceptionHelper;
@@ -51,32 +52,32 @@ public abstract class AbstractActivities
     return Arrays.asList("application/json");
   }
   
-  protected ResponseContext buildCreateEntryResponse(
+  protected <T extends ASBase>ResponseContext buildCreateEntryResponse(
     String link, 
-    ASBase base) {
+    ASBase.Builder<T,?> builder) {
     return
-      new ActivitiesResponseContext<ASBase>(base)
+      new ActivitiesResponseContext<T>(builder)
         .setLocation(link)
         .setContentLocation(link)
-        .setEntityTag(calculateEntityTag(base))
+        .setEntityTag(calculateEntityTag(builder.get()))
         .setStatus(201);
   }
 
-  protected ResponseContext buildGetEntryResponse(
+  protected <T extends ASObject>ResponseContext buildGetEntryResponse(
     RequestContext request, 
-    ASObject base)
+    ASObject.Builder<T,?> builder)
       throws ResponseContextException {
-      base.setSource(createSourceObject(request));
+      builder.source(createSourceObject(request));
       return 
-        new ActivitiesResponseContext<ASObject>(base)
-         .setEntityTag(calculateEntityTag(base));
+        new ActivitiesResponseContext<T>(builder)
+         .setEntityTag(calculateEntityTag(builder.get()));
   }
 
-  protected ResponseContext buildGetFeedResponse(
-    Collection<ASObject> collection) {
+  protected <T extends ASObject>ResponseContext buildGetFeedResponse(
+    CollectionBuilder<T> builder) {
       return 
-        new ActivitiesResponseContext<Collection<ASObject>>(collection)
-          .setEntityTag(calculateEntityTag(collection));
+        new ActivitiesResponseContext<Collection<T>>(builder)
+          .setEntityTag(calculateEntityTag(builder.get()));
   }
 
   protected ServiceObject createSourceObject(

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesProvider.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesProvider.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesProvider.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesProvider.java Thu Nov 10 21:48:45 2011
@@ -25,11 +25,13 @@ import java.util.Set;
 import javax.activation.MimeType;
 
 import org.apache.abdera2.activities.model.ASBase;
+import org.apache.abdera2.activities.model.ASDocument;
 import org.apache.abdera2.activities.model.ASObject;
 import org.apache.abdera2.activities.model.Activity;
 import org.apache.abdera2.activities.model.Collection;
 import org.apache.abdera2.activities.model.IO;
 import org.apache.abdera2.activities.model.TypeAdapter;
+import org.apache.abdera2.activities.model.objects.ErrorObject;
 import org.apache.abdera2.common.date.DateTimes;
 import org.apache.abdera2.common.http.EntityTag;
 import org.apache.abdera2.common.misc.ExceptionHelper;
@@ -87,8 +89,7 @@ public abstract class AbstractActivities
             ErrorObject
             .makeError()
             .code(code)
-            .displayName(message)
-            .get())
+            .displayName(message))
         .setStatus(code)
         .setStatusText(message);
   }
@@ -154,28 +155,29 @@ public abstract class AbstractActivities
       } catch (Throwable t) {
         throw ExceptionHelper.propogate(t);
       }
-    if (entity != null) {
-      setDocProperties(entity, context);
-      context.setAttribute(ASBase.class.getName(), entity);
-    }
+    if (entity != null)
+      context.setAttribute(ASBase.class.getName(), getDoc(entity,context));
     return (T)entity;
   }
   
-  private static void setDocProperties(ASBase base, RequestContext context) {
+  private static <T extends ASBase>ASDocument<T> getDoc(T base, RequestContext context) {
+    ASDocument.Builder<T> builder = 
+      ASDocument.make(base);
     String etag = context.getHeader("ETag");
     if (etag != null)
-        base.setEntityTag(etag);
+        builder.entityTag(etag);
     DateTime lm = context.getDateHeader("Last-Modified");
     if (lm != null)
-        base.setLastModified(lm);
+        builder.lastModified(lm);
     MimeType mt = context.getContentType();
     if (mt != null)
-        base.setContentType(mt.toString());
+        builder.contentType(mt.toString());
     String language = context.getContentLanguage();
     if (language != null)
-        base.setLanguage(language);
+        builder.language(language);
     String slug = context.getSlug();
     if (slug != null)
-        base.setSlug(slug);
+        builder.slug(slug);
+    return builder.get();
   }
 }

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesWorkspaceProvider.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesWorkspaceProvider.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesWorkspaceProvider.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/AbstractActivitiesWorkspaceProvider.java Thu Nov 10 21:48:45 2011
@@ -23,6 +23,7 @@ import java.util.Set;
 import javax.activation.MimeType;
 
 import org.apache.abdera2.activities.model.TypeAdapter;
+import org.apache.abdera2.activities.model.objects.ErrorObject;
 import org.apache.abdera2.common.mediatype.MimeTypeHelper;
 import org.apache.abdera2.common.protocol.AbstractWorkspaceProvider;
 import org.apache.abdera2.common.protocol.CollectionRequestProcessor;
@@ -87,8 +88,7 @@ public abstract class AbstractActivities
           ErrorObject
             .makeError()
             .code(code)
-            .displayName(message)
-            .get())
+            .displayName(message))
         .setStatus(code)
         .setStatusText(message);
   }

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java Thu Nov 10 21:48:45 2011
@@ -34,17 +34,15 @@ public class ActivitiesResponseContext<T
   
   private final static Log log = LogFactory.getLog(ActivitiesResponseContext.class);
   
-  private final T base;
+  private final ASBase.Builder<T,?> builder;
   private final boolean chunked;
   
-  public ActivitiesResponseContext(T base) {
-    this(base, true);
+  public ActivitiesResponseContext(ASBase.Builder<T,?> builder) {
+    this(builder, true);
   }
   
-  public ActivitiesResponseContext(T base, boolean chunked) {
-    log.debug(String.format("Entity: %s", base.toString()));
-    log.debug(String.format("Chunked? %s", chunked));
-    this.base = base;
+  public ActivitiesResponseContext(ASBase.Builder<T,?> builder, boolean chunked) {
+    this.builder = builder;
     setStatus(200);
     setStatusText("OK");
     this.chunked = chunked;
@@ -59,24 +57,29 @@ public class ActivitiesResponseContext<T
     log.debug(String.format("Content-Type: %s", getContentType()));
   }
    
+  @SuppressWarnings("unchecked")
+  public <X extends ASBase.Builder<T,?>>X getBuilder() {
+    return (X)builder;
+  }
+  
   public T getEntity() {
-    return base;
+    return builder.get();
   }
 
   public boolean hasEntity() {
-    return (base != null);
+    return (builder != null);
   }
 
   public void writeTo(java.io.Writer javaWriter) throws IOException {
     log.debug("Writing...");
     if (hasEntity())
-      base.writeTo(javaWriter);
+      getEntity().writeTo(javaWriter);
   }
 
   public void writeTo(OutputStream out) throws IOException {
     log.debug("Writing...");
     if (hasEntity())
-      base.writeTo(out);
+      getEntity().writeTo(out);
   }
 
   public MimeType getContentType() {
@@ -88,7 +91,7 @@ public class ActivitiesResponseContext<T
     if (hasEntity() && len == -1 && !chunked) {
         try {
             ByteArrayOutputStream out = new ByteArrayOutputStream();
-            base.writeTo(out);
+            getEntity().writeTo(out);
             len = out.size();
             super.setContentLength(len);
         } catch (Exception e) {

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java Thu Nov 10 21:48:45 2011
@@ -17,6 +17,7 @@
  */
 package org.apache.abdera2.activities.protocol;
 
+import org.apache.abdera2.activities.model.objects.ErrorObject;
 import org.apache.abdera2.common.misc.MoreFunctions;
 
 public class ProtocolException extends RuntimeException {
@@ -31,9 +32,11 @@ public class ProtocolException extends R
 
     public ProtocolException(int code, String message) {
         super(String.format("%d::%s",code,message));
-        this.error = new ErrorObject();
-        error.setDisplayName(message);
-        error.setCode(code);
+        this.error = ErrorObject
+          .makeError()
+            .code(code)
+            .displayName(message)
+          .get();
     }
 
     public ErrorObject getError() {

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java Thu Nov 10 21:48:45 2011
@@ -17,7 +17,6 @@
  */
 package org.apache.abdera2.activities.protocol.basic;
 
-import java.util.LinkedHashSet;
 import java.util.UUID;
 import java.util.logging.Logger;
 
@@ -26,10 +25,10 @@ import javax.activation.MimeType;
 import org.apache.abdera2.activities.model.ASBase;
 import org.apache.abdera2.activities.model.ASObject;
 import org.apache.abdera2.activities.model.Collection;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
+import org.apache.abdera2.activities.model.objects.ErrorObject;
 import org.apache.abdera2.activities.model.objects.PersonObject;
-import org.apache.abdera2.activities.protocol.AbstractActivitiesProvider;
 import org.apache.abdera2.activities.protocol.ActivitiesResponseContext;
-import org.apache.abdera2.activities.protocol.ErrorObject;
 import org.apache.abdera2.activities.protocol.managed.FeedConfiguration;
 import org.apache.abdera2.activities.protocol.managed.ManagedCollectionAdapter;
 import org.apache.abdera2.common.mediatype.MimeTypeHelper;
@@ -80,10 +79,10 @@ public abstract class BasicAdapter exten
         return (String)val;
     }
 
-    protected Collection<ASObject> createCollection() {
-      Collection<ASObject> col = 
+    protected <T extends ASObject>CollectionBuilder<T> createCollection() {
+      return
         Collection
-          .makeCollection()
+          .<T>makeCollection()
           .id(config.getFeedUri())
           .set("title", config.getFeedTitle())
           .set("updated", DateTime.now())
@@ -91,31 +90,27 @@ public abstract class BasicAdapter exten
             PersonObject
               .makePerson()
               .displayName(config.getFeedAuthor())
-              .get())
-          .get();
-      col.setItems(new LinkedHashSet<ASObject>());
-      return col;
+              .get());
     }
     
-    protected void addEditLinkToObject(ASObject object) throws Exception {
-      if (AbstractActivitiesProvider.getEditUriFromEntry(object) == null)
-        object.setProperty("editLink", object.getId());
+    protected <T extends ASObject>void addEditLinkToObject(
+      ASObject.Builder<T,?> builder, 
+      String id) throws Exception {
+        builder.set("editLink", id);
     }
 
-    protected void setObjectIdIfNull(ASObject object) throws Exception {
-      if (object.getId() != null)
-        return;
+    protected <T extends ASObject>void setObjectId(ASObject.Builder<T,?> builder) throws Exception {
       String uuidUri = UUID.randomUUID().toString();
       String[] segments = uuidUri.split(":");
       String entryId = segments[segments.length - 1];
-      object.setId(createEntryIdUri(entryId));
+      builder.id(createEntryIdUri(entryId));
     }
 
     protected String createEntryIdUri(String entryId) throws Exception {
         return config.getFeedUri() + "/" + entryId;
     }
 
-    private void push(RequestContext context, String channel, ASObject object) {
+    private <T extends ASObject>void push(RequestContext context, String channel, ASObject.Builder<T,?> builder) {
       if (context.getAttribute(Scope.CONTAINER, "AbderaChannelManager") != null) {
         ChannelManager cm = (ChannelManager) context.getAttribute(
           Scope.CONTAINER, "AbderaChannelManager");
@@ -123,12 +118,12 @@ public abstract class BasicAdapter exten
           Pusher<ASObject> pusher = 
             cm.getPusher(channel);
           if (pusher != null)
-            pusher.push(object);
+            pusher.push(builder.get());
         }
       }
     }
     
-    private ResponseContext createOrUpdateObject(RequestContext request, boolean createFlag) {
+    ResponseContext createOrUpdateObject(RequestContext request, boolean createFlag) {
       try {
         MimeType mimeType = request.getContentType();
         String contentType = mimeType == null ? null : mimeType.toString();
@@ -143,18 +138,20 @@ public abstract class BasicAdapter exten
             target.getType() == TargetType.TYPE_COLLECTION) {
             // only allow multiposts on collections.. these always create, never update
             Collection<ASObject> coll = (Collection<ASObject>) base;
-            Collection<ASObject> retl = new Collection<ASObject>();
+            CollectionBuilder<ASObject> retl = Collection.makeCollection();
             int c = 0;
             for (ASObject inputEntry : coll.getItems()) {
-              ASObject newEntry = createItem(inputEntry,c++);
+              ASObject.Builder<?,?> newEntry = createItem(inputEntry,c++);
               if (newEntry != null) {
                 push(request,target.getParameter(BasicProvider.PARAM_FEED),newEntry);
-                retl.addItem(newEntry);
+                retl.item(newEntry.get());
               } else {
-                ErrorObject err = new ErrorObject();
-                err.setCode(-100);
-                err.setDisplayName("Error adding object");
-                retl.addItem(err);
+                retl.item(
+                  ErrorObject
+                    .makeError()
+                      .code(-100)
+                      .displayName("Error adding object")
+                    .get());
               }
             }
             return
@@ -165,12 +162,12 @@ public abstract class BasicAdapter exten
             target.getParameter(BasicProvider.PARAM_ENTRY) : 
               null;
           ASObject inputEntry = (ASObject) base;
-          ASObject newEntry = createFlag ? 
+          ASObject.Builder<ASObject,?> newEntry = createFlag ? 
             createItem(inputEntry) : 
             updateItem(entryId, inputEntry);
           if (newEntry != null) {
             push(request,target.getParameter(BasicProvider.PARAM_FEED),newEntry);
-            String loc = newEntry.getProperty("editLink");
+            String loc = newEntry.get().getProperty("editLink");
             return 
               new ActivitiesResponseContext<ASObject>(newEntry)
                 .setStatus(createFlag?201:200)
@@ -223,7 +220,7 @@ public abstract class BasicAdapter exten
           Target target = input.getTarget();
           String entryId = target.getParameter(BasicProvider.PARAM_ENTRY);
           try {
-              ASObject object = getItem(entryId);
+              ASObject.Builder<ASObject,?> object = getItem(entryId);
               if (object != null) {
                 return 
                   new ActivitiesResponseContext<ASObject>(object)
@@ -240,9 +237,8 @@ public abstract class BasicAdapter exten
       return new Function<RequestContext,ResponseContext>() {
         public ResponseContext apply(RequestContext input) {
           try {
-            Collection<ASObject> collection = 
+            CollectionBuilder<ASObject> collection = 
               getCollection();
-
             if (collection != null) { 
               return 
                 new ActivitiesResponseContext<Collection<ASObject>>(collection)
@@ -255,15 +251,15 @@ public abstract class BasicAdapter exten
       };
     }
 
-    public abstract Collection<ASObject> getCollection() throws Exception;
+    public abstract <T extends ASObject>CollectionBuilder<T> getCollection() throws Exception;
 
-    public abstract ASObject getItem(Object objectId) throws Exception;
+    public abstract <T extends ASObject>ASObject.Builder<T,?> getItem(Object objectId) throws Exception;
 
-    public abstract ASObject createItem(ASObject object) throws Exception;
+    public abstract <T extends ASObject>ASObject.Builder<T,?> createItem(ASObject object) throws Exception;
 
-    public abstract ASObject createItem(ASObject object, int c) throws Exception;
+    public abstract <T extends ASObject>ASObject.Builder<T,?> createItem(ASObject object, int c) throws Exception;
     
-    public abstract ASObject updateItem(Object objectId, ASObject object) throws Exception;
+    public abstract <T extends ASObject>ASObject.Builder<T,?> updateItem(Object objectId, ASObject object) throws Exception;
 
     public abstract boolean deleteItem(Object objectId) throws Exception;
 

Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/managed/FeedConfiguration.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/managed/FeedConfiguration.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/managed/FeedConfiguration.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/managed/FeedConfiguration.java Thu Nov 10 21:48:45 2011
@@ -18,7 +18,6 @@
 package org.apache.abdera2.activities.protocol.managed;
 
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
@@ -26,6 +25,7 @@ import org.apache.abdera2.common.protoco
 import org.apache.abdera2.common.protocol.RequestContext;
 
 import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
 
 public class FeedConfiguration extends Configuration implements CollectionInfo {
     public static final String PROP_NAME_ADAPTER_CLASS = "adapterClassName";
@@ -45,16 +45,16 @@ public class FeedConfiguration extends C
 
     public static class Generator implements Supplier<FeedConfiguration> {
 
-      private String feedId;
-      private String subUri;
-      private String adapterClassName;
-      private String feedConfigLocation;
-      private ServerConfiguration serverConfiguration;
-      private String feedTitle = "unknown";
-      private String feedAuthor = "unknown";
-      private final Map<Object, Object> optionalProperties = 
-        new HashMap<Object,Object>();
-      private CollectionAdapterConfiguration adapterConfiguration;      
+      String feedId;
+      String subUri;
+      String adapterClassName;
+      String feedConfigLocation;
+      ServerConfiguration serverConfiguration;
+      String feedTitle = "unknown";
+      String feedAuthor = "unknown";
+      final ImmutableMap.Builder<Object,Object> optionalProperties =
+        ImmutableMap.builder();
+      CollectionAdapterConfiguration adapterConfiguration;      
       
       public Generator id(String id) {
         this.feedId = id;
@@ -123,8 +123,7 @@ public class FeedConfiguration extends C
     private final ServerConfiguration serverConfiguration;
     private final String feedTitle;
     private final String feedAuthor;
-    private final Map<Object, Object> optionalProperties = 
-      new HashMap<Object,Object>();
+    private final ImmutableMap<Object, Object> optionalProperties;
     private final CollectionAdapterConfiguration adapterConfiguration;
 
     protected FeedConfiguration(Generator gen) {
@@ -135,7 +134,7 @@ public class FeedConfiguration extends C
       this.serverConfiguration = gen.serverConfiguration;
       this.feedTitle = gen.feedTitle;
       this.feedAuthor = gen.feedAuthor;
-      this.optionalProperties.putAll(gen.optionalProperties);
+      this.optionalProperties = gen.optionalProperties.build();
       this.adapterConfiguration = gen.adapterConfiguration;
     }
 
@@ -210,7 +209,7 @@ public class FeedConfiguration extends C
         String[] arr = null;
         if (accepts == null || !(accepts instanceof String))
             arr = new String[] {"application/json"};
-        arr = ((String)accepts).split("\\s*,\\s*");
+        else arr = ((String)accepts).split("\\s*,\\s*");
         return Arrays.<String>asList(arr);
     }
 

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java Thu Nov 10 21:48:45 2011
@@ -31,6 +31,10 @@ public final class IsoPosition 
     return new IsoPosition(coordinate.getLatitude(),coordinate.getLongitude());
   }
   
+  public static IsoPosition at(double latitude, double longitude) {
+    return new IsoPosition(latitude,longitude);
+  }
+  
   public static IsoPosition at(Point point) {
     return new IsoPosition(
       point.getCoordinate().getLatitude(),

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java Thu Nov 10 21:48:45 2011
@@ -1,5 +1,6 @@
 package org.apache.abdera2.common.misc;
 
+import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedHashSet;
@@ -111,7 +112,9 @@ public class MoreFunctions {
       public T apply(Object[] input) {
         try {
           if (input != null) {
-            return _class.getConstructor(args).newInstance(input);
+            Constructor<T> c = _class.getConstructor(args);
+            c.setAccessible(true);
+            return c.newInstance(input);
           } else {
             return _class.newInstance();
           }

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/Activities.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/Activities.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/Activities.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/Activities.java Thu Nov 10 21:48:45 2011
@@ -26,6 +26,9 @@ public class Activities {
     // coming from.
     //
     // this activity basically says: "James is following John"
+    //
+    // All Activity objects are immutable and thread-safe
+    // once created
     Activity activity = 
       makeActivity()
         .actor(

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtendingBaseObjectExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtendingBaseObjectExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtendingBaseObjectExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtendingBaseObjectExample.java Thu Nov 10 21:48:45 2011
@@ -1,8 +1,10 @@
 package org.apache.abdera2.examples.activities;
 
+import org.apache.abdera2.activities.model.Collection;
 import org.apache.abdera2.activities.model.IO;
 import org.apache.abdera2.activities.model.objects.EventObject;
 import org.apache.abdera2.activities.model.objects.AdditionalEventProperties;
+import org.apache.abdera2.activities.model.objects.EventObject.EventBuilder;
 import org.apache.abdera2.activities.model.objects.PersonObject;
 
 /**
@@ -16,17 +18,23 @@ public class ExtendingBaseObjectExample 
 
   public static void main(String... args) throws Exception {
     IO io = IO.get();
-    EventObject event = new EventObject();
-    event.setObjectType("hangout");
+    EventBuilder builder = 
+      EventObject.makeEvent("hangout");
     // the extend method dynamically attaches a new interface
     // to the object that can be used to specify extension
     // properties in a typesafe manner
-    AdditionalEventProperties ext = 
-      event.extend(
-        AdditionalEventProperties.class);
-    ext.setHost(new PersonObject("james"));
-    event.getAttending(true).addItem(new PersonObject("joe"));
-    io.write(event,System.out,"UTF-8");
+    builder.extend(
+      AdditionalEventProperties.Builder.class)
+       .host(PersonObject.makePerson().displayName("James").get());
+    builder.attending(
+      Collection.makeCollection()
+        .item(
+           PersonObject
+             .makePerson()
+               .displayName("Joe")
+                 .get())
+                   .get());
+    io.write(builder.get(),System.out,"UTF-8");
   }
   
 }

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtensionExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtensionExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtensionExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ExtensionExample.java Thu Nov 10 21:48:45 2011
@@ -16,14 +16,14 @@ public class ExtensionExample {
   public static void main(String... args) throws Exception {
     
     // create the io with our custom type adapter
-    IO io = IO.get(new BarAdapter());
-    
-    // tell the serializer how to handle specific property names
-    io.addPropertyMapping("bar", Bar.class);
-    io.addPropertyMapping("etag", EntityTag.class);
+    IO io = IO.make()
+      .adapter(new BarAdapter())
+      .property("bar", Bar.class)
+      .property("etag", EntityTag.class)
+      .get();
     
     // create a new object with "objectType":"foo"
-    ASObject as = new ASObject("foo");
+    ASObject.Builder<ASObject,?> as = ASObject.makeObject("foo");
     
     // attach the Foo.class interface to the object to set
     // extension properties
@@ -34,18 +34,19 @@ public class ExtensionExample {
     Map<Bar,String> map = new HashMap<Bar,String>();
     map.put(new Bar("z"),"a");
     map.put(new Bar("y"), "b");
-    as.setProperty("map",map);
+    as.set("map",map);
     
     // outputs: foo
-    System.out.println(as.getObjectType());
+    ASObject obj = as.get();
+    System.out.println(obj.getObjectType());
     
     // outputs: {"etag":"W/\"test\"","map":{"y":"b","z":"a"},"bar":"foobarbaz","objectType":"foo"}
-    as.writeTo(io,System.out);
+    obj.writeTo(io,System.out);
     
     // now try reading it
-    StringReader sr = new StringReader(io.write(as));
-    as = io.readObject(sr);
-    foo = as.extend(Foo.class);
+    StringReader sr = new StringReader(io.write(obj));
+    obj = io.readObject(sr);
+    foo = obj.extend(Foo.class);
 
     System.out.println();
     
@@ -55,7 +56,7 @@ public class ExtensionExample {
     System.out.println(foo.getBar().getClass());
     
     // map will deserialize as an asobject...
-    System.out.println(as.getProperty("map").getClass());
+    System.out.println(obj.getProperty("map").getClass());
     
   }
   

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GeneratorStreamingExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GeneratorStreamingExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GeneratorStreamingExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GeneratorStreamingExample.java Thu Nov 10 21:48:45 2011
@@ -5,9 +5,9 @@ import java.io.ByteArrayOutputStream;
 
 import org.apache.abdera2.activities.model.ASBase;
 import org.apache.abdera2.activities.model.Activity;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
 import org.apache.abdera2.activities.model.Collection;
 import org.apache.abdera2.activities.model.CollectionWriter;
-import org.apache.abdera2.activities.model.Generator;
 import org.apache.abdera2.activities.model.IO;
 import org.apache.abdera2.activities.model.Verb;
 
@@ -33,13 +33,14 @@ public class GeneratorStreamingExample {
       io.getCollectionWriter(out, "UTF-8");
     
     // Output the collection header
-    ASBase header = new ASBase();
-    header.setProperty("title", "My Items");
-    header.setProperty("totalItems", 10);
-    writer.writeHeader(header);
+    writer.writeHeader(
+      ASBase.make()
+        .set("title", "My Items")
+        .set("totalItems", 10)
+        .get());
     
     // Prepare the Activity template
-    Generator<Activity> gen = 
+    ActivityBuilder gen = 
       makeActivity()
       .actor(makePerson().get())
       .verb(Verb.POST)
@@ -47,9 +48,7 @@ public class GeneratorStreamingExample {
         makeService()
           .displayName("My Application")
           .get())
-      .displayName("joe")
-      .get()
-      .newGenerator();
+      .displayName("joe");
     
     // we can now use the Generator to produce 
     // new Activities using the one we just 
@@ -64,9 +63,9 @@ public class GeneratorStreamingExample {
     // modified list
     for (int n = 0; n < 10; n++)
       writer.writeObject(  // write out each object as we create it
-        gen.startNew()
+        gen.template()
           .set("title", "A" + n)
-          .complete());
+          .get());
     
     // complete the writer.. very important.. always do this
     // or the json generated by the writer will be malformed

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GooglePlusExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GooglePlusExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GooglePlusExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/GooglePlusExample.java Thu Nov 10 21:48:45 2011
@@ -5,6 +5,7 @@ import org.apache.abdera2.common.anno.Pa
 import org.apache.abdera2.common.anno.URITemplate;
 
 import org.apache.abdera2.activities.client.ActivitiesClient;
+import org.apache.abdera2.activities.model.ASDocument;
 import org.apache.abdera2.activities.model.Activity;
 import org.apache.abdera2.activities.model.Collection;
 import static org.apache.abdera2.common.templates.Template.expandAnnotated;
@@ -24,10 +25,11 @@ public class GooglePlusExample   {
     ActivitiesClient cl = 
       new ActivitiesClient();
     try {
-      Collection<Activity> c = 
+      ASDocument<Collection<Activity>> doc = 
         cl.getCollection(
           expandAnnotated(
             new GooglePlusExample()));
+      Collection<Activity> c = doc.getRoot();
       out.println(c.getProperty("title"));
       int n = 1;
       for (Activity a : c.getItems())

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MiscellaneousExamples.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MiscellaneousExamples.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MiscellaneousExamples.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MiscellaneousExamples.java Thu Nov 10 21:48:45 2011
@@ -3,6 +3,7 @@ package org.apache.abdera2.examples.acti
 import org.apache.abdera2.activities.extra.ASContext;
 import org.apache.abdera2.activities.extra.Extra;
 import org.apache.abdera2.activities.model.Activity;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
 import org.apache.abdera2.activities.model.Collection;
 import org.apache.abdera2.common.templates.Template;
 
@@ -36,18 +37,41 @@ public class MiscellaneousExamples {
     // do not know about each other directly, we can related the two
     // and detect that they are likely duplicates of one another
     
-    Activity a1 = new Activity();
-    a1.setId("foo");
-    a1.addDownstreamDuplicate("baz");
-    
-    Activity a2 = new Activity();
-    a2.setId("bar");
-    a2.addUpstreamDuplicate("baz");
+    Activity a1 = 
+      Activity.makeActivity()
+        .id("foo")
+        .downstreamDuplicate("baz")
+        .get();
+    
+    Activity a2 = 
+      Activity.makeActivity()
+       .id("bar")
+       .upstreamDuplicate("baz")
+       .get();
     
     System.out.println(Extra.IDENTITY_EQUIVALENCE.equivalent(a1, a2)); // false
     System.out.println(Extra.IDENTITY_WITH_DUPLICATES_EQUIVALENCE.equivalent(a1, a2)); // true
     
     
+    // All of the Activity objects are immutable thread-safe instances,
+    // which means editing the data in an object is a bit more difficult 
+    // that just calling a setter...
+    // support we want to add a property to one of the activities
+    // we created above... we can do so by using the activity as a template
+    // for creating a new Activity object
+    
+    Activity a3 = a1.<Activity,ActivityBuilder>template().set("foo", "bar").get();
+    a3.writeTo(System.out);
+    
+    // it's also possible to merge two objects into a forth of the 
+    // same or different type... when merging, properties contained
+    // in the passed in object will replace those contained in the 
+    // original source object. The merge is not deep...
+    
+    Activity a4 = a1.as(Activity.class, a3);
+    a4.writeTo(System.out);
+    
+    
     
     // Working with URI Templates.. the ASContext class
     // provides a URI Template Context implementation
@@ -62,8 +86,9 @@ public class MiscellaneousExamples {
     // the url for the next page.
     
     Collection<Activity> collection = 
-      new Collection<Activity>();
-    collection.setProperty("nextPageToken", "foo");
+      Collection.<Activity>makeCollection()
+        .set("nextPageToken", "foo")
+        .get();
     
     Template template = 
       new Template("http://example.org/stuff{?nextPageToken}");

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MyActivitiesAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MyActivitiesAdapter.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MyActivitiesAdapter.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MyActivitiesAdapter.java Thu Nov 10 21:48:45 2011
@@ -21,13 +21,15 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.Logger;
 
+import org.apache.abdera2.activities.model.ASBase;
 import org.apache.abdera2.activities.model.ASObject;
-import org.apache.abdera2.activities.model.Collection;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
 import org.apache.abdera2.activities.protocol.basic.BasicAdapter;
 import org.apache.abdera2.activities.protocol.managed.FeedConfiguration;
 import org.apache.abdera2.common.protocol.RequestContext;
 import org.apache.abdera2.common.protocol.ResponseContextException;
 
+
 public class MyActivitiesAdapter extends BasicAdapter {
 
     private static final String ERROR_INVALID_ENTRY = "No Such Entry in the Feed";
@@ -58,57 +60,58 @@ public class MyActivitiesAdapter extends
     }
 
     @Override
-    public Collection<ASObject> getCollection() throws Exception {
-        Collection<ASObject> col = createCollection();
-        
+    public CollectionBuilder<ASObject> getCollection() throws Exception {
+        CollectionBuilder<ASObject> col = createCollection();
         for (Item item : entries)
-          col.addItem(item.getValue());
+          col.item(item.getValue());
         return col;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    public ASObject getItem(Object entryId) throws Exception {
+    public ASObject.Builder<ASObject,?> getItem(Object entryId) throws Exception {
       ASObject ret = null;
       for (Item item : entries)
         if (item.getKey().equals(entryId.toString())) {
           ret = item.getValue();
           break;
         }
-      return ret;
+      if (ret == null) return null;
+      return ret.<ASObject,ASObject.Builder>template();
     }
 
     @Override
-    public ASObject createItem(ASObject object) throws Exception {
+    public <T extends ASObject>ASObject.Builder<T,?> createItem(ASObject object) throws Exception {
         return createItem(object,-1);
     }
     
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    public ASObject createItem(ASObject object, int c) throws Exception {
-        setObjectIdIfNull(object);
-        logger.info("assigning id to Object: " + object.getId().toString());
-        String entryId = getObjectIdFromUri(object.getId().toString());
-        if (c != -1) entryId += c;
-        if (object.getUpdated() == null) {
-            object.setUpdatedNow();
-        }
-        addEditLinkToObject(object);
-        storeObject(entryId, object);
-        logger.finest("returning this object from sampleadapter.createItem: " + object.toString());
-        return object;
+    public <T extends ASObject>ASObject.Builder<T,?> createItem(ASObject object, int c) throws Exception {
+      ASObject.Builder<T, ?> builder = object.<ASObject,ASObject.Builder>template(ASBase.withoutFields("editLink","updated"));
+      if (!object.has("id"))
+        setObjectId(builder);
+      logger.info("assigning id to Object: " + object.getId().toString());
+      String entryId = getObjectIdFromUri(object.getId().toString());
+      if (c != -1) entryId += c;
+      builder.updatedNow();
+      addEditLinkToObject(builder,object.getId());
+      storeObject(entryId, object);
+      logger.finest("returning this object from sampleadapter.createItem: " + object.toString());
+      return builder;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    public ASObject updateItem(Object entryId, ASObject object) throws Exception {
+    public <T extends ASObject>ASObject.Builder<T,?> updateItem(Object entryId, ASObject object) throws Exception {
         if (!deleteItem(entryId))
             throw new Exception(ERROR_INVALID_ENTRY);
-        
-        if (object.getUpdated() == null) {
-            object.setUpdatedNow();
-        }
-        addEditLinkToObject(object);
-        storeObject((String)entryId, object);
+        ASObject.Builder<T, ?> builder = object.<ASObject,ASObject.Builder>template(ASBase.withoutFields("editLink","updated"));
+        builder.updatedNow();
+        addEditLinkToObject(builder,object.getId());
+        storeObject((String)entryId, builder.get());
         logger.finest("returning this entry from sampleadapter.updateEntry: " + object.toString());
-        return object;
+        return builder;
     }
 
     @Override

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/PusherExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/PusherExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/PusherExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/PusherExample.java Thu Nov 10 21:48:45 2011
@@ -10,7 +10,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadPoolExecutor;
 
 import org.apache.abdera2.activities.model.Activity;
-import org.apache.abdera2.activities.model.Generator;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
 import org.apache.abdera2.activities.model.Verb;
 import org.apache.abdera2.common.pusher.ChannelManager;
 import org.apache.abdera2.common.pusher.Pusher;
@@ -20,12 +20,10 @@ import org.apache.abdera2.common.pusher.
 
 public class PusherExample {
 
-  private static final Generator<Activity> gen = 
+  private static final ActivityBuilder gen = 
     makeActivity()
     .actor(makePerson().displayName("joe").get())
-    .verb(Verb.POST)
-    .get()
-    .newGenerator();
+    .verb(Verb.POST);
   
   public static void main(String... args) throws Exception {
     
@@ -51,12 +49,12 @@ public class PusherExample {
     Pusher<Activity> pusher = cm.getPusher("foo");
     for (int n = 0; n < 3; n++) 
       pusher.push(
-        gen.startNew()
+        gen.template()
           .set("object",
             makeNote()
               .displayName(format("My note #%d",n+1))
               .get())
-          .complete()
+          .get()
         );
     
     latch.await();

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ReadingListExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ReadingListExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ReadingListExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/ReadingListExample.java Thu Nov 10 21:48:45 2011
@@ -1,8 +1,8 @@
 package org.apache.abdera2.examples.activities;
 
 import org.apache.abdera2.activities.model.Activity;
-import org.apache.abdera2.activities.model.Collection;
-import org.apache.abdera2.activities.model.Generator;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
 import org.apache.abdera2.activities.model.IO;
 
 import static org.apache.abdera2.activities.model.Verb.SAVE;
@@ -28,31 +28,30 @@ public class ReadingListExample {
     // Building an activity stream for a reading list
     IO io = IO.get();
     
-    Generator<Activity> gen = 
+    ActivityBuilder gen = 
       makeActivity()
         .actor(
           makePerson()
             .displayName("James")
-            .get())
-        .get().newGenerator();
+            .get());
 
-    Collection.CollectionGenerator<Activity> builder = 
+    CollectionBuilder<Activity> builder = 
       makeCollection();
     
     // Add a book we want to read
     builder.item(
-      gen.startNew()
+      gen.template()
          .set("verb", SAVE)
          .set("object", 
            makeBook()
              .displayName("The Cat in the Hat")
              .get())
          .set("format", EBOOK())
-         .complete());
+         .get());
     
     // Add a book we just finished
     builder.item(
-      gen.startNew()
+      gen.template()
          .set("verb", CONSUME)
          .set("object", 
            makeBook()
@@ -63,7 +62,7 @@ public class ReadingListExample {
                  .get())
              .get())
          .set("format", HARDCOVER())
-         .complete());
+         .get());
     
     builder.get().writeTo(io,System.out);
     

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/RepliesAndTargetingExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/RepliesAndTargetingExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/RepliesAndTargetingExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/RepliesAndTargetingExample.java Thu Nov 10 21:48:45 2011
@@ -1,8 +1,8 @@
 package org.apache.abdera2.examples.activities;
 
 import org.apache.abdera2.activities.model.Activity;
-import org.apache.abdera2.activities.model.objects.NoteObject;
-import org.apache.abdera2.activities.model.objects.PersonObject;
+import static org.apache.abdera2.activities.model.objects.NoteObject.makeNote;
+import static org.apache.abdera2.activities.model.objects.PersonObject.makePerson;
 import static org.apache.abdera2.activities.model.objects.Objects.FRIENDS;
 import static org.apache.abdera2.activities.model.objects.Objects.NETWORK;
 
@@ -12,13 +12,12 @@ public class RepliesAndTargetingExample 
     
     Activity activity = 
       Activity.makeActivity()
-        .to(new PersonObject("bob"))
-        .cc(FRIENDS("Colleagues"))
-        .bto(new PersonObject("sally"))
-        .bcc(NETWORK())
+        .to(makePerson().displayName("bob").get())
+        .cc(FRIENDS("Colleagues").get())
+        .bto(makePerson().displayName("sally").get())
+        .bcc(NETWORK)
         .inReplyTo(
-          NoteObject
-            .makeNote()
+          makeNote()
             .id("urn:foo:note:1")
           .get())
         .get();

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/VersionControlExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/VersionControlExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/VersionControlExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/VersionControlExample.java Thu Nov 10 21:48:45 2011
@@ -1,8 +1,8 @@
 package org.apache.abdera2.examples.activities;
 
 import org.apache.abdera2.activities.model.Activity;
-import org.apache.abdera2.activities.model.Collection;
-import org.apache.abdera2.activities.model.Generator;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
 import org.apache.abdera2.activities.model.objects.FileObject;
 import org.apache.abdera2.activities.model.objects.VersionObject;
 
@@ -19,16 +19,21 @@ public class VersionControlExample {
 
   public static void main(String... args) throws Exception {
         
-    Generator<Activity> gen = 
+    ActivityBuilder me = 
       makeActivity()
       .actor(
         makePerson()
           .displayName("James")
-          .get())
-      .get()
-      .newGenerator();
+          .get());
     
-    Collection.CollectionGenerator<Activity> builder = 
+    ActivityBuilder boss = 
+      makeActivity()
+      .actor(
+        makePerson()
+          .displayName("The Boss")
+          .get());
+    
+    CollectionBuilder<Activity> builder = 
       makeCollection();
     
     // first, indicate that we created a document
@@ -39,54 +44,52 @@ public class VersionControlExample {
         .get();
     
     builder.item(
-      gen.startNew()
+      me.template()
         .set("object", file)
         .set("verb", POST)
-        .complete());
+        .get());
     
     // second, indicate that a new version was created
     VersionObject version = 
       makeVersion()
         .of(file)
-        .major("2")
+        .major(2)
         .get();
     
     builder.item(
-      gen.startNew() 
+      me.template() 
          .set("object", version)
          .set("verb", POST)
-         .complete());
+         .get());
     
     // whoops, the boss rejected the new version
     builder.item(
-      gen.startNew()
+      boss.template()
          .set("object", version)
          .set("verb", REJECT)
-         .set("actor", makePerson().displayName("The Boss").get())
          .set("summary", "This version is missing something")
-         .complete());
+         .get());
     
     // create a new version to deal with the bosses concerns
     VersionObject old = version;
     version = makeVersion()
       .of(file)
-      .major("3")
+      .major(3)
       .previous(old)
       .get();
     
     builder.item(
-        gen.startNew() 
-           .set("object", version)
-           .set("verb", POST)
-           .complete());
+      me.template() 
+         .set("object", version)
+         .set("verb", POST)
+         .get());
     
     // the boss approves the new version
     builder.item(
-      gen.startNew()
-         .set("object", version)
-         .set("verb", APPROVE)
-         .set("actor", makePerson().displayName("The Boss").get())
-         .complete());
+      boss.template()
+       .set("object", version)
+       .set("verb", APPROVE)
+       .get());
     
     builder.get().writeTo(System.out);
   }

Modified: abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/security/JwtExample.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/security/JwtExample.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/security/JwtExample.java (original)
+++ abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/security/JwtExample.java Thu Nov 10 21:48:45 2011
@@ -22,8 +22,11 @@ public class JwtExample {
     
     KeyPair pair = KeyHelper.generateKeyPair("RSA", 1024);
 
-    Activity activity = new Activity();
-    activity.setVerb(Verb.POST);
+    Activity activity = 
+      Activity
+        .makeActivity()
+          .verb(Verb.POST)
+            .get();
 
     String jwt = Jwt.generate(pair.getPrivate(), activity);
     

Modified: abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/activities/FeedToActivityConverter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/activities/FeedToActivityConverter.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/activities/FeedToActivityConverter.java (original)
+++ abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/activities/FeedToActivityConverter.java Thu Nov 10 21:48:45 2011
@@ -1,15 +1,16 @@
 package org.apache.abdera2.ext.activities;
 
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import javax.xml.namespace.QName;
 
 import org.apache.abdera2.activities.model.ASBase;
 import org.apache.abdera2.activities.model.ASObject;
+import org.apache.abdera2.activities.model.ASObject.ASObjectBuilder;
 import org.apache.abdera2.activities.model.Activity;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
 import org.apache.abdera2.activities.model.Collection;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
 import org.apache.abdera2.activities.model.CollectionWriter;
 import org.apache.abdera2.activities.model.MediaLink;
 import org.apache.abdera2.activities.model.Verb;
@@ -72,24 +73,24 @@ public class FeedToActivityConverter {
   }
 
   protected ASBase header(Feed feed) {
-    Collection<Activity> col = 
-      new Collection<Activity>();
-    col.setId(feed.getId().toString());
-    col.setAuthor(authors(feed.getAuthors()));
-    col.setProperty("contributors", authors(feed.getContributors()));
-    categories(feed.getCategories(), col);
-    col.setProperty("generator", generator(feed.getGenerator()));
-    col.setImage(image(feed.getIcon()));
-    col.setUrl(feed.getAlternateLinkResolvedHref());
-    col.setDisplayName(feed.getTitle());
-    col.setSummary(feed.getSubtitle());
-    col.setUpdated(feed.getUpdated());
-    col.setProperty("nextLink", FeedPagingHelper.getNext(feed));
-    col.setProperty("previousLink", FeedPagingHelper.getPrevious(feed));
-    col.setProperty("firstLink", FeedPagingHelper.getFirst(feed));
-    col.setProperty("lastLink", FeedPagingHelper.getLast(feed));
-    col.setProperty("selfLink", feed.getSelfLinkResolvedHref());
-    return col;
+    CollectionBuilder<Activity> builder = 
+      Collection.<Activity>makeCollection()
+        .id(feed.getId().toString())
+        .author(authors(feed.getAuthors()))
+        .set("contributors", authors(feed.getContributors()));
+    categories(feed.getCategories(), builder);
+    builder.set("generator", generator(feed.getGenerator()))
+      .image(image(feed.getIcon()))
+      .url(feed.getAlternateLinkResolvedHref())
+      .displayName(feed.getTitle())
+      .summary(feed.getSubtitle())
+      .updated(feed.getUpdated())
+      .set("nextLink", FeedPagingHelper.getNext(feed))
+      .set("previousLink", FeedPagingHelper.getPrevious(feed))
+      .set("firstLink", FeedPagingHelper.getFirst(feed))
+      .set("lastLink", FeedPagingHelper.getLast(feed))
+      .set("selfLink", feed.getSelfLinkResolvedHref());
+    return builder.get();
   }
   
   protected Verb verb(Entry entry) {
@@ -105,30 +106,29 @@ public class FeedToActivityConverter {
   }
   
   protected Activity item(Entry entry) {
-    Activity activity = new Activity();
+    ActivityBuilder builder = Activity.makeActivity();
     if (entry.getId() != null)
-      activity.setId(entry.getId().toString());
+      builder.id(entry.getId().toString());
     if (entry.getUpdated() != null)
-      activity.setUpdated(entry.getUpdated());
+      builder.updated(entry.getUpdated());
     if (entry.getPublished() != null)
-      activity.setPublished(entry.getPublished());
-    activity.setUrl(entry.getAlternateLinkResolvedHref());
-    activity.setTitle(entry.getTitle());
-    activity.setSummary(entry.getSummary());
-    categories(entry.getCategories(), activity);
-    activity.setLang(entry.getLanguageTag());
-    activity.setVerb(verb(entry));
+      builder.published(entry.getPublished());
+    builder.url(entry.getAlternateLinkResolvedHref())
+      .title(entry.getTitle())
+      .summary(entry.getSummary());
+    categories(entry.getCategories(), builder);
+    builder.lang(entry.getLanguageTag())
+      .verb(verb(entry));
     List<Person> authors = entry.getAuthorsInherited();
-    activity.setActor(authors(authors));
-    activity.setProperty("contributors", authors(entry.getContributors()));
-    activity.setObject(object(entry));
-    activity.setTarget(target(entry));
+    builder.actor(authors(authors))
+      .set("contributors", authors(entry.getContributors()))
+      .object(object(entry))
+      .target(target(entry));
     List<Link> enclosures = entry.getLinks("enclosure");
-    for (Link link : enclosures) {
-      activity.addAttachment(
+    for (Link link : enclosures)
+      builder.attachment(
         attachment(link));
-    }
-    return activity;
+    return builder.get();
   }
   
   protected String objectType(ExtensibleElement ext) {
@@ -143,29 +143,28 @@ public class FeedToActivityConverter {
   }
   
   protected ASObject object(ExtensibleElement ext) {
-    ASObject obj = new ASObject();
+    ASObjectBuilder builder = ASObject.makeObject(objectType(ext));
     if (ext.has(Constants.ID))
-      obj.setId(ext.getSimpleExtension(Constants.ID));
+      builder.id(ext.getSimpleExtension(Constants.ID));
     if (ext.has(Constants.TITLE)) {
       Text text = ext.getExtension(Constants.TITLE);
-      obj.setDisplayName(text.getValue());
+      builder.displayName(text.getValue());
     }
     if (ext.has(Constants.SUMMARY)) {
       Text text = ext.getExtension(Constants.SUMMARY);
-      obj.setSummary(text.getValue());
+      builder.summary(text.getValue());
     }
-    obj.setObjectType(objectType(ext));
     List<Link> links = ext.getExtensions(
       Constants.LINK, withRel("preview"));
     for (Link link : links) {
       String rel = link.getCanonicalRel();
       if (Link.REL_ALTERNATE.equalsIgnoreCase(rel)) {
-        obj.setUrl(link.getResolvedHref());
+        builder.url(link.getResolvedHref());
       } else if ("preview".equalsIgnoreCase(rel)) {
-        obj.setImage(image(link.getResolvedBaseUri()));
+        builder.image(image(link.getResolvedBaseUri()));
       }
     }
-    return obj;
+    return builder.get();
   }
   
   protected ASObject target(Entry entry) {
@@ -181,73 +180,61 @@ public class FeedToActivityConverter {
   }
   
   protected ASObject attachment(Link link) {
-    ASObject obj = new ASObject();
-    obj.setUrl(link.getResolvedHref());
-    obj.setProperty("mimeType", link.getMimeType());
-    obj.setDisplayName(link.getTitle());
-    obj.setProperty("hreflang", link.getHrefLang());
-    obj.setObjectType("link");
-    return obj;
+    return ASObject.makeObject("link")
+      .url(link.getResolvedHref())
+      .set("mimeType", link.getMimeType())
+      .displayName(link.getTitle())
+      .set("hreflang", link.getHrefLang())
+      .get();
   }
   
   protected MediaLink image(IRI iri) {
-    MediaLink link = null;
-    if (iri != null) {
-      link = new MediaLink();
-      link.setUrl(iri);
-    }
-    return link;
+    return iri == null ? null :
+      MediaLink.makeMediaLink()
+        .url(iri).get();
   }
   
   protected ASObject generator(Generator generator) {
-    ASObject _generator = null;
-    if (generator != null) {
-      _generator = new ServiceObject();
-      _generator.setDisplayName(generator.getText());
-      _generator.setProperty("version", generator.getVersion());
-      _generator.setUrl(generator.getUri());
-    }
-    return _generator;
+    return generator == null ? null :
+      ServiceObject
+        .makeService()
+        .displayName(generator.getText())
+        .set("version",generator.getVersion())
+        .url(generator.getUri())
+        .get();
   }
   
-  protected void categories(List<Category> categories, ASObject obj) {
+  protected void categories(List<Category> categories, ASObject.Builder<?,?> builder) {
     for (Category category : categories)
-      obj.addTag(category(category));
+      builder.tag(category(category));
   }
   
   protected ASObject category(Category category) {
-    ASObject _category = new ASObject("category");
-    _category.setDisplayName(category.getTerm());
-    if (category.getScheme() != null)
-      _category.setProperty("scheme", category.getScheme());
-    return _category;
+    return ASObject.makeObject("category")
+      .displayName(category.getTerm())
+      .set("scheme",category.getScheme()).get();
   }
   
   protected ASObject authors(List<Person> authors) {
     if (authors.size() == 1) {
       return person(authors.get(0));
     } else if (authors.size() > 1) {
-      Collection<PersonObject> _authors = 
-        new Collection<PersonObject>();
+      CollectionBuilder<PersonObject> _authors = 
+        Collection.<PersonObject>makeCollection();
       for (Person person : authors) {
         PersonObject _person = person(person);
         if (_person != null) 
-          _authors.addItem(_person);
+          _authors.item(_person);
       }
-      return _authors;
+      return _authors.get();
     } else return null;
   }
   
   protected PersonObject person(Person person) {
-    PersonObject _person = new PersonObject();
-    _person.setDisplayName(person.getName());
-    if (person.getUri() != null)
-      _person.setUrl(person.getUri());
-    if (person.getEmail() != null) {
-      Set<String> emails = new HashSet<String>();
-      emails.add(person.getEmail());
-      _person.setEmails(emails);
-    }
-    return _person;
+    return 
+      PersonObject.makePerson()
+       .displayName(person.getName())
+       .url(person.getUri())
+       .email(person.getEmail()).get();
   }
 }

Modified: abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/AsyncBasicTest.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/AsyncBasicTest.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/AsyncBasicTest.java (original)
+++ abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/AsyncBasicTest.java Thu Nov 10 21:48:45 2011
@@ -87,17 +87,15 @@ public class AsyncBasicTest {
           Thread.sleep(20 * 1000);
         } catch (Throwable t) {}
       
-        Activity activity = new Activity();
-        activity.setId("http://localhost:9002/sample/foo");
-        activity.setTitle("test entry");
-        activity.setVerb(Verb.POST);
-        activity.setPublishedNow();
-        PersonObject person = new PersonObject();
-        person.setDisplayName("James");
-        activity.setActor(person);
-        NoteObject note = new NoteObject();
-        note.setContent("Test Content");
-        activity.setObject(note);
+        Activity activity = 
+          Activity.makeActivity()
+           .id("http://localhost:9002/sample/foo")
+           .title("test entry")
+           .verb(Verb.POST)
+           .publishedNow()
+           .actor(PersonObject.makePerson().displayName("James").get())
+           .object(NoteObject.makeNote().content("Test Content").get())
+           .get();
         Session session = client.newSession();
         ActivityEntity ae = new ActivityEntity(activity);
         ClientResponse resp = session.post("http://localhost:9002/sample", ae);

Modified: abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/BasicTest.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/BasicTest.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/BasicTest.java (original)
+++ abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/BasicTest.java Thu Nov 10 21:48:45 2011
@@ -27,6 +27,10 @@ import java.io.IOException;
 import org.apache.abdera2.activities.client.ActivityEntity;
 import org.apache.abdera2.activities.model.ASObject;
 import org.apache.abdera2.activities.model.Activity;
+import org.apache.abdera2.activities.model.Activity.ActivityBuilder;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
+
+import static org.apache.abdera2.activities.model.ASBase.withoutFields;
 import org.apache.abdera2.activities.model.Collection;
 import org.apache.abdera2.activities.model.IO;
 import org.apache.abdera2.activities.model.Verb;
@@ -79,17 +83,15 @@ public class BasicTest {
 
     @Test
     public void testPostEntry() throws IOException {
-        Activity activity = new Activity();
-        activity.setId("http://localhost:9002/sample/foo");
-        activity.setTitle("test entry");
-        activity.setVerb(Verb.POST);
-        activity.setPublishedNow();
-        PersonObject person = new PersonObject();
-        person.setDisplayName("James");
-        activity.setActor(person);
-        NoteObject note = new NoteObject();
-        note.setContent("Test Content");
-        activity.setObject(note);
+      Activity activity = 
+        Activity.makeActivity()
+         .id("http://localhost:9002/sample/foo")
+         .title("test entry")
+         .verb(Verb.POST)
+         .publishedNow()
+         .actor(PersonObject.makePerson().displayName("James").get())
+         .object(NoteObject.makeNote().content("Test Content").get())
+         .get();
         Session session = client.newSession();
         ActivityEntity ae = new ActivityEntity(activity);
         ClientResponse resp = session.post("http://localhost:9002/sample", ae);
@@ -122,7 +124,7 @@ public class BasicTest {
         resp.release();
         assertTrue(object instanceof Activity);
         Activity activity = (Activity) object;
-        activity.setTitle("This is the modified title");
+        activity = activity.<Activity,ActivityBuilder>template(withoutFields("title")).get();
         ActivityEntity ae = new ActivityEntity(activity);
         resp = session.put("http://localhost:9002/sample/foo", ae);
         assertEquals(ResponseType.SUCCESSFUL, resp.getType());
@@ -163,23 +165,19 @@ public class BasicTest {
     @SuppressWarnings("unused")
     @Test
     public void testMultiPostEntry() throws IOException {
-        Collection<Activity> collection = new Collection<Activity>();
-        for (int n = 0; n < 10; n++) {
-          Activity activity = new Activity();
-          activity.setId("http://localhost:9002/sample/foo" + n);
-          activity.setTitle("test entry " + n);
-          activity.setVerb(Verb.POST);
-          activity.setPublishedNow();
-          PersonObject person = new PersonObject();
-          person.setDisplayName("James");
-          activity.setActor(person);
-          NoteObject note = new NoteObject();
-          note.setContent("Test Content " + n);
-          activity.setObject(note);
-          collection.addItem(activity);
-        }
+        CollectionBuilder<Activity> builder = Collection.makeCollection();
+        for (int n = 0; n < 10; n++)
+          builder.item(
+            Activity.makeActivity()
+             .id("http://localhost:9002/sample/foo" + n)
+             .title("test entry "+n)
+             .verb(Verb.POST)
+             .publishedNow()
+             .actor(PersonObject.makePerson().displayName("James").get())
+             .object(NoteObject.makeNote().content("Test Content "+n).get())
+             .get());
         Session session = client.newSession();
-        ActivityEntity ae = new ActivityEntity(collection);
+        ActivityEntity ae = new ActivityEntity(builder.get());
         ClientResponse resp = session.post("http://localhost:9002/sample", ae);
         assertNotNull(resp);
         assertEquals(ResponseType.SUCCESSFUL, resp.getType());

Modified: abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/SampleBasicAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/SampleBasicAdapter.java?rev=1200583&r1=1200582&r2=1200583&view=diff
==============================================================================
--- abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/SampleBasicAdapter.java (original)
+++ abdera/abdera2/test/src/main/java/org/apache/abdera2/test/activities/server/SampleBasicAdapter.java Thu Nov 10 21:48:45 2011
@@ -21,8 +21,9 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.Logger;
 
+import org.apache.abdera2.activities.model.ASBase;
 import org.apache.abdera2.activities.model.ASObject;
-import org.apache.abdera2.activities.model.Collection;
+import org.apache.abdera2.activities.model.Collection.CollectionBuilder;
 import org.apache.abdera2.activities.protocol.basic.BasicAdapter;
 import org.apache.abdera2.activities.protocol.managed.FeedConfiguration;
 import org.apache.abdera2.common.protocol.RequestContext;
@@ -58,57 +59,58 @@ public class SampleBasicAdapter extends 
     }
 
     @Override
-    public Collection<ASObject> getCollection() throws Exception {
-        Collection<ASObject> col = createCollection();
-        
+    public CollectionBuilder<ASObject> getCollection() throws Exception {
+        CollectionBuilder<ASObject> col = createCollection();
         for (Item item : entries)
-          col.addItem(item.getValue());
+          col.item(item.getValue());
         return col;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    public ASObject getItem(Object entryId) throws Exception {
+    public ASObject.Builder<ASObject,?> getItem(Object entryId) throws Exception {
       ASObject ret = null;
       for (Item item : entries)
         if (item.getKey().equals(entryId.toString())) {
           ret = item.getValue();
           break;
         }
-      return ret;
+      if (ret == null) return null;
+      return ret.<ASObject,ASObject.Builder>template();
     }
 
     @Override
-    public ASObject createItem(ASObject object) throws Exception {
+    public <T extends ASObject>ASObject.Builder<T,?> createItem(ASObject object) throws Exception {
         return createItem(object,-1);
     }
     
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    public ASObject createItem(ASObject object, int c) throws Exception {
-        setObjectIdIfNull(object);
-        logger.info("assigning id to Object: " + object.getId().toString());
-        String entryId = getObjectIdFromUri(object.getId().toString());
-        if (c != -1) entryId += c;
-        if (object.getUpdated() == null) {
-            object.setUpdatedNow();
-        }
-        addEditLinkToObject(object);
-        storeObject(entryId, object);
-        logger.finest("returning this object from sampleadapter.createItem: " + object.toString());
-        return object;
+    public <T extends ASObject>ASObject.Builder<T,?> createItem(ASObject object, int c) throws Exception {
+      ASObject.Builder<T, ?> builder = object.<ASObject,ASObject.Builder>template(ASBase.withoutFields("editLink","updated"));
+      if (!object.has("id"))
+        setObjectId(builder);
+      logger.info("assigning id to Object: " + object.getId().toString());
+      String entryId = getObjectIdFromUri(object.getId().toString());
+      if (c != -1) entryId += c;
+      builder.updatedNow();
+      addEditLinkToObject(builder,object.getId());
+      storeObject(entryId, object);
+      logger.finest("returning this object from sampleadapter.createItem: " + object.toString());
+      return builder;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    public ASObject updateItem(Object entryId, ASObject object) throws Exception {
+    public <T extends ASObject>ASObject.Builder<T,?> updateItem(Object entryId, ASObject object) throws Exception {
         if (!deleteItem(entryId))
             throw new Exception(ERROR_INVALID_ENTRY);
-        
-        if (object.getUpdated() == null) {
-            object.setUpdatedNow();
-        }
-        addEditLinkToObject(object);
-        storeObject((String)entryId, object);
+        ASObject.Builder<T, ?> builder = object.<ASObject,ASObject.Builder>template(ASBase.withoutFields("editLink","updated"));
+        builder.updatedNow();
+        addEditLinkToObject(builder,object.getId());
+        storeObject((String)entryId, builder.get());
         logger.finest("returning this entry from sampleadapter.updateEntry: " + object.toString());
-        return object;
+        return builder;
     }
 
     @Override