You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streams.apache.org by sb...@apache.org on 2014/11/16 01:56:19 UTC

[01/10] incubator-streams git commit: STREAMS-220 | Rewrote FacebookPostActivitySerializer to guarantee final Activity data shape

Repository: incubator-streams
Updated Branches:
  refs/heads/STREAMS-68,218 8737bdadf -> ce2a794dc


STREAMS-220 | Rewrote FacebookPostActivitySerializer to guarantee final Activity data shape


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/01efddab
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/01efddab
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/01efddab

Branch: refs/heads/STREAMS-68,218
Commit: 01efddab57355035ea480046d10122fa22e60eff
Parents: bfa9466
Author: Robert Douglas <rd...@w2ogroup.com>
Authored: Wed Nov 12 12:29:55 2014 -0600
Committer: Robert Douglas <rd...@w2ogroup.com>
Committed: Wed Nov 12 12:29:55 2014 -0600

----------------------------------------------------------------------
 .../api/FacebookPostActivitySerializer.java     | 243 +------------------
 .../serializer/FacebookActivityUtil.java        | 147 ++++++++++-
 .../facebook/test/FacebookPostSerDeTest.java    |  28 ++-
 3 files changed, 163 insertions(+), 255 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/01efddab/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivitySerializer.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivitySerializer.java b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivitySerializer.java
index aff87eb..2bc0867 100644
--- a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivitySerializer.java
+++ b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivitySerializer.java
@@ -15,37 +15,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.streams.facebook.api;
 
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.streams.data.ActivitySerializer;
 import org.apache.streams.exceptions.ActivitySerializerException;
 import org.apache.streams.facebook.Post;
