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 2016/11/25 20:24:52 UTC

[11/42] incubator-streams git commit: STREAMS-440: custom checkstyle.xml, address compliance

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorMojoIT.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorMojoIT.java b/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorMojoIT.java
index f2ccd2a..a1d48cc 100644
--- a/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorMojoIT.java
+++ b/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorMojoIT.java
@@ -41,46 +41,45 @@ import static org.apache.streams.plugins.test.StreamsPojoSourceGeneratorTest.jav
  */
 public class StreamsPojoSourceGeneratorMojoIT extends TestCase {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsPojoSourceGeneratorMojoIT.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsPojoSourceGeneratorMojoIT.class);
 
-    protected void setUp() throws Exception
-    {
-        // required for mojo lookups to work
-        super.setUp();
-    }
+  protected void setUp() throws Exception {
+    // required for mojo lookups to work
+    super.setUp();
+  }
 
 
-    @Test
-    public void testStreamsPojoSourceGeneratorMojo() throws Exception {
+  @Test
+  public void testStreamsPojoSourceGeneratorMojo() throws Exception {
 
-        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/streams-plugin-pojo" );
+    File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/streams-plugin-pojo" );
 
-        Verifier verifier;
+    Verifier verifier;
 
-        verifier = new Verifier( testDir.getAbsolutePath() );
+    verifier = new Verifier( testDir.getAbsolutePath() );
 
-        List cliOptions = new ArrayList();
-        cliOptions.add( "-N" );
-        verifier.executeGoals( Lists.<String>newArrayList(
-                "clean",
-                "dependency:unpack-dependencies",
-                "generate-sources",
-                "compile"));
+    List cliOptions = new ArrayList();
+    cliOptions.add( "-N" );
+    verifier.executeGoals( Lists.<String>newArrayList(
+        "clean",
+        "dependency:unpack-dependencies",
+        "generate-sources",
+        "compile"));
 
-        verifier.verifyErrorFreeLog();
+    verifier.verifyErrorFreeLog();
 
-        verifier.resetStreams();
+    verifier.resetStreams();
 
-        File testOutput = new File(testDir.getAbsolutePath() + "/target/generated-sources/pojo-mojo");
+    File testOutput = new File(testDir.getAbsolutePath() + "/target/generated-sources/pojo-mojo");
 
-        assert( testOutput != null );
-        assert( testOutput.exists() == true );
-        assert( testOutput.isDirectory() == true );
+    assert ( testOutput != null );
+    assert ( testOutput.exists() == true );
+    assert ( testOutput.isDirectory() == true );
 
-        Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput)
-                .filter(javaFilter);
-        Collection<File> outputCollection = Lists.newArrayList(outputIterator);
-        assert( outputCollection.size() > 133 );
+    Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput)
+        .filter(javaFilter);
+    Collection<File> outputCollection = Lists.newArrayList(outputIterator);
+    assert ( outputCollection.size() > 133 );
 
-    }
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorTest.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorTest.java b/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorTest.java
index 7e04e3e..a16c1da 100644
--- a/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorTest.java
+++ b/streams-plugins/streams-plugin-pojo/src/test/java/org/apache/streams/plugins/test/StreamsPojoSourceGeneratorTest.java
@@ -19,72 +19,75 @@
 
 package org.apache.streams.plugins.test;
 
+import org.apache.streams.plugins.StreamsPojoGenerationConfig;
+import org.apache.streams.plugins.StreamsPojoSourceGenerator;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 import com.google.common.io.Files;
-import org.apache.streams.plugins.StreamsPojoGenerationConfig;
-import org.apache.streams.plugins.StreamsPojoSourceGenerator;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.annotation.Nullable;
 import java.io.File;
-import java.io.FileFilter;
 import java.util.Collection;
 import java.util.List;
+import javax.annotation.Nullable;
 
 /**
- * Test that Activity beans are compatible with the example activities in the spec.
+ * Tests that StreamsPojoSourceGenerator via SDK generates java sources.
+ *
+ * @throws Exception Exception
  */
 public class StreamsPojoSourceGeneratorTest {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsPojoSourceGeneratorTest.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsPojoSourceGeneratorTest.class);
 
