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 2015/12/01 02:35:23 UTC

[1/3] incubator-streams git commit: resolves STREAMS-385

Repository: incubator-streams
Updated Branches:
  refs/heads/master 075050574 -> 3e446b90f


resolves STREAMS-385


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

Branch: refs/heads/master
Commit: 786f9ea73c5e645d91acdf2b05e0c6b3c9060424
Parents: daca194
Author: Steve Blackmon (@steveblackmon) <sb...@apache.org>
Authored: Wed Nov 25 13:06:18 2015 -0600
Committer: Steve Blackmon (@steveblackmon) <sb...@apache.org>
Committed: Wed Nov 25 13:06:18 2015 -0600

----------------------------------------------------------------------
 .../ActivityObjectConverterProcessor.java       | 103 ++++++++
 .../converter/ActivityObjectConverterUtil.java  | 239 +++++++++++++++++++
 .../BaseObjectNodeActivityObjectConverter.java  |  76 ++++++
 .../BaseStringActivityObjectConverter.java      |  70 ++++++
 ...tyObjectConverterProcessorConfiguration.json |  26 ++
 ...aseActivityObjectConverterProcessorTest.java |  93 ++++++++
 .../test/CustomActivityObjectConverter.java     |  62 +++++
 ...tomActivityObjectConverterProcessorTest.java | 106 ++++++++
 .../streams/converter/test/CustomType.java      |   1 +
 .../TwitterJsonUserActivityObjectConverter.java |  64 +++++
 .../TwitterActivityObjectsConvertersTest.java   |  55 +++++
 .../apache/streams/data/util/ActivityUtil.java  |   7 +
 12 files changed, 902 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterProcessor.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterProcessor.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterProcessor.java