+import org.apache.streams.facebook.serializer.FacebookActivityUtil;
 import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.pojo.json.*;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 import org.joda.time.format.ISODateTimeFormat;
 
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
-import static org.apache.streams.data.util.ActivityUtil.*;
-
-/**
- * Serializes activity posts
- *   sblackmon: This class needs a rewrite
- */
 public class FacebookPostActivitySerializer implements ActivitySerializer<org.apache.streams.facebook.Post> {
 
     public static final DateTimeFormatter FACEBOOK_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
@@ -70,25 +55,10 @@ public class FacebookPostActivitySerializer implements ActivitySerializer<org.ap
 
     @Override
     public Activity deserialize(Post post) throws ActivitySerializerException {
-
         Activity activity = new Activity();
-        activity.setPublished(post.getCreatedTime());
-        activity.setUpdated(post.getUpdatedTime());
-        addActor(activity, mapper.convertValue(post.getFrom(), ObjectNode.class));
-        setProvider(activity);
-        setObjectType(post.getType(), activity);
-        parseObject(activity, mapper.convertValue(post, ObjectNode.class));
-        fixContentFromSummary(activity);
-        activity.setVerb("post");
-        List<String> links = Lists.newLinkedList();
-        links.add(post.getLink());
-        activity.setLinks(links);
-        ensureExtensions(activity).put("facebook", post);
-        if(post.getLikes() != null) {
-            Map<String, Object> likes = Maps.newHashMap();
-            likes.put("count", post.getLikes().size());
-            ensureExtensions(activity).put("likes", likes);
-        }
+
+        FacebookActivityUtil.updateActivity(post, activity);
+
         return activity;
     }
 
@@ -96,209 +66,4 @@ public class FacebookPostActivitySerializer implements ActivitySerializer<org.ap
     public List<Activity> deserializeAll(List<Post> serializedList) {
         throw new NotImplementedException("Not currently supported by this deserializer");
     }
-
-    private void fixContentFromSummary(Activity activity) {
-        //we MUST have a content field set, so choose the best option
-        if(activity.getContent() == null) {
-            activity.setContent(activity.getAdditionalProperties().containsKey("summary") ?
-                    (String) activity.getAdditionalProperties().get("summary") :
-                    activity.getObject().getSummary());
-        }
-    }
-
-    private void fixObjectId(Activity activity) {
-        //An artifact of schema generation, the default value is {link}
-        if(activity.getObject().getId().equals("{link}")) {
-            activity.getObject().setId(null);
-        }
-    }
-
-    private void setObjectType(String type, Activity activity) {
-        ActivityObject object = new ActivityObject();
-        activity.setObject(object);
-        object.setObjectType(type);
-    }
-
-    private void setProvider(Activity activity) {
-        Provider provider = new Provider();
-        provider.setId("id:provider:"+PROVIDER_NAME);
-        provider.setDisplayName(PROVIDER_NAME);
-        activity.setProvider(provider);
-    }
-
-    private String getObjectType(JsonNode node) {
-        Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
-        ensureMoreFields(fields);
-        Map.Entry<String, JsonNode> field = fields.next();
-        //ensureNoMoreFields(fields);
-        return node.asText();
-    }
-
-    private void parseObject(Activity activity, JsonNode jsonNode) throws ActivitySerializerException {
-        for(Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields(); fields.hasNext();) {
-            Map.Entry<String, JsonNode> field = fields.next();
-            String key = field.getKey();
-            JsonNode value = field.getValue();
-            mapField(activity, key, value);
-        }
-    }
-
-    private void mapField(Activity activity, String name, JsonNode value) throws ActivitySerializerException {
-        if("application".equals(name)) {
-            addGenerator(activity, value);
-        } else if ("caption".equals(name)) {
-            addSummary(activity, value);
-        } else if ("comments".equals(name)) {
-            addAttachments(activity, value);
-        } else if ("description".equals(name)) {
-            addObjectSummary(activity, value);
-        } else if ("from".equals(name)) {
-            addActor(activity, value);
-        } else if ("icon".equals(name)) {
-            addIcon(activity, value);
-        } else if ("id".equals(name)) {
-            addId(activity, value);
-        } else if ("is_hidden".equals(name)) {
-            addObjectHiddenExtension(activity, value);
-        } else if ("like_count".equals(name)) {
-            addLikeExtension(activity, value);
-        } else if ("link".equals(name)) {
-            addObjectLink(activity, value);
-        } else if ("message".equals(name)) {
-            activity.setContent(value.asText());
-        } else if ("name".equals(name)) {
-            addObjectName(activity, value);
-        } else if ("object_id".equals(name)) {
-            addObjectId(activity, value);
-        } else if ("picture".equals(name)) {
-            addObjectImage(activity, value);
-        } else if ("place".equals(name)) {
-            addLocationExtension(activity, value);
-        } else if ("shares".equals(name)) {
-            addRebroadcastExtension(activity, value);
-        } else if ("source".equals(name)) {
-            addObjectLink(activity, value);
-        } else if ("story".equals(name)) {
-            addTitle(activity, value);
-        }
-    }
-
-    private void addSummary(Activity activity, JsonNode value) {
-        activity.setAdditionalProperty("summary", value.asText());
-    }
-
-    private void addTitle(Activity activity, JsonNode value) {
-        activity.setTitle(value.asText());
-    }
-
-    private void addLikeExtension(Activity activity, JsonNode value) {
-        Map<String, Object> extensions = ensureExtensions(activity);
-        Map<String, Object> likes = Maps.newHashMap();
-        likes.put("count", value.asLong());
-        extensions.put(LIKES_EXTENSION, likes);
-    }
-
-    private void addLocationExtension(Activity activity, JsonNode value) {
-        Map<String, Object> extensions = ensureExtensions(activity);
-        if(value.has("location")) {
-            Map<String, Object> location = new HashMap<String, Object>();
-            JsonNode fbLocation = value.get("location");
-            if(fbLocation.has("country")) {
-                location.put(LOCATION_EXTENSION_COUNTRY, fbLocation.get("country"));
-            }
-            if(fbLocation.has("latitude") && fbLocation.has("longitude")) {
-                location.put(LOCATION_EXTENSION_COORDINATES, String.format("%s,%s", fbLocation.get("longitude"), fbLocation.get("latitude")));
-            }
-            extensions.put(LOCATION_EXTENSION, location);
-        }
-    }
-
-    private void addObjectImage(Activity activity, JsonNode value) {
-        Image image = new Image();
-        image.setUrl(value.asText());
-        activity.getObject().setImage(image);
-    }
-
-    private void addObjectId(Activity activity, JsonNode value) {
-        activity.getObject().setId(getObjectId("facebook", activity.getObject().getObjectType(), value.asText()));
-    }
-
-    private void addObjectName(Activity activity, JsonNode value) {
-        activity.getObject().setDisplayName(value.asText());
-    }
-
-    private void addId(Activity activity, JsonNode value) {
-        activity.setId("id:"+PROVIDER_NAME+":"+value.asText());
-    }
-
-    private void addObjectLink(Activity activity, JsonNode value) {
-        activity.getObject().setUrl(value.asText());
-    }
-
-    private void addRebroadcastExtension(Activity activity, JsonNode value) {
-        Map<String, Object> extensions = ensureExtensions(activity);
-        if(value.has("count")) {
-            Map<String, Object> rebroadCast = Maps.newHashMap();
-            rebroadCast.put("count", value.get("count").asLong());
-            rebroadCast.put("perspectival", true);
-            extensions.put(REBROADCAST_EXTENSION, rebroadCast);
-        }
-    }
-
-    private void addObjectHiddenExtension(Activity activity, JsonNode value) {
-        Map<String, Object> extensions = ensureExtensions(activity);
-        extensions.put("hidden", value.asBoolean());
-    }
-
-    private void addIcon(Activity activity, JsonNode value) {
-        Icon icon = new Icon();
-        //Apparently the Icon didn't map from the schema very well
-        icon.setAdditionalProperty("url", value.asText());
-        activity.setIcon(icon);
-    }
-
-    private void addActor(Activity activity, JsonNode value) {
-        Actor actor = new Actor();
-        if(value.has("name")) {
-            actor.setDisplayName(value.get("name").asText());
-        }
-        if(value.has("id")) {
-            actor.setId("id:"+PROVIDER_NAME+":"+value.get("id").asText());
-        }
-        activity.setActor(actor);
-    }
-
-    private void addObjectSummary(Activity activity, JsonNode value) {
-        activity.getObject().setSummary(value.asText());
-    }
-
-    private void addGenerator(Activity activity, JsonNode value) {
-        Generator generator = new Generator();
-        if(value.has("id")) {
-            generator.setId(getObjectId(PROVIDER_NAME, "generator", value.get("id").asText()));
-        }
-        if(value.has("name")) {
-            generator.setDisplayName(value.get("name").asText());
-        }
-        if(value.has("namespace")) {
-            generator.setSummary(value.get("namespace").asText());
-        }
-        activity.setGenerator(generator);
-    }
-
-    private void addAttachments(Activity activity, JsonNode value) {
-        //No direct mapping at this time
-    }
-
-    private static void ensureMoreFields(Iterator<Map.Entry<String, JsonNode>> fields) {
-        if(!fields.hasNext()) {
-            throw new IllegalStateException("Facebook activity must have one and only one root element");
-        }
-    }
-    private static void ensureNoMoreFields(Iterator<Map.Entry<String, JsonNode>> fields) {
-        if(fields.hasNext()) {
-            throw new IllegalStateException("Facebook activity must have one and only one root element");
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/01efddab/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
index 06053b5..af650ba 100644
--- a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
+++ b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
@@ -15,27 +15,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.streams.facebook.serializer;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.streams.exceptions.ActivitySerializerException;
-import org.apache.streams.facebook.Cover;
-import org.apache.streams.facebook.Location;
-import org.apache.streams.facebook.Page;
-import org.apache.streams.pojo.json.Activity;
-import org.apache.streams.pojo.json.Actor;
-import org.apache.streams.pojo.json.Image;
-import org.apache.streams.pojo.json.Provider;
+import org.apache.streams.facebook.*;
+import org.apache.streams.facebook.Place;
+import org.apache.streams.facebook.Post;
+import org.apache.streams.pojo.json.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
-import static org.apache.streams.data.util.ActivityUtil.ensureExtensions;
+import static org.apache.streams.data.util.ActivityUtil.*;
 
 public class FacebookActivityUtil {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FacebookActivityUtil.class);
+
     /**
      * Updates the given Activity object with the values from the Page
      * @param page the object to use as the source
@@ -49,6 +51,61 @@ public class FacebookActivityUtil {
     }
 
     /**
+     * Updates the given Activity object with the values from the Post
+     * @param post
+     * @param activity
+     * @throws ActivitySerializerException
+     */
+    public static void updateActivity(Post post, Activity activity) throws ActivitySerializerException {
+        activity.setActor(buildActor(post));
+        activity.setId(formatId(post.getId()));
+        activity.setProvider(getProvider());
+        activity.setUpdated(post.getUpdatedTime());
+        activity.setPublished(post.getCreatedTime());
+
+        if(post.getLink() != null && post.getLink().length() > 0) {
+            List<String> links = Lists.newArrayList();
+            links.add(post.getLink());
+            activity.setLinks(links);
+        }
+
+        activity.setContent(post.getMessage());
+
+        activity.setVerb("post");
+        activity.setObject(buildObject(post));
+        buildExtensions(activity, post);
+    }
+
+    /**
+     * Builds out the {@link org.apache.streams.pojo.json.ActivityObject} from the given {@link org.apache.streams.pojo.json.Post}
+     * @param post
+     * @return {@link org.apache.streams.pojo.json.ActivityObject}
+     */
+    public static ActivityObject buildObject(Post post) {
+        ActivityObject activityObject = new ActivityObject();
+
+        try {
+            activityObject.setContent(post.getMessage());
+            activityObject.setPublished(post.getCreatedTime());
+            activityObject.setUpdated(post.getUpdatedTime());
+            activityObject.setDisplayName(post.getFrom().getName());
+            activityObject.setId(formatId(post.getId()));
+            activityObject.setObjectType(post.getType());
+            activityObject.setUrl(post.getLink());
+
+            if(activityObject.getObjectType().equals("photo")) {
+                Image image = new Image();
+                image.setUrl(activityObject.getUrl());
+                activityObject.setImage(image);
+            }
+        } catch (Exception e) {
+            LOGGER.error("Exception while trying to build Activity object for post: {}, exception: {}", post, e);
+        }
+
+        return activityObject;
+    }
+
+    /**
      * Gets the common facebook {@link org.apache.streams.pojo.json.Provider} object
      * @return a provider object representing Facebook
      */
@@ -95,6 +152,31 @@ public class FacebookActivityUtil {
     }
 
     /**
+     * Builds an {@link org.apache.streams.pojo.json.Actor} object from the {@link org.apache.streams.pojo.json.Post}
+     * @param post
+     * @return {@link org.apache.streams.pojo.json.Actor}
+     */
+    public static Actor buildActor(Post post) {
+        Actor actor = new Actor();
+
+        try {
+            actor.setId(formatId(
+                    Optional.fromNullable(
+                            post.getFrom().getId())
+                            .or(Optional.of(post.getFrom().getId().toString()))
+                            .orNull()
+            ));
+
+            actor.setDisplayName(post.getFrom().getName());
+            actor.setAdditionalProperty("handle", post.getFrom().getName());
+        } catch (Exception e) {
+            LOGGER.error("Exception trying to build actor for Post: {}, {}", post, e);
+        }
+
+        return actor;
+    }
+
+    /**
      * Builds the actor extensions given the page object
      * @param actor
      * @param page
@@ -115,6 +197,53 @@ public class FacebookActivityUtil {
     }
 
     /**
+     * Fills out the extensions attribute of the passed in {@link org.apache.streams.pojo.json.Activity}
+     * @param activity
+     * @param post
+     */
+    public static void buildExtensions(Activity activity, Post post) {
+        Map<String, Object> extensions = ensureExtensions(activity);
+
+        if(post.getLikes() != null) {
+            Map<String, Object> likes = Maps.newHashMap();
+            org.apache.streams.facebook.Like like = post.getLikes().get(0);
+
+            if(like.getAdditionalProperties().containsKey("data")) {
+                extensions.put("likes", likes);
+            }
+        }
+
+        if(post.getShares() != null) {
+            Map<String, Object> shares = Maps.newHashMap();
+            shares.put("count", ((Map<String, Object>)post.getShares()).get("count"));
+            extensions.put("rebroadcasts", shares);
+        }
+
+        if(post.getTo() != null) {
+            To to = post.getTo();
+            List<Datum> data = to.getData();
+            extensions.put("user_mentions", Lists.newArrayList());
+
+            for(Datum d : data) {
+                Map<String, String> mention = Maps.newHashMap();
+
+                mention.put("id", d.getId());
+                mention.put("displayName", d.getName());
+                mention.put("handle", d.getName());
+
+                ((List<Map<String,String>>)extensions.get("user_mentions")).add(mention);
+            }
+        }
+
+        if(post.getPlace() != null) {
+            Place place = post.getPlace();
+            if(place.getAdditionalProperties().containsKey("location")) {
+                extensions.put(LOCATION_EXTENSION, place.getAdditionalProperties().get("location"));
+            }
+        }
+    }
+
+    /**
      * Formats the ID to conform with the Apache Streams activity ID convention
      * @param idparts the parts of the ID to join
      * @return a valid Activity ID in format "id:facebook:part1:part2:...partN"

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/01efddab/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookPostSerDeTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookPostSerDeTest.java b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookPostSerDeTest.java
index bbe2eeb..8a557d7 100644
--- a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookPostSerDeTest.java
+++ b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookPostSerDeTest.java
@@ -24,7 +24,9 @@ import com.google.common.base.Joiner;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.input.BoundedInputStream;
 import org.apache.streams.facebook.Post;
+import org.apache.streams.facebook.serializer.FacebookActivityUtil;
 import org.apache.streams.jackson.StreamsJacksonMapper;
+import org.apache.streams.pojo.json.Activity;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.Ignore;
@@ -33,13 +35,9 @@ import org.slf4j.LoggerFactory;
 
 import java.io.InputStream;
 
-/**
-* Created with IntelliJ IDEA.
-* User: sblackmon
-* Date: 8/20/13
-* Time: 5:57 PM
-* To change this template use File | Settings | File Templates.
-*/
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 public class FacebookPostSerDeTest {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(FacebookPostSerDeTest.class);
@@ -73,6 +71,22 @@ public class FacebookPostSerDeTest {
 
             LOGGER.debug(mapper.writeValueAsString(serde));
 
+            Activity activity = new Activity();
+            FacebookActivityUtil.updateActivity(ser, activity);
+
+            assertNotNull(activity);
+            assertNotNull(activity.getActor().getId());
+            assertNotNull(activity.getActor().getDisplayName());
+            assertNotNull(activity.getId());
+            assert(activity.getVerb().equals("post"));
+            assertNotNull(activity.getObject());
+            assertNotNull(activity.getUpdated());
+            assertNotNull(activity.getPublished());
+            assertEquals(activity.getProvider().getId(), "id:providers:facebook");
+            assertEquals(activity.getProvider().getDisplayName(), "Facebook");
+            assertEquals(activity.getLinks().size(), 1);
+            assertNotNull(activity.getAdditionalProperties().get("extensions"));
+
         } catch( Exception e ) {
             System.out.println(e);
             e.printStackTrace();


[07/10] incubator-streams git commit: improved error handling serialize twitter type support classes

Posted by sb...@apache.org.
improved error handling
serialize twitter type support classes


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/93026a7c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/93026a7c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/93026a7c

Branch: refs/heads/STREAMS-68,218
Commit: 93026a7c2110df4ff441d2732f68085ebf933d53
Parents: 8737bda
Author: Steve Blackmon <sb...@w2odigital.com>
Authored: Sat Nov 15 12:51:11 2014 -0600
Committer: Steve Blackmon <sb...@w2odigital.com>
Committed: Sat Nov 15 12:51:50 2014 -0600

----------------------------------------------------------------------
 .../converter/ActivityConverterProcessor.java   | 23 ++++++++++++++--
 .../converter/TypeConverterProcessor.java       |  5 ++--
 .../streams-provider-twitter/pom.xml            |  6 +++-
 .../serializer/TwitterConverterResolver.java    | 29 ++++++--------------
 .../serializer/TwitterDocumentClassifier.java   | 11 +++++---
 5 files changed, 43 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/93026a7c/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
index 46ba788..629f979 100644
--- a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
@@ -74,6 +74,9 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
                     break;
             }
 
+            //Preconditions.checkNotNull(datumClass);
+            if( datumClass == null) return result;
+
             // This implementation is primitive, greedy, takes first it can resolve
             Class converterClass = null;
             for( ActivityConverterResolver resolver : resolvers ) {
@@ -82,25 +85,39 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
                     break;
             }
 
+            //Preconditions.checkNotNull(converterClass);
+            if( converterClass == null) return result;
+
             ActivityConverter converter = ActivityConverterFactory.getInstance(converterClass);
 
+            //Preconditions.checkNotNull(converter);
+            if( converter == null) return result;
+
             Object typedDoc;
             if( datumClass.isInstance(inDoc) )
                 typedDoc = inDoc;
             else
                 typedDoc = TypeConverterUtil.convert(inDoc, datumClass, mapper);
 
+            //Preconditions.checkNotNull(typedDoc);
+            if( typedDoc == null) return result;
+
             Activity activity = converter.deserialize(typedDoc);
 
+            //Preconditions.checkNotNull(activity);
+            if( activity == null) return result;
+
             entry.setDocument(activity);
 
             result.add(entry);
 
-        } catch( Throwable e ) {
-            LOGGER.warn("Unable to serialize!", e.getMessage());
+        } catch( Exception e ) {
+            LOGGER.warn("Unable to serialize!  " + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            return result;
         }
 
-        return result;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/93026a7c/streams-components/streams-converters/src/main/java/org/apache/streams/converter/TypeConverterProcessor.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/TypeConverterProcessor.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/TypeConverterProcessor.java
index 6bfeead..5ff5567 100644
--- a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/TypeConverterProcessor.java
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/TypeConverterProcessor.java
@@ -19,7 +19,6 @@ under the License.
 package org.apache.streams.converter;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import org.apache.streams.core.StreamsDatum;
 import org.apache.streams.core.StreamsProcessor;
@@ -27,13 +26,13 @@ import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
+import java.io.Serializable;
 import java.util.List;
 
 /**
  *
  */
-public class TypeConverterProcessor implements StreamsProcessor {
+public class TypeConverterProcessor implements StreamsProcessor, Serializable {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(TypeConverterProcessor.class);
 

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/93026a7c/streams-contrib/streams-provider-twitter/pom.xml
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/pom.xml b/streams-contrib/streams-provider-twitter/pom.xml
index 1c0e8cb..660afbc 100644
--- a/streams-contrib/streams-provider-twitter/pom.xml
+++ b/streams-contrib/streams-provider-twitter/pom.xml
@@ -80,7 +80,11 @@
             <artifactId>hbc-core</artifactId>
             <version>2.1.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.2</version>
+        </dependency>
         <dependency>
             <groupId>org.twitter4j</groupId>
             <artifactId>twitter4j-core</artifactId>

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/93026a7c/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterConverterResolver.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterConverterResolver.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterConverterResolver.java
index f14c9f5..5a58e42 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterConverterResolver.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterConverterResolver.java
@@ -18,25 +18,9 @@
 
 package org.apache.streams.twitter.serializer;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.streams.data.ActivityConverter;
 import org.apache.streams.data.ActivityConverterResolver;
-import org.apache.streams.data.DocumentClassifier;
 import org.apache.streams.exceptions.ActivitySerializerException;
-import org.apache.streams.jackson.StreamsJacksonMapper;
-import org.apache.streams.twitter.pojo.Delete;
-import org.apache.streams.twitter.pojo.FriendList;
-import org.apache.streams.twitter.pojo.Retweet;
-import org.apache.streams.twitter.pojo.Tweet;
-import org.apache.streams.twitter.pojo.User;
-import org.apache.streams.twitter.pojo.UserstreamEvent;
-
-import java.io.IOException;
-import java.io.Serializable;
+import org.apache.streams.twitter.pojo.*;
 
 /**
  * Created by sblackmon on 12/13/13.
@@ -50,10 +34,12 @@ public class TwitterConverterResolver implements ActivityConverterResolver {
     private static TwitterConverterResolver instance = new TwitterConverterResolver();
 
     public static TwitterConverterResolver getInstance() {
+
+        if( instance == null )
+            instance = new TwitterConverterResolver();
         return instance;
-    }
 
-    private static ObjectMapper mapper = new StreamsJacksonMapper(StreamsTwitterMapper.TWITTER_FORMAT);
+    }
 
     @Override
     public Class bestSerializer(Class documentClass) throws ActivitySerializerException {
@@ -66,7 +52,10 @@ public class TwitterConverterResolver implements ActivityConverterResolver {
             return TwitterJsonUserActivityConverter.class;
         else if (documentClass == UserstreamEvent.class)
             return TwitterJsonUserstreameventActivityConverter.class;
-        else return TwitterJsonTweetActivityConverter.class;
+        else if (documentClass == FriendList.class)
+            return null;
+        else
+            return TwitterJsonTweetActivityConverter.class;
 
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/93026a7c/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterDocumentClassifier.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterDocumentClassifier.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterDocumentClassifier.java
index b9ca789..1719491 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterDocumentClassifier.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterDocumentClassifier.java
@@ -23,13 +23,11 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
-import org.apache.streams.data.ActivityConverter;
 import org.apache.streams.data.DocumentClassifier;
 import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.twitter.pojo.*;
 
 import java.io.IOException;
-import java.io.Serializable;
 
 /**
  * Created by sblackmon on 12/13/13.
@@ -40,13 +38,16 @@ public class TwitterDocumentClassifier implements DocumentClassifier {
 
     }
 
-    private static TwitterDocumentClassifier instance = new TwitterDocumentClassifier();
+    private static TwitterDocumentClassifier instance;
 
     public static TwitterDocumentClassifier getInstance() {
+
+        if( instance == null )
+            instance = new TwitterDocumentClassifier();
         return instance;
     }
 
-    private static ObjectMapper mapper = new StreamsJacksonMapper(Lists.newArrayList(StreamsTwitterMapper.TWITTER_FORMAT));
+    private static ObjectMapper mapper;
 
     public Class detectClass(Object document) {
 
@@ -56,6 +57,8 @@ public class TwitterDocumentClassifier implements DocumentClassifier {
         String json = (String)document;
         Preconditions.checkArgument(StringUtils.isNotEmpty(json));
 
+        mapper = new StreamsJacksonMapper(Lists.newArrayList(StreamsTwitterMapper.TWITTER_FORMAT));
+
         ObjectNode objectNode;
         try {
             objectNode = (ObjectNode) mapper.readTree(json);


[10/10] incubator-streams git commit: improved configuration scheme

Posted by sb...@apache.org.
improved configuration scheme


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/ce2a794d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/ce2a794d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/ce2a794d

Branch: refs/heads/STREAMS-68,218
Commit: ce2a794dc9c79a28d3650377c58942fb95d82eb2
Parents: df648a8
Author: Steve Blackmon <sb...@w2odigital.com>
Authored: Sat Nov 15 18:56:05 2014 -0600
Committer: Steve Blackmon <sb...@w2odigital.com>
Committed: Sat Nov 15 18:56:05 2014 -0600

----------------------------------------------------------------------
 ...ActivityConverterProcessorConfiguration.json | 23 ++++++++++++++++++++
 1 file changed, 23 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/ce2a794d/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/components/http/ActivityConverterProcessorConfiguration.json
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/components/http/ActivityConverterProcessorConfiguration.json b/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/components/http/ActivityConverterProcessorConfiguration.json
new file mode 100644
index 0000000..ab173b4
--- /dev/null
+++ b/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/components/http/ActivityConverterProcessorConfiguration.json
@@ -0,0 +1,23 @@
+{
+    "type": "object",
+    "$schema": "http://json-schema.org/draft-03/schema",
+    "id": "#",
+    "javaType" : "org.apache.streams.converter.ActivityConverterProcessorConfiguration",
+    "javaInterfaces": ["java.io.Serializable"],
+    "properties": {
+        "classifiers": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "javaType": "org.apache.streams.data.DocumentClassifier"
+            }
+        },
+        "resolvers": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "javaType": "org.apache.streams.data.ActivityConverterResolver"
+            }
+        }
+    }
+}
\ No newline at end of file


[05/10] incubator-streams git commit: Merge remote-tracking branch 'robdouglas/STREAMS-220'

Posted by sb...@apache.org.
Merge remote-tracking branch 'robdouglas/STREAMS-220'


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/b410556f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/b410556f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/b410556f

Branch: refs/heads/STREAMS-68,218
Commit: b410556f871228cf4b65eabd2a12ca915d4df0bf
Parents: dc7ba80 5611aa7
Author: Ryan Ebanks <ry...@gmail.com>
Authored: Fri Nov 14 11:37:43 2014 -0600
Committer: Ryan Ebanks <ry...@gmail.com>
Committed: Fri Nov 14 11:37:43 2014 -0600

----------------------------------------------------------------------
 .../api/FacebookPostActivitySerializer.java     | 243 +------------------
 .../serializer/FacebookActivityUtil.java        | 153 +++++++++++-
 .../facebook/test/FacebookPostSerDeTest.java    |  28 ++-
 3 files changed, 169 insertions(+), 255 deletions(-)
----------------------------------------------------------------------



[06/10] incubator-streams git commit: Merge remote-tracking branch 'rbnks/RSS-PROVIDER-TEST-FIX'

Posted by sb...@apache.org.
Merge remote-tracking branch 'rbnks/RSS-PROVIDER-TEST-FIX'


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/9b89c089
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/9b89c089
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/9b89c089

Branch: refs/heads/STREAMS-68,218
Commit: 9b89c0898d0b0ad02550a6cada3ef83911ed140d
Parents: b410556 a698a07
Author: Ryan Ebanks <ry...@gmail.com>
Authored: Fri Nov 14 17:11:10 2014 -0600
Committer: Ryan Ebanks <ry...@gmail.com>
Committed: Fri Nov 14 17:11:10 2014 -0600

----------------------------------------------------------------------
 .../org/apache/streams/rss/provider/RssStreamProviderTest.java | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[09/10] incubator-streams git commit: Merge branch 'master' into STREAMS-68, 218

Posted by sb...@apache.org.
Merge branch 'master' into STREAMS-68,218

Conflicts:
	streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivityConverter.java


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/df648a80
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/df648a80
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/df648a80

Branch: refs/heads/STREAMS-68,218
Commit: df648a80d17c36220cba95a77331c1bbdcfd3532
Parents: a24b3be 9b89c08
Author: Steve Blackmon <sb...@w2odigital.com>
Authored: Sat Nov 15 18:55:54 2014 -0600
Committer: Steve Blackmon <sb...@w2odigital.com>
Committed: Sat Nov 15 18:55:54 2014 -0600

----------------------------------------------------------------------
 .../api/FacebookPostActivityConverter.java      | 244 +------------------
 .../serializer/FacebookActivityUtil.java        | 153 +++++++++++-
 .../facebook/test/FacebookPostSerDeTest.java    |  28 ++-
 .../rss/provider/RssStreamProviderTest.java     |   6 +-
 4 files changed, 175 insertions(+), 256 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/df648a80/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivityConverter.java
----------------------------------------------------------------------
diff --cc streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivityConverter.java
index ad64768,0000000..a41c405
mode 100644,000000..100644
--- a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivityConverter.java
+++ b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/api/FacebookPostActivityConverter.java
@@@ -1,313 -1,0 +1,79 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + *
 + *   http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
- 
 +package org.apache.streams.facebook.api;
 +
- 
- import com.fasterxml.jackson.databind.JsonNode;
 +import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.node.ObjectNode;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Maps;
 +import org.apache.commons.lang.NotImplementedException;
 +import org.apache.streams.data.ActivityConverter;
 +import org.apache.streams.exceptions.ActivitySerializerException;
 +import org.apache.streams.facebook.Post;
++import org.apache.streams.facebook.serializer.FacebookActivityUtil;
 +import org.apache.streams.jackson.StreamsJacksonMapper;
 +import org.apache.streams.pojo.json.*;
 +import org.joda.time.format.DateTimeFormat;
 +import org.joda.time.format.DateTimeFormatter;
 +import org.joda.time.format.ISODateTimeFormat;
 +
- import java.util.HashMap;
- import java.util.Iterator;
 +import java.util.List;
- import java.util.Map;
 +
- import static org.apache.streams.data.util.ActivityUtil.*;
- 
- /**
-  * Serializes activity posts
-  *   sblackmon: This class needs a rewrite
-  */
- public class FacebookPostActivityConverter implements ActivityConverter<Post> {
++public class FacebookPostActivitySerializer implements ActivitySerializer<org.apache.streams.facebook.Post> {
 +
 +    public FacebookPostActivityConverter() {
 +
 +    }
 +
 +    private static FacebookPostActivityConverter instance = new FacebookPostActivityConverter();
 +
 +    public static FacebookPostActivityConverter getInstance() {
 +        return instance;
 +    }
 +
 +    public static final DateTimeFormatter FACEBOOK_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
 +    public static final DateTimeFormatter ACTIVITY_FORMAT = ISODateTimeFormat.basicDateTime();
 +
 +    public static final String PROVIDER_NAME = "Facebook";
 +
 +    public static ObjectMapper mapper;
 +    static {
 +        mapper = StreamsJacksonMapper.getInstance();
 +    }
 +
 +    @Override
 +    public String serializationFormat() {
 +        return "facebook_post_json_v1";
 +    }
 +
 +    @Override
 +    public Post serialize(Activity deserialized) throws ActivitySerializerException {
 +        throw new NotImplementedException("Not currently supported by this deserializer");
 +    }
 +
 +    @Override
 +    public Activity deserialize(Post post) throws ActivitySerializerException {
- 
 +        Activity activity = new Activity();
-         activity.setPublished(post.getCreatedTime());
-         activity.setUpdated(post.getUpdatedTime());
-         addActor(activity, mapper.convertValue(post.getFrom(), ObjectNode.class));
-         setProvider(activity);
-         setObjectType(post.getType(), activity);
-         parseObject(activity, mapper.convertValue(post, ObjectNode.class));
-         fixContentFromSummary(activity);
-         activity.setVerb("post");
-         List<String> links = Lists.newLinkedList();
-         links.add(post.getLink());
-         activity.setLinks(links);
-         ensureExtensions(activity).put("facebook", post);
-         if(post.getLikes() != null) {
-             Map<String, Object> likes = Maps.newHashMap();
-             likes.put("count", post.getLikes().size());
-             ensureExtensions(activity).put("likes", likes);
-         }
++
++        FacebookActivityUtil.updateActivity(post, activity);
++
 +        return activity;
 +    }
 +
 +    @Override
 +    public List<Activity> deserializeAll(List<Post> serializedList) {
 +        throw new NotImplementedException("Not currently supported by this deserializer");
 +    }
- 
-     private void fixContentFromSummary(Activity activity) {
-         //we MUST have a content field set, so choose the best option
-         if(activity.getContent() == null) {
-             activity.setContent(activity.getAdditionalProperties().containsKey("summary") ?
-                     (String) activity.getAdditionalProperties().get("summary") :
-                     activity.getObject().getSummary());
-         }
-     }
- 
-     private void fixObjectId(Activity activity) {
-         //An artifact of schema generation, the default value is {link}
-         if(activity.getObject().getId().equals("{link}")) {
-             activity.getObject().setId(null);
-         }
-     }
- 
-     private void setObjectType(String type, Activity activity) {
-         ActivityObject object = new ActivityObject();
-         activity.setObject(object);
-         object.setObjectType(type);
-     }
- 
-     private void setProvider(Activity activity) {
-         Provider provider = new Provider();
-         provider.setId("id:provider:"+PROVIDER_NAME);
-         provider.setDisplayName(PROVIDER_NAME);
-         activity.setProvider(provider);
-     }
- 
-     private String getObjectType(JsonNode node) {
-         Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
-         ensureMoreFields(fields);
-         Map.Entry<String, JsonNode> field = fields.next();
-         //ensureNoMoreFields(fields);
-         return node.asText();
-     }
- 
-     private void parseObject(Activity activity, JsonNode jsonNode) throws ActivitySerializerException {
-         for(Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields(); fields.hasNext();) {
-             Map.Entry<String, JsonNode> field = fields.next();
-             String key = field.getKey();
-             JsonNode value = field.getValue();
-             mapField(activity, key, value);
-         }
-     }
- 
-     private void mapField(Activity activity, String name, JsonNode value) throws ActivitySerializerException {
-         if("application".equals(name)) {
-             addGenerator(activity, value);
-         } else if ("caption".equals(name)) {
-             addSummary(activity, value);
-         } else if ("comments".equals(name)) {
-             addAttachments(activity, value);
-         } else if ("description".equals(name)) {
-             addObjectSummary(activity, value);
-         } else if ("from".equals(name)) {
-             addActor(activity, value);
-         } else if ("icon".equals(name)) {
-             addIcon(activity, value);
-         } else if ("id".equals(name)) {
-             addId(activity, value);
-         } else if ("is_hidden".equals(name)) {
-             addObjectHiddenExtension(activity, value);
-         } else if ("like_count".equals(name)) {
-             addLikeExtension(activity, value);
-         } else if ("link".equals(name)) {
-             addObjectLink(activity, value);
-         } else if ("message".equals(name)) {
-             activity.setContent(value.asText());
-         } else if ("name".equals(name)) {
-             addObjectName(activity, value);
-         } else if ("object_id".equals(name)) {
-             addObjectId(activity, value);
-         } else if ("picture".equals(name)) {
-             addObjectImage(activity, value);
-         } else if ("place".equals(name)) {
-             addLocationExtension(activity, value);
-         } else if ("shares".equals(name)) {
-             addRebroadcastExtension(activity, value);
-         } else if ("source".equals(name)) {
-             addObjectLink(activity, value);
-         } else if ("story".equals(name)) {
-             addTitle(activity, value);
-         }
-     }
- 
-     private void addSummary(Activity activity, JsonNode value) {
-         activity.setAdditionalProperty("summary", value.asText());
-     }
- 
-     private void addTitle(Activity activity, JsonNode value) {
-         activity.setTitle(value.asText());
-     }
- 
-     private void addLikeExtension(Activity activity, JsonNode value) {
-         Map<String, Object> extensions = ensureExtensions(activity);
-         Map<String, Object> likes = Maps.newHashMap();
-         likes.put("count", value.asLong());
-         extensions.put(LIKES_EXTENSION, likes);
-     }
- 
-     private void addLocationExtension(Activity activity, JsonNode value) {
-         Map<String, Object> extensions = ensureExtensions(activity);
-         if(value.has("location")) {
-             Map<String, Object> location = new HashMap<String, Object>();
-             JsonNode fbLocation = value.get("location");
-             if(fbLocation.has("country")) {
-                 location.put(LOCATION_EXTENSION_COUNTRY, fbLocation.get("country"));
-             }
-             if(fbLocation.has("latitude") && fbLocation.has("longitude")) {
-                 location.put(LOCATION_EXTENSION_COORDINATES, String.format("%s,%s", fbLocation.get("longitude"), fbLocation.get("latitude")));
-             }
-             extensions.put(LOCATION_EXTENSION, location);
-         }
-     }
- 
-     private void addObjectImage(Activity activity, JsonNode value) {
-         Image image = new Image();
-         image.setUrl(value.asText());
-         activity.getObject().setImage(image);
-     }
- 
-     private void addObjectId(Activity activity, JsonNode value) {
-         activity.getObject().setId(getObjectId("facebook", activity.getObject().getObjectType(), value.asText()));
-     }
- 
-     private void addObjectName(Activity activity, JsonNode value) {
-         activity.getObject().setDisplayName(value.asText());
-     }
- 
-     private void addId(Activity activity, JsonNode value) {
-         activity.setId("id:"+PROVIDER_NAME+":"+value.asText());
-     }
- 
-     private void addObjectLink(Activity activity, JsonNode value) {
-         activity.getObject().setUrl(value.asText());
-     }
- 
-     private void addRebroadcastExtension(Activity activity, JsonNode value) {
-         Map<String, Object> extensions = ensureExtensions(activity);
-         if(value.has("count")) {
-             Map<String, Object> rebroadCast = Maps.newHashMap();
-             rebroadCast.put("count", value.get("count").asLong());
-             rebroadCast.put("perspectival", true);
-             extensions.put(REBROADCAST_EXTENSION, rebroadCast);
-         }
-     }
- 
-     private void addObjectHiddenExtension(Activity activity, JsonNode value) {
-         Map<String, Object> extensions = ensureExtensions(activity);
-         extensions.put("hidden", value.asBoolean());
-     }
- 
-     private void addIcon(Activity activity, JsonNode value) {
-         Icon icon = new Icon();
-         //Apparently the Icon didn't map from the schema very well
-         icon.setAdditionalProperty("url", value.asText());
-         activity.setIcon(icon);
-     }
- 
-     private void addActor(Activity activity, JsonNode value) {
-         Actor actor = new Actor();
-         if(value.has("name")) {
-             actor.setDisplayName(value.get("name").asText());
-         }
-         if(value.has("id")) {
-             actor.setId("id:"+PROVIDER_NAME+":"+value.get("id").asText());
-         }
-         activity.setActor(actor);
-     }
- 
-     private void addObjectSummary(Activity activity, JsonNode value) {
-         activity.getObject().setSummary(value.asText());
-     }
- 
-     private void addGenerator(Activity activity, JsonNode value) {
-         Generator generator = new Generator();
-         if(value.has("id")) {
-             generator.setId(getObjectId(PROVIDER_NAME, "generator", value.get("id").asText()));
-         }
-         if(value.has("name")) {
-             generator.setDisplayName(value.get("name").asText());
-         }
-         if(value.has("namespace")) {
-             generator.setSummary(value.get("namespace").asText());
-         }
-         activity.setGenerator(generator);
-     }
- 
-     private void addAttachments(Activity activity, JsonNode value) {
-         //No direct mapping at this time
-     }
- 
-     private static void ensureMoreFields(Iterator<Map.Entry<String, JsonNode>> fields) {
-         if(!fields.hasNext()) {
-             throw new IllegalStateException("Facebook activity must have one and only one root element");
-         }
-     }
-     private static void ensureNoMoreFields(Iterator<Map.Entry<String, JsonNode>> fields) {
-         if(fields.hasNext()) {
-             throw new IllegalStateException("Facebook activity must have one and only one root element");
-         }
-     }
- 
 +}


[02/10] incubator-streams git commit: Fixed failing RSS Streams test

Posted by sb...@apache.org.
Fixed failing RSS Streams test


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/a698a077
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/a698a077
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/a698a077

Branch: refs/heads/STREAMS-68,218
Commit: a698a077936f187e419f9caaaf024c3c50975ae5
Parents: 76763f8
Author: Ryan Ebanks <ry...@gmail.com>
Authored: Thu Nov 13 08:48:03 2014 -0600
Committer: Ryan Ebanks <ry...@gmail.com>
Committed: Thu Nov 13 08:48:03 2014 -0600

----------------------------------------------------------------------
 .../org/apache/streams/rss/provider/RssStreamProviderTest.java | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/a698a077/streams-contrib/streams-provider-rss/src/test/java/org/apache/streams/rss/provider/RssStreamProviderTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-rss/src/test/java/org/apache/streams/rss/provider/RssStreamProviderTest.java b/streams-contrib/streams-provider-rss/src/test/java/org/apache/streams/rss/provider/RssStreamProviderTest.java
index bf5e105..1cce391 100644
--- a/streams-contrib/streams-provider-rss/src/test/java/org/apache/streams/rss/provider/RssStreamProviderTest.java
+++ b/streams-contrib/streams-provider-rss/src/test/java/org/apache/streams/rss/provider/RssStreamProviderTest.java
@@ -52,11 +52,15 @@ public class RssStreamProviderTest extends RandomizedTest {
             StreamsResultSet batch = provider.readCurrent();
             LOGGER.debug("Batch size : {}", batch.size());
             datumCount += batch.size();
+            if(batch.size() != 0) { //if race condition happened, pull again
+                batch = provider.readCurrent();
+                assertEquals(0, batch.size());
+            }
 
             assertTrue(provider.scheduler.isComplete());
+            assertEquals(20, datumCount);
             assertFalse(provider.isRunning());
             assertEquals(0, datums.size());
-            assertEquals(20, datumCount);
             provider.cleanUp();
         } finally {
             if(provider != null)


[04/10] incubator-streams git commit: Merge branch 'master' into STREAMS-220

Posted by sb...@apache.org.
Merge branch 'master' into STREAMS-220


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/5611aa74
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/5611aa74
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/5611aa74

Branch: refs/heads/STREAMS-68,218
Commit: 5611aa74c52e4bea77e6e536815ae59974359396
Parents: 3fa79f1 0ffc40e
Author: Robert Douglas <rd...@w2ogroup.com>
Authored: Thu Nov 13 09:49:11 2014 -0600
Committer: Robert Douglas <rd...@w2ogroup.com>
Committed: Thu Nov 13 09:49:11 2014 -0600

----------------------------------------------------------------------
 .../streams/jackson/TypeConverterProcessor.java | 112 ++++++++
 .../test/TypeConverterProcessorTest.java        |  95 +++++++
 .../DatasiftActivitySerializerProcessor.java    |  89 ++++++
 .../DatasiftTypeConverterProcessor.java         |   7 +-
 .../serializer/DatasiftActivitySerializer.java  |  12 +-
 .../DatasiftDefaultActivitySerializer.java      | 214 ---------------
 .../serializer/DatasiftEventClassifier.java     |  53 ++++
 .../DatasiftInstagramActivitySerializer.java    |   8 +-
 .../DatasiftInteractionActivitySerializer.java  | 222 +++++++++++++++
 .../DatasiftTweetActivitySerializer.java        | 266 ------------------
 .../DatasiftTwitterActivitySerializer.java      | 272 +++++++++++++++++++
 .../datasift/util/StreamsDatasiftMapper.java    |  11 +-
 .../apache/streams/datasift/DatasiftPush.json   |  30 ++
 .../com/datasift/test/DatasiftSerDeTest.java    |  18 +-
 .../DatasiftTypeConverterProcessorTest.java     |  72 -----
 .../DatasiftActivitySerializerTest.java         |  82 +++---
 .../serializer/DatasiftEventClassifierTest.java |  64 +++++
 ...DatasiftInstagramActivitySerializerTest.java |  43 +++
 ...tasiftInteractionActivitySerializerTest.java |  48 ++++
 .../DatasiftTwitterActivitySerializerTest.java  |  43 +++
 .../streams-provider-twitter/pom.xml            |   6 +
 .../processor/TwitterEventProcessor.java        | 194 -------------
 .../twitter/processor/TwitterTypeConverter.java | 209 --------------
 .../provider/TwitterEventClassifier.java        |  58 ++--
 .../serializer/StreamsTwitterMapper.java        |  11 +-
 .../TwitterJsonActivitySerializer.java          |  24 +-
 .../TwitterJsonDeleteActivitySerializer.java    |   6 +
 .../TwitterJsonRetweetActivitySerializer.java   |   6 +
 .../TwitterJsonTweetActivitySerializer.java     |   6 +
 .../TwitterJsonUserActivitySerializer.java      |   6 +
 ...erJsonUserstreameventActivitySerializer.java |   6 +
 .../streams/twitter/test/SimpleTweetTest.java   |  11 +-
 .../twitter/test/TweetActivitySerDeTest.java    |   6 +-
 .../streams/twitter/test/TweetSerDeTest.java    |   6 +-
 .../test/TwitterEventClassifierTest.java        |  34 +++
 .../streams/pig/test/PigProcessDatumTest.java   |   2 -
 .../pig/test/PigProcessDocumentTest.java        |   2 -
 .../streams/pig/test/PigSerializerTest.java     |   3 +-
 38 files changed, 1278 insertions(+), 1079 deletions(-)
----------------------------------------------------------------------



[03/10] incubator-streams git commit: STREAMS-220 | Including Facebook object in extensions

Posted by sb...@apache.org.
STREAMS-220 | Including Facebook object in extensions


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/3fa79f14
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/3fa79f14
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/3fa79f14

Branch: refs/heads/STREAMS-68,218
Commit: 3fa79f14614974e588828c6f70a99393bf833c10
Parents: 01efdda
Author: Robert Douglas <rd...@w2ogroup.com>
Authored: Thu Nov 13 09:48:51 2014 -0600
Committer: Robert Douglas <rd...@w2ogroup.com>
Committed: Thu Nov 13 09:48:51 2014 -0600

----------------------------------------------------------------------
 .../streams/facebook/serializer/FacebookActivityUtil.java      | 6 ++++++
 1 file changed, 6 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/3fa79f14/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
index af650ba..49f2880 100644
--- a/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
+++ b/streams-contrib/streams-provider-facebook/src/main/java/org/apache/streams/facebook/serializer/FacebookActivityUtil.java
@@ -17,6 +17,8 @@
  */
 package org.apache.streams.facebook.serializer;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
@@ -25,6 +27,7 @@ import org.apache.streams.exceptions.ActivitySerializerException;
 import org.apache.streams.facebook.*;
 import org.apache.streams.facebook.Place;
 import org.apache.streams.facebook.Post;
+import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.pojo.json.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -202,6 +205,7 @@ public class FacebookActivityUtil {
      * @param post
      */
     public static void buildExtensions(Activity activity, Post post) {
+        ObjectMapper mapper = StreamsJacksonMapper.getInstance();
         Map<String, Object> extensions = ensureExtensions(activity);
 
         if(post.getLikes() != null) {
@@ -241,6 +245,8 @@ public class FacebookActivityUtil {
                 extensions.put(LOCATION_EXTENSION, place.getAdditionalProperties().get("location"));
             }
         }
+
+        extensions.put("facebook", mapper.convertValue(post, ObjectNode.class));
     }
 
     /**


[08/10] incubator-streams git commit: improved configuration scheme

Posted by sb...@apache.org.
improved configuration scheme


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/a24b3be7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/a24b3be7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/a24b3be7

Branch: refs/heads/STREAMS-68,218
Commit: a24b3be723dbc7ccca7f34cc0f58ae8bb8838470
Parents: 93026a7
Author: Steve Blackmon <sb...@w2odigital.com>
Authored: Sat Nov 15 18:34:32 2014 -0600
Committer: Steve Blackmon <sb...@w2odigital.com>
Committed: Sat Nov 15 18:34:32 2014 -0600

----------------------------------------------------------------------
 streams-components/streams-converters/pom.xml   | 54 ++++++++++++++++++++
 .../converter/ActivityConverterProcessor.java   | 50 +++++++++++++-----
 .../streams/twitter/test/FullTweetTest.java     | 14 ++---
 .../streams/data/ActivityConverterResolver.java |  5 ++
 .../apache/streams/data/DocumentClassifier.java |  9 ++--
 5 files changed, 108 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/a24b3be7/streams-components/streams-converters/pom.xml
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/pom.xml b/streams-components/streams-converters/pom.xml
index cf990cb..78f42b9 100644
--- a/streams-components/streams-converters/pom.xml
+++ b/streams-components/streams-converters/pom.xml
@@ -80,6 +80,60 @@
         </testResources>
         <plugins>
 
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>1.8</version>
+                <executions>
+                    <execution>
+                        <id>add-source</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>target/generated-sources/jsonschema2pojo</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>add-source-jaxb2</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>target/generated-sources/jaxb2</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.jsonschema2pojo</groupId>
+                <artifactId>jsonschema2pojo-maven-plugin</artifactId>
+                <configuration>
+                    <addCompileSourceRoot>true</addCompileSourceRoot>
+                    <generateBuilders>true</generateBuilders>
+                    <sourcePaths>
+                        <sourcePath>src/main/jsonschema</sourcePath>
+                    </sourcePaths>
+                    <outputDirectory>target/generated-sources/jsonschema2pojo</outputDirectory>
+                    <targetPackage>org.apache.streams.converter</targetPackage>
+                    <useLongIntegers>true</useLongIntegers>
+                    <useJodaDates>true</useJodaDates>
+                    <includeJsr303Annotations>true</includeJsr303Annotations>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/a24b3be7/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
index 629f979..521c906 100644
--- a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityConverterProcessor.java
@@ -38,21 +38,22 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(ActivityConverterProcessor.class);
 
+    protected ActivityConverterProcessorConfiguration configuration;
+
     private List<DocumentClassifier> classifiers;
     private List<ActivityConverterResolver> resolvers;
 
     public ActivityConverterProcessor() {
         super(Activity.class);
-        this.classifiers = Lists.newArrayList((DocumentClassifier)BaseDocumentClassifier.getInstance());
-        this.resolvers = Lists.newArrayList((ActivityConverterResolver) BaseActivityConverterResolver.getInstance());
+        this.classifiers = Lists.newArrayList();
+        this.resolvers = Lists.newArrayList();
     }
 
-    public ActivityConverterProcessor(List<DocumentClassifier> classifiers, List<ActivityConverterResolver> factories) {
+    public ActivityConverterProcessor(ActivityConverterProcessorConfiguration configuration) {
         super(Activity.class);
-        this.classifiers = classifiers;
-        this.resolvers = factories;
-        this.classifiers.add(BaseDocumentClassifier.getInstance());
-        this.resolvers.add(BaseActivityConverterResolver.getInstance());
+        this.configuration = configuration;
+        this.classifiers = Lists.newArrayList();
+        this.resolvers = Lists.newArrayList();
     }
 
     @Override
@@ -75,7 +76,12 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
             }
 
             //Preconditions.checkNotNull(datumClass);
-            if( datumClass == null) return result;
+            if( datumClass == null) {
+                LOGGER.warn("Unable to classify");
+                return result;
+            } else {
+                LOGGER.debug("Classifies document as " + datumClass.getSimpleName());
+            }
 
             // This implementation is primitive, greedy, takes first it can resolve
             Class converterClass = null;
@@ -86,7 +92,13 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
             }
 
             //Preconditions.checkNotNull(converterClass);
-            if( converterClass == null) return result;
+            if( converterClass == null) {
+                LOGGER.warn("Unable to resolve converterClass");
+                return result;
+            }
+            else {
+                LOGGER.debug("Resolved converter: " + converterClass.getSimpleName());
+            }
 
             ActivityConverter converter = ActivityConverterFactory.getInstance(converterClass);
 
@@ -100,12 +112,18 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
                 typedDoc = TypeConverterUtil.convert(inDoc, datumClass, mapper);
 
             //Preconditions.checkNotNull(typedDoc);
-            if( typedDoc == null) return result;
+            if( typedDoc == null) {
+                LOGGER.warn("Unable to convert " + inDoc.getClass().getSimpleName() + " to " + datumClass.getSimpleName());
+                return result;
+            }
 
             Activity activity = converter.deserialize(typedDoc);
 
             //Preconditions.checkNotNull(activity);
-            if( activity == null) return result;
+            if( activity == null) {
+                LOGGER.warn("Unable to convert " + datumClass.getClass().getCanonicalName() + " to Activity");
+                return result;
+            }
 
             entry.setDocument(activity);
 
@@ -123,8 +141,14 @@ public class ActivityConverterProcessor extends TypeConverterProcessor {
     @Override
     public void prepare(Object configurationObject) {
         super.prepare(configurationObject);
-        Preconditions.checkArgument(classifiers.size() > 0);
-        Preconditions.checkArgument(resolvers.size() > 0);
+        if( configuration != null ) {
+            if (configuration.getClassifiers() != null && configuration.getClassifiers().size() > 0)
+                this.classifiers.addAll(configuration.getClassifiers());
+            if (configuration.getResolvers() != null && configuration.getResolvers().size() > 0)
+                this.resolvers.addAll(configuration.getResolvers());
+        }
+        this.classifiers.add(BaseDocumentClassifier.getInstance());
+        this.resolvers.add(BaseActivityConverterResolver.getInstance());
     }
 
 };

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/a24b3be7/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/FullTweetTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/FullTweetTest.java b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/FullTweetTest.java
index a661f2c..63dcf51 100644
--- a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/FullTweetTest.java
+++ b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/FullTweetTest.java
@@ -23,18 +23,16 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import org.apache.streams.converter.ActivityConverterProcessor;
+import org.apache.streams.converter.ActivityConverterProcessorConfiguration;
 import org.apache.streams.core.StreamsDatum;
 import org.apache.streams.data.ActivityConverterResolver;
 import org.apache.streams.data.DocumentClassifier;
-import org.apache.streams.exceptions.ActivitySerializerException;
 import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.pojo.json.Activity;
 import org.apache.streams.twitter.pojo.Retweet;
-import org.apache.streams.twitter.pojo.Tweet;
 import org.apache.streams.twitter.serializer.StreamsTwitterMapper;
 import org.apache.streams.twitter.serializer.TwitterConverterResolver;
 import org.apache.streams.twitter.serializer.TwitterDocumentClassifier;
-import org.apache.streams.twitter.serializer.TwitterJsonActivityConverter;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -95,10 +93,12 @@ public class FullTweetTest {
 
         Activity activity = null;
         try {
-            ActivityConverterProcessor converter = new ActivityConverterProcessor(
-                    Lists.newArrayList((DocumentClassifier)TwitterDocumentClassifier.getInstance()),
-                    Lists.newArrayList((ActivityConverterResolver)TwitterConverterResolver.getInstance()));
-            converter.prepare(null);
+            ActivityConverterProcessorConfiguration converterProcessorConfiguration = new ActivityConverterProcessorConfiguration()
+                    .withClassifiers(Lists.newArrayList((DocumentClassifier)TwitterDocumentClassifier.getInstance()))
+                    .withResolvers(Lists.newArrayList((ActivityConverterResolver)TwitterConverterResolver.getInstance()));
+
+            ActivityConverterProcessor converter = new ActivityConverterProcessor(converterProcessorConfiguration);
+            converter.prepare(converterProcessorConfiguration);
             List<StreamsDatum> result = converter.process(new StreamsDatum(TWITTER_JSON));
             activity = (Activity)result.get(0).getDocument();
         } catch (Throwable e) {

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/a24b3be7/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverterResolver.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverterResolver.java b/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverterResolver.java
index f4d7a92..84f098a 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverterResolver.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverterResolver.java
@@ -27,6 +27,11 @@ import java.io.Serializable;
  */
 public interface ActivityConverterResolver extends Serializable {
 
+    /*
+      Every implementing class should have a static getInstance() method
+      But java 7 does not allow the interface to require that
+     */
+
     /**
      * Identifies a class that con convert this document to an activity
      *

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/a24b3be7/streams-pojo/src/main/java/org/apache/streams/data/DocumentClassifier.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/DocumentClassifier.java b/streams-pojo/src/main/java/org/apache/streams/data/DocumentClassifier.java
index ea0055f..3c6b5e5 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/DocumentClassifier.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/DocumentClassifier.java
@@ -18,17 +18,18 @@
 
 package org.apache.streams.data;
 
-import org.apache.streams.exceptions.ActivitySerializerException;
-import org.apache.streams.pojo.json.Activity;
-
 import java.io.Serializable;
-import java.util.List;
 
 /**
  * Serializes and deserializes Activities
  */
 public interface DocumentClassifier extends Serializable {
 
+    /*
+      Every implementing class should have a static getInstance() method
+      But java 7 does not allow the interface to require that
+     */
+
     /**
      * Gets the supported content type that can be deserialized/serialized
      *