-    public static final Predicate<File> javaFilter = new Predicate<File>() {
-        @Override
-        public boolean apply(@Nullable File file) {
-            if( file.getName().endsWith(".java") )
-                return true;
-            else return false;
-        }
-    };
+  public static final Predicate<File> javaFilter = new Predicate<File>() {
+    @Override
+    public boolean apply(@Nullable File file) {
+      if ( file.getName().endsWith(".java") ) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  };
 
-    /**
-     * Tests that all example activities can be loaded into Activity beans
-     *
-     * @throws Exception
-     */
-    @Test
-    public void testStreamsPojoSourceGenerator() throws Exception {
+  /**
+   * Tests that StreamsPojoSourceGenerator via SDK generates pig resources.
+   *
+   * @throws Exception Exception
+   */
+  @Test
+  public void testStreamsPojoSourceGenerator() throws Exception {
 
-        StreamsPojoGenerationConfig config = new StreamsPojoGenerationConfig();
+    StreamsPojoGenerationConfig config = new StreamsPojoGenerationConfig();
 
-        List<String> sourcePaths = Lists.newArrayList(
-            "target/test-classes/activitystreams-schemas/activity.json",
-            "target/test-classes/activitystreams-schemas/collection.json",
-            "target/test-classes/activitystreams-schemas/media_link.json",
-            "target/test-classes/activitystreams-schemas/object.json",
-            "target/test-classes/activitystreams-schemas/objectTypes",
-            "target/test-classes/activitystreams-schemas/verbs"
-        );
-        config.setSourcePaths(sourcePaths);
+    List<String> sourcePaths = Lists.newArrayList(
+        "target/test-classes/activitystreams-schemas/activity.json",
+        "target/test-classes/activitystreams-schemas/collection.json",
+        "target/test-classes/activitystreams-schemas/media_link.json",
+        "target/test-classes/activitystreams-schemas/object.json",
+        "target/test-classes/activitystreams-schemas/objectTypes",
+        "target/test-classes/activitystreams-schemas/verbs"
+    );
+    config.setSourcePaths(sourcePaths);
 
-        config.setTargetPackage("org.apache.streams.pojo");
-        config.setTargetDirectory("target/generated-sources/pojo");
+    config.setTargetPackage("org.apache.streams.pojo");
+    config.setTargetDirectory("target/generated-sources/pojo");
 
-        StreamsPojoSourceGenerator streamsPojoSourceGenerator = new StreamsPojoSourceGenerator(config);
-        streamsPojoSourceGenerator.run();
+    StreamsPojoSourceGenerator streamsPojoSourceGenerator = new StreamsPojoSourceGenerator(config);
+    streamsPojoSourceGenerator.run();
 
-        assert( config.getTargetDirectory() != null );
-        assert( config.getTargetDirectory().exists() == true );
-        assert( config.getTargetDirectory().isDirectory() == true );
+    assert ( config.getTargetDirectory() != null );
+    assert ( config.getTargetDirectory().exists() == true );
+    assert ( config.getTargetDirectory().isDirectory() == true );
 
-        Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(config.getTargetDirectory())
-                .filter(javaFilter);
-        Collection<File> outputCollection = Lists.newArrayList(outputIterator);
-        assert( outputCollection.size() > 133 );
+    Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(config.getTargetDirectory())
+        .filter(javaFilter);
+    Collection<File> outputCollection = Lists.newArrayList(outputIterator);
+    assert ( outputCollection.size() > 133 );
 
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaGenerationConfig.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaGenerationConfig.java b/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaGenerationConfig.java
index 18ae551..f6ee814 100644
--- a/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaGenerationConfig.java
+++ b/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaGenerationConfig.java
@@ -19,47 +19,40 @@
 
 package org.apache.streams.plugins;
 
-import org.jsonschema2pojo.DefaultGenerationConfig;
-import org.jsonschema2pojo.util.URLUtil;
-
 import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 /**
- * Created by sblackmon on 3/27/16.
+ * Configures StreamsScalaSourceGenerator.
  */
 public class StreamsScalaGenerationConfig {
 
-    private List<String> sourcePackages;
-    private String targetPackage;
-    private String targetDirectory;
+  private List<String> sourcePackages;
+  private String targetPackage;
+  private String targetDirectory;
 
-    public void setSourcePackages(List<String> sourcePackages) {
-        this.sourcePackages = sourcePackages;
-    }
+  public void setSourcePackages(List<String> sourcePackages) {
+    this.sourcePackages = sourcePackages;
+  }
 
-    public List<String> getSourcePackages() {
-        return sourcePackages;
-    }
+  public List<String> getSourcePackages() {
+    return sourcePackages;
+  }
 
-    public void setTargetPackage(String targetPackage) {
-        this.targetPackage = targetPackage;
-    }
+  public void setTargetPackage(String targetPackage) {
+    this.targetPackage = targetPackage;
+  }
 
-    public void setTargetDirectory(String targetDirectory) {
-        this.targetDirectory = targetDirectory;
-    }
+  public void setTargetDirectory(String targetDirectory) {
+    this.targetDirectory = targetDirectory;
+  }
 
-    public String getTargetPackage() {
-        return targetPackage;
-    }
+  public String getTargetPackage() {
+    return targetPackage;
+  }
 
-    public File getTargetDirectory() {
-        return new File(targetDirectory);
-    }
+  public File getTargetDirectory() {
+    return new File(targetDirectory);
+  }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGenerator.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGenerator.java b/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGenerator.java
index 4891c0d..ce9b766 100644
--- a/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGenerator.java
+++ b/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGenerator.java
@@ -20,7 +20,6 @@
 package org.apache.streams.plugins;
 
 import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.reflections.ReflectionUtils;
@@ -43,337 +42,389 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * Created by sblackmon on 11/18/15.
+ * Embed within your own java code
+ *
+ * <p/>
+ * StreamsScalaGenerationConfig config = new StreamsScalaGenerationConfig();
+ * config.setTargetDirectory("target/generated-sources/scala");
+ * config.setTargetPackage("com.example");
+ * StreamsScalaSourceGenerator generator = new StreamsScalaSourceGenerator(config);
+ * generator.run();
+ *
  */
 public class StreamsScalaSourceGenerator implements Runnable {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGenerator.class);
-
-    private final static String LS = System.getProperty("line.separator");
-
-    private StreamsScalaGenerationConfig config;
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGenerator.class);
 
-    private Reflections reflections;
+  private static final String LS = System.getProperty("line.separator");
 
-    private String outDir;
+  private StreamsScalaGenerationConfig config;
 
-    public static void main(String[] args) {
-        StreamsScalaGenerationConfig config = new StreamsScalaGenerationConfig();
+  private Reflections reflections;
 
-        List<String> sourcePackages = Lists.newArrayList();
-        String targetDirectory = "target/generated-sources/pojo";
-        String targetPackage = "";
+  private String outDir;
 
-        if( args.length > 0 )
-            sourcePackages = Splitter.on(',').splitToList(args[0]);
-        if( args.length > 1 )
-            targetDirectory = args[1];
-        if( args.length > 2 )
-            targetPackage = args[2];
+  /**
+   * Run from CLI without Maven
+   *
+   * <p/>
+   * java -jar streams-plugin-scala-jar-with-dependencies.jar StreamsScalaSourceGenerator target/generated-sources
+   *
+   * @param args [targetDirectory, targetPackage]
+   * */
+  public static void main(String[] args) {
+    StreamsScalaGenerationConfig config = new StreamsScalaGenerationConfig();
 
-        config.setSourcePackages(sourcePackages);
-        config.setTargetPackage(targetPackage);
-        config.setTargetDirectory(targetDirectory);
+    List<String> sourcePackages = Lists.newArrayList();
+    String targetDirectory = "target/generated-sources/pojo";
+    String targetPackage = "";
 
-        StreamsScalaSourceGenerator streamsScalaSourceGenerator = new StreamsScalaSourceGenerator(config);
-        streamsScalaSourceGenerator.run();
+    if ( args.length > 0 ) {
+      sourcePackages = Splitter.on(',').splitToList(args[0]);
     }
-
-    public StreamsScalaSourceGenerator(StreamsScalaGenerationConfig config) {
-        this.config = config;
-        this.outDir = config.getTargetDirectory().getAbsolutePath();
-        reflections = new Reflections(
-                new ConfigurationBuilder()
-                        // TODO
-                        .forPackages(
-                                config.getSourcePackages()
-                                        .toArray(new String[config.getSourcePackages().size()])
-                        )
-                        .setScanners(
-                                new SubTypesScanner(),
-                                new TypeAnnotationsScanner()));
-
+    if ( args.length > 1 ) {
+      targetDirectory = args[1];
     }
-
-    public void run() {
-
-        List<Class<?>> serializableClasses = detectSerializableClasses();
-
-        LOGGER.info("Detected {} serialiables:", serializableClasses.size());
-        for( Class clazz : serializableClasses )
-            LOGGER.debug(clazz.toString());
-
-        List<Class<?>> pojoClasses = detectPojoClasses(serializableClasses);
-
-        LOGGER.info("Detected {} pojos:", pojoClasses.size());
-        for( Class clazz : pojoClasses )
-            LOGGER.debug(clazz.toString());
-
-        List<Class<?>> traits = detectTraits(pojoClasses);
-
-        LOGGER.info("Detected {} traits:", traits.size());
-        for( Class clazz : traits )
-            LOGGER.debug(clazz.toString());
-
-        List<Class<?>> cases = detectCases(pojoClasses);
-
-        LOGGER.info("Detected {} cases:", cases.size());
-        for( Class clazz : cases )
-            LOGGER.debug(clazz.toString());
-
-
-        for( Class clazz : traits ) {
-            String pojoPath = clazz.getPackage().getName().replace(".pojo.json", ".scala").replace(".","/")+"/traits/";
-            String pojoName = clazz.getSimpleName()+".scala";
-            String pojoScala = renderTrait(clazz);
-            writeFile(outDir+"/"+pojoPath+pojoName, pojoScala);
-        }
-
-        for( Class clazz : traits ) {
-            String pojoPath = clazz.getPackage().getName().replace(".pojo.json", ".scala").replace(".","/")+"/";
-            String pojoName = clazz.getSimpleName()+".scala";
-            String pojoScala = renderClass(clazz);
-            writeFile(outDir+"/"+pojoPath+pojoName, pojoScala);
-        }
-
-        for( Class clazz : cases ) {
-            String pojoPath = clazz.getPackage().getName().replace(".pojo.json", ".scala").replace(".","/")+"/";
-            String pojoName = clazz.getSimpleName()+".scala";
-            String pojoScala = renderCase(clazz);
-            writeFile(outDir+"/"+pojoPath+pojoName, pojoScala);
-        }
-
+    if ( args.length > 2 ) {
+      targetPackage = args[2];
     }
 
-    private void writeFile(String pojoFile, String pojoScala) {
-        try {
-            File path = new File(pojoFile);
-            File dir = path.getParentFile();
-            if( !dir.exists() )
-                dir.mkdirs();
-            Files.write(Paths.get(pojoFile), pojoScala.getBytes(), StandardOpenOption.CREATE_NEW);
-        } catch (Exception e) {
-            LOGGER.error("Write Exception: {}", e);
-        }
+    config.setSourcePackages(sourcePackages);
+    config.setTargetPackage(targetPackage);
+    config.setTargetDirectory(targetDirectory);
+
+    StreamsScalaSourceGenerator streamsScalaSourceGenerator = new StreamsScalaSourceGenerator(config);
+    streamsScalaSourceGenerator.run();
+  }
+
+  /**
+   * StreamsScalaSourceGenerator constructor.
+   * @param config StreamsScalaGenerationConfig
+   */
+  public StreamsScalaSourceGenerator(StreamsScalaGenerationConfig config) {
+    this.config = config;
+    this.outDir = config.getTargetDirectory().getAbsolutePath();
+    reflections = new Reflections(
+        new ConfigurationBuilder()
+            // TODO
+            .forPackages(
+                config.getSourcePackages()
+                    .toArray(new String[config.getSourcePackages().size()])
+            )
+            .setScanners(
+                new SubTypesScanner(),
+                new TypeAnnotationsScanner()));
+
+  }
+
+  @Override
+  public void run() {
+
+    List<Class<?>> serializableClasses = detectSerializableClasses();
+
+    LOGGER.info("Detected {} serialiables:", serializableClasses.size());
+    for ( Class clazz : serializableClasses ) {
+      LOGGER.debug(clazz.toString());
     }
 
-    public List<Class<?>> detectSerializableClasses() {
+    List<Class<?>> pojoClasses = detectPojoClasses(serializableClasses);
 
-        Set<Class<? extends Serializable>> classes =
-                reflections.getSubTypesOf(java.io.Serializable.class);
-
-        List<Class<?>> result = Lists.newArrayList();
-
-        for( Class clazz : classes ) {
-            result.add(clazz);
-        }
-
-        return result;
+    LOGGER.info("Detected {} pojos:", pojoClasses.size());
+    for ( Class clazz : pojoClasses ) {
+      LOGGER.debug(clazz.toString());
     }
 
-    public List<Class<?>> detectPojoClasses(List<Class<?>> classes) {
+    List<Class<?>> traits = detectTraits(pojoClasses);
 
-        List<Class<?>> result = Lists.newArrayList();
+    LOGGER.info("Detected {} traits:", traits.size());
+    for ( Class clazz : traits ) {
+      LOGGER.debug(clazz.toString());
+    }
 
-        for( Class clazz : classes ) {
-            try {
-                clazz.newInstance().toString();
-            } catch( Exception e) {}
-            // super-halfass way to know if this is a jsonschema2pojo
-            if( clazz.getAnnotations().length >= 1 )
-                result.add(clazz);
-        }
+    List<Class<?>> cases = detectCases(pojoClasses);
 
-        return result;
+    LOGGER.info("Detected {} cases:", cases.size());
+    for ( Class clazz : cases ) {
+      LOGGER.debug(clazz.toString());
     }
 
-    public List<Class<?>> detectTraits(List<Class<?>> classes) {
+    for ( Class clazz : traits ) {
+      String pojoPath = clazz.getPackage().getName().replace(".pojo.json", ".scala").replace(".","/") + "/traits/";
+      String pojoName = clazz.getSimpleName() + ".scala";
+      String pojoScala = renderTrait(clazz);
+      writeFile(outDir + "/" + pojoPath + pojoName, pojoScala);
+    }
 
-        List<Class<?>> traits = Lists.newArrayList();
+    for ( Class clazz : traits ) {
+      String pojoPath = clazz.getPackage().getName().replace(".pojo.json", ".scala").replace(".","/") + "/";
+      String pojoName = clazz.getSimpleName() + ".scala";
+      String pojoScala = renderClass(clazz);
+      writeFile(outDir + "/" + pojoPath + pojoName, pojoScala);
+    }
 
-        for( Class clazz : classes ) {
-            if (reflections.getSubTypesOf(clazz).size() > 0)
-                traits.add(clazz);
-        }
+    for ( Class clazz : cases ) {
+      String pojoPath = clazz.getPackage().getName().replace(".pojo.json", ".scala").replace(".","/") + "/";
+      String pojoName = clazz.getSimpleName() + ".scala";
+      String pojoScala = renderCase(clazz);
+      writeFile(outDir + "/" + pojoPath + pojoName, pojoScala);
+    }
 
-        return traits;
+  }
+
+  private void writeFile(String pojoFile, String pojoScala) {
+    try {
+      File path = new File(pojoFile);
+      File dir = path.getParentFile();
+      if ( !dir.exists() ) {
+        dir.mkdirs();
+      }
+      Files.write(Paths.get(pojoFile), pojoScala.getBytes(), StandardOpenOption.CREATE_NEW);
+    } catch (Exception ex) {
+      LOGGER.error("Write Exception: {}", ex);
     }
+  }
 
-    public List<Class<?>> detectCases(List<Class<?>> classes) {
+  /**
+   * detectSerializableClasses.
+   * @return List of Serializable Classes
+   */
+  public List<Class<?>> detectSerializableClasses() {
 
-        List<Class<?>> cases = Lists.newArrayList();
+    Set<Class<? extends Serializable>> classes =
+        reflections.getSubTypesOf(java.io.Serializable.class);
 
-        for( Class clazz : classes ) {
-            if (reflections.getSubTypesOf(clazz).size() == 0)
-                cases.add(clazz);
-        }
+    List<Class<?>> result = Lists.newArrayList();
 
-        return cases;
+    for ( Class clazz : classes ) {
+      result.add(clazz);
     }
 
+    return result;
+  }
+
+  /**
+   * detect which Classes are Pojo Classes.
+   * @param classes List of candidate Pojo Classes
+   * @return List of actual Pojo Classes
+   */
+  public List<Class<?>> detectPojoClasses(List<Class<?>> classes) {
+
+    List<Class<?>> result = Lists.newArrayList();
+
+    for ( Class clazz : classes ) {
+      try {
+        clazz.newInstance().toString();
+      } catch ( Exception ex) {
+        //
+      }
+      // super-halfass way to know if this is a jsonschema2pojo
+      if ( clazz.getAnnotations().length >= 1 ) {
+        result.add(clazz);
+      }
+    }
 
-    public String renderTrait(Class<?> pojoClass) {
-        StringBuffer stringBuffer = new StringBuffer();
-        stringBuffer.append("package ");
-        stringBuffer.append(pojoClass.getPackage().getName().replace(".pojo.json", ".scala"));
-        stringBuffer.append(".traits");
-        stringBuffer.append(LS);
-        stringBuffer.append("trait "+pojoClass.getSimpleName());
-        stringBuffer.append(" extends Serializable");
-        stringBuffer.append(" {");
+    return result;
+  }
 
-        Set<Field> fields = ReflectionUtils.getAllFields(pojoClass);
-        appendFields(stringBuffer, fields, "def", ";");
+  private List<Class<?>> detectTraits(List<Class<?>> classes) {
 
-        stringBuffer.append("}");
+    List<Class<?>> traits = Lists.newArrayList();
 
-        return stringBuffer.toString();
+    for ( Class clazz : classes ) {
+      if (reflections.getSubTypesOf(clazz).size() > 0) {
+        traits.add(clazz);
+      }
     }
 
-    public String renderClass(Class<?> pojoClass) {
-        StringBuffer stringBuffer = new StringBuffer();
-        stringBuffer.append("package ");
-        stringBuffer.append(pojoClass.getPackage().getName().replace(".pojo.json", ".scala"));
-        stringBuffer.append(LS);
-        stringBuffer.append("import org.apache.commons.lang.builder.{HashCodeBuilder, EqualsBuilder, ToStringBuilder}");
-        stringBuffer.append(LS);
-        stringBuffer.append("class "+pojoClass.getSimpleName());
-        stringBuffer.append(" (");
+    return traits;
+  }
 
-        Set<Field> fields = ReflectionUtils.getAllFields(pojoClass);
-        appendFields(stringBuffer, fields, "var", ",");
+  private List<Class<?>> detectCases(List<Class<?>> classes) {
 
-        stringBuffer.append(")");
-        stringBuffer.append(" extends "+pojoClass.getPackage().getName().replace(".pojo.json", ".scala")+".traits."+pojoClass.getSimpleName());
-        stringBuffer.append(" with Serializable ");
-        stringBuffer.append("{ ");
-        stringBuffer.append(LS);
-        stringBuffer.append("override def equals(obj: Any) = obj match { ");
-        stringBuffer.append(LS);
-        stringBuffer.append("  case other: ");
-        stringBuffer.append(pojoClass.getSimpleName());
-        stringBuffer.append(" => other.getClass == getClass && EqualsBuilder.reflectionEquals(this,obj)");
-        stringBuffer.append(LS);
-        stringBuffer.append("  case _ => false");
-        stringBuffer.append(LS);
-        stringBuffer.append("}");
-        stringBuffer.append(LS);
-        stringBuffer.append("override def hashCode = new HashCodeBuilder().hashCode");
-        stringBuffer.append(LS);
-        stringBuffer.append("}");
+    List<Class<?>> cases = Lists.newArrayList();
 
-        return stringBuffer.toString();
+    for ( Class clazz : classes ) {
+      if (reflections.getSubTypesOf(clazz).size() == 0) {
+        cases.add(clazz);
+      }
     }
 
-    public String renderCase(Class<?> pojoClass) {
-        StringBuffer stringBuffer = new StringBuffer();
-        stringBuffer.append("package ");
-        stringBuffer.append(pojoClass.getPackage().getName().replace(".pojo.json", ".scala"));
-        stringBuffer.append(LS);
-        stringBuffer.append("case class "+pojoClass.getSimpleName());
-        stringBuffer.append("(");
-        Set<Field> fields = ReflectionUtils.getAllFields(pojoClass);
-        appendFields(stringBuffer, fields, "var", ",");
-        stringBuffer.append(")");
-        if( pojoClass.getSuperclass() != null && !pojoClass.getSuperclass().equals(java.lang.Object.class)) {
-            stringBuffer.append(" extends "+pojoClass.getSuperclass().getPackage().getName().replace(".pojo.json", ".scala")+".traits."+pojoClass.getSuperclass().getSimpleName());
-        }
-        stringBuffer.append(LS);
-
-        return stringBuffer.toString();
+    return cases;
+  }
+
+  private String renderTrait(Class<?> pojoClass) {
+    StringBuffer stringBuffer = new StringBuffer();
+    stringBuffer.append("package ");
+    stringBuffer.append(pojoClass.getPackage().getName().replace(".pojo.json", ".scala"));
+    stringBuffer.append(".traits");
+    stringBuffer.append(LS);
+    stringBuffer.append("trait " + pojoClass.getSimpleName());
+    stringBuffer.append(" extends Serializable");
+    stringBuffer.append(" {");
+
+    Set<Field> fields = ReflectionUtils.getAllFields(pojoClass);
+    appendFields(stringBuffer, fields, "def", ";");
+
+    stringBuffer.append("}");
+
+    return stringBuffer.toString();
+  }
+
+  private String renderClass(Class<?> pojoClass) {
+    StringBuffer stringBuffer = new StringBuffer();
+    stringBuffer.append("package ");
+    stringBuffer.append(pojoClass.getPackage().getName().replace(".pojo.json", ".scala"));
+    stringBuffer.append(LS);
+    stringBuffer.append("import org.apache.commons.lang.builder.{HashCodeBuilder, EqualsBuilder, ToStringBuilder}");
+    stringBuffer.append(LS);
+    stringBuffer.append("class " + pojoClass.getSimpleName());
+    stringBuffer.append(" (");
+
+    Set<Field> fields = ReflectionUtils.getAllFields(pojoClass);
+    appendFields(stringBuffer, fields, "var", ",");
+
+    stringBuffer.append(")");
+    stringBuffer.append(" extends " + pojoClass.getPackage().getName().replace(".pojo.json", ".scala") + ".traits." + pojoClass.getSimpleName());
+    stringBuffer.append(" with Serializable ");
+    stringBuffer.append("{ ");
+    stringBuffer.append(LS);
+    stringBuffer.append("override def equals(obj: Any) = obj match { ");
+    stringBuffer.append(LS);
+    stringBuffer.append("  case other: ");
+    stringBuffer.append(pojoClass.getSimpleName());
+    stringBuffer.append(" => other.getClass == getClass && EqualsBuilder.reflectionEquals(this,obj)");
+    stringBuffer.append(LS);
+    stringBuffer.append("  case _ => false");
+    stringBuffer.append(LS);
+    stringBuffer.append("}");
+    stringBuffer.append(LS);
+    stringBuffer.append("override def hashCode = new HashCodeBuilder().hashCode");
+    stringBuffer.append(LS);
+    stringBuffer.append("}");
+
+    return stringBuffer.toString();
+  }
+
+  private String renderCase(Class<?> pojoClass) {
+    StringBuffer stringBuffer = new StringBuffer();
+    stringBuffer.append("package ");
+    stringBuffer.append(pojoClass.getPackage().getName().replace(".pojo.json", ".scala"));
+    stringBuffer.append(LS);
+    stringBuffer.append("case class " + pojoClass.getSimpleName());
+    stringBuffer.append("(");
+    Set<Field> fields = ReflectionUtils.getAllFields(pojoClass);
+    appendFields(stringBuffer, fields, "var", ",");
+    stringBuffer.append(")");
+    if ( pojoClass.getSuperclass() != null && !pojoClass.getSuperclass().equals(java.lang.Object.class)) {
+      stringBuffer.append(" extends " + pojoClass.getSuperclass().getPackage().getName().replace(".pojo.json", ".scala") + ".traits." + pojoClass.getSuperclass().getSimpleName());
     }
-
-    private void appendFields(StringBuffer stringBuffer, Set<Field> fields, String varDef, String fieldDelimiter) {
-        if( fields.size() > 0 ) {
-            stringBuffer.append(LS);
-            Map<String,Field> fieldsToAppend = uniqueFields(fields);
-            for( Iterator<Field> iter = fieldsToAppend.values().iterator(); iter.hasNext(); ) {
-                Field field = iter.next();
-                if( override( field ) )
-                    stringBuffer.append("override ");
-                stringBuffer.append(varDef);
-                stringBuffer.append(" ");
-                stringBuffer.append(name(field));
-                stringBuffer.append(": ");
-                if( option(field) ) {
-                    stringBuffer.append("scala.Option[");
-                    stringBuffer.append(type(field));
-                    stringBuffer.append("]");
-                } else {
-                    stringBuffer.append(type(field));
-                }
-                if( !fieldDelimiter.equals(";") && value(field) != null) {
-                    stringBuffer.append(" = ");
-                    if( option(field) ) {
-                        stringBuffer.append("scala.Some(");
-                        stringBuffer.append(value(field));
-                        stringBuffer.append(")");
-                    } else {
-                        stringBuffer.append(value(field));
-                    }
-                }
-                if( iter.hasNext()) stringBuffer.append(fieldDelimiter);
-                stringBuffer.append(LS);
-            }
+    stringBuffer.append(LS);
+
+    return stringBuffer.toString();
+  }
+
+  private void appendFields(StringBuffer stringBuffer, Set<Field> fields, String varDef, String fieldDelimiter) {
+    if ( fields.size() > 0 ) {
+      stringBuffer.append(LS);
+      Map<String,Field> fieldsToAppend = uniqueFields(fields);
+      for ( Iterator<Field> iter = fieldsToAppend.values().iterator(); iter.hasNext(); ) {
+        Field field = iter.next();
+        if ( override( field ) ) {
+          stringBuffer.append("override ");
+        }
+        stringBuffer.append(varDef);
+        stringBuffer.append(" ");
+        stringBuffer.append(name(field));
+        stringBuffer.append(": ");
+        if ( option(field) ) {
+          stringBuffer.append("scala.Option[");
+          stringBuffer.append(type(field));
+          stringBuffer.append("]");
         } else {
-            stringBuffer.append(LS);
+          stringBuffer.append(type(field));
+        }
+        if ( !fieldDelimiter.equals(";") && value(field) != null) {
+          stringBuffer.append(" = ");
+          if ( option(field) ) {
+            stringBuffer.append("scala.Some(");
+            stringBuffer.append(value(field));
+            stringBuffer.append(")");
+          } else {
+            stringBuffer.append(value(field));
+          }
         }
+        if ( iter.hasNext()) {
+          stringBuffer.append(fieldDelimiter);
+        }
+        stringBuffer.append(LS);
+      }
+    } else {
+      stringBuffer.append(LS);
     }
-
-    private boolean option(Field field) {
-        if( field.getName().equals("verb")) {
-            return false;
-        } else if( field.getType().equals(java.util.Map.class)) {
-            return false;
-        } else if( field.getType().equals(java.util.List.class)) {
-            return false;
-        } else return true;
+  }
+
+  private boolean option(Field field) {
+    if ( field.getName().equals("verb")) {
+      return false;
+    } else if ( field.getType().equals(java.util.Map.class)) {
+      return false;
+    } else if ( field.getType().equals(java.util.List.class)) {
+      return false;
+    } else {
+      return true;
     }
-
-    private String value(Field field) {
-        if( field.getName().equals("verb")) {
-            return "\"post\"";
-        } else if( field.getName().equals("objectType")) {
-            return "\"application\"";
-        } else return null;
+  }
+
+  private String value(Field field) {
+    if ( field.getName().equals("verb")) {
+      return "\"post\"";
+    } else if ( field.getName().equals("objectType")) {
+      return "\"application\"";
+    } else {
+      return null;
     }
-
-    private String type(Field field) {
-        if( field.getType().equals(java.lang.String.class)) {
-            return "String";
-        } else if( field.getType().equals(java.util.Map.class)) {
-            return "scala.collection.mutable.Map[String,Any]";
-        } else if( field.getType().equals(java.util.List.class)) {
-            return "scala.collection.mutable.MutableList[Any]";
-        }
-        return field.getType().getCanonicalName().replace(".pojo.json", ".scala");
+  }
+
+  private String type(Field field) {
+    if ( field.getType().equals(java.lang.String.class)) {
+      return "String";
+    } else if ( field.getType().equals(java.util.Map.class)) {
+      return "scala.collection.mutable.Map[String,Any]";
+    } else if ( field.getType().equals(java.util.List.class)) {
+      return "scala.collection.mutable.MutableList[Any]";
     }
-
-    private Map<String,Field> uniqueFields(Set<Field> fieldset) {
-        Map<String,Field> fields = Maps.newTreeMap();
-        Field item = null;
-        for( Iterator<Field> it = fieldset.iterator(); it.hasNext(); item = it.next() ) {
-            if( item != null && item.getName() != null ) {
-                Field added = fields.put(item.getName(), item);
-            }
-            // ensure right class will get used
-        }
-        return fields;
+    return field.getType().getCanonicalName().replace(".pojo.json", ".scala");
+  }
+
+  private Map<String,Field> uniqueFields(Set<Field> fieldset) {
+    Map<String,Field> fields = Maps.newTreeMap();
+    Field item = null;
+    for ( Iterator<Field> it = fieldset.iterator(); it.hasNext(); item = it.next() ) {
+      if ( item != null && item.getName() != null ) {
+        Field added = fields.put(item.getName(), item);
+      }
+      // ensure right class will get used
     }
-
-    private String name(Field field) {
-        if( field.getName().equals("object"))
-            return "obj";
-        else return field.getName();
+    return fields;
+  }
+
+  private String name(Field field) {
+    if ( field.getName().equals("object")) {
+      return "obj";
+    } else {
+      return field.getName();
     }
-
-    private boolean override(Field field) {
-        try {
-            if( field.getDeclaringClass().getSuperclass().getField(field.getName()) != null )
-                return true;
-            else return false;
-        } catch( Exception e ) {
-            return false;
-        }
+  }
+
+  private boolean override(Field field) {
+    try {
+      if ( field.getDeclaringClass().getSuperclass().getField(field.getName()) != null ) {
+        return true;
+      } else {
+        return false;
+      }
+    } catch ( Exception ex ) {
+      return false;
     }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGeneratorMojo.java b/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGeneratorMojo.java
index ae91b36..44c82ac 100644
--- a/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGeneratorMojo.java
+++ b/streams-plugins/streams-plugin-scala/src/main/java/org/apache/streams/plugins/StreamsScalaSourceGeneratorMojo.java
@@ -20,9 +20,9 @@
 package org.apache.streams.plugins;
 
 import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -34,52 +34,59 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 
-@Mojo(  name = "scala",
-        defaultPhase = LifecyclePhase.GENERATE_SOURCES
-)
-@Execute(   goal = "scala",
-            phase = LifecyclePhase.GENERATE_SOURCES
-)
+@Mojo(
+    name = "scala",
+    defaultPhase = LifecyclePhase.GENERATE_SOURCES
+    )
+@Execute(
+    goal = "scala",
+    phase = LifecyclePhase.GENERATE_SOURCES
+    )
 public class StreamsScalaSourceGeneratorMojo extends AbstractMojo {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorMojo.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorMojo.class);
 
-    @Component
-    private MavenProject project;
+  @Component
+  private MavenProject project;
 
-//    @Component
-//    private Settings settings;
-//
-//    @Parameter( defaultValue = "${localRepository}", readonly = true, required = true )
-//    protected ArtifactRepository localRepository;
-//
-//    @Parameter( defaultValue = "${plugin}", readonly = true ) // Maven 3 only
-//    private PluginDescriptor plugin;
-//
-    @Parameter( defaultValue = "${project.basedir}", readonly = true )
-    private File basedir;
+  //    @Component
+  //    private Settings settings;
+  //
+  //    @Parameter( defaultValue = "${localRepository}", readonly = true, required = true )
+  //    protected ArtifactRepository localRepository;
+  //
+  //    @Parameter( defaultValue = "${plugin}", readonly = true ) // Maven 3 only
+  //    private PluginDescriptor plugin;
+  //
+  @Parameter( defaultValue = "${project.basedir}", readonly = true )
+  private File basedir;
 
-    @Parameter(defaultValue = "${project.build.directory}", readonly = true)
-    private File target;
+  @Parameter(defaultValue = "${project.build.directory}", readonly = true)
+  private File target;
 
-    @Parameter(defaultValue = "org.apache.streams.pojo.json", readonly = true)
-    private String packages;
+  @Parameter(defaultValue = "org.apache.streams.pojo.json", readonly = true)
+  private String packages;
 
-    public void execute() throws MojoExecutionException {
-        StreamsScalaGenerationConfig config = new StreamsScalaGenerationConfig();
-        config.setSourcePackages(Splitter.on(',').splitToList(packages));
-        config.setTargetDirectory(target.toString());
+  /**
+   * execute StreamsScalaSourceGeneratorMojo.
+   * @throws MojoExecutionException MojoExecutionException
+   * @throws MojoFailureException MojoFailureException
+   */
+  public void execute() throws MojoExecutionException {
+    StreamsScalaGenerationConfig config = new StreamsScalaGenerationConfig();
+    config.setSourcePackages(Splitter.on(',').splitToList(packages));
+    config.setTargetDirectory(target.toString());
 
-        StreamsScalaSourceGenerator streamsScalaSourceGenerator = new StreamsScalaSourceGenerator(config);
+    StreamsScalaSourceGenerator streamsScalaSourceGenerator = new StreamsScalaSourceGenerator(config);
 
-        streamsScalaSourceGenerator.run();
-    }
+    streamsScalaSourceGenerator.run();
+  }
 
-    public File getTarget() {
-        return target;
-    }
+  public File getTarget() {
+    return target;
+  }
 
-    public String getPackages() {
-        return packages;
-    }
+  public String getPackages() {
+    return packages;
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorCLITest.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorCLITest.java b/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorCLITest.java
index 6394193..0365af4 100644
--- a/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorCLITest.java
+++ b/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorCLITest.java
@@ -19,9 +19,10 @@
 
 package org.apache.streams.plugins.test;
 
+import org.apache.streams.plugins.StreamsScalaSourceGenerator;
+
 import com.google.common.collect.Lists;
 import com.google.common.io.Files;
-import org.apache.streams.plugins.StreamsScalaSourceGenerator;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,31 +34,31 @@ import java.util.List;
 import static org.apache.streams.plugins.test.StreamsScalaSourceGeneratorTest.scalaFilter;
 
 /**
- * Created by sblackmon on 5/5/16.
+ * Test whether StreamsScalaSourceGeneratorCLI generates sources.
  */
 public class StreamsScalaSourceGeneratorCLITest {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorCLITest.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorCLITest.class);
 
-    @Test
-    public void testStreamsScalaSourceGeneratorCLI() throws Exception {
+  @Test
+  public void testStreamsScalaSourceGeneratorCLI() throws Exception {
 
-        String sourcePackages = "org.apache.streams.pojo.json";
-        String targetPackage = "org.apache.streams.scala";
-        String targetDirectory = "./target/generated-sources/scala-cli";
+    String sourcePackages = "org.apache.streams.pojo.json";
+    String targetPackage = "org.apache.streams.scala";
+    String targetDirectory = "./target/generated-sources/scala-cli";
 
-        List<String> argsList = Lists.newArrayList(sourcePackages, targetDirectory, targetPackage);
-        StreamsScalaSourceGenerator.main(argsList.toArray(new String[argsList.size()]));
+    List<String> argsList = Lists.newArrayList(sourcePackages, targetDirectory, targetPackage);
+    StreamsScalaSourceGenerator.main(argsList.toArray(new String[argsList.size()]));
 
-        File testOutput = new File(targetDirectory);
+    File testOutput = new File(targetDirectory);
 
-        assert( testOutput != null );
-        assert( testOutput.exists() == true );
-        assert( testOutput.isDirectory() == true );
+    assert ( testOutput != null );
+    assert ( testOutput.exists() == true );
+    assert ( testOutput.isDirectory() == true );
 
-        Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput)
-                .filter(scalaFilter);
-        Collection<File> outputCollection = Lists.newArrayList(outputIterator);
-        assert( outputCollection.size() > 133 );
-    }
+    Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput)
+        .filter(scalaFilter);
+    Collection<File> outputCollection = Lists.newArrayList(outputIterator);
+    assert ( outputCollection.size() > 133 );
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorMojoIT.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorMojoIT.java b/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorMojoIT.java
index bcd988f..a0caecf 100644
--- a/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorMojoIT.java
+++ b/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorMojoIT.java
@@ -41,43 +41,42 @@ import static org.apache.streams.plugins.test.StreamsScalaSourceGeneratorTest.sc
  */
 public class StreamsScalaSourceGeneratorMojoIT extends TestCase {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorMojoIT.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorMojoIT.class);
 
-    protected void setUp() throws Exception
-    {
-        // required for mojo lookups to work
-        super.setUp();
-    }
+  protected void setUp() throws Exception {
+    // required for mojo lookups to work
+    super.setUp();
+  }
 
 
-    @Test
-    public void testStreamsScalaSourceGeneratorMojo() throws Exception {
+  @Test
+  public void testStreamsScalaSourceGeneratorMojo() throws Exception {
 
-        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/streams-plugin-scala" );
+    File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/streams-plugin-scala" );
 
-        Verifier verifier;
+    Verifier verifier;
 
-        verifier = new Verifier( testDir.getAbsolutePath() );
+    verifier = new Verifier( testDir.getAbsolutePath() );
 
-        List cliOptions = new ArrayList();
-        cliOptions.add( "-N" );
-        verifier.executeGoals( Lists.<String>newArrayList(
-                "compile"));
+    List cliOptions = new ArrayList();
+    cliOptions.add( "-N" );
+    verifier.executeGoals( Lists.<String>newArrayList(
+        "compile"));
 
-        verifier.verifyErrorFreeLog();
+    verifier.verifyErrorFreeLog();
 
-        verifier.resetStreams();
+    verifier.resetStreams();
 
-        File testOutput = new File(testDir.getAbsolutePath() + "/target/generated-sources/scala-mojo");
+    File testOutput = new File(testDir.getAbsolutePath() + "/target/generated-sources/scala-mojo");
 
-        assert( testOutput != null );
-        assert( testOutput.exists() == true );
-        assert( testOutput.isDirectory() == true );
+    assert ( testOutput != null );
+    assert ( testOutput.exists() == true );
+    assert ( testOutput.isDirectory() == true );
 
-        Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput)
-                .filter(scalaFilter);
-        Collection<File> outputCollection = Lists.newArrayList(outputIterator);
-        assert( outputCollection.size() > 133 );
+    Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput)
+        .filter(scalaFilter);
+    Collection<File> outputCollection = Lists.newArrayList(outputIterator);
+    assert ( outputCollection.size() > 133 );
 
-    }
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorTest.java
----------------------------------------------------------------------
diff --git a/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorTest.java b/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorTest.java
index fda4416..1fafaf4 100644
--- a/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorTest.java
+++ b/streams-plugins/streams-plugin-scala/src/test/java/org/apache/streams/plugins/test/StreamsScalaSourceGeneratorTest.java
@@ -19,78 +19,84 @@
 
 package org.apache.streams.plugins.test;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Lists;
 import org.apache.streams.plugins.StreamsScalaGenerationConfig;
 import org.apache.streams.plugins.StreamsScalaSourceGenerator;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.annotation.Nullable;
 import java.io.File;
 import java.io.FileFilter;
+import javax.annotation.Nullable;
 
 import static junit.framework.TestCase.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 /**
- * Test that Activity beans are compatible with the example activities in the spec.
+ * Tests that StreamsScalaSourceGenerator via SDK generates scala sources.
  */
 public class StreamsScalaSourceGeneratorTest {
 
-    private final static Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorTest.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(StreamsScalaSourceGeneratorTest.class);
 
-    public static final Predicate<File> scalaFilter = new Predicate<File>() {
-        @Override
-        public boolean apply(@Nullable File file) {
-            if( file.getName().endsWith(".scala") )
-                return true;
-            else return false;
-        }
-    };
-    /**
-     * Tests that all example activities can be loaded into Activity beans
-     *
-     * @throws Exception
-     */
-    @Test
-    public void testStreamsScalaSourceGenerator() throws Exception {
+  public static final Predicate<File> scalaFilter = new Predicate<File>() {
+    @Override
+    public boolean apply(@Nullable File file) {
+      if ( file.getName().endsWith(".scala") ) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  };
 
-        StreamsScalaGenerationConfig streamsScalaGenerationConfig = new StreamsScalaGenerationConfig();
-        streamsScalaGenerationConfig.setSourcePackages(Lists.newArrayList("org.apache.streams.pojo.json"));
-        streamsScalaGenerationConfig.setTargetPackage("org.apache.streams.scala");
-        streamsScalaGenerationConfig.setTargetDirectory("target/generated-sources/scala-test");
+  /**
+   * Tests that StreamsScalaSourceGenerator via SDK generates scala sources.
+   *
+   * @throws Exception Exception
+   */
+  @Test
+  public void testStreamsScalaSourceGenerator() throws Exception {
 
-        StreamsScalaSourceGenerator streamsScalaSourceGenerator = new StreamsScalaSourceGenerator(streamsScalaGenerationConfig);
-        streamsScalaSourceGenerator.run();
+    StreamsScalaGenerationConfig streamsScalaGenerationConfig = new StreamsScalaGenerationConfig();
+    streamsScalaGenerationConfig.setSourcePackages(Lists.newArrayList("org.apache.streams.pojo.json"));
+    streamsScalaGenerationConfig.setTargetPackage("org.apache.streams.scala");
+    streamsScalaGenerationConfig.setTargetDirectory("target/generated-sources/scala-test");
 
-        File testOutput = new File( "./target/generated-sources/scala-test/org/apache/streams/scala");
-        FileFilter scalaFilter = new FileFilter() {
-            @Override
-            public boolean accept(File pathname) {
-                if( pathname.getName().endsWith(".scala") )
-                    return true;
-                return false;
-            }
-        };
+    StreamsScalaSourceGenerator streamsScalaSourceGenerator = new StreamsScalaSourceGenerator(streamsScalaGenerationConfig);
+    streamsScalaSourceGenerator.run();
 
-        assertNotNull( testOutput );
-        assertTrue( testOutput.exists() );
-        assertTrue( testOutput.isDirectory() );
-        assertEquals( 10, testOutput.listFiles(scalaFilter).length );
-        assertTrue( new File(testOutput + "/traits").exists() );
-        assertTrue( new File(testOutput + "/traits").isDirectory() );
-        assertNotNull( new File(testOutput + "/traits").listFiles(scalaFilter) );
-        assertEquals( 4, new File(testOutput + "/traits").listFiles(scalaFilter).length );
-        assertTrue( new File(testOutput + "/objectTypes").exists() );
-        assertTrue( new File(testOutput + "/objectTypes").isDirectory() );
-        assertNotNull( new File(testOutput + "/objectTypes").listFiles(scalaFilter) );
-        assertEquals( 42, new File(testOutput + "/objectTypes").listFiles(scalaFilter).length);
-        assertTrue( new File(testOutput + "/verbs").exists() );
-        assertTrue( new File(testOutput + "/verbs").isDirectory() );
-        assertNotNull( new File(testOutput + "/verbs").listFiles(scalaFilter) );
-        assertEquals( 89, new File(testOutput + "/verbs").listFiles(scalaFilter).length );
-    }
+    File testOutput = new File( "./target/generated-sources/scala-test/org/apache/streams/scala");
+    FileFilter scalaFilter = new FileFilter() {
+      @Override
+      public boolean accept(File pathname) {
+        if ( pathname.getName().endsWith(".scala") ) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+    };
+
+    assertNotNull( testOutput );
+    assertTrue( testOutput.exists() );
+    assertTrue( testOutput.isDirectory() );
+    assertEquals( 10, testOutput.listFiles(scalaFilter).length );
+    assertTrue( new File(testOutput + "/traits").exists() );
+    assertTrue( new File(testOutput + "/traits").isDirectory() );
+    assertNotNull( new File(testOutput + "/traits").listFiles(scalaFilter) );
+    assertEquals( 4, new File(testOutput + "/traits").listFiles(scalaFilter).length );
+    assertTrue( new File(testOutput + "/objectTypes").exists() );
+    assertTrue( new File(testOutput + "/objectTypes").isDirectory() );
+    assertNotNull( new File(testOutput + "/objectTypes").listFiles(scalaFilter) );
+    assertEquals( 42, new File(testOutput + "/objectTypes").listFiles(scalaFilter).length);
+    assertTrue( new File(testOutput + "/verbs").exists() );
+    assertTrue( new File(testOutput + "/verbs").isDirectory() );
+    assertNotNull( new File(testOutput + "/verbs").listFiles(scalaFilter) );
+    assertEquals( 89, new File(testOutput + "/verbs").listFiles(scalaFilter).length );
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-pojo-extensions/src/main/java/org/apache/streams/data/util/PropertyUtil.java
----------------------------------------------------------------------
diff --git a/streams-pojo-extensions/src/main/java/org/apache/streams/data/util/PropertyUtil.java b/streams-pojo-extensions/src/main/java/org/apache/streams/data/util/PropertyUtil.java
index f5a4b55..827bc6a 100644
--- a/streams-pojo-extensions/src/main/java/org/apache/streams/data/util/PropertyUtil.java
+++ b/streams-pojo-extensions/src/main/java/org/apache/streams/data/util/PropertyUtil.java
@@ -18,17 +18,17 @@
 
 package org.apache.streams.data.util;
 
+import org.apache.streams.jackson.StreamsJacksonMapper;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.ValueNode;
-import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import org.apache.streams.jackson.StreamsJacksonMapper;
 
 import java.util.Iterator;
 import java.util.List;
@@ -39,87 +39,88 @@ import java.util.Map;
  */
 public class PropertyUtil {
 
-    private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
-
-    public static Map<String, Object> flattenToMap(ObjectNode object) {
-        Map<String, Object> flatObject = Maps.newHashMap();
-        addKeys(new String(), object, flatObject, '.');
-        return flatObject;
-    }
-
-    public static ObjectNode flattenToObjectNode(ObjectNode object) {
-        Map<String, Object> flatObject = flattenToMap(object, '.');
-        addKeys(new String(), object, flatObject, '.');
-        return mapper.convertValue(flatObject, ObjectNode.class);
-    }
-
-    public static Map<String, Object> flattenToMap(ObjectNode object, char seperator) {
-        Map<String, Object> flatObject = Maps.newHashMap();
-        addKeys(new String(), object, flatObject, seperator);
-        return flatObject;
+  private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
+
+  public static Map<String, Object> flattenToMap(ObjectNode object) {
+    Map<String, Object> flatObject = Maps.newHashMap();
+    addKeys(new String(), object, flatObject, '.');
+    return flatObject;
+  }
+
+  public static Map<String, Object> flattenToMap(ObjectNode object, char seperator) {
+    Map<String, Object> flatObject = Maps.newHashMap();
+    addKeys(new String(), object, flatObject, seperator);
+    return flatObject;
+  }
+
+  public static ObjectNode flattenToObjectNode(ObjectNode object) {
+    Map<String, Object> flatObject = flattenToMap(object, '.');
+    addKeys(new String(), object, flatObject, '.');
+    return mapper.convertValue(flatObject, ObjectNode.class);
+  }
+
+  public static ObjectNode flattenToObjectNode(ObjectNode object, char seperator) {
+    Map<String, Object> flatObject = flattenToMap(object, seperator);
+    addKeys(new String(), object, flatObject, seperator);
+    return mapper.convertValue(flatObject, ObjectNode.class);
+  }
+
+  private static void addKeys(String currentPath, JsonNode jsonNode, Map<String, Object> map, char seperator) {
+    if (jsonNode.isObject()) {
+      ObjectNode objectNode = (ObjectNode) jsonNode;
+      Iterator<Map.Entry<String, JsonNode>> iter = objectNode.fields();
+      String pathPrefix = currentPath.isEmpty() ? "" : currentPath + seperator;
+
+      while (iter.hasNext()) {
+        Map.Entry<String, JsonNode> entry = iter.next();
+        addKeys(pathPrefix + entry.getKey(), entry.getValue(), map, seperator);
+      }
+    } else if (jsonNode.isArray()) {
+      ArrayNode arrayNode = (ArrayNode) jsonNode;
+      map.put(currentPath, arrayNode);
+    } else if (jsonNode.isValueNode()) {
+      ValueNode valueNode = (ValueNode) jsonNode;
+      if ( valueNode.isTextual() ) {
+        map.put(currentPath, valueNode.asText());
+      } else if ( valueNode.isNumber() ) {
+        map.put(currentPath, valueNode);
+      }
     }
-
-    public static ObjectNode flattenToObjectNode(ObjectNode object, char seperator) {
-        Map<String, Object> flatObject = flattenToMap(object, seperator);
-        addKeys(new String(), object, flatObject, seperator);
-        return mapper.convertValue(flatObject, ObjectNode.class);
-    }
-
-    private static void addKeys(String currentPath, JsonNode jsonNode, Map<String, Object> map, char seperator) {
-        if (jsonNode.isObject()) {
-            ObjectNode objectNode = (ObjectNode) jsonNode;
-            Iterator<Map.Entry<String, JsonNode>> iter = objectNode.fields();
-            String pathPrefix = currentPath.isEmpty() ? "" : currentPath + seperator;
-
-            while (iter.hasNext()) {
-                Map.Entry<String, JsonNode> entry = iter.next();
-                addKeys(pathPrefix + entry.getKey(), entry.getValue(), map, seperator);
-            }
-        } else if (jsonNode.isArray()) {
-            ArrayNode arrayNode = (ArrayNode) jsonNode;
-            map.put(currentPath, arrayNode);
-        } else if (jsonNode.isValueNode()) {
-            ValueNode valueNode = (ValueNode) jsonNode;
-            if( valueNode.isTextual() )
-                map.put(currentPath, valueNode.asText());
-            else if ( valueNode.isNumber() )
-                map.put(currentPath, valueNode);
+  }
+
+  public static ObjectNode unflattenMap(Map<String, Object> object, char seperator) {
+    return unflattenObjectNode(mapper.convertValue(object, ObjectNode.class), seperator);
+  }
+
+  public static ObjectNode unflattenObjectNode(ObjectNode flatObject, char seperator) {
+    ObjectNode root = mapper.createObjectNode();
+    Iterator<Map.Entry<String, JsonNode>> iter = flatObject.fields();
+    while (iter.hasNext()) {
+      Map.Entry<String, JsonNode> item = iter.next();
+      String fullKey = item.getKey();
+      if ( !fullKey.contains(Character.valueOf(seperator).toString())) {
+        root.put(item.getKey(), item.getValue());
+      } else {
+        ObjectNode currentNode = root;
+        List<String> keyParts = Lists.newArrayList();
+        Iterables.addAll(keyParts, Splitter.on(seperator).split(item.getKey()));
+        Iterator<String> keyPartIterator = Iterables.limit(Splitter.on(seperator).split(item.getKey()), keyParts.size() - 1).iterator();
+        while ( keyPartIterator.hasNext()) {
+          String part = keyPartIterator.next();
+          if ( currentNode.has(part) && currentNode.get(part).isObject() ) {
+            currentNode = (ObjectNode) currentNode.get(part);
+          } else {
+            ObjectNode newNode = mapper.createObjectNode();
+            currentNode.put(part, newNode);
+            currentNode = newNode;
+          }
         }
-    }
+        currentNode.put(keyParts.get(keyParts.size() - 1), item.getValue());
 
-    public static ObjectNode unflattenMap(Map<String, Object> object, char seperator) {
-        return unflattenObjectNode(mapper.convertValue(object, ObjectNode.class), seperator);
-    }
-
-    public static ObjectNode unflattenObjectNode(ObjectNode flatObject, char seperator) {
-        ObjectNode root = mapper.createObjectNode();
-        Iterator<Map.Entry<String, JsonNode>> iter = flatObject.fields();
-        while (iter.hasNext()) {
-            Map.Entry<String, JsonNode> item = iter.next();
-            String fullKey = item.getKey();
-            if( !fullKey.contains(Character.valueOf(seperator).toString())) {
-                root.put(item.getKey(), item.getValue());
-            } else {
-                ObjectNode currentNode = root;
-                List<String> keyParts = Lists.newArrayList();
-                Iterables.addAll(keyParts, Splitter.on(seperator).split(item.getKey()));
-                Iterator<String> keyPartIterator = Iterables.limit(Splitter.on(seperator).split(item.getKey()), keyParts.size()-1).iterator();
-                while( keyPartIterator.hasNext()) {
-                    String part = keyPartIterator.next();
-                    if( currentNode.has(part) && currentNode.get(part).isObject() ) {
-                        currentNode = (ObjectNode) currentNode.get(part);
-                    } else {
-                        ObjectNode newNode = mapper.createObjectNode();
-                        currentNode.put(part, newNode);
-                        currentNode = newNode;
-                    }
-                };
-                currentNode.put(keyParts.get(keyParts.size()-1), item.getValue());
-
-            }
-        }
-        return root;
+      }
     }
+    return root;
+  }
 
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-pojo-extensions/src/main/java/org/apache/streams/pojo/extensions/ExtensionUtil.java
----------------------------------------------------------------------
diff --git a/streams-pojo-extensions/src/main/java/org/apache/streams/pojo/extensions/ExtensionUtil.java b/streams-pojo-extensions/src/main/java/org/apache/streams/pojo/extensions/ExtensionUtil.java
index 7fe2c28..988a269 100644
--- a/streams-pojo-extensions/src/main/java/org/apache/streams/pojo/extensions/ExtensionUtil.java
+++ b/streams-pojo-extensions/src/main/java/org/apache/streams/pojo/extensions/ExtensionUtil.java
@@ -18,12 +18,13 @@
 
 package org.apache.streams.pojo.extensions;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Strings;
 import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.pojo.json.Activity;
 import org.apache.streams.pojo.json.ActivityObject;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Strings;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -32,133 +33,131 @@ import java.util.Map;
  */
 public class ExtensionUtil {
 
-    public static final String DEFAULT_EXTENSION_PROPERTY = null;
-
-    private static final ExtensionUtil INSTANCE = new ExtensionUtil(DEFAULT_EXTENSION_PROPERTY);
-
-    private String extensionProperty;
-
-    public static ExtensionUtil getInstance(){
-        return INSTANCE;
-    }
-
-    public static ExtensionUtil getInstance(String property){
-        return new ExtensionUtil(property);
-    }
-
-    private ExtensionUtil(String extensionProperty) {
-        this.extensionProperty = extensionProperty;
-    }
-
-    /**
-     * Property on the activity object to use for extensions
-     */
-
-    private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
-
-    public Map<String, Object> getExtensions(Activity activity) {
-        return ensureExtensions(activity);
-    }
-
-    public Object getExtension(Activity activity, String key) {
-        Map<String,Object> extensions = ensureExtensions(activity);
-        return extensions.get(key);
-    }
-
-    public void setExtensions(Activity activity, Map<String, Object> extensions) {
-        activity.setAdditionalProperty(extensionProperty, extensions);
-    }
-
-    public void addExtension(Activity activity, String key, Object extension) {
-        Map<String,Object> extensions = ensureExtensions(activity);
-        extensions.put(key, extension);
-    }
-
-    public void addExtensions(Activity activity, Map<String, Object> extensions) {
-        for( Map.Entry<String, Object> item : extensions.entrySet())
-            addExtension(activity, item.getKey(), item.getValue());
-    }
-
-    public void removeExtension(Activity activity, String key) {
-        Map<String,Object> extensions = ensureExtensions(activity);
-        extensions.remove(key);
-    }
-
-    public Map<String, Object> getExtensions(ActivityObject object) {
-        ActivityObject activityObject = mapper.convertValue(object, ActivityObject.class);
-        return ensureExtensions(activityObject);
-    }
-
-    public Object getExtension(ActivityObject object, String key) {
-        Map<String,Object> extensions = ensureExtensions(object);
-        return extensions.get(key);
-    }
-
-    public void setExtensions(ActivityObject object, Map<String, Object> extensions) {
-        object.setAdditionalProperty(extensionProperty, extensions);
-    }
-
-    public void addExtension(ActivityObject object, String key, Object extension) {
-        Map<String,Object> extensions = ensureExtensions(object);
-        extensions.put(key, extension);
-    }
-
-    public void addExtensions(ActivityObject object, Map<String, Object> extensions) {
-        for( Map.Entry<String, Object> item : extensions.entrySet())
-            addExtension(object, item.getKey(), item.getValue());
-    }
-
-    public void removeExtension(ActivityObject object, String key) {
-        Map<String,Object> extensions = ensureExtensions(object);
-        extensions.remove(key);
-    }
-
-    /**
-     * Creates a standard extension property
-     * @param activity activity to create the property in
-     * @return the Map representing the extensions property
-     */
-    @SuppressWarnings("unchecked")
-    public Map<String, Object> ensureExtensions(Activity activity) {
-        Map<String,Object> additionalProperties = activity.getAdditionalProperties();
-        Map<String,Object> extensions;
-        if(additionalProperties == null) {
-            additionalProperties = new HashMap<>();
-        }
-        if( !Strings.isNullOrEmpty(extensionProperty) ) {
-            extensions = (Map<String, Object>) additionalProperties.get(extensionProperty);
-            if(extensions == null) {
-                extensions = new HashMap<>();
-                additionalProperties.put(extensionProperty, extensions);
-            }
-            return extensions;
-        } else {
-            return additionalProperties;
-        }
-    }
-
-    /**
-     * Creates a standard extension property
-     * @param object object node to create the property in
-     * @return {@link Map} representing the extensions property
-     */
-    @SuppressWarnings("unchecked")
-    public Map<String, Object> ensureExtensions(ActivityObject object) {
-        Map<String,Object> additionalProperties = object.getAdditionalProperties();
-        Map<String,Object> extensions;
-        if(additionalProperties == null) {
-            additionalProperties = new HashMap<>();
-        }
-        if( !Strings.isNullOrEmpty(extensionProperty) ) {
-            extensions = (Map<String, Object>) additionalProperties.get(extensionProperty);
-            if(extensions == null) {
-                extensions = new HashMap<>();
-                additionalProperties.put(extensionProperty, extensions);
-            }
-            return extensions;
-        } else {
-            return additionalProperties;
-        }
-    }
+  public static final String DEFAULT_EXTENSION_PROPERTY = null;
+
+  private static final ExtensionUtil INSTANCE = new ExtensionUtil(DEFAULT_EXTENSION_PROPERTY);
+
+  private String extensionProperty;
+
+  public static ExtensionUtil getInstance() {
+    return INSTANCE;
+  }
+
+  public static ExtensionUtil getInstance(String property) {
+    return new ExtensionUtil(property);
+  }
+
+  private ExtensionUtil(String extensionProperty) {
+    this.extensionProperty = extensionProperty;
+  }
+
+  private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
+
+  public Map<String, Object> getExtensions(Activity activity) {
+    return ensureExtensions(activity);
+  }
+
+  public Map<String, Object> getExtensions(ActivityObject object) {
+    ActivityObject activityObject = mapper.convertValue(object, ActivityObject.class);
+    return ensureExtensions(activityObject);
+  }
+
+  public Object getExtension(Activity activity, String key) {
+    Map<String,Object> extensions = ensureExtensions(activity);
+    return extensions.get(key);
+  }
+
+  public Object getExtension(ActivityObject object, String key) {
+    Map<String,Object> extensions = ensureExtensions(object);
+    return extensions.get(key);
+  }
+
+  public void addExtension(Activity activity, String key, Object extension) {
+    Map<String,Object> extensions = ensureExtensions(activity);
+    extensions.put(key, extension);
+  }
+
+  public void addExtension(ActivityObject object, String key, Object extension) {
+    Map<String,Object> extensions = ensureExtensions(object);
+    extensions.put(key, extension);
+  }
+
+  public void removeExtension(Activity activity, String key) {
+    Map<String,Object> extensions = ensureExtensions(activity);
+    extensions.remove(key);
+  }
+
+  public void removeExtension(ActivityObject object, String key) {
+    Map<String,Object> extensions = ensureExtensions(object);
+    extensions.remove(key);
+  }
+
+  public void setExtensions(Activity activity, Map<String, Object> extensions) {
+    activity.setAdditionalProperty(extensionProperty, extensions);
+  }
+
+  public void setExtensions(ActivityObject object, Map<String, Object> extensions) {
+    object.setAdditionalProperty(extensionProperty, extensions);
+  }
+
+  public void addExtensions(Activity activity, Map<String, Object> extensions) {
+    for ( Map.Entry<String, Object> item : extensions.entrySet()) {
+      addExtension(activity, item.getKey(), item.getValue());
+    }
+  }
+
+  public void addExtensions(ActivityObject object, Map<String, Object> extensions) {
+    for ( Map.Entry<String, Object> item : extensions.entrySet()) {
+      addExtension(object, item.getKey(), item.getValue());
+    }
+  }
+
+  /**
+   * Creates a standard extension property.
+   * @param activity activity to create the property in
+   * @return the Map representing the extensions property
+   */
+  @SuppressWarnings("unchecked")
+  public Map<String, Object> ensureExtensions(Activity activity) {
+    Map<String,Object> additionalProperties = activity.getAdditionalProperties();
+    Map<String,Object> extensions;
+    if (additionalProperties == null) {
+      additionalProperties = new HashMap<>();
+    }
+    if ( !Strings.isNullOrEmpty(extensionProperty) ) {
+      extensions = (Map<String, Object>) additionalProperties.get(extensionProperty);
+      if (extensions == null) {
+        extensions = new HashMap<>();
+        additionalProperties.put(extensionProperty, extensions);
+      }
+      return extensions;
+    } else {
+      return additionalProperties;
+    }
+  }
+
+  /**
+   * Creates a standard extension property.
+   * @param object object node to create the property in
+   * @return {@link Map} representing the extensions property
+   */
+  @SuppressWarnings("unchecked")
+  public Map<String, Object> ensureExtensions(ActivityObject object) {
+    Map<String,Object> additionalProperties = object.getAdditionalProperties();
+    Map<String,Object> extensions;
+    if (additionalProperties == null) {
+      additionalProperties = new HashMap<>();
+    }
+    if ( !Strings.isNullOrEmpty(extensionProperty) ) {
+      extensions = (Map<String, Object>) additionalProperties.get(extensionProperty);
+      if (extensions == null) {
+        extensions = new HashMap<>();
+        additionalProperties.put(extensionProperty, extensions);
+      }
+      return extensions;
+    } else {
+      return additionalProperties;
+    }
+  }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-pojo-extensions/src/test/java/org/apache/streams/pojo/extensions/test/ExtensionUtilTest.java
----------------------------------------------------------------------
diff --git a/streams-pojo-extensions/src/test/java/org/apache/streams/pojo/extensions/test/ExtensionUtilTest.java b/streams-pojo-extensions/src/test/java/org/apache/streams/pojo/extensions/test/ExtensionUtilTest.java
index 5cce209..de49da4 100644
--- a/streams-pojo-extensions/src/test/java/org/apache/streams/pojo/extensions/test/ExtensionUtilTest.java
+++ b/streams-pojo-extensions/src/test/java/org/apache/streams/pojo/extensions/test/ExtensionUtilTest.java
@@ -18,34 +18,31 @@
 
 package org.apache.streams.pojo.extensions.test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Strings;
-import com.google.common.collect.Maps;
-import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.pojo.extensions.ExtensionUtil;
 import org.apache.streams.pojo.json.Activity;
-import org.apache.streams.pojo.json.ActivityObject;
+
+import com.google.common.base.Strings;
 import org.junit.Test;
 
 import java.util.Map;
 
 /**
- *  Test ExtensionUtil methods
+ * Test ExtensionUtil methods.
  */
 public class ExtensionUtilTest {
 
-    @Test
-    public void testActivitySetCustomExtension() throws Exception {
-        ExtensionUtil customExtensionUtil = ExtensionUtil.getInstance("ext");
-        Activity activity = new Activity();
-        Map<String, Object> extensions = customExtensionUtil.ensureExtensions(activity);
-        String value = "value";
-        extensions.put("extension", value);
-        customExtensionUtil.setExtensions(activity, extensions);
-        assert(!Strings.isNullOrEmpty((String)customExtensionUtil.getExtension(activity, "extension")));
-        extensions = customExtensionUtil.getExtensions(activity);
-        assert(value.equals((String)extensions.get("extension")));
-        assert(activity.getAdditionalProperties().get("ext") != null);
-    }
+  @Test
+  public void testActivitySetCustomExtension() throws Exception {
+    ExtensionUtil customExtensionUtil = ExtensionUtil.getInstance("ext");
+    Activity activity = new Activity();
+    Map<String, Object> extensions = customExtensionUtil.ensureExtensions(activity);
+    String value = "value";
+    extensions.put("extension", value);
+    customExtensionUtil.setExtensions(activity, extensions);
+    assert (!Strings.isNullOrEmpty((String)customExtensionUtil.getExtension(activity, "extension")));
+    extensions = customExtensionUtil.getExtensions(activity);
+    assert (value.equals((String)extensions.get("extension")));
+    assert (activity.getAdditionalProperties().get("ext") != null);
+  }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverter.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverter.java b/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverter.java
index 4d6d759..70f2135 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverter.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/ActivityConverter.java
@@ -27,61 +27,67 @@ import java.util.List;
 /**
  * Converts non-Activity documents to Activities and back.
  *
+ * <p/>
  * Each converter may one, several, or zero activities.
  *
+ * <p/>
  * The recommended approach for deriving multiple activities from a source document is:
  *
+ * <p/>
  *   1) Return one activity for each occurance of a verb, from the same ActivityConverter, if the activities are of like type.
  *
+ * <p/>
  *      For example, BlogShareConverter would convert a blog containing two shares into two Activities with verb: share
  *
+ * <p/>
  *   2) Create multiple ActivityConverters, if the activities are not of like type.
  *
+ * <p/>
  *      For example, a blog post that is both a post and a share should be transformed by two seperate Converters, individually
  *      or simultaneously applied.
  */
 public interface ActivityConverter<T> extends Serializable {
 
-    /**
-     * What class does this ActivityConverter require?
-     *
-     * @return The class the ActivityConverter requires.  Should always return the templated class.
-     */
-    Class requiredClass();
+  /**
+   * 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();
+  /**
+   * 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 fromActivity(Activity deserialized) throws ActivityConversionException;
+  /**
+   * Converts the activity to a POJO representation.
+   *
+   * @param deserialized the string
+   * @return a fully populated Activity object
+   */
+  T fromActivity(Activity deserialized) throws ActivityConversionException;
 
-    /**
-     * Converts a POJO into one or more Activities
-     * @param serialized the string representation
-     * @return a fully populated Activity object
-     */
-    List<Activity> toActivityList(T serialized) throws ActivityConversionException;
+  /**
+   * Converts multiple Activities into a list of source documents.
+   * @param list a typed List of documents
+   * @return a list of source documents
+   */
+  List<T> fromActivityList(List<Activity> list) throws ActivityConversionException;
 
-    /**
-     * Converts multiple Activities into a list of source documents
-     * @param list a typed List of documents
-     * @return a list of source documents
-     */
-    List<T> fromActivityList(List<Activity> list) throws ActivityConversionException;
+  /**
+   * Converts a POJO into one or more Activities.
+   * @param serialized the string representation
+   * @return a fully populated Activity object
+   */
+  List<Activity> toActivityList(T serialized) throws ActivityConversionException;
 
-    /**
-     * Converts multiple documents into a list of Activity objects
-     * @param list a typed List of documents
-     * @return a list of fully populated activities
-     */
-    List<Activity> toActivityList(List<T> list) throws ActivityConversionException;
+  /**
+   * Converts multiple documents into a list of Activity objects.
+   * @param list a typed List of documents
+   * @return a list of fully populated activities
+   */
+  List<Activity> toActivityList(List<T> list) throws ActivityConversionException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/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
index 0d25d91..7e80327 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/ActivityObjectConverter.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/ActivityObjectConverter.java
@@ -22,44 +22,42 @@ 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.
  *
+ * <p/>
  * 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;
+  /**
+   * 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;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/5dffd5c3/streams-pojo/src/main/java/org/apache/streams/data/ActivitySerializer.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/ActivitySerializer.java b/streams-pojo/src/main/java/org/apache/streams/data/ActivitySerializer.java
index 8ca0c04..3a4282c 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/ActivitySerializer.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/ActivitySerializer.java
@@ -26,37 +26,38 @@ import java.util.List;
 /**
  * Serializes and deserializes Activities
  *
+ * <p/>
  * Deprecated: Switch all modules to use {@link org.apache.streams.data.ActivityConverter}
  */
 @Deprecated
 public interface ActivitySerializer<T> {
 
-    /**
-     * 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 serialize(Activity deserialized) throws ActivitySerializerException;
-
-    /**
-     * Converts a POJO into an Activity
-     * @param serialized the string representation
-     * @return a fully populated Activity object
-     */
-    Activity deserialize(T serialized) throws ActivitySerializerException;
-
-    /**
-     * Converts multiple documents into a list of Activity objects
-     * @param serializedList a typed List of documents
-     * @return a list of fully populated activities
-     */
-    List<Activity> deserializeAll(List<T> serializedList);
+  /**
+   * 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 serialize(Activity deserialized) throws ActivitySerializerException;
+
+  /**
+   * Converts a POJO into an Activity.
+   * @param serialized the string representation
+   * @return a fully populated Activity object
+   */
+  Activity deserialize(T serialized) throws ActivitySerializerException;
+
+  /**
+   * Converts multiple documents into a list of Activity objects.
+   * @param serializedList a typed List of documents
+   * @return a list of fully populated activities
+   */
+  List<Activity> deserializeAll(List<T> serializedList);
 }