new file mode 100644
index 0000000..ff45877
--- /dev/null
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterProcessor.java
@@ -0,0 +1,103 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.streams.converter;
+
+import com.google.common.collect.Lists;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.core.StreamsProcessor;
+import org.apache.streams.core.util.DatumUtils;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * ActivityObjectConverterProcessor is a utility processor for converting any datum document
+ * to an Activity.
+ *
+ * By default it will handle string json and objectnode representation of existing Activities,
+ * translating them into the POJO representation(s) preferred by each registered/detected
+ * ActivityConverter.
+ *
+ * To use this capability without a dedicated stream processor, just use ActivityConverterUtil.
+ */
+public class ActivityObjectConverterProcessor implements StreamsProcessor {
+
+    public static final String STREAMS_ID = "ActivityObjectConverterProcessor";
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(ActivityObjectConverterProcessor.class);
+
+    private ActivityObjectConverterUtil converterUtil;
+
+    private ActivityObjectConverterProcessorConfiguration configuration;
+
+    public ActivityObjectConverterProcessor() {
+    }
+
+    public ActivityObjectConverterProcessor(ActivityObjectConverterProcessorConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    @Override
+    public String getId() {
+        return STREAMS_ID;
+    }
+
+    @Override
+    public List<StreamsDatum> process(StreamsDatum entry) {
+
+        List<StreamsDatum> result = Lists.newLinkedList();
+        Object document = entry.getDocument();
+
+        try {
+
+            // first determine which classes this document might actually be
+            ActivityObject activityObject = converterUtil.convert(document);
+
+            StreamsDatum datum = DatumUtils.cloneDatum(entry);
+            datum.setId(activityObject.getId());
+            datum.setDocument(activityObject);
+            result.add(datum);
+
+        } catch( Exception e ) {
+            LOGGER.warn("General exception in process! " + e.getMessage());
+        } finally {
+            return result;
+        }
+
+    }
+
+    @Override
+    public void prepare(Object configurationObject) {
+        if( configurationObject instanceof ActivityObjectConverterProcessorConfiguration)
+            converterUtil = ActivityObjectConverterUtil.getInstance((ActivityObjectConverterProcessorConfiguration)configurationObject);
+        else
+            converterUtil = ActivityObjectConverterUtil.getInstance();
+
+    }
+
+    @Override
+    public void cleanUp() {
+
+    }
+
+};

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterUtil.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterUtil.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterUtil.java
new file mode 100644
index 0000000..629d82a
--- /dev/null
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/ActivityObjectConverterUtil.java
@@ -0,0 +1,239 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.streams.converter;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.streams.data.ActivityObjectConverter;
+import org.apache.streams.data.DocumentClassifier;
+import org.apache.streams.data.util.ActivityUtil;
+import org.apache.streams.exceptions.ActivityConversionException;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * ActivityObjectConverterUtil converts document into all possible ActivityObject
+ * representations based on registered DocumentClassifiers and ActivityObjectConverters.
+ *
+ * Implementations and contributed modules may implement DocumentClassifiers
+ * and ActivityObjectConverters to translate additional document types into desired
+ * ActivityObject formats.
+ *
+ * A DocumentClassifier's reponsibility is to recognize document formats and label them,
+ * using a jackson-compatible POJO class.
+ *
+ * An ActivityObjectConverter's reponsibility is to converting a raw document associated with an
+ * incoming POJO class into an activity object.
+ *
+ */
+public class ActivityObjectConverterUtil {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(ActivityObjectConverterUtil.class);
+
+    private static final ActivityObjectConverterUtil INSTANCE = new ActivityObjectConverterUtil();
+
+    public static ActivityObjectConverterUtil getInstance(){
+        return INSTANCE;
+    }
+
+    public static ActivityObjectConverterUtil getInstance(ActivityObjectConverterProcessorConfiguration configuration){
+        return new ActivityObjectConverterUtil(configuration);
+    }
+
+    private List<DocumentClassifier> classifiers = Lists.newLinkedList();
+    private List<ActivityObjectConverter> converters = Lists.newLinkedList();
+
+    /*
+      Use getInstance to get a globally shared thread-safe ActivityConverterUtil,
+      rather than call this constructor.  Reflection-based resolution of
+      converters across all modules can be slow and should only happen
+      once per JVM.
+     */
+    protected ActivityObjectConverterUtil() {
+        configure();
+    }
+
+    protected ActivityObjectConverterUtil(ActivityObjectConverterProcessorConfiguration configuration) {
+        classifiers = configuration.getClassifiers();
+        converters = configuration.getConverters();
+        configure();
+    }
+
+    public synchronized ActivityObject convert(Object document) {
+
+        ActivityObject result = null;
+
+        List<Class> detectedClasses = detectClasses(document);
+
+        if( detectedClasses.size() == 0 ) {
+            LOGGER.warn("Unable to classify");
+            return null;
+        } else {
+            LOGGER.debug("Classified document as " + detectedClasses);
+        }
+
+        // for each of these classes:
+        //   use TypeUtil to switch the document to that type
+        Map<Class, Object> typedDocs = convertToDetectedClasses(detectedClasses, document);
+
+        if( typedDocs.size() == 0 ) {
+            LOGGER.warn("Unable to convert to any detected Class");
+            return null;
+        }
+        else {
+            LOGGER.debug("Document has " + typedDocs.size() + " representations: " + typedDocs.toString());
+        }
+
+        // for each specified / discovered converter
+        for( ActivityObjectConverter converter : converters ) {
+
+            Object typedDoc = typedDocs.get(converter.requiredClass());
+
+            ActivityObject activityObject = applyConverter(converter, typedDoc);
+
+            // prefer the most specific ActivityObject sub-class returned by all converters
+            if( activityObject != null ) {
+                if (result == null)
+                    result = activityObject;
+                else if (isAncestor(activityObject.getClass(), result.getClass()))
+                    result = activityObject;
+            }
+
+        }
+
+        return result;
+    }
+
+    protected ActivityObject applyConverter(ActivityObjectConverter converter, Object typedDoc) {
+
+        ActivityObject activityObject = null;
+        // if the document can be typed as the required class
+        if( typedDoc != null ) {
+
+            // let the converter create activities if it can
+            try {
+                activityObject = convertToActivityObject(converter, typedDoc);
+            } catch( Exception e ) {
+                LOGGER.debug("convertToActivity caught exception " + e.getMessage());
+            }
+
+        }
+        return activityObject;
+    }
+
+    protected ActivityObject convertToActivityObject(ActivityObjectConverter converter, Object document) {
+
+        ActivityObject activityObject = null;
+        try {
+            activityObject = converter.toActivityObject(document);
+        } catch (ActivityConversionException e1) {
+            LOGGER.debug(converter.getClass().getCanonicalName() + " unable to convert " + converter.requiredClass().getClass().getCanonicalName() + " to Activity");
+        }
+
+        return activityObject;
+
+    }
+
+    protected List<Class> detectClasses(Object document) {
+
+        // ConcurrentHashSet is preferable, but it's only in guava 15+
+        // spark 1.5.0 uses guava 14 so for the moment this is the workaround
+        // Set<Class> detectedClasses = new ConcurrentHashSet();
+        Set<Class> detectedClasses = Collections.newSetFromMap(new ConcurrentHashMap<Class, Boolean>());
+        for( DocumentClassifier classifier : classifiers ) {
+            try {
+                List<Class> detected = classifier.detectClasses(document);
+                if (detected != null && detected.size() > 0)
+                    detectedClasses.addAll(detected);
+            } catch( Exception e) {
+                LOGGER.warn("{} failed in method detectClasses - ()", classifier.getClass().getCanonicalName(), e);
+            }
+        }
+
+        return Lists.newArrayList(detectedClasses);
+    }
+
+    private Map<Class, Object> convertToDetectedClasses(List<Class> datumClasses, Object document) {
+
+        Map<Class, Object> convertedDocuments = Maps.newHashMap();
+        for( Class detectedClass : datumClasses ) {
+
+            Object typedDoc;
+            if (detectedClass.isInstance(document))
+                typedDoc = document;
+            else
+                typedDoc = TypeConverterUtil.getInstance().convert(document, detectedClass);
+
+            if( typedDoc != null )
+                convertedDocuments.put(detectedClass, typedDoc);
+        }
+
+        return convertedDocuments;
+    }
+
+    public void configure() {
+        Reflections reflections = new Reflections(new ConfigurationBuilder()
+                .setUrls(ClasspathHelper.forPackage("org.apache.streams"))
+                .setScanners(new SubTypesScanner()));
+        if ( classifiers.size() == 0) {
+            Set<Class<? extends DocumentClassifier>> classifierClasses = reflections.getSubTypesOf(DocumentClassifier.class);
+            for (Class classifierClass : classifierClasses) {
+                try {
+                    this.classifiers.add((DocumentClassifier) classifierClass.newInstance());
+                } catch (Exception e) {
+                    LOGGER.warn("Exception instantiating " + classifierClass);
+                }
+            }
+        }
+        Preconditions.checkArgument(classifiers.size() > 0);
+        if ( converters.size() == 0) {
+            Set<Class<? extends ActivityObjectConverter>> converterClasses = reflections.getSubTypesOf(ActivityObjectConverter.class);
+            for (Class converterClass : converterClasses) {
+                try {
+                    this.converters.add((ActivityObjectConverter) converterClass.newInstance());
+                } catch (Exception e) {
+                    LOGGER.warn("Exception instantiating " + converterClass);
+                }
+            }
+        }
+        Preconditions.checkArgument(this.converters.size() > 0);
+    }
+
+    private boolean isAncestor(Class possibleDescendant, Class possibleAncestor) {
+        if( possibleDescendant.equals(Object.class))
+            return false;
+        if( possibleDescendant.getSuperclass().equals(possibleAncestor))
+            return true;
+        else return isAncestor(possibleDescendant.getSuperclass(), possibleAncestor);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseObjectNodeActivityObjectConverter.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseObjectNodeActivityObjectConverter.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseObjectNodeActivityObjectConverter.java
new file mode 100644
index 0000000..cb66414
--- /dev/null
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseObjectNodeActivityObjectConverter.java
@@ -0,0 +1,76 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.streams.converter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.streams.data.ActivityConverter;
+import org.apache.streams.data.ActivityObjectConverter;
+import org.apache.streams.exceptions.ActivityConversionException;
+import org.apache.streams.jackson.StreamsJacksonMapper;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+
+import java.util.List;
+
+/**
+ * BaseObjectNodeActivityConverter is included by default in all
+ * @see {@link ActivityConverterProcessor}
+ *
+ * Ensures generic ObjectNode representation of an Activity can be converted to Activity
+ *
+ */
+public class BaseObjectNodeActivityObjectConverter implements ActivityObjectConverter<ObjectNode> {
+
+    public static Class requiredClass = ObjectNode.class;
+
+    private ObjectMapper mapper = StreamsJacksonMapper.getInstance();
+
+    @Override
+    public Class requiredClass() {
+        return requiredClass;
+    }
+
+    @Override
+    public String serializationFormat() {
+        return null;
+    }
+
+    @Override
+    public ObjectNode fromActivityObject(ActivityObject deserialized) throws ActivityConversionException {
+        try {
+            return mapper.convertValue(deserialized, ObjectNode.class);
+        } catch (Exception e) {
+            throw new ActivityConversionException();
+        }
+    }
+
+    @Override
+    public ActivityObject toActivityObject(ObjectNode serialized) throws ActivityConversionException {
+        try {
+            return mapper.convertValue(serialized, ActivityObject.class);
+        } catch (Exception e) {
+            throw new ActivityConversionException();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseStringActivityObjectConverter.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseStringActivityObjectConverter.java b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseStringActivityObjectConverter.java
new file mode 100644
index 0000000..3bbbdac
--- /dev/null
+++ b/streams-components/streams-converters/src/main/java/org/apache/streams/converter/BaseStringActivityObjectConverter.java
@@ -0,0 +1,70 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.streams.converter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.streams.data.ActivityObjectConverter;
+import org.apache.streams.exceptions.ActivityConversionException;
+import org.apache.streams.jackson.StreamsJacksonMapper;
+import org.apache.streams.pojo.json.ActivityObject;
+
+/**
+ * BaseObjectNodeActivityConverter is included by default in all
+ * @see {@link ActivityConverterProcessor}
+ *
+ * Ensures generic ObjectNode representation of an Activity can be converted to Activity
+ *
+ */
+public class BaseStringActivityObjectConverter implements ActivityObjectConverter<String> {
+
+    public static Class requiredClass = String.class;
+
+    private ObjectMapper mapper = StreamsJacksonMapper.getInstance();
+
+    @Override
+    public Class requiredClass() {
+        return requiredClass;
+    }
+
+    @Override
+    public String serializationFormat() {
+        return null;
+    }
+
+    @Override
+    public String fromActivityObject(ActivityObject deserialized) throws ActivityConversionException {
+        try {
+            return mapper.writeValueAsString(deserialized);
+        } catch (Exception e) {
+            throw new ActivityConversionException();
+        }
+    }
+
+    @Override
+    public ActivityObject toActivityObject(String serialized) throws ActivityConversionException {
+        try {
+            return mapper.readValue(serialized, ActivityObject.class);
+        } catch (Exception e) {
+            throw new ActivityConversionException();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/converter/ActivityObjectConverterProcessorConfiguration.json
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/converter/ActivityObjectConverterProcessorConfiguration.json b/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/converter/ActivityObjectConverterProcessorConfiguration.json
new file mode 100644
index 0000000..7eacacb
--- /dev/null
+++ b/streams-components/streams-converters/src/main/jsonschema/org/apache/streams/converter/ActivityObjectConverterProcessorConfiguration.json
@@ -0,0 +1,26 @@
+{
+    "$schema": "http://json-schema.org/draft-03/schema",
+    "$license": [
+        "http://www.apache.org/licenses/LICENSE-2.0"
+    ],
+    "id": "#",
+    "type": "object",
+    "javaType" : "org.apache.streams.converter.ActivityObjectConverterProcessorConfiguration",
+    "javaInterfaces": ["java.io.Serializable"],
+    "properties": {
+        "classifiers": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "javaType": "org.apache.streams.data.DocumentClassifier"
+            }
+        },
+        "converters": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "javaType": "org.apache.streams.data.ActivityObjectConverter"
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/BaseActivityObjectConverterProcessorTest.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/BaseActivityObjectConverterProcessorTest.java b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/BaseActivityObjectConverterProcessorTest.java
new file mode 100644
index 0000000..30b3ef0
--- /dev/null
+++ b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/BaseActivityObjectConverterProcessorTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.converter.test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.streams.converter.ActivityObjectConverterProcessor;
+import org.apache.streams.converter.ActivityObjectConverterProcessorConfiguration;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.jackson.StreamsJacksonMapper;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+import static junit.framework.Assert.*;
+
+/**
+ * Test for
+ * @see {@link ActivityObjectConverterProcessor}
+ *
+ * Test that default String & ObjectNode conversion works.
+ */
+public class BaseActivityObjectConverterProcessorTest {
+
+    private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
+
+    private static final String ACTIVITYOBJECT_JSON = "{\"id\":\"id\",\"objectType\":\"person\"}";
+
+    ActivityObjectConverterProcessor processor;
+
+    @Before
+    public void setup() {
+        processor = new ActivityObjectConverterProcessor(new ActivityObjectConverterProcessorConfiguration());
+        processor.prepare(new ActivityObjectConverterProcessorConfiguration());
+    }
+
+    @Test
+    public void testBaseActivityObjectSerializerProcessorInvalid() {
+        String INVALID_DOCUMENT = " 38Xs}";
+        StreamsDatum datum = new StreamsDatum(INVALID_DOCUMENT);
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testActivityObjectConverterProcessorString() {
+        StreamsDatum datum = new StreamsDatum(ACTIVITYOBJECT_JSON);
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        StreamsDatum resultDatum = result.get(0);
+        assertNotNull(resultDatum);
+        assertNotNull(resultDatum.getDocument());
+        assertTrue(resultDatum.getDocument() instanceof ActivityObject);
+        assertTrue(((ActivityObject)resultDatum.getDocument()).getObjectType().equals("person"));
+    }
+
+    @Test
+    public void testBaseActivityObjectSerializerProcessorObject() throws IOException {
+        ObjectNode OBJECT_DOCUMENT = mapper.readValue(ACTIVITYOBJECT_JSON, ObjectNode.class);
+        StreamsDatum datum = new StreamsDatum(OBJECT_DOCUMENT);
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        StreamsDatum resultDatum = result.get(0);
+        assertNotNull(resultDatum);
+        assertNotNull(resultDatum.getDocument());
+        assertTrue(resultDatum.getDocument() instanceof ActivityObject);
+        assertTrue(((ActivityObject)resultDatum.getDocument()).getObjectType().equals("person"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverter.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverter.java b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverter.java
new file mode 100644
index 0000000..a20edc5
--- /dev/null
+++ b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverter.java
@@ -0,0 +1,62 @@
+/*
+ * 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.converter.test;
+
+import com.google.common.collect.Lists;
+import org.apache.streams.data.ActivityConverter;
+import org.apache.streams.data.ActivityObjectConverter;
+import org.apache.streams.exceptions.ActivityConversionException;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.apache.streams.pojo.json.Provider;
+
+import java.util.List;
+
+/**
+ * Support class for
+ * @see {@link CustomActivityObjectConverterProcessorTest}
+ */
+public class CustomActivityObjectConverter implements ActivityObjectConverter<CustomType> {
+
+    @Override
+    public Class requiredClass() {
+        return CustomType.class;
+    }
+
+    @Override
+    public String serializationFormat() {
+        return null;
+    }
+
+    @Override
+    public CustomType fromActivityObject(ActivityObject deserialized) throws ActivityConversionException {
+        CustomType customType = new CustomType();
+        customType.setTest(deserialized.getId());
+        return customType;
+    }
+
+    @Override
+    public ActivityObject toActivityObject(CustomType document) throws ActivityConversionException {
+        ActivityObject customActivityObject = new ActivityObject();
+        customActivityObject.setId(document.getTest());
+        customActivityObject.setObjectType(document.getTest());
+        return customActivityObject;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverterProcessorTest.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverterProcessorTest.java b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverterProcessorTest.java
new file mode 100644
index 0000000..cefc0d5
--- /dev/null
+++ b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomActivityObjectConverterProcessorTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.converter.test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.streams.converter.ActivityConverterProcessor;
+import org.apache.streams.converter.ActivityConverterProcessorConfiguration;
+import org.apache.streams.converter.ActivityObjectConverterProcessor;
+import org.apache.streams.converter.ActivityObjectConverterProcessorConfiguration;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.jackson.StreamsJacksonMapper;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+import static junit.framework.Assert.*;
+
+/**
+ * Test for
+ * @see {@link ActivityConverterProcessor}
+ *
+ * Test that arbitrary POJO conversion works, including when POJO represented as String & ObjectNode.
+ */
+public class CustomActivityObjectConverterProcessorTest {
+
+    private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
+
+    ActivityObjectConverterProcessor processor;
+
+    ActivityObjectConverterProcessorConfiguration configuration;
+
+    CustomType testDocument;
+
+    @Before
+    public void setup() {
+        configuration = new ActivityObjectConverterProcessorConfiguration();
+        configuration.getClassifiers().add(new CustomDocumentClassifier());
+        configuration.getConverters().add(new CustomActivityObjectConverter());
+        processor = new ActivityObjectConverterProcessor(configuration);
+        processor.prepare(configuration);
+        testDocument = new CustomType();
+        testDocument.setTest("testValue");
+    }
+
+    @Test
+    public void testCustomActivityObjectConverterProcessorString() throws IOException  {
+        StreamsDatum datum = new StreamsDatum(mapper.writeValueAsString(testDocument));
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        StreamsDatum resultDatum = result.get(0);
+        assertNotNull(resultDatum);
+        assertNotNull(resultDatum.getDocument());
+        assertTrue(resultDatum.getDocument() instanceof ActivityObject);
+        assertTrue(((ActivityObject)resultDatum.getDocument()).getObjectType().equals("testValue"));
+    }
+
+    @Test
+    public void testCustomActivityObjectSerializerProcessorObjectNode() throws IOException {
+        ObjectNode OBJECT_DOCUMENT = mapper.convertValue(testDocument, ObjectNode.class);
+        StreamsDatum datum = new StreamsDatum(OBJECT_DOCUMENT);
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        StreamsDatum resultDatum = result.get(0);
+        assertNotNull(resultDatum);
+        assertNotNull(resultDatum.getDocument());
+        assertTrue(resultDatum.getDocument() instanceof ActivityObject);
+        assertTrue(((ActivityObject)resultDatum.getDocument()).getObjectType().equals("testValue"));
+    }
+
+    @Test
+    public void testCustomActivityObjectSerializerProcessorPOJO() throws IOException {
+        StreamsDatum datum = new StreamsDatum(testDocument);
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        StreamsDatum resultDatum = result.get(0);
+        assertNotNull(resultDatum);
+        assertNotNull(resultDatum.getDocument());
+        assertTrue(resultDatum.getDocument() instanceof ActivityObject);
+        assertTrue(((ActivityObject)resultDatum.getDocument()).getObjectType().equals("testValue"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomType.java
----------------------------------------------------------------------
diff --git a/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomType.java b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomType.java
index ddcec4b..4253c9c 100644
--- a/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomType.java
+++ b/streams-components/streams-converters/src/test/java/org/apache/streams/converter/test/CustomType.java
@@ -22,6 +22,7 @@ package org.apache.streams.converter.test;
 /**
  * Support class for
  * @see {@link org.apache.streams.converter.test.CustomActivityConverterProcessorTest}
+ * @see {@link org.apache.streams.converter.test.CustomActivityObjectConverterProcessorTest}
  */
 public class CustomType {
 

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJsonUserActivityObjectConverter.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJsonUserActivityObjectConverter.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJsonUserActivityObjectConverter.java
new file mode 100644
index 0000000..d62b1e8
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJsonUserActivityObjectConverter.java
@@ -0,0 +1,64 @@
+/*
+ * 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.twitter.converter;
+
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.streams.data.ActivityConverter;
+import org.apache.streams.data.ActivityObjectConverter;
+import org.apache.streams.exceptions.ActivityConversionException;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.apache.streams.twitter.pojo.User;
+
+import java.util.List;
+
+import static org.apache.streams.twitter.converter.util.TwitterActivityUtil.buildActor;
+import static org.apache.streams.twitter.converter.util.TwitterActivityUtil.updateActivity;
+
+public class TwitterJsonUserActivityObjectConverter implements ActivityObjectConverter<User> {
+
+    public static Class requiredClass = User.class;
+
+    @Override
+    public Class requiredClass() {
+        return requiredClass;
+    }
+
+    private static TwitterJsonUserActivityObjectConverter instance = new TwitterJsonUserActivityObjectConverter();
+
+    public static TwitterJsonUserActivityObjectConverter getInstance() {
+        return instance;
+    }
+
+    @Override
+    public String serializationFormat() {
+        return null;
+    }
+
+    @Override
+    public User fromActivityObject(ActivityObject deserialized) throws ActivityConversionException {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public ActivityObject toActivityObject(User serialized) throws ActivityConversionException {
+        return buildActor(serialized);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TwitterActivityObjectsConvertersTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TwitterActivityObjectsConvertersTest.java b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TwitterActivityObjectsConvertersTest.java
new file mode 100644
index 0000000..4a663e2
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TwitterActivityObjectsConvertersTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.twitter.test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import org.apache.streams.converter.ActivityConverterUtil;
+import org.apache.streams.converter.ActivityObjectConverterUtil;
+import org.apache.streams.data.util.ActivityUtil;
+import org.apache.streams.jackson.StreamsJacksonMapper;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
+import org.apache.streams.twitter.converter.TwitterDateTimeFormat;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * Tests {@link: org.apache.streams.twitter.converter.*}
+ */
+public class TwitterActivityObjectsConvertersTest {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(TwitterActivityObjectsConvertersTest.class);
+
+    private ActivityObjectConverterUtil activityObjectConverterUtil = ActivityObjectConverterUtil.getInstance();
+
+    private String user = "{\"id\":1663018644,\"id_str\":\"1663018644\",\"name\":\"M.R. Clark\",\"screen_name\":\"cantennisfan\",\"location\":\"\",\"url\":null,\"description\":null,\"protected\":false,\"verified\":false,\"followers_count\":0,\"friends_count\":5,\"listed_count\":0,\"favourites_count\":2,\"statuses_count\":72,\"created_at\":\"Sun Aug 11 17:23:47 +0000 2013\",\"utc_offset\":-18000,\"time_zone\":\"Eastern Time (US & Canada)\",\"geo_enabled\":false,\"lang\":\"en\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"C0DEED\",\"profile_background_image_url\":\"http://abs.twimg.com/images/themes/theme1/bg.png\",\"profile_background_image_url_https\":\"https://abs.twimg.com/images/themes/theme1/bg.png\",\"profile_background_tile\":false,\"profile_link_color\":\"0084B4\",\"profile_sidebar_border_color\":\"C0DEED\",\"profile_sidebar_fill_color\":\"DDEEF6\",\"profile_text_color\":\"333333\",\"profile_use_background_image\":true,\"profile_image_
 url\":\"http://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png\",\"profile_image_url_https\":\"https://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png\",\"default_profile\":true,\"default_profile_image\":true,\"following\":null,\"follow_request_sent\":null,\"notifications\":null,\"status\":{\"created_at\":\"Thu Jan 01 14:11:48 +0000 2015\",\"id\":550655634706669568,\"id_str\":\"550655634706669568\",\"text\":\"CBC Media Centre - CBC - Air Farce New Year's Eve 2014/2015: http://t.co/lMlL9VbC5e\",\"source\":\"<a href=\\\"https://dev.twitter.com/docs/tfw\\\" rel=\\\"nofollow\\\">Twitter for Websites</a>\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"retweet_count\":0,\"favorite_count\":0,\"entities\":{\"hashtags\":[],\"trends\":[],\
 "urls\":[{\"url\":\"http://t.co/lMlL9VbC5e\",\"expanded_url\":\"http://www.cbc.ca/mediacentre/air-farce-new-years-eve-20142015.html#.VKVVarDhVxR.twitter\",\"display_url\":\"cbc.ca/mediacentre/ai…\",\"indices\":[61,83]}],\"user_mentions\":[],\"symbols\":[]},\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"filter_level\":\"medium\",\"lang\":\"en\",\"timestamp_ms\":\"1420121508658\"}}\n";
+
+    @Test
+    public void testConvertUser() {
+        ActivityObject activityObject = activityObjectConverterUtil.convert(user);
+        assert( activityObject != null );
+        if( !ActivityUtil.isValid(activityObject) )
+            Assert.fail();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/786f9ea7/streams-pojo/src/main/java/org/apache/streams/data/util/ActivityUtil.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/util/ActivityUtil.java b/streams-pojo/src/main/java/org/apache/streams/data/util/ActivityUtil.java
index 8c6774a..1234d73 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/util/ActivityUtil.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/util/ActivityUtil.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.ActivityObject;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -130,4 +131,10 @@ public class ActivityUtil {
                 && activity.getProvider() != null
                 && activity.getProvider().getId() != null;
     }
+
+    public static boolean isValid(ActivityObject activityObject) {
+        return activityObject != null
+            && activityObject.getId() != null
+            && activityObject.getObjectType() != null;
+    }
 }



[2/3] incubator-streams git commit: STREAMS-385: missing class

Posted by sb...@apache.org.
STREAMS-385: missing class


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

Branch: refs/heads/master
Commit: 2b39e8351e883cd11fce882baf2b1f080a1db757
Parents: 786f9ea
Author: Steve Blackmon (@steveblackmon) <sb...@apache.org>
Authored: Mon Nov 30 10:19:51 2015 -0600
Committer: Steve Blackmon (@steveblackmon) <sb...@apache.org>
Committed: Mon Nov 30 10:21:38 2015 -0600

----------------------------------------------------------------------
 .../streams/data/ActivityObjectConverter.java   | 65 ++++++++++++++++++++
 1 file changed, 65 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/2b39e835/streams-pojo/src/main/java/org/apache/streams/data/ActivityObjectConverter.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/ActivityObjectConverter.java b/streams-pojo/src/main/java/org/apache/streams/data/ActivityObjectConverter.java
new file mode 100644
index 0000000..0d25d91
--- /dev/null
+++ b/streams-pojo/src/main/java/org/apache/streams/data/ActivityObjectConverter.java
@@ -0,0 +1,65 @@
+/*
+ * 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.data;
+
+import org.apache.streams.exceptions.ActivityConversionException;
+import org.apache.streams.pojo.json.ActivityObject;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Converts non-ActivityObject documents to ActivityObjects and back.
+ *
+ * Each converter may return zero or one alternative representations.
+ *
+ */
+
+public interface ActivityObjectConverter<T> extends Serializable {
+
+    /**
+     * What class does this ActivityConverter require?
+     *
+     * @return The class the ActivityConverter requires.  Should always return the templated class.
+     */
+    Class requiredClass();
+
+    /**
+     * Gets the supported content type that can be deserialized/serialized
+     *
+     * @return A string representing the format name.  Can be an IETF MIME type or other
+     */
+    String serializationFormat();
+
+    /**
+     * Converts the activity to a POJO representation.
+     *
+     * @param deserialized the string
+     * @return a fully populated Activity object
+     */
+    T fromActivityObject(ActivityObject deserialized) throws ActivityConversionException;
+
+    /**
+     * Converts a POJO into an ActivityObject
+     * @param serialized the string representation
+     * @return a fully populated Activity object
+     */
+    ActivityObject toActivityObject(T serialized) throws ActivityConversionException;
+
+}


[3/3] incubator-streams git commit: Merge branch 'STREAMS-385'

Posted by sb...@apache.org.
Merge branch 'STREAMS-385'

* STREAMS-385:
  STREAMS-385: missing class
  resolves STREAMS-385


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

Branch: refs/heads/master
Commit: 3e446b90faf1a2e895856fb5710e75dc619ede99
Parents: 0750505 2b39e83
Author: Steve Blackmon (@steveblackmon) <sb...@apache.org>
Authored: Mon Nov 30 17:57:45 2015 -0600
Committer: Steve Blackmon (@steveblackmon) <sb...@apache.org>
Committed: Mon Nov 30 17:57:45 2015 -0600

----------------------------------------------------------------------
 .../ActivityObjectConverterProcessor.java       | 103 ++++++++
 .../converter/ActivityObjectConverterUtil.java  | 239 +++++++++++++++++++
 .../BaseObjectNodeActivityObjectConverter.java  |  76 ++++++
 .../BaseStringActivityObjectConverter.java      |  70 ++++++
 ...tyObjectConverterProcessorConfiguration.json |  26 ++
 ...aseActivityObjectConverterProcessorTest.java |  93 ++++++++
 .../test/CustomActivityObjectConverter.java     |  62 +++++
 ...tomActivityObjectConverterProcessorTest.java | 106 ++++++++
 .../streams/converter/test/CustomType.java      |   1 +
 .../TwitterJsonUserActivityObjectConverter.java |  64 +++++
 .../TwitterActivityObjectsConvertersTest.java   |  55 +++++
 .../streams/data/ActivityObjectConverter.java   |  65 +++++
 .../apache/streams/data/util/ActivityUtil.java  |   7 +
 13 files changed, 967 insertions(+)
----------------------------------------------------------------------