You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by jo...@apache.org on 2014/12/16 20:05:29 UTC

[01/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Repository: incubator-nifi
Updated Branches:
  refs/heads/develop d7b1113a8 -> a94cf4be4


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..8747bc4
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,966 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>16</version>
+    </parent>
+    <groupId>org.apache.nifi</groupId>
+    <artifactId>nifi-parent</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>Apache NiFi (incubating) Parent</name>
+    <description>Apache NiFi is a dataflow system based on the concepts of flow-based programming. It is currently a part of the Apache Incubator.</description>
+    <url>http://nifi.incubator.apache.org/maven-site/</url>
+    <organization>
+        <name>Apache NiFi (incubating) Project</name>
+        <url>http://nifi.incubating.apache.org/</url>
+    </organization>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <mailingLists>
+        <mailingList>
+            <name>Dev</name>
+            <subscribe>dev-subscribe@nifi.incubator.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@nifi.incubator.apache.org</unsubscribe>
+            <post>dev@nifi.incubator.apache.org</post>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-dev</archive>
+        </mailingList>
+        <mailingList>
+            <name>Commits</name>
+            <subscribe>commits-subscribe@nifi.incubator.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@nifi.incubator.apache.org</unsubscribe>
+            <post>commits@nifi.incubator.apache.org</post>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-commits</archive>
+        </mailingList>
+    </mailingLists>
+    <prerequisites>
+        <maven>${maven.min-version}</maven>
+    </prerequisites>
+    <modules>
+        <module>commons</module>
+        <!--
+        ! Would prefer to have the nar-maven-plugin built as part of this parent.  However, Maven
+        ! blocks building plugins with extensions in the same reactor as other components which want to use the plugin.
+        ! See MNG-1911 and MNG-5572 for more details.
+        -->
+        <!--<module>nar-maven-plugin</module>-->
+        <module>nifi-api</module>
+        <module>nifi-bootstrap</module>
+        <module>nifi-mock</module>
+        <module>nar-bundles</module>
+        <module>assembly</module>
+    </modules>
+    <scm>
+        <connection>scm:git:git://git.apache.org/incubator-nifi.git</connection>
+        <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-nifi.git</developerConnection>
+        <url>https://git-wip-us.apache.org/repos/asf?p=incubator-nifi.git</url>
+    </scm>
+    <issueManagement>
+        <system>JIRA</system>
+        <url>https://issues.apache.org/jira/browse/NIFI</url>
+    </issueManagement>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <org.slf4j.version>1.7.8</org.slf4j.version>
+        <jetty.version>9.2.5.v20141112</jetty.version>
+        <lucene.version>4.10.2</lucene.version>
+        <spring.version>4.1.2.RELEASE</spring.version>
+        <spring.security.version>3.2.5.RELEASE</spring.security.version>
+        <jersey.version>1.18.3</jersey.version>
+    </properties>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>1.1.2</version>
+            </dependency>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>jcl-over-slf4j</artifactId>
+                <version>1.1.2</version>
+                <scope>provided</scope>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.slf4j</groupId>
+                        <artifactId>slf4j-api</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>jcl-over-slf4j</artifactId>
+                <version>${org.slf4j.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>log4j-over-slf4j</artifactId>
+                <version>${org.slf4j.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>jul-to-slf4j</artifactId>
+                <version>${org.slf4j.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${org.slf4j.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven</groupId>
+                <artifactId>maven-plugin-api</artifactId>
+                <version>2.0.11</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>2.9</version>
+                <type>maven-plugin</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.5</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.plugin-tools</groupId>
+                <artifactId>maven-plugin-annotations</artifactId>
+                <version>3.3</version>
+            </dependency>            
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>4.12</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-core</artifactId>
+                <version>1.10.16</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-all</artifactId>
+                <version>1.10.8</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-simple</artifactId>
+                <version>${org.slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-compress</artifactId>
+                <version>1.9</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>3.3.2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.antlr</groupId>
+                <artifactId>antlr-runtime</artifactId>
+                <version>3.5.2</version>
+            </dependency>  
+            <dependency>
+                <groupId>commons-codec</groupId>
+                <artifactId>commons-codec</artifactId>
+                <version>1.10</version>
+            </dependency>   
+            <dependency>
+                <groupId>commons-net</groupId>
+                <artifactId>commons-net</artifactId>
+                <version>3.3</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>2.4</version>
+            </dependency>
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk16</artifactId>
+                <version>1.46</version>
+            </dependency>
+            <dependency>
+                <groupId>com.jcraft</groupId>
+                <artifactId>jsch</artifactId>
+                <version>0.1.51</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>4.3.6</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.mail</groupId>
+                <artifactId>mail</artifactId>
+                <version>1.4.7</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.jponge</groupId>
+                <artifactId>lzma-java</artifactId>
+                <version>1.3</version>
+            </dependency>
+            <dependency>
+                <groupId>org.tukaani</groupId>
+                <artifactId>xz</artifactId>
+                <version>1.5</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sf.saxon</groupId>
+                <artifactId>Saxon-HE</artifactId>
+                <version>9.6.0-3</version>
+            </dependency>              
+            <dependency>
+                <groupId>stax</groupId>
+                <artifactId>stax-api</artifactId>
+                <version>1.0.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.quartz-scheduler</groupId>
+                <artifactId>quartz</artifactId>
+                <version>2.2.1</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey.contribs</groupId>
+                <artifactId>jersey-spring</artifactId>
+                <version>${jersey.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-web</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-aop</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-context</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-beans</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey.contribs</groupId>
+                <artifactId>jersey-multipart</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-beans</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-context</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-context-support</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-expression</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-tx</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-core</artifactId>
+                <version>${spring.version}</version>
+                <exclusions>
+                    <!-- <artifactId>jcl-over-slf4j</artifactId> is used in dependencies 
+                    section -->
+                    <exclusion>
+                        <groupId>commons-logging</groupId>
+                        <artifactId>commons-logging</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-web</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-aop</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-jdbc</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.security</groupId>
+                <artifactId>spring-security-core</artifactId>
+                <version>${spring.security.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-web</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-expression</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-aop</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-context</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-beans</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.security</groupId>
+                <artifactId>spring-security-web</artifactId>
+                <version>${spring.security.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-tx</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-jdbc</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-expression</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-web</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-aop</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-context</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-beans</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.security</groupId>
+                <artifactId>spring-security-acl</artifactId>
+                <version>${spring.security.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-tx</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-jdbc</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-aop</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-context</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.security</groupId>
+                <artifactId>spring-security-config</artifactId>
+                <version>${spring.security.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-aop</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-context</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>spring-beans</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.aspectj</groupId>
+                <artifactId>aspectjweaver</artifactId>
+                <version>1.8.4</version>
+            </dependency>
+            <dependency>
+                <groupId>cglib</groupId>
+                <artifactId>cglib-nodep</artifactId>
+                <version>3.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-collections4</artifactId>
+                <version>4.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-pool2</artifactId>
+                <version>2.2</version>
+            </dependency>
+            <dependency>
+                <groupId>com.jcraft</groupId>
+                <artifactId>jzlib</artifactId>
+                <version>1.1.3</version>
+            </dependency>      
+            <dependency>
+                <groupId>joda-time</groupId>
+                <artifactId>joda-time</artifactId>
+                <version>2.6</version>
+            </dependency>
+            <dependency>
+                <groupId>com.yammer.metrics</groupId>
+                <artifactId>metrics-ganglia</artifactId>
+                <version>2.2.0</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.jms</groupId>
+                <artifactId>javax.jms-api</artifactId>
+                <version>2.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.activemq</groupId>
+                <artifactId>activemq-client</artifactId>
+                <version>5.10.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.hornetq</groupId>
+                <artifactId>hornetq-jms-client</artifactId>
+                <version>2.4.5.Final</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.lucene</groupId>
+                <artifactId>lucene-core</artifactId>
+                <version>${lucene.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.lucene</groupId>
+                <artifactId>lucene-analyzers-common</artifactId>
+                <version>${lucene.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.lucene</groupId>
+                <artifactId>lucene-queryparser</artifactId>
+                <version>${lucene.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.hadoop</groupId>
+                <artifactId>hadoop-common</artifactId>
+                <version>2.5.2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.hadoop</groupId>
+                <artifactId>hadoop-hdfs</artifactId>
+                <version>2.5.2</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-server</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-core</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-json</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-servlet</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>            
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-client</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-server</artifactId>
+                <version>${jetty.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-servlet</artifactId>
+                <version>${jetty.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-webapp</artifactId>
+                <version>${jetty.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-servlets</artifactId>
+                <version>${jetty.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-jsp</artifactId>
+                <version>${jetty.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet.jsp</groupId>
+                <artifactId>javax.servlet.jsp-api</artifactId>
+                <version>2.3.1</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>javax.el</groupId>
+                <artifactId>javax.el-api</artifactId>
+                <version>3.0.0</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet.jsp.jstl</groupId>
+                <artifactId>javax.servlet.jsp.jstl-api</artifactId>
+                <version>1.2.1</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>javax.servlet-api</artifactId>
+                <version>3.1.0</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty.toolchain</groupId>
+                <artifactId>jetty-jsp-jdt</artifactId>
+                <version>2.3.3</version>
+                <scope>provided</scope>
+            </dependency>        
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>18.0</version>
+            </dependency>
+            <dependency>
+                <groupId>com.h2database</groupId>
+                <artifactId>h2</artifactId>
+                <version>1.3.176</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jasypt</groupId>
+                <artifactId>jasypt</artifactId>
+                <version>1.9.2</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-web-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-file-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-expression-language</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>custom-ui-utilities</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-core-flowfile-attributes</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>flowfile-packager</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>naive-search-ring-buffer</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-search-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-socket-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>data-provenance-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-runtime</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-bootstrap</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-resources</artifactId>
+                <version>${project.version}</version>
+                <classifier>resources</classifier>
+                <scope>provided</scope> <!-- Provided - we don't want the zip in the libs -->
+                <type>zip</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-framework-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>volatile-provenance-repository-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>persistent-provenance-repository-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>standard-services-api-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>ssl-context-service-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>distributed-cache-services-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-standard-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-jetty-bundle</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>update-attribute-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>monitor-threshold-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>hadoop-libraries-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>hadoop-nar</artifactId>
+                <version>${project.version}</version>
+                <type>nar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-stream-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-properties</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-security-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>                             
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-logging-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-nar</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-processor-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>remote-communications-utils</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-mock</artifactId>
+                <version>${project.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>wali</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>    
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.nifi</groupId>
+                    <artifactId>nar-maven-plugin</artifactId>
+                    <version>${project.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.2</version>
+                    <configuration>
+                        <source>1.7</source>
+                        <target>1.7</target>
+                        <fork>true</fork>
+                        <optimize>true</optimize>
+                        <encoding>UTF-8</encoding>
+                        <showDeprecation>true</showDeprecation>
+                        <showWarnings>true</showWarnings>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-plugin-plugin</artifactId>
+                    <version>3.3</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>2.9</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.7</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.18</version>
+                    <configuration>
+                        <argLine>-Xmx1G</argLine>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-assembly-plugin</artifactId>
+                    <version>2.5.2</version>
+                    <configuration>
+                        <attach>false</attach>
+                        <tarLongFileMode>gnu</tarLongFileMode>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.5.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>jaxb2-maven-plugin</artifactId>
+                    <version>1.6</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>2.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>exec-maven-plugin</artifactId>
+                    <version>1.3.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>2.10.1</version>
+                    <configuration>
+                        <failOnError>false</failOnError>
+                        <quiet>true</quiet>
+                        <show>private</show>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>rpm-maven-plugin</artifactId>
+                    <version>2.1.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.antlr</groupId>
+                    <artifactId>antlr3-maven-plugin</artifactId>
+                    <version>3.5.2</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nar-maven-plugin</artifactId>
+                <version>${project.version}</version>
+                <extensions>true</extensions>
+            </plugin>
+        </plugins>
+    </build>
+</project>


[03/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
new file mode 100644
index 0000000..b5f3fd6
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
@@ -0,0 +1,530 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import org.apache.nifi.distributed.cache.server.DistributedSetCacheServer;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.ConnectException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.distributed.cache.client.Deserializer;
+import org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService;
+import org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService;
+import org.apache.nifi.distributed.cache.client.Serializer;
+import org.apache.nifi.distributed.cache.client.exception.DeserializationException;
+import org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer;
+import org.apache.nifi.reporting.InitializationException;
+import org.apache.nifi.ssl.SSLContextService.ClientAuth;
+import org.apache.nifi.ssl.StandardSSLContextService;
+import org.apache.nifi.util.MockConfigurationContext;
+import org.apache.nifi.util.MockControllerServiceInitializationContext;
+
+import org.apache.commons.lang3.SerializationException;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestServerAndClient {
+
+    private static Logger LOGGER;
+
+    static {
+        System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "info");
+        System.setProperty("org.slf4j.simpleLogger.showDateTime", "true");
+        System.setProperty("org.slf4j.simpleLogger.log.nifi.distributed.cache.server.AbstractCacheServer", "debug");
+        System.setProperty("org.slf4j.simpleLogger.log.nifi.distributed.cache.client.DistributedMapCacheClientService", "debug");
+        System.setProperty("org.slf4j.simpleLogger.log.nifi.distributed.cache.server.TestServerAndClient", "debug");
+        System.setProperty("org.slf4j.simpleLogger.log.nifi.remote.io.socket.ssl.SSLSocketChannel", "trace");
+        LOGGER = LoggerFactory.getLogger(TestServerAndClient.class);
+    }
+
+    @Test
+    public void testNonPersistentSetServerAndClient() throws InitializationException, IOException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create server
+        final DistributedSetCacheServer server = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        final DistributedSetCacheClientService client = createClient();
+        final Serializer<String> serializer = new StringSerializer();
+        final boolean added = client.addIfAbsent("test", serializer);
+        assertTrue(added);
+
+        final boolean contains = client.contains("test", serializer);
+        assertTrue(contains);
+
+        final boolean addedAgain = client.addIfAbsent("test", serializer);
+        assertFalse(addedAgain);
+
+        final boolean removed = client.remove("test", serializer);
+        assertTrue(removed);
+
+        final boolean containedAfterRemove = client.contains("test", serializer);
+        assertFalse(containedAfterRemove);
+
+        server.shutdownServer();
+    }
+
+    @Test
+    public void testPersistentSetServerAndClient() throws InitializationException, IOException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create server
+        final DistributedSetCacheServer server = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final File dataFile = new File("target/cache-data");
+        deleteRecursively(dataFile);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        serverProperties.put(DistributedSetCacheServer.PERSISTENCE_PATH, dataFile.getAbsolutePath());
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        final DistributedSetCacheClientService client = createClient();
+        final Serializer<String> serializer = new StringSerializer();
+        final boolean added = client.addIfAbsent("test", serializer);
+        final boolean added2 = client.addIfAbsent("test2", serializer);
+        assertTrue(added);
+        assertTrue(added2);
+
+        final boolean contains = client.contains("test", serializer);
+        final boolean contains2 = client.contains("test2", serializer);
+        assertTrue(contains);
+        assertTrue(contains2);
+
+        final boolean addedAgain = client.addIfAbsent("test", serializer);
+        assertFalse(addedAgain);
+
+        final boolean removed = client.remove("test", serializer);
+        assertTrue(removed);
+
+        final boolean containedAfterRemove = client.contains("test", serializer);
+        assertFalse(containedAfterRemove);
+
+        server.shutdownServer();
+
+        final DistributedSetCacheServer newServer = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext newServerInitContext = new MockControllerServiceInitializationContext(newServer, "server2");
+        newServer.initialize(newServerInitContext);
+
+        final MockConfigurationContext newServerContext = new MockConfigurationContext(serverProperties,
+                newServerInitContext.getControllerServiceLookup());
+        newServer.startServer(newServerContext);
+
+        assertFalse(client.contains("test", serializer));
+        assertTrue(client.contains("test2", serializer));
+
+        newServer.shutdownServer();
+    }
+
+    @Test
+    public void testPersistentSetServerAndClientWithLFUEvictions() throws InitializationException, IOException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create server
+        final DistributedSetCacheServer server = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final File dataFile = new File("target/cache-data");
+        deleteRecursively(dataFile);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        serverProperties.put(DistributedSetCacheServer.PERSISTENCE_PATH, dataFile.getAbsolutePath());
+        serverProperties.put(DistributedSetCacheServer.MAX_CACHE_ENTRIES, "3");
+
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        final DistributedSetCacheClientService client = createClient();
+        final Serializer<String> serializer = new StringSerializer();
+        final boolean added = client.addIfAbsent("test", serializer);
+        waitABit();
+        final boolean added2 = client.addIfAbsent("test2", serializer);
+        waitABit();
+        final boolean added3 = client.addIfAbsent("test3", serializer);
+        waitABit();
+        assertTrue(added);
+        assertTrue(added2);
+        assertTrue(added3);
+
+        final boolean contains = client.contains("test", serializer);
+        final boolean contains2 = client.contains("test2", serializer);
+        assertTrue(contains);
+        assertTrue(contains2);
+
+        final boolean addedAgain = client.addIfAbsent("test", serializer);
+        assertFalse(addedAgain);
+
+        final boolean added4 = client.addIfAbsent("test4", serializer);
+        assertTrue(added4);
+
+        // ensure that added3 was evicted because it was used least frequently
+        assertFalse(client.contains("test3", serializer));
+
+        server.shutdownServer();
+
+        final DistributedSetCacheServer newServer = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext newServerInitContext = new MockControllerServiceInitializationContext(newServer, "server2");
+        newServer.initialize(newServerInitContext);
+
+        final MockConfigurationContext newServerContext = new MockConfigurationContext(serverProperties,
+                newServerInitContext.getControllerServiceLookup());
+        newServer.startServer(newServerContext);
+
+        assertTrue(client.contains("test", serializer));
+        assertTrue(client.contains("test2", serializer));
+        assertFalse(client.contains("test3", serializer));
+        assertTrue(client.contains("test4", serializer));
+
+        newServer.shutdownServer();
+    }
+
+    @Test
+    public void testPersistentSetServerAndClientWithFIFOEvictions() throws InitializationException, IOException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create server
+        final DistributedSetCacheServer server = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final File dataFile = new File("target/cache-data");
+        deleteRecursively(dataFile);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        serverProperties.put(DistributedSetCacheServer.PERSISTENCE_PATH, dataFile.getAbsolutePath());
+        serverProperties.put(DistributedSetCacheServer.MAX_CACHE_ENTRIES, "3");
+        serverProperties.put(DistributedSetCacheServer.EVICTION_POLICY, DistributedSetCacheServer.EVICTION_STRATEGY_FIFO);
+
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        final DistributedSetCacheClientService client = createClient();
+        final Serializer<String> serializer = new StringSerializer();
+
+        // add 3 entries to the cache. But, if we add too fast, we'll have the same millisecond
+        // for the entry time so we don't know which entry will be evicted. So we wait a few millis in between
+        final boolean added = client.addIfAbsent("test", serializer);
+        waitABit();
+        final boolean added2 = client.addIfAbsent("test2", serializer);
+        waitABit();
+        final boolean added3 = client.addIfAbsent("test3", serializer);
+        waitABit();
+
+        assertTrue(added);
+        assertTrue(added2);
+        assertTrue(added3);
+
+        final boolean contains = client.contains("test", serializer);
+        final boolean contains2 = client.contains("test2", serializer);
+        assertTrue(contains);
+        assertTrue(contains2);
+
+        final boolean addedAgain = client.addIfAbsent("test", serializer);
+        assertFalse(addedAgain);
+
+        final boolean added4 = client.addIfAbsent("test4", serializer);
+        assertTrue(added4);
+
+        // ensure that added3 was evicted because it was used least frequently
+        assertFalse(client.contains("test", serializer));
+        assertTrue(client.contains("test3", serializer));
+
+        server.shutdownServer();
+
+        final DistributedSetCacheServer newServer = new DistributedSetCacheServer();
+        MockControllerServiceInitializationContext newServerInitContext = new MockControllerServiceInitializationContext(newServer, "server2");
+        newServer.initialize(newServerInitContext);
+
+        final MockConfigurationContext newServerContext = new MockConfigurationContext(serverProperties,
+                newServerInitContext.getControllerServiceLookup());
+        newServer.startServer(newServerContext);
+
+        assertFalse(client.contains("test", serializer));
+        assertTrue(client.contains("test2", serializer));
+        assertTrue(client.contains("test3", serializer));
+        assertTrue(client.contains("test4", serializer));
+
+        newServer.shutdownServer();
+    }
+
+    @Test
+    public void testNonPersistentMapServerAndClient() throws InitializationException, IOException, InterruptedException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create server
+        final DistributedMapCacheServer server = new DistributedMapCacheServer();
+        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        DistributedMapCacheClientService client = new DistributedMapCacheClientService();
+        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
+        client.initialize(clientInitContext);
+
+        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
+        clientProperties.put(DistributedMapCacheClientService.HOSTNAME, "localhost");
+        clientProperties.put(DistributedMapCacheClientService.COMMUNICATIONS_TIMEOUT, "360 secs");
+        MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
+        client.cacheConfig(clientContext);
+        final Serializer<String> valueSerializer = new StringSerializer();
+        final Serializer<String> keySerializer = new StringSerializer();
+        final Deserializer<String> deserializer = new StringDeserializer();
+
+        final String original = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
+        assertEquals(null, original);
+        LOGGER.debug("end getAndPutIfAbsent");
+
+        final boolean contains = client.containsKey("testKey", keySerializer);
+        assertTrue(contains);
+        LOGGER.debug("end containsKey");
+
+        final boolean added = client.putIfAbsent("testKey", "test", keySerializer, valueSerializer);
+        assertFalse(added);
+        LOGGER.debug("end putIfAbsent");
+
+        final String originalAfterPut = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
+        assertEquals("test", originalAfterPut);
+        LOGGER.debug("end getAndPutIfAbsent");
+
+        final boolean removed = client.remove("testKey", keySerializer);
+        assertTrue(removed);
+        LOGGER.debug("end remove");
+
+        final boolean containedAfterRemove = client.containsKey("testKey", keySerializer);
+        assertFalse(containedAfterRemove);
+
+        client.putIfAbsent("testKey", "test", keySerializer, valueSerializer);
+        client.close();
+        try {
+            client.containsKey("testKey", keySerializer);
+            fail("Should be closed and not accessible");
+        } catch (Exception e) {
+
+        }
+        client = null;
+        clientInitContext = null;
+        clientContext = null;
+
+        DistributedMapCacheClientService client2 = new DistributedMapCacheClientService();
+
+        MockControllerServiceInitializationContext clientInitContext2 = new MockControllerServiceInitializationContext(client2, "client2");
+        client2.initialize(clientInitContext2);
+
+        MockConfigurationContext clientContext2 = new MockConfigurationContext(clientProperties,
+                clientInitContext2.getControllerServiceLookup());
+        client2.cacheConfig(clientContext2);
+        assertFalse(client2.putIfAbsent("testKey", "test", keySerializer, valueSerializer));
+        assertTrue(client2.containsKey("testKey", keySerializer));
+        server.shutdownServer();
+        Thread.sleep(1000);
+        try {
+            client2.containsKey("testKey", keySerializer);
+            fail("Should have blown exception!");
+        } catch (ConnectException e) {
+            client2 = null;
+            clientContext2 = null;
+            clientInitContext2 = null;
+        }
+        Thread.sleep(2000);
+        System.gc();
+        LOGGER.debug("end testNonPersistentMapServerAndClient");
+    }
+
+    @Test
+    public void testClientTermination() throws InitializationException, IOException, InterruptedException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create server
+        final DistributedMapCacheServer server = new DistributedMapCacheServer();
+        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        DistributedMapCacheClientService client = new DistributedMapCacheClientService();
+        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
+        client.initialize(clientInitContext);
+
+        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
+        clientProperties.put(DistributedMapCacheClientService.HOSTNAME, "localhost");
+        clientProperties.put(DistributedMapCacheClientService.COMMUNICATIONS_TIMEOUT, "360 secs");
+        MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
+        client.cacheConfig(clientContext);
+        final Serializer<String> valueSerializer = new StringSerializer();
+        final Serializer<String> keySerializer = new StringSerializer();
+        final Deserializer<String> deserializer = new StringDeserializer();
+
+        final String original = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
+        assertEquals(null, original);
+
+        final boolean contains = client.containsKey("testKey", keySerializer);
+        assertTrue(contains);
+
+        final boolean added = client.putIfAbsent("testKey", "test", keySerializer, valueSerializer);
+        assertFalse(added);
+
+        final String originalAfterPut = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
+        assertEquals("test", originalAfterPut);
+
+        final boolean removed = client.remove("testKey", keySerializer);
+        assertTrue(removed);
+
+        final boolean containedAfterRemove = client.containsKey("testKey", keySerializer);
+        assertFalse(containedAfterRemove);
+
+        client = null;
+        clientInitContext = null;
+        clientContext = null;
+        Thread.sleep(2000);
+        System.gc();
+        server.shutdownServer();
+    }
+
+    @Ignore
+    @Test
+    public void testSSLWith2RequestsWithServerTimeout() throws InitializationException, IOException, InterruptedException {
+        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
+        // Create SSLContext Service
+        final StandardSSLContextService sslService = new StandardSSLContextService();
+        final MockControllerServiceInitializationContext sslServerInitContext = new MockControllerServiceInitializationContext(sslService,
+                "ssl-context");
+        sslService.initialize(sslServerInitContext);
+
+        final Map<PropertyDescriptor, String> sslServerProps = new HashMap<>();
+        sslServerProps.put(StandardSSLContextService.KEYSTORE, "src/test/resources/localhost-ks.jks");
+        sslServerProps.put(StandardSSLContextService.KEYSTORE_PASSWORD, "localtest");
+        sslServerProps.put(StandardSSLContextService.KEYSTORE_TYPE, "JKS");
+        sslServerProps.put(StandardSSLContextService.TRUSTSTORE, "src/test/resources/localhost-ts.jks");
+        sslServerProps.put(StandardSSLContextService.TRUSTSTORE_PASSWORD, "localtest");
+        sslServerProps.put(StandardSSLContextService.TRUSTSTORE_TYPE, "JKS");
+        MockConfigurationContext sslServerContext = new MockConfigurationContext(sslServerProps, sslServerInitContext);
+        sslService.onConfigured(sslServerContext);
+        sslService.createSSLContext(ClientAuth.REQUIRED);
+        // Create server
+        final DistributedMapCacheServer server = new DistributedMapCacheServer();
+        final MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
+        server.initialize(serverInitContext);
+
+        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
+        serverProperties.put(DistributedMapCacheServer.SSL_CONTEXT_SERVICE, "ssl-context");
+        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
+        server.startServer(serverContext);
+
+        DistributedMapCacheClientService client = new DistributedMapCacheClientService();
+        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
+        client.initialize(clientInitContext);
+
+        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
+        clientProperties.put(DistributedMapCacheClientService.HOSTNAME, "localhost");
+        clientProperties.put(DistributedMapCacheClientService.COMMUNICATIONS_TIMEOUT, "360 secs");
+        clientProperties.put(DistributedMapCacheClientService.SSL_CONTEXT_SERVICE, "ssl-context");
+        MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
+        client.cacheConfig(clientContext);
+        final Serializer<String> valueSerializer = new StringSerializer();
+        final Serializer<String> keySerializer = new StringSerializer();
+        final Deserializer<String> deserializer = new StringDeserializer();
+
+        final String original = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
+        assertEquals(null, original);
+
+        Thread.sleep(30000);
+        try {
+            final boolean contains = client.containsKey("testKey", keySerializer);
+            assertTrue(contains);
+        } catch (IOException e) {
+            // this is due to the server timing out in the middle of this request
+            assertTrue(e.getMessage().contains("Channel is closed"));
+        }
+
+        server.shutdownServer();
+    }
+
+    private void waitABit() {
+        try {
+            Thread.sleep(10L);
+        } catch (final InterruptedException e) {
+        }
+    }
+
+    private DistributedSetCacheClientService createClient() throws InitializationException {
+        final DistributedSetCacheClientService client = new DistributedSetCacheClientService();
+        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
+        client.initialize(clientInitContext);
+
+        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
+        clientProperties.put(DistributedSetCacheClientService.HOSTNAME, "localhost");
+        final MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
+        client.onConfigured(clientContext);
+
+        return client;
+    }
+
+    private static class StringSerializer implements Serializer<String> {
+        @Override
+        public void serialize(final String value, final OutputStream output) throws SerializationException, IOException {
+            output.write(value.getBytes(StandardCharsets.UTF_8));
+        }
+    }
+
+    private static class StringDeserializer implements Deserializer<String> {
+        @Override
+        public String deserialize(final byte[] input) throws DeserializationException, IOException {
+            return (input.length == 0) ? null : new String(input, StandardCharsets.UTF_8);
+        }
+    }
+
+    private static void deleteRecursively(final File dataFile) throws IOException {
+        if (dataFile == null || !dataFile.exists()) {
+            return;
+        }
+
+        final File[] children = dataFile.listFiles();
+        for (final File child : children) {
+            if (child.isDirectory()) {
+                deleteRecursively(child);
+            } else {
+                for (int i = 0; i < 100 && child.exists(); i++) {
+                    child.delete();
+                }
+
+                if (child.exists()) {
+                    throw new IOException("Could not delete " + dataFile.getAbsolutePath());
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks
new file mode 100755
index 0000000..81be31d
Binary files /dev/null and b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks
new file mode 100755
index 0000000..820e1e1
Binary files /dev/null and b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml
new file mode 100644
index 0000000..8a34581
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml
@@ -0,0 +1,47 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>distributed-cache-services-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>distributed-cache-services-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>Distributed Cache Services NAR</name>
+    <packaging>nar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>standard-services-api-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-client-service</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-protocol</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-server</artifactId>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/pom.xml b/nar-bundles/standard-services/distributed-cache-services-bundle/pom.xml
new file mode 100644
index 0000000..f499831
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>standard-services-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    
+    <artifactId>distributed-cache-services-bundle</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>Distributed Cache Services Bundle</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>distributed-cache-protocol</module>
+        <module>distributed-cache-client-service</module>
+        <module>distributed-cache-server</module>
+        <module>distributed-cache-services-nar</module>
+    </modules>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/load-distribution-service-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/load-distribution-service-api/pom.xml b/nar-bundles/standard-services/load-distribution-service-api/pom.xml
new file mode 100644
index 0000000..c939e95
--- /dev/null
+++ b/nar-bundles/standard-services/load-distribution-service-api/pom.xml
@@ -0,0 +1,37 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>standard-services-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>load-distribution-service-api</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>Load Distribution Service API</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java b/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java
new file mode 100644
index 0000000..656bf99
--- /dev/null
+++ b/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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.nifi.loading;
+
+import java.util.Map;
+
+public interface LoadDistributionListener {
+
+    public void update(Map<String, Integer> loadInfo);
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java b/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java
new file mode 100644
index 0000000..c413975
--- /dev/null
+++ b/nar-bundles/standard-services/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java
@@ -0,0 +1,33 @@
+/*
+ * 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.nifi.loading;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.nifi.controller.ControllerService;
+
+/**
+ * A service that will provide a Map of Fully Qualified Domain Names (fqdn) with
+ * their respective weights (scale of 1 - 100).
+ */
+public interface LoadDistributionService extends ControllerService {
+
+    public Map<String, Integer> getLoadDistribution(Set<String> fqdns);
+
+    public Map<String, Integer> getLoadDistribution(Set<String> fqdns, LoadDistributionListener listener);
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/pom.xml b/nar-bundles/standard-services/pom.xml
new file mode 100644
index 0000000..047d642
--- /dev/null
+++ b/nar-bundles/standard-services/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nar-bundle-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>standard-services-parent</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>Standard Services Parent</name>
+
+    <modules>
+        <module>distributed-cache-client-service-api</module>
+        <module>distributed-cache-services-bundle</module>
+        <module>load-distribution-service-api</module>
+        <module>ssl-context-bundle</module>
+        <module>ssl-context-service-api</module>
+        <module>standard-services-api-nar</module>
+    </modules>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/nar/pom.xml b/nar-bundles/standard-services/ssl-context-bundle/nar/pom.xml
new file mode 100644
index 0000000..ec1e937
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/nar/pom.xml
@@ -0,0 +1,39 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>ssl-context-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+	
+    <artifactId>ssl-context-service-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>SSL Context Services Nar</name>
+    <packaging>nar</packaging>
+	
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>standard-services-api-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/pom.xml b/nar-bundles/standard-services/ssl-context-bundle/pom.xml
new file mode 100644
index 0000000..305e242
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>standard-services-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>ssl-context-bundle</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>SSL Context Bundle</name>
+
+    <modules>
+        <module>ssl-context-service</module>
+        <module>nar</module>
+    </modules>
+    
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/pom.xml b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/pom.xml
new file mode 100644
index 0000000..9e18e57
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/pom.xml
@@ -0,0 +1,52 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>ssl-context-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>ssl-context-service</artifactId>
+    <packaging>jar</packaging>
+
+    <name>SSL Context Controller Service</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-processor-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-security-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-mock</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java
new file mode 100644
index 0000000..d7aae16
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java
@@ -0,0 +1,354 @@
+/*
+ * 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.nifi.ssl;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.components.ValidationContext;
+import org.apache.nifi.components.ValidationResult;
+import org.apache.nifi.components.Validator;
+import org.apache.nifi.controller.AbstractControllerService;
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.controller.annotation.OnConfigured;
+import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.reporting.InitializationException;
+import org.apache.nifi.security.util.CertificateUtils;
+import org.apache.nifi.security.util.KeystoreType;
+import org.apache.nifi.security.util.SslContextFactory;
+
+public class StandardSSLContextService extends AbstractControllerService implements SSLContextService {
+
+    public static final String STORE_TYPE_JKS = "JKS";
+    public static final String STORE_TYPE_PKCS12 = "PKCS12";
+
+    public static final PropertyDescriptor TRUSTSTORE = new PropertyDescriptor.Builder()
+            .name("Truststore Filename")
+            .description("The fully-qualified filename of the Truststore")
+            .defaultValue(null)
+            .addValidator(createFileExistsAndReadableValidator())
+            .sensitive(false)
+            .build();
+    public static final PropertyDescriptor TRUSTSTORE_TYPE = new PropertyDescriptor.Builder()
+            .name("Truststore Type")
+            .description("The Type of the Truststore. Either JKS or PKCS12")
+            .allowableValues(STORE_TYPE_JKS, STORE_TYPE_PKCS12)
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .defaultValue(STORE_TYPE_JKS)
+            .sensitive(false)
+            .build();
+    public static final PropertyDescriptor TRUSTSTORE_PASSWORD = new PropertyDescriptor.Builder()
+            .name("Truststore Password")
+            .description("The password for the Truststore")
+            .defaultValue(null)
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .sensitive(true)
+            .build();
+    public static final PropertyDescriptor KEYSTORE = new PropertyDescriptor.Builder()
+            .name("Keystore Filename")
+            .description("The fully-qualified filename of the Keystore")
+            .defaultValue(null)
+            .addValidator(createFileExistsAndReadableValidator())
+            .sensitive(false)
+            .build();
+    public static final PropertyDescriptor KEYSTORE_TYPE = new PropertyDescriptor.Builder()
+            .name("Keystore Type")
+            .description("The Type of the Keystore")
+            .allowableValues(STORE_TYPE_JKS, STORE_TYPE_PKCS12)
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .defaultValue(STORE_TYPE_JKS)
+            .sensitive(false)
+            .build();
+    public static final PropertyDescriptor KEYSTORE_PASSWORD = new PropertyDescriptor.Builder()
+            .name("Keystore Password")
+            .defaultValue(null)
+            .description("The password for the Keystore")
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .sensitive(true)
+            .build();
+
+    private static final List<PropertyDescriptor> properties;
+
+    static {
+        List<PropertyDescriptor> props = new ArrayList<>();
+        props.add(KEYSTORE);
+        props.add(KEYSTORE_PASSWORD);
+        props.add(KEYSTORE_TYPE);
+        props.add(TRUSTSTORE);
+        props.add(TRUSTSTORE_PASSWORD);
+        props.add(TRUSTSTORE_TYPE);
+        properties = Collections.unmodifiableList(props);
+    }
+    private ConfigurationContext configContext;
+
+    @OnConfigured
+    public void onConfigured(final ConfigurationContext context) throws InitializationException {
+        configContext = context;
+
+        final Collection<ValidationResult> results = new ArrayList<>();
+        results.addAll(validateStore(context.getProperties(), KeystoreValidationGroup.KEYSTORE));
+        results.addAll(validateStore(context.getProperties(), KeystoreValidationGroup.TRUSTSTORE));
+
+        if (!results.isEmpty()) {
+            final StringBuilder sb = new StringBuilder(this + " is not valid due to:");
+            for (final ValidationResult result : results) {
+                sb.append("\n").append(result.toString());
+            }
+            throw new InitializationException(sb.toString());
+        }
+
+        if (countNulls(context.getProperty(KEYSTORE).getValue(),
+                context.getProperty(KEYSTORE_PASSWORD).getValue(),
+                context.getProperty(KEYSTORE_TYPE).getValue(),
+                context.getProperty(TRUSTSTORE).getValue(),
+                context.getProperty(TRUSTSTORE_PASSWORD).getValue(),
+                context.getProperty(TRUSTSTORE_TYPE).getValue()) >= 4) {
+            throw new InitializationException(this + " does not have the KeyStore or the TrustStore populated");
+        }
+
+        // verify that the filename, password, and type match
+        createSSLContext(ClientAuth.REQUIRED);
+    }
+
+    private static Validator createFileExistsAndReadableValidator() {
+        return new Validator() {
+            // Not using the FILE_EXISTS_VALIDATOR because the default is to
+            // allow expression language
+            @Override
+            public ValidationResult validate(String subject, String input, ValidationContext context) {
+                final String substituted;
+                try {
+                    substituted = context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
+                } catch (final Exception e) {
+                    return new ValidationResult.Builder()
+                            .subject(subject)
+                            .input(input)
+                            .valid(false)
+                            .explanation("Not a valid Expression Language value: " + e.getMessage())
+                            .build();
+                }
+
+                final File file = new File(substituted);
+                final boolean valid = file.exists() && file.canRead();
+                final String explanation = valid ? null : "File " + file + " does not exist or cannot be read";
+                return new ValidationResult.Builder()
+                        .subject(subject)
+                        .input(input)
+                        .valid(valid)
+                        .explanation(explanation)
+                        .build();
+            }
+        };
+    }
+
+    @Override
+    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+        return properties;
+    }
+
+    @Override
+    protected Collection<ValidationResult> customValidate(ValidationContext validationContext) {
+        final Collection<ValidationResult> results = new ArrayList<>();
+        results.addAll(validateStore(validationContext.getProperties(), KeystoreValidationGroup.KEYSTORE));
+        results.addAll(validateStore(validationContext.getProperties(), KeystoreValidationGroup.TRUSTSTORE));
+
+        if (countNulls(validationContext.getProperty(KEYSTORE).getValue(),
+                validationContext.getProperty(KEYSTORE_PASSWORD).getValue(),
+                validationContext.getProperty(KEYSTORE_TYPE).getValue(),
+                validationContext.getProperty(TRUSTSTORE).getValue(),
+                validationContext.getProperty(TRUSTSTORE_PASSWORD).getValue(),
+                validationContext.getProperty(TRUSTSTORE_TYPE).getValue())
+                >= 4) {
+            results.add(new ValidationResult.Builder()
+                    .subject(this.getClass().getSimpleName() + " : " + getIdentifier())
+                    .valid(false)
+                    .explanation("Does not have the KeyStore or the TrustStore populated")
+                    .build());
+        }
+        if (results.isEmpty()) {
+            // verify that the filename, password, and type match
+            try {
+                createSSLContext(ClientAuth.REQUIRED);
+            } catch (ProcessException e) {
+                results.add(new ValidationResult.Builder()
+                        .subject(getClass().getSimpleName() + " : " + getIdentifier())
+                        .valid(false)
+                        .explanation(e.getMessage())
+                        .build());
+            }
+        }
+        return results;
+    }
+
+    @Override
+    public SSLContext createSSLContext(final ClientAuth clientAuth) throws ProcessException {
+        try {
+            final String keystoreFile = configContext.getProperty(KEYSTORE).getValue();
+            if (keystoreFile == null) {
+                return SslContextFactory.createTrustSslContext(
+                        configContext.getProperty(TRUSTSTORE).getValue(),
+                        configContext.getProperty(TRUSTSTORE_PASSWORD).getValue().toCharArray(),
+                        configContext.getProperty(TRUSTSTORE_TYPE).getValue());
+            }
+            final String truststoreFile = configContext.getProperty(TRUSTSTORE).getValue();
+            if (truststoreFile == null) {
+                return SslContextFactory.createSslContext(
+                        configContext.getProperty(KEYSTORE).getValue(),
+                        configContext.getProperty(KEYSTORE_PASSWORD).getValue().toCharArray(),
+                        configContext.getProperty(KEYSTORE_TYPE).getValue());
+            }
+
+            return SslContextFactory.createSslContext(
+                    configContext.getProperty(KEYSTORE).getValue(),
+                    configContext.getProperty(KEYSTORE_PASSWORD).getValue().toCharArray(),
+                    configContext.getProperty(KEYSTORE_TYPE).getValue(),
+                    configContext.getProperty(TRUSTSTORE).getValue(),
+                    configContext.getProperty(TRUSTSTORE_PASSWORD).getValue().toCharArray(),
+                    configContext.getProperty(TRUSTSTORE_TYPE).getValue(),
+                    org.apache.nifi.security.util.SslContextFactory.ClientAuth.valueOf(clientAuth.name()));
+        } catch (final Exception e) {
+            throw new ProcessException(e);
+        }
+    }
+
+    @Override
+    public String getTrustStoreFile() {
+        return configContext.getProperty(TRUSTSTORE).getValue();
+    }
+
+    @Override
+    public String getTrustStoreType() {
+        return configContext.getProperty(TRUSTSTORE_TYPE).getValue();
+    }
+
+    @Override
+    public String getTrustStorePassword() {
+        return configContext.getProperty(TRUSTSTORE_PASSWORD).getValue();
+    }
+
+    @Override
+    public boolean isTrustStoreConfigured() {
+        return getTrustStoreFile() != null && getTrustStorePassword() != null && getTrustStoreType() != null;
+    }
+
+    @Override
+    public String getKeyStoreFile() {
+        return configContext.getProperty(KEYSTORE).getValue();
+    }
+
+    @Override
+    public String getKeyStoreType() {
+        return configContext.getProperty(KEYSTORE_TYPE).getValue();
+    }
+
+    @Override
+    public String getKeyStorePassword() {
+        return configContext.getProperty(KEYSTORE_PASSWORD).getValue();
+    }
+
+    @Override
+    public boolean isKeyStoreConfigured() {
+        return getKeyStoreFile() != null && getKeyStorePassword() != null && getKeyStoreType() != null;
+    }
+
+    private static Collection<ValidationResult> validateStore(final Map<PropertyDescriptor, String> properties,
+            final KeystoreValidationGroup keyStoreOrTrustStore) {
+        final Collection<ValidationResult> results = new ArrayList<>();
+
+        final String filename;
+        final String password;
+        final String type;
+
+        if (keyStoreOrTrustStore == KeystoreValidationGroup.KEYSTORE) {
+            filename = properties.get(KEYSTORE);
+            password = properties.get(KEYSTORE_PASSWORD);
+            type = properties.get(KEYSTORE_TYPE);
+        } else {
+            filename = properties.get(TRUSTSTORE);
+            password = properties.get(TRUSTSTORE_PASSWORD);
+            type = properties.get(TRUSTSTORE_TYPE);
+        }
+
+        final String keystoreDesc = (keyStoreOrTrustStore == KeystoreValidationGroup.KEYSTORE) ? "Keystore" : "Truststore";
+
+        final int nulls = countNulls(filename, password, type);
+        if (nulls != 3 && nulls != 0) {
+            results.add(new ValidationResult.Builder().valid(false).explanation("Must set either 0 or 3 properties for " + keystoreDesc)
+                    .subject(keystoreDesc + " Properties").build());
+        } else if (nulls == 0) {
+            // all properties were filled in.
+            final File file = new File(filename);
+            if (!file.exists() || !file.canRead()) {
+                results.add(new ValidationResult.Builder()
+                        .valid(false)
+                        .subject(keystoreDesc + " Properties")
+                        .explanation("Cannot access file " + file.getAbsolutePath())
+                        .build());
+            } else {
+                try {
+                    final boolean storeValid = CertificateUtils
+                            .isStoreValid(file.toURI().toURL(), KeystoreType.valueOf(type), password.toCharArray());
+                    if (!storeValid) {
+                        results.add(new ValidationResult.Builder()
+                                .subject(keystoreDesc + " Properties")
+                                .valid(false)
+                                .explanation("Invalid KeyStore Password or Type specified for file " + filename)
+                                .build());
+                    }
+                } catch (MalformedURLException e) {
+                    results.add(new ValidationResult.Builder()
+                            .subject(keystoreDesc + " Properties")
+                            .valid(false)
+                            .explanation("Malformed URL from file: " + e)
+                            .build());
+                }
+            }
+        }
+
+        return results;
+    }
+
+    private static int countNulls(Object... objects) {
+        int count = 0;
+        for (final Object x : objects) {
+            if (x == null) {
+                count++;
+            }
+        }
+
+        return count;
+    }
+
+    public static enum KeystoreValidationGroup {
+
+        KEYSTORE, TRUSTSTORE
+    }
+
+    @Override
+    public String toString() {
+        return "SSLContextService[id=" + getIdentifier() + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
new file mode 100644
index 0000000..b1b6124
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
@@ -0,0 +1,15 @@
+# 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.
+org.apache.nifi.ssl.StandardSSLContextService
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html
new file mode 100644
index 0000000..0ce9aa4
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html lang="en">
+    <!--
+      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.
+    -->
+    <head>
+        <meta charset="utf-8" />
+        <title>StandardSSLContextService</title>
+
+        <link rel="stylesheet" href="../../css/component-usage.css" type="text/css" />
+    </head>
+
+    <body>
+
+        <!-- Service Documentation ================================================== -->
+        <h2>Configuring the SSLContext Controller Service:</h2>
+        <p>
+            The SSLContext controller service is a mechanism for providing all the security properties that 
+            allow for secure communications between NiFi extensions and other systems. NiFi extensions include 
+            processors, reporting tasks, and other controller services. 
+        </p>
+
+        <p>
+            The <code>controller-services.xml</code> file is located in the NiFi <code>conf</code> 
+            directory. The user may set up any number of controller services within this file.
+        </p>
+
+        <p>
+            Below is an example of the template for a SSLContext controller service. Note that the identifier 
+            in this example is <code>ssl-context</code>. If using this template to create your own SSLContext controller 
+            service, replace the property values with values that are suitable for your system. Possible options for 
+            <code>Keystore Type</code> and <code>Truststore Type</code> are <span style="font-style: italic;">JKS</span>
+            or <span style="font-style: italic;">PKCS12</span>.
+        </p>
+
+        <pre>
+&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
+&lt;services&gt;
+    &lt;service&gt;
+        &lt;identifier&gt;ssl-context&lt;/identifier&gt;
+        &lt;class&gt;nifi.ssl.StandardSSLContextService&lt;/class&gt;
+        &lt;property name="Keystore Filename"&gt;C:/testpki/localtest-ks.jks&lt;/property&gt;
+        &lt;property name="Keystore Password"&gt;localtest&lt;/property&gt;
+        &lt;property name="Keystore Type"&gt;JKS&lt;/property&gt;
+        &lt;property name="Truststore Filename"&gt;C:/testpki/localtest-ts.jks&lt;/property&gt;
+        &lt;property name="Truststore Password"&gt;localtest&lt;/property&gt;
+        &lt;property name="Truststore Type"&gt;JKS&lt;/property&gt;
+    &lt;/service&gt;
+&lt;/services&gt;
+        </pre>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java
new file mode 100644
index 0000000..5d583ca
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java
@@ -0,0 +1,197 @@
+/*
+ * 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.nifi.ssl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+
+import org.apache.nifi.controller.ControllerService;
+import org.apache.nifi.reporting.InitializationException;
+import org.apache.nifi.ssl.SSLContextService.ClientAuth;
+import org.apache.nifi.util.TestRunner;
+import org.apache.nifi.util.TestRunners;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SSLContextServiceTest {
+
+    @Test
+    public void testBad1() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            runner.addControllerService("test-bad1", service, properties);
+            Assert.fail("Should have thrown an Exception");
+        } catch (InitializationException e) {
+            assertEquals(
+                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad1] does not have the KeyStore or the TrustStore populated",
+                    e.getCause().getCause().toString());
+        }
+    }
+
+    @Test
+    public void testBad2() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
+            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
+            runner.addControllerService("test-bad2", service, properties);
+            Assert.fail("Should have thrown an Exception");
+        } catch (InitializationException e) {
+            assertEquals(
+                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad2] is not valid due to:\n'Keystore Properties' is invalid because Must set either 0 or 3 properties for Keystore",
+                    e.getCause().getCause().toString());
+        }
+    }
+
+    @Test
+    public void testBad3() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
+            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "JKS");
+            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
+            runner.addControllerService("test-bad3", service, properties);
+            Assert.fail("Should have thrown an Exception");
+        } catch (InitializationException e) {
+            assertEquals(
+                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad3] is not valid due to:\n'Truststore Properties' is invalid because Must set either 0 or 3 properties for Truststore",
+                    e.getCause().getCause().toString());
+        }
+    }
+
+    @Test
+    public void testBad4() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
+            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "wrongpassword");
+            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
+            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
+            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "wrongpassword");
+            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
+            runner.addControllerService("test-bad4", service, properties);
+            Assert.fail("Should have thrown an Exception");
+        } catch (InitializationException e) {
+            assertEquals(
+                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad4] is not valid due to:\n"
+                    + "'Keystore Properties' is invalid because Invalid KeyStore Password or Type specified for file src/test/resources/localhost-ks.jks\n"
+                    + "'Truststore Properties' is invalid because Invalid KeyStore Password or Type specified for file src/test/resources/localhost-ts.jks",
+                    e.getCause().getCause().toString());
+        }
+    }
+
+    @Test
+    public void testBad5() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/DOES-NOT-EXIST.jks");
+            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
+            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
+            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
+            runner.addControllerService("test-bad5", service, properties);
+            Assert.fail("Should have thrown an Exception");
+        } catch (InitializationException e) {
+            assertTrue(e.getCause().getCause().toString().startsWith("org.apache.nifi.reporting.InitializationException: "
+                    + "SSLContextService[id=test-bad5] is not valid due to:\n'Keystore Properties' is invalid "
+                    + "because Cannot access file"));
+        }
+    }
+
+    @Test
+    public void testGood() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            ControllerService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
+            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
+            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
+            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
+            runner.addControllerService("test-good1", service, properties);
+            runner.setProperty("SSL Context Svc ID", "test-good1");
+            runner.assertValid();
+            service = runner.getProcessContext().getControllerServiceLookup().getControllerService("test-good1");
+            Assert.assertNotNull(service);
+            Assert.assertTrue(service instanceof StandardSSLContextService);
+            SSLContextService sslService = (SSLContextService) service;
+            sslService.createSSLContext(ClientAuth.REQUIRED);
+            sslService.createSSLContext(ClientAuth.WANT);
+            sslService.createSSLContext(ClientAuth.NONE);
+        } catch (InitializationException e) {
+        }
+    }
+
+    @Test
+    public void testGoodTrustOnly() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
+            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
+            runner.addControllerService("test-good2", service, properties);
+            runner.setProperty("SSL Context Svc ID", "test-good2");
+            runner.assertValid();
+            Assert.assertNotNull(service);
+            Assert.assertTrue(service instanceof StandardSSLContextService);
+            service.createSSLContext(ClientAuth.NONE);
+        } catch (InitializationException e) {
+        }
+    }
+
+    @Test
+    public void testGoodKeyOnly() {
+        try {
+            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
+            SSLContextService service = new StandardSSLContextService();
+            HashMap<String, String> properties = new HashMap<String, String>();
+            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
+            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
+            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "JKS");
+            runner.addControllerService("test-good3", service, properties);
+            runner.setProperty("SSL Context Svc ID", "test-good3");
+            runner.assertValid();
+            Assert.assertNotNull(service);
+            Assert.assertTrue(service instanceof StandardSSLContextService);
+            SSLContextService sslService = service;
+            sslService.createSSLContext(ClientAuth.NONE);
+        } catch (Exception e) {
+            System.out.println(e);
+            Assert.fail("Should not have thrown a exception " + e.getMessage());
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java
new file mode 100644
index 0000000..6cb2fb6
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java
@@ -0,0 +1,47 @@
+/*
+ * 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.nifi.ssl;
+
+import org.apache.nifi.ssl.SSLContextService;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.processor.AbstractProcessor;
+import org.apache.nifi.processor.ProcessContext;
+import org.apache.nifi.processor.ProcessSession;
+import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.processor.util.StandardValidators;
+
+public class TestProcessor extends AbstractProcessor {
+
+    @Override
+    public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
+    }
+
+    @Override
+    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+        List<PropertyDescriptor> propDescs = new ArrayList<>();
+        propDescs.add(new PropertyDescriptor.Builder()
+                .name("SSL Context Svc ID")
+                .description("ID of SSL Context Svc")
+                .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
+                .required(true)
+                .build());
+        return propDescs;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks
new file mode 100755
index 0000000..81be31d
Binary files /dev/null and b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks
new file mode 100755
index 0000000..820e1e1
Binary files /dev/null and b/nar-bundles/standard-services/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-service-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-service-api/pom.xml b/nar-bundles/standard-services/ssl-context-service-api/pom.xml
new file mode 100644
index 0000000..e71cabb
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-service-api/pom.xml
@@ -0,0 +1,36 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>standard-services-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>ssl-context-service-api</artifactId>
+    <packaging>jar</packaging>
+
+    <name>SSL Context Service API</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>


[10/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/misc/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml
----------------------------------------------------------------------
diff --git a/misc/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml b/misc/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml
deleted file mode 100644
index 0680d18..0000000
--- a/misc/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<component-set>
-    <components>
-        <component>
-            <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
-            <role-hint>nar</role-hint>
-            <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
-            <configuration>
-                <lifecycles>
-                    <lifecycle>
-                        <id>default</id>
-                        <phases>
-                            <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
-                            <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
-                            <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
-                            <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
-                            <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
-                            <package>org.apache.nifi:nar-maven-plugin:nar</package>
-                            <install>org.apache.maven.plugins:maven-install-plugin:install</install>
-                            <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
-                        </phases>
-                    </lifecycle>
-                </lifecycles>
-            </configuration>
-        </component>
-        <component>
-            <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
-            <role-hint>nar</role-hint>
-            <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
-            <configuration>
-                <type>nar</type>
-                <language>java</language>
-                <addedToClasspath>false</addedToClasspath>
-                <includesDependencies>true</includesDependencies>
-            </configuration>
-        </component>
-    </components>
-</component-set>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/misc/pom.xml
----------------------------------------------------------------------
diff --git a/misc/pom.xml b/misc/pom.xml
new file mode 100644
index 0000000..5c7ca7f
--- /dev/null
+++ b/misc/pom.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.nifi</groupId>
+    <artifactId>nar-maven-plugin</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>maven-plugin</packaging>
+    <name>Apache NiFi NAR Plugin</name>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <build>
+        <defaultGoal>install</defaultGoal>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.2</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.5</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <version>3.3</version>
+                <executions>
+                  <execution>
+                    <id>default-descriptor</id>
+                    <goals>
+                      <goal>descriptor</goal>
+                    </goals>
+                    <phase>process-classes</phase>
+                  </execution>
+                  <execution>
+                    <id>help-descriptor</id>
+                    <goals>
+                      <goal>helpmojo</goal>
+                    </goals>
+                    <phase>process-classes</phase>
+                  </execution>
+                </executions>
+              </plugin>
+        </plugins>
+    </build>    
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>2.0.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <version>2.9</version>
+            <type>maven-plugin</type>
+        </dependency>
+        <dependency>
+            <!-- No code from maven-jar-plugin is actually used; it's included
+            just to simplify the dependencies list.                     -->
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-jar-plugin</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.plugin-tools</groupId>
+            <artifactId>maven-plugin-annotations</artifactId>
+            <version>3.3</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+    <distributionManagement>
+        <repository>
+            <id>nifi-releases</id>
+            <url>${nifi.repo.url}</url>
+        </repository>
+        <snapshotRepository>
+            <id>nifi-snapshots</id>
+            <url>${nifi.snapshot.repo.url}</url>
+        </snapshotRepository>
+    </distributionManagement>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/misc/src/main/java/nifi/NarMojo.java
----------------------------------------------------------------------
diff --git a/misc/src/main/java/nifi/NarMojo.java b/misc/src/main/java/nifi/NarMojo.java
new file mode 100644
index 0000000..5196f73
--- /dev/null
+++ b/misc/src/main/java/nifi/NarMojo.java
@@ -0,0 +1,610 @@
+/*
+ * 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 nifi;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.archiver.MavenArchiver;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.installer.ArtifactInstaller;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.dependency.utils.DependencyStatusSets;
+import org.apache.maven.plugin.dependency.utils.DependencyUtil;
+import org.apache.maven.plugin.dependency.utils.filters.DestFileFilter;
+import org.apache.maven.plugin.dependency.utils.resolvers.ArtifactsResolver;
+import org.apache.maven.plugin.dependency.utils.resolvers.DefaultArtifactsResolver;
+import org.apache.maven.plugin.dependency.utils.translators.ArtifactTranslator;
+import org.apache.maven.plugin.dependency.utils.translators.ClassifierTypeTranslator;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
+import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
+import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
+import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
+import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
+import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
+import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
+import org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
+import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
+import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.archiver.jar.JarArchiver;
+import org.codehaus.plexus.archiver.jar.ManifestException;
+import org.codehaus.plexus.archiver.manager.ArchiverManager;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * Packages the current project as an Apache NiFi Archive (NAR).
+ *
+ * The following code is derived from maven-dependencies-plugin and
+ * maven-jar-plugin. The functionality of CopyDependenciesMojo and JarMojo was
+ * simplified to the use case of NarMojo.
+ *
+ */
+@Mojo(name = "nar", defaultPhase = LifecyclePhase.PACKAGE, threadSafe = false, requiresDependencyResolution = ResolutionScope.RUNTIME)
+public class NarMojo extends AbstractMojo {
+
+    private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"};
+    private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
+
+    /**
+     * POM
+     *
+     */
+    @Parameter(defaultValue = "${project}", readonly = true, required = true)
+    protected MavenProject project;
+
+    @Parameter(defaultValue = "${session}", readonly = true, required = true)
+    protected MavenSession session;
+
+    /**
+     * List of files to include. Specified as fileset patterns.
+     */
+    @Parameter(property = "includes")
+    protected String[] includes;
+    /**
+     * List of files to exclude. Specified as fileset patterns.
+     */
+    @Parameter(property = "excludes")
+    protected String[] excludes;
+    /**
+     * Name of the generated NAR.
+     *
+     */
+    @Parameter(alias = "narName", property = "nar.finalName", defaultValue = "${project.build.finalName}", required = true)
+    protected String finalName;
+
+    /**
+     * The Jar archiver.
+     *
+     * \@\component role="org.codehaus.plexus.archiver.Archiver" roleHint="jar"
+     */
+    @Component(role = org.codehaus.plexus.archiver.Archiver.class, hint = "jar")
+    private JarArchiver jarArchiver;
+    /**
+     * The archive configuration to use.
+     *
+     * See <a
+     * href="http://maven.apache.org/shared/maven-archiver/index.html">the
+     * documentation for Maven Archiver</a>.
+     *
+     */
+    @Parameter(property = "archive")
+    protected final MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+    /**
+     * Path to the default MANIFEST file to use. It will be used if
+     * <code>useDefaultManifestFile</code> is set to <code>true</code>.
+     *
+     */
+    @Parameter(property = "defaultManifestFiles", defaultValue = "${project.build.outputDirectory}/META-INF/MANIFEST.MF", readonly = true, required = true)
+    protected File defaultManifestFile;
+
+    /**
+     * Set this to <code>true</code> to enable the use of the
+     * <code>defaultManifestFile</code>.
+     *
+     * @since 2.2
+     */
+    @Parameter(property = "nar.useDefaultManifestFile", defaultValue = "false")
+    protected boolean useDefaultManifestFile;
+
+    @Component
+    protected MavenProjectHelper projectHelper;
+
+    /**
+     * Whether creating the archive should be forced.
+     *
+     */
+    @Parameter(property = "nar.forceCreation", defaultValue = "false")
+    protected boolean forceCreation;
+
+    /**
+     * Classifier to add to the artifact generated. If given, the artifact will
+     * be an attachment instead.
+     *
+     */
+    @Parameter(property = "classifier")
+    protected String classifier;
+
+    @Component
+    protected ArtifactInstaller installer;
+
+    @Component
+    protected ArtifactRepositoryFactory repositoryFactory;
+
+    /**
+     * This only applies if the classifier parameter is used.
+     *
+     */
+    @Parameter(property = "mdep.failOnMissingClassifierArtifact", defaultValue = "true", required = false)
+    protected boolean failOnMissingClassifierArtifact = true;
+
+    /**
+     * Comma Separated list of Types to include. Empty String indicates include
+     * everything (default).
+     *
+     */
+    @Parameter(property = "includeTypes", required = false)
+    protected String includeTypes;
+
+    /**
+     * Comma Separated list of Types to exclude. Empty String indicates don't
+     * exclude anything (default).
+     *
+     */
+    @Parameter(property = "excludeTypes", required = false)
+    protected String excludeTypes;
+
+    /**
+     * Scope to include. An Empty string indicates all scopes (default).
+     *
+     */
+    @Parameter(property = "includeScope", required = false)
+    protected String includeScope;
+
+    /**
+     * Scope to exclude. An Empty string indicates no scopes (default).
+     *
+     */
+    @Parameter(property = "excludeScope", required = false)
+    protected String excludeScope;
+
+    /**
+     * Comma Separated list of Classifiers to include. Empty String indicates
+     * include everything (default).
+     *
+     */
+    @Parameter(property = "includeClassifiers", required = false)
+    protected String includeClassifiers;
+
+    /**
+     * Comma Separated list of Classifiers to exclude. Empty String indicates
+     * don't exclude anything (default).
+     *
+     */
+    @Parameter(property = "excludeClassifiers", required = false)
+    protected String excludeClassifiers;
+
+    /**
+     * Specify classifier to look for. Example: sources
+     *
+     */
+    @Parameter(property = "classifier", required = false)
+    protected String copyDepClassifier;
+
+    /**
+     * Specify type to look for when constructing artifact based on classifier.
+     * Example: java-source,jar,war, nar
+     *
+     */
+    @Parameter(property = "type", required = false, defaultValue = "nar")
+    protected String type;
+
+    /**
+     * Comma separated list of Artifact names too exclude.
+     *
+     */
+    @Parameter(property = "excludeArtifacts", required = false)
+    protected String excludeArtifactIds;
+
+    /**
+     * Comma separated list of Artifact names to include.
+     *
+     */
+    @Parameter(property = "includeArtifacts", required = false)
+    protected String includeArtifactIds;
+
+    /**
+     * Comma separated list of GroupId Names to exclude.
+     *
+     */
+    @Parameter(property = "excludeArtifacts", required = false)
+    protected String excludeGroupIds;
+
+    /**
+     * Comma separated list of GroupIds to include.
+     *
+     */
+    @Parameter(property = "includeGroupIds", required = false)
+    protected String includeGroupIds;
+
+    /**
+     * Directory to store flag files
+     *
+     */
+    @Parameter(property = "markersDirectory", required = false, defaultValue = "${project.build.directory}/dependency-maven-plugin-markers")
+    protected File markersDirectory;
+
+    /**
+     * Overwrite release artifacts
+     *
+     */
+    @Parameter(property = "overWriteReleases", required = false)
+    protected boolean overWriteReleases;
+
+    /**
+     * Overwrite snapshot artifacts
+     *
+     */
+    @Parameter(property = "overWriteSnapshots", required = false)
+    protected boolean overWriteSnapshots;
+
+    /**
+     * Overwrite artifacts that don't exist or are older than the source.
+     *
+     */
+    @Parameter(property = "overWriteIfNewer", required = false, defaultValue = "true")
+    protected boolean overWriteIfNewer;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     */
+    @Component
+    protected ArtifactFactory factory;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     *
+     */
+    @Component
+    protected ArtifactResolver resolver;
+
+    /**
+     * Artifact collector, needed to resolve dependencies.
+     *
+     */
+    @Component(role = org.apache.maven.artifact.resolver.ArtifactCollector.class)
+    protected ArtifactCollector artifactCollector;
+
+    @Component(role = org.apache.maven.artifact.metadata.ArtifactMetadataSource.class)
+    protected ArtifactMetadataSource artifactMetadataSource;
+
+    /**
+     * Location of the local repository.
+     *
+     */
+    @Parameter(property = "localRepository", required = true, readonly = true)
+    protected ArtifactRepository local;
+
+    /**
+     * List of Remote Repositories used by the resolver
+     *
+     */
+    @Parameter(property = "project.remoteArtifactRepositories", required = true, readonly = true)
+    protected List remoteRepos;
+
+    /**
+     * To look up Archiver/UnArchiver implementations
+     *
+     */
+    @Component
+    protected ArchiverManager archiverManager;
+
+    /**
+     * Contains the full list of projects in the reactor.
+     *
+     */
+    @Parameter(property = "reactorProjects", required = true, readonly = true)
+    protected List reactorProjects;
+
+    /**
+     * If the plugin should be silent.
+     *
+     */
+    @Parameter(property = "silent", required = false, defaultValue = "false")
+    public boolean silent;
+
+    /**
+     * Output absolute filename for resolved artifacts
+     *
+     */
+    @Parameter(property = "outputAbsoluteArtifactFilename", defaultValue = "false", required = false)
+    protected boolean outputAbsoluteArtifactFilename;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        copyDependencies();
+        makeNar();
+    }
+
+    private void copyDependencies() throws MojoExecutionException {
+        DependencyStatusSets dss = getDependencySets(this.failOnMissingClassifierArtifact);
+        Set artifacts = dss.getResolvedDependencies();
+
+        for (Object artifactObj : artifacts) {
+            copyArtifact((Artifact) artifactObj);
+        }
+
+        artifacts = dss.getSkippedDependencies();
+        for (Object artifactOjb : artifacts) {
+            Artifact artifact = (Artifact) artifactOjb;
+            getLog().info(artifact.getFile().getName() + " already exists in destination.");
+        }
+    }
+
+    protected void copyArtifact(Artifact artifact) throws MojoExecutionException {
+        String destFileName = DependencyUtil.getFormattedFileName(artifact, false);
+        final File destDir = DependencyUtil.getFormattedOutputDirectory(false, false, false, false, false, getDependenciesDirectory(), artifact);
+        final File destFile = new File(destDir, destFileName);
+        copyFile(artifact.getFile(), destFile);
+    }
+
+    protected Artifact getResolvedPomArtifact(Artifact artifact) {
+        Artifact pomArtifact = this.factory.createArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "", "pom");
+        // Resolve the pom artifact using repos
+        try {
+            this.resolver.resolve(pomArtifact, this.remoteRepos, this.local);
+        } catch (ArtifactResolutionException | ArtifactNotFoundException e) {
+            getLog().info(e.getMessage());
+        }
+        return pomArtifact;
+    }
+
+    protected ArtifactsFilter getMarkedArtifactFilter() {
+        return new DestFileFilter(this.overWriteReleases, this.overWriteSnapshots, this.overWriteIfNewer, false, false, false, false, false, getDependenciesDirectory());
+    }
+
+    protected DependencyStatusSets getDependencySets(boolean stopOnFailure) throws MojoExecutionException {
+        // add filters in well known order, least specific to most specific
+        FilterArtifacts filter = new FilterArtifacts();
+
+        filter.addFilter(new ProjectTransitivityFilter(project.getDependencyArtifacts(), false));
+        filter.addFilter(new ScopeFilter(this.includeScope, this.excludeScope));
+        filter.addFilter(new TypeFilter(this.includeTypes, this.excludeTypes));
+        filter.addFilter(new ClassifierFilter(this.includeClassifiers, this.excludeClassifiers));
+        filter.addFilter(new GroupIdFilter(this.includeGroupIds, this.excludeGroupIds));
+        filter.addFilter(new ArtifactIdFilter(this.includeArtifactIds, this.excludeArtifactIds));
+
+        // explicitly filter our nar dependencies
+        filter.addFilter(new TypeFilter("", "nar"));
+
+        // start with all artifacts.
+        Set artifacts = project.getArtifacts();
+
+        // perform filtering
+        try {
+            artifacts = filter.filter(artifacts);
+        } catch (ArtifactFilterException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // transform artifacts if classifier is set
+        final DependencyStatusSets status;
+        if (StringUtils.isNotEmpty(copyDepClassifier)) {
+            status = getClassifierTranslatedDependencies(artifacts, stopOnFailure);
+        } else {
+            status = filterMarkedDependencies(artifacts);
+        }
+
+        return status;
+    }
+
+    protected DependencyStatusSets getClassifierTranslatedDependencies(Set artifacts, boolean stopOnFailure) throws MojoExecutionException {
+        Set unResolvedArtifacts = new HashSet();
+        Set resolvedArtifacts = artifacts;
+        DependencyStatusSets status = new DependencyStatusSets();
+
+        // possibly translate artifacts into a new set of artifacts based on the
+        // classifier and type
+        // if this did something, we need to resolve the new artifacts
+        if (StringUtils.isNotEmpty(copyDepClassifier)) {
+            ArtifactTranslator translator = new ClassifierTypeTranslator(this.copyDepClassifier, this.type, this.factory);
+            artifacts = translator.translate(artifacts, getLog());
+
+            status = filterMarkedDependencies(artifacts);
+
+            // the unskipped artifacts are in the resolved set.
+            artifacts = status.getResolvedDependencies();
+
+            // resolve the rest of the artifacts
+            ArtifactsResolver artifactsResolver = new DefaultArtifactsResolver(this.resolver, this.local,
+                    this.remoteRepos, stopOnFailure);
+            resolvedArtifacts = artifactsResolver.resolve(artifacts, getLog());
+
+            // calculate the artifacts not resolved.
+            unResolvedArtifacts.addAll(artifacts);
+            unResolvedArtifacts.removeAll(resolvedArtifacts);
+        }
+
+        // return a bean of all 3 sets.
+        status.setResolvedDependencies(resolvedArtifacts);
+        status.setUnResolvedDependencies(unResolvedArtifacts);
+
+        return status;
+    }
+
+    protected DependencyStatusSets filterMarkedDependencies(Set artifacts) throws MojoExecutionException {
+        // remove files that have markers already
+        FilterArtifacts filter = new FilterArtifacts();
+        filter.clearFilters();
+        filter.addFilter(getMarkedArtifactFilter());
+
+        Set unMarkedArtifacts;
+        try {
+            unMarkedArtifacts = filter.filter(artifacts);
+        } catch (ArtifactFilterException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // calculate the skipped artifacts
+        Set skippedArtifacts = new HashSet();
+        skippedArtifacts.addAll(artifacts);
+        skippedArtifacts.removeAll(unMarkedArtifacts);
+
+        return new DependencyStatusSets(unMarkedArtifacts, null, skippedArtifacts);
+    }
+
+    protected void copyFile(File artifact, File destFile) throws MojoExecutionException {
+        try {
+            getLog().info("Copying " + (this.outputAbsoluteArtifactFilename ? artifact.getAbsolutePath() : artifact.getName()) + " to " + destFile);
+            FileUtils.copyFile(artifact, destFile);
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error copying artifact from " + artifact + " to " + destFile, e);
+        }
+    }
+
+    private File getClassesDirectory() {
+        final File outputDirectory = new File(project.getBasedir(), "target");
+        return new File(outputDirectory, "classes");
+    }
+
+    private File getDependenciesDirectory() {
+        return new File(getClassesDirectory(), "META-INF/dependencies");
+    }
+
+    private void makeNar() throws MojoExecutionException {
+        File narFile = createArchive();
+
+        if (classifier != null) {
+            projectHelper.attachArtifact(project, "nar", classifier, narFile);
+        } else {
+            project.getArtifact().setFile(narFile);
+        }
+    }
+
+    public File createArchive() throws MojoExecutionException {
+        final File outputDirectory = new File(project.getBasedir(), "target");
+        File narFile = getNarFile(outputDirectory, finalName, classifier);
+        MavenArchiver archiver = new MavenArchiver();
+        archiver.setArchiver(jarArchiver);
+        archiver.setOutputFile(narFile);
+        archive.setForced(forceCreation);
+
+        try {
+            File contentDirectory = getClassesDirectory();
+            if (!contentDirectory.exists()) {
+                getLog().warn("NAR will be empty - no content was marked for inclusion!");
+            } else {
+                archiver.getArchiver().addDirectory(contentDirectory, getIncludes(), getExcludes());
+            }
+
+            File existingManifest = defaultManifestFile;
+            if (useDefaultManifestFile && existingManifest.exists() && archive.getManifestFile() == null) {
+                getLog().info("Adding existing MANIFEST to archive. Found under: " + existingManifest.getPath());
+                archive.setManifestFile(existingManifest);
+            }
+
+            // automatically add the artifact id to the manifest
+            archive.addManifestEntry("Nar-Id", project.getArtifactId());
+
+            // look for a nar dependency
+            String narDependency = getNarDependency();
+            if (narDependency != null) {
+                archive.addManifestEntry("Nar-Dependency-Id", narDependency);
+            }
+
+            archiver.createArchive(session, project, archive);
+            return narFile;
+        } catch (ArchiverException | MojoExecutionException | ManifestException | IOException | DependencyResolutionRequiredException e) {
+            throw new MojoExecutionException("Error assembling NAR", e);
+        }
+    }
+
+    private String[] getIncludes() {
+        if (includes != null && includes.length > 0) {
+            return includes;
+        }
+        return DEFAULT_INCLUDES;
+    }
+
+    private String[] getExcludes() {
+        if (excludes != null && excludes.length > 0) {
+            return excludes;
+        }
+        return DEFAULT_EXCLUDES;
+    }
+
+    protected File getNarFile(File basedir, String finalName, String classifier) {
+        if (classifier == null) {
+            classifier = "";
+        } else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) {
+            classifier = "-" + classifier;
+        }
+
+        return new File(basedir, finalName + classifier + ".nar");
+    }
+
+    private String getNarDependency() throws MojoExecutionException {
+        String narDependency = null;
+
+        // get nar dependencies
+        FilterArtifacts filter = new FilterArtifacts();
+        filter.addFilter(new TypeFilter("nar", ""));
+
+        // start with all artifacts.
+        Set artifacts = project.getArtifacts();
+
+        // perform filtering
+        try {
+            artifacts = filter.filter(artifacts);
+        } catch (ArtifactFilterException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // ensure there is a single nar dependency
+        if (artifacts.size() > 1) {
+            throw new MojoExecutionException("Each NAR represents a ClassLoader. A NAR dependency allows that NAR's ClassLoader to be "
+                    + "used as the parent of this NAR's ClassLoader. As a result, only a single NAR dependency is allowed.");
+        } else if (artifacts.size() == 1) {
+            final Artifact artifact = (Artifact) artifacts.iterator().next();
+            narDependency = artifact.getArtifactId();
+        }
+
+        return narDependency;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/misc/src/main/resources/META-INF/plexus/components.xml
----------------------------------------------------------------------
diff --git a/misc/src/main/resources/META-INF/plexus/components.xml b/misc/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..0680d18
--- /dev/null
+++ b/misc/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<component-set>
+    <components>
+        <component>
+            <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+            <role-hint>nar</role-hint>
+            <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+            <configuration>
+                <lifecycles>
+                    <lifecycle>
+                        <id>default</id>
+                        <phases>
+                            <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
+                            <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
+                            <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                            <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
+                            <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
+                            <package>org.apache.nifi:nar-maven-plugin:nar</package>
+                            <install>org.apache.maven.plugins:maven-install-plugin:install</install>
+                            <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
+                        </phases>
+                    </lifecycle>
+                </lifecycles>
+            </configuration>
+        </component>
+        <component>
+            <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
+            <role-hint>nar</role-hint>
+            <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
+            <configuration>
+                <type>nar</type>
+                <language>java</language>
+                <addedToClasspath>false</addedToClasspath>
+                <includesDependencies>true</includesDependencies>
+            </configuration>
+        </component>
+    </components>
+</component-set>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml
deleted file mode 100644
index 6280349..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
-	<modelVersion>4.0.0</modelVersion>
-
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>distributed-cache-services-bundle</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
-
-	<artifactId>distributed-cache-client-service</artifactId>
-	<packaging>jar</packaging>
-
-	<name>Distributed Cache Client Service</name>
-	<description>Provides a Client for interfacing with a Distributed Cache</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-client-service-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-protocol</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>remote-communications-utils</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-processor-utils</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-stream-utils</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>ssl-context-service-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.9</version>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java
deleted file mode 100644
index f838c2f..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.TimeUnit;
-
-import javax.net.ssl.SSLContext;
-
-public interface CommsSession extends Closeable {
-
-    void setTimeout(final long value, final TimeUnit timeUnit);
-    
-    InputStream getInputStream() throws IOException;
-    
-    OutputStream getOutputStream() throws IOException;
-    
-    boolean isClosed();
-    
-    void interrupt();
-    
-    String getHostname();
-    
-    int getPort();
-    
-    long getTimeout(TimeUnit timeUnit);
-    
-    SSLContext getSSLContext();
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java
deleted file mode 100644
index ee96660..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.controller.AbstractControllerService;
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.controller.annotation.OnConfigured;
-import org.apache.nifi.distributed.cache.protocol.ProtocolHandshake;
-import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
-import org.apache.nifi.io.ByteArrayOutputStream;
-import org.apache.nifi.io.DataOutputStream;
-import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.remote.StandardVersionNegotiator;
-import org.apache.nifi.remote.VersionNegotiator;
-import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.ssl.SSLContextService.ClientAuth;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DistributedMapCacheClientService extends AbstractControllerService implements DistributedMapCacheClient {
-
-    private static final Logger logger = LoggerFactory.getLogger(DistributedMapCacheClientService.class);
-
-    public static final PropertyDescriptor HOSTNAME = new PropertyDescriptor.Builder()
-            .name("Server Hostname")
-            .description("The name of the server that is running the DistributedMapCacheServer service")
-            .required(true)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .build();
-    public static final PropertyDescriptor PORT = new PropertyDescriptor.Builder()
-            .name("Server Port")
-            .description("The port on the remote server that is to be used when communicating with the DistributedMapCacheServer service")
-            .required(true)
-            .addValidator(StandardValidators.PORT_VALIDATOR)
-            .defaultValue("4557")
-            .build();
-    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
-            .name("SSL Context Service")
-            .description(
-                    "If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted")
-            .required(false)
-            .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
-            .defaultValue(null)
-            .build();
-    public static final PropertyDescriptor COMMUNICATIONS_TIMEOUT = new PropertyDescriptor.Builder()
-            .name("Communications Timeout")
-            .description(
-                    "Specifies how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received")
-            .required(true)
-            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
-            .defaultValue("30 secs")
-            .build();
-
-    private final BlockingQueue<CommsSession> queue = new LinkedBlockingQueue<>();
-    private volatile ConfigurationContext configContext;
-    private volatile boolean closed = false;
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        final List<PropertyDescriptor> descriptors = new ArrayList<>();
-        descriptors.add(HOSTNAME);
-        descriptors.add(PORT);
-        descriptors.add(SSL_CONTEXT_SERVICE);
-        descriptors.add(COMMUNICATIONS_TIMEOUT);
-        return descriptors;
-    }
-
-    @OnConfigured
-    public void cacheConfig(final ConfigurationContext context) {
-        this.configContext = context;
-    }
-
-    @Override
-    public <K, V> boolean putIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer)
-            throws IOException {
-        return withCommsSession(new CommsAction<Boolean>() {
-            @Override
-            public Boolean execute(final CommsSession session) throws IOException {
-                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
-                dos.writeUTF("putIfAbsent");
-
-                serialize(key, keySerializer, dos);
-                serialize(value, valueSerializer, dos);
-
-                dos.flush();
-
-                final DataInputStream dis = new DataInputStream(session.getInputStream());
-                return dis.readBoolean();
-            }
-        });
-    }
-
-    @Override
-    public <K> boolean containsKey(final K key, final Serializer<K> keySerializer) throws IOException {
-        return withCommsSession(new CommsAction<Boolean>() {
-            @Override
-            public Boolean execute(final CommsSession session) throws IOException {
-                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
-                dos.writeUTF("containsKey");
-
-                serialize(key, keySerializer, dos);
-                dos.flush();
-
-                final DataInputStream dis = new DataInputStream(session.getInputStream());
-                return dis.readBoolean();
-            }
-        });
-    }
-
-    @Override
-    public <K, V> V getAndPutIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer,
-            final Deserializer<V> valueDeserializer) throws IOException {
-        return withCommsSession(new CommsAction<V>() {
-            @Override
-            public V execute(final CommsSession session) throws IOException {
-                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
-                dos.writeUTF("getAndPutIfAbsent");
-
-                serialize(key, keySerializer, dos);
-                serialize(value, valueSerializer, dos);
-                dos.flush();
-
-                // read response
-                final DataInputStream dis = new DataInputStream(session.getInputStream());
-                final byte[] responseBuffer = readLengthDelimitedResponse(dis);
-                return valueDeserializer.deserialize(responseBuffer);
-            }
-        });
-    }
-
-    @Override
-    public <K, V> V get(final K key, final Serializer<K> keySerializer, final Deserializer<V> valueDeserializer) throws IOException {
-        return withCommsSession(new CommsAction<V>() {
-            @Override
-            public V execute(final CommsSession session) throws IOException {
-                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
-                dos.writeUTF("get");
-
-                serialize(key, keySerializer, dos);
-                dos.flush();
-
-                // read response
-                final DataInputStream dis = new DataInputStream(session.getInputStream());
-                final byte[] responseBuffer = readLengthDelimitedResponse(dis);
-                return valueDeserializer.deserialize(responseBuffer);
-            }
-        });
-    }
-
-    @Override
-    public <K> boolean remove(final K key, final Serializer<K> serializer) throws IOException {
-        return withCommsSession(new CommsAction<Boolean>() {
-            @Override
-            public Boolean execute(final CommsSession session) throws IOException {
-                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
-                dos.writeUTF("remove");
-
-                serialize(key, serializer, dos);
-                dos.flush();
-
-                // read response
-                final DataInputStream dis = new DataInputStream(session.getInputStream());
-                return dis.readBoolean();
-            }
-        });
-    }
-
-    private byte[] readLengthDelimitedResponse(final DataInputStream dis) throws IOException {
-        final int responseLength = dis.readInt();
-        final byte[] responseBuffer = new byte[responseLength];
-        dis.readFully(responseBuffer);
-        return responseBuffer;
-    }
-
-    public CommsSession createCommsSession(final ConfigurationContext context) throws IOException {
-        final String hostname = context.getProperty(HOSTNAME).getValue();
-        final int port = context.getProperty(PORT).asInteger();
-        final long timeoutMillis = context.getProperty(COMMUNICATIONS_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS);
-        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
-
-        final CommsSession commsSession;
-        if (sslContextService == null) {
-            commsSession = new StandardCommsSession(hostname, port);
-        } else {
-            commsSession = new SSLCommsSession(sslContextService.createSSLContext(ClientAuth.REQUIRED), hostname, port);
-        }
-
-        commsSession.setTimeout(timeoutMillis, TimeUnit.MILLISECONDS);
-        return commsSession;
-    }
-
-    private CommsSession leaseCommsSession() throws IOException {
-        CommsSession session = queue.poll();
-        if (session != null && !session.isClosed()) {
-            return session;
-        }
-
-        session = createCommsSession(configContext);
-        final VersionNegotiator versionNegotiator = new StandardVersionNegotiator(1);
-        try {
-            ProtocolHandshake.initiateHandshake(session.getInputStream(), session.getOutputStream(), versionNegotiator);
-        } catch (final HandshakeException e) {
-            try {
-                session.close();
-            } catch (final IOException ioe) {
-            }
-
-            throw new IOException(e);
-        }
-
-        return session;
-    }
-
-    @Override
-    public void close() throws IOException {
-        this.closed = true;
-
-        CommsSession commsSession;
-        while ((commsSession = queue.poll()) != null) {
-            try (final DataOutputStream dos = new DataOutputStream(commsSession.getOutputStream())) {
-                dos.writeUTF("close");
-                dos.flush();
-                commsSession.close();
-            } catch (final IOException e) {
-            }
-        }
-        logger.info("Closed {}", new Object[] { getIdentifier() });
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        if (!closed)
-            close();
-        logger.debug("Finalize called");
-    }
-
-    private <T> void serialize(final T value, final Serializer<T> serializer, final DataOutputStream dos) throws IOException {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.serialize(value, baos);
-        dos.writeInt(baos.size());
-        baos.writeTo(dos);
-    }
-
-    private <T> T withCommsSession(final CommsAction<T> action) throws IOException {
-        if (closed) {
-            throw new IllegalStateException("Client is closed");
-        }
-
-        final CommsSession session = leaseCommsSession();
-        try {
-            return action.execute(session);
-        } catch (final IOException ioe) {
-            try {
-                session.close();
-            } catch (final IOException ignored) {
-            }
-
-            throw ioe;
-        } finally {
-            if (!session.isClosed()) {
-                if (this.closed) {
-                    try {
-                        session.close();
-                    } catch (final IOException ioe) {
-                    }
-                } else {
-                    queue.offer(session);
-                }
-            }
-        }
-    }
-
-    private static interface CommsAction<T> {
-        T execute(CommsSession commsSession) throws IOException;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java
deleted file mode 100644
index 1d7c94c..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.controller.AbstractControllerService;
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.controller.annotation.OnConfigured;
-import org.apache.nifi.distributed.cache.protocol.ProtocolHandshake;
-import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
-import org.apache.nifi.io.ByteArrayOutputStream;
-import org.apache.nifi.io.DataOutputStream;
-import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.remote.StandardVersionNegotiator;
-import org.apache.nifi.remote.VersionNegotiator;
-import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.ssl.SSLContextService.ClientAuth;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DistributedSetCacheClientService extends AbstractControllerService implements DistributedSetCacheClient {
-
-    private static final Logger logger = LoggerFactory.getLogger(DistributedMapCacheClientService.class);
-
-    public static final PropertyDescriptor HOSTNAME = new PropertyDescriptor.Builder()
-            .name("Server Hostname")
-            .description("The name of the server that is running the DistributedSetCacheServer service")
-            .required(true)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .build();
-    public static final PropertyDescriptor PORT = new PropertyDescriptor.Builder()
-            .name("Server Port")
-            .description("The port on the remote server that is to be used when communicating with the DistributedSetCacheServer service")
-            .required(true)
-            .addValidator(StandardValidators.PORT_VALIDATOR)
-            .defaultValue("4557")
-            .build();
-    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
-            .name("SSL Context Service")
-            .description(
-                    "If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted")
-            .required(false)
-            .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
-            .defaultValue(null)
-            .build();
-    public static final PropertyDescriptor COMMUNICATIONS_TIMEOUT = new PropertyDescriptor.Builder()
-            .name("Communications Timeout")
-            .description(
-                    "Specifices how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received")
-            .required(true)
-            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
-            .defaultValue("30 secs")
-            .build();
-
-    private final BlockingQueue<CommsSession> queue = new LinkedBlockingQueue<>();
-    private volatile ConfigurationContext configContext;
-    private volatile boolean closed = false;
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        final List<PropertyDescriptor> descriptors = new ArrayList<>();
-        descriptors.add(HOSTNAME);
-        descriptors.add(PORT);
-        descriptors.add(SSL_CONTEXT_SERVICE);
-        descriptors.add(COMMUNICATIONS_TIMEOUT);
-        return descriptors;
-    }
-
-    @OnConfigured
-    public void onConfigured(final ConfigurationContext context) {
-        this.configContext = context;
-    }
-
-    public CommsSession createCommsSession(final ConfigurationContext context) throws IOException {
-        final String hostname = context.getProperty(HOSTNAME).getValue();
-        final int port = context.getProperty(PORT).asInteger();
-        final long timeoutMillis = context.getProperty(COMMUNICATIONS_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS);
-        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
-
-        final CommsSession commsSession;
-        if (sslContextService == null) {
-            commsSession = new StandardCommsSession(hostname, port);
-        } else {
-            commsSession = new SSLCommsSession(sslContextService.createSSLContext(ClientAuth.REQUIRED), hostname, port);
-        }
-
-        commsSession.setTimeout(timeoutMillis, TimeUnit.MILLISECONDS);
-        return commsSession;
-    }
-
-    private CommsSession leaseCommsSession() throws IOException {
-        CommsSession session = queue.poll();
-        if (session != null && !session.isClosed()) {
-            return session;
-        }
-
-        session = createCommsSession(configContext);
-        final VersionNegotiator versionNegotiator = new StandardVersionNegotiator(1);
-        try {
-            ProtocolHandshake.initiateHandshake(session.getInputStream(), session.getOutputStream(), versionNegotiator);
-        } catch (final HandshakeException e) {
-            try {
-                session.close();
-            } catch (final IOException ioe) {
-            }
-
-            throw new IOException(e);
-        }
-
-        return session;
-    }
-
-    @Override
-    public <T> boolean addIfAbsent(final T value, final Serializer<T> serializer) throws IOException {
-        return invokeRemoteBoolean("addIfAbsent", value, serializer);
-    }
-
-    @Override
-    public <T> boolean contains(final T value, final Serializer<T> serializer) throws IOException {
-        return invokeRemoteBoolean("contains", value, serializer);
-    }
-
-    @Override
-    public <T> boolean remove(final T value, final Serializer<T> serializer) throws IOException {
-        return invokeRemoteBoolean("remove", value, serializer);
-    }
-
-    @Override
-    public void close() throws IOException {
-        this.closed = true;
-
-        CommsSession commsSession;
-        while ((commsSession = queue.poll()) != null) {
-            try (final DataOutputStream dos = new DataOutputStream(commsSession.getOutputStream())) {
-                dos.writeUTF("close");
-                dos.flush();
-                commsSession.close();
-            } catch (final IOException e) {
-            }
-        }
-        logger.info("Closed {}", new Object[] { getIdentifier() });
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        if (!closed)
-            close();
-        logger.debug("Finalize called");
-    }
-
-    private <T> boolean invokeRemoteBoolean(final String methodName, final T value, final Serializer<T> serializer) throws IOException {
-        if (closed) {
-            throw new IllegalStateException("Client is closed");
-        }
-
-        final CommsSession session = leaseCommsSession();
-        try {
-            final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
-            dos.writeUTF(methodName);
-
-            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            serializer.serialize(value, baos);
-            dos.writeInt(baos.size());
-            baos.writeTo(dos);
-            dos.flush();
-
-            final DataInputStream dis = new DataInputStream(session.getInputStream());
-            return dis.readBoolean();
-        } catch (final IOException ioe) {
-            try {
-                session.close();
-            } catch (final IOException ignored) {
-            }
-
-            throw ioe;
-        } finally {
-            if (!session.isClosed()) {
-                if (this.closed) {
-                    try {
-                        session.close();
-                    } catch (final IOException ioe) {
-                    }
-                } else {
-                    queue.offer(session);
-                }
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java
deleted file mode 100644
index c8be082..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.TimeUnit;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.io.BufferedInputStream;
-import org.apache.nifi.io.BufferedOutputStream;
-import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel;
-import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream;
-import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream;
-
-public class SSLCommsSession implements CommsSession {
-    private final SSLSocketChannel sslSocketChannel;
-    private final SSLContext sslContext;
-    private final String hostname;
-    private final int port;
-    
-    private final SSLSocketChannelInputStream in;
-    private final BufferedInputStream bufferedIn;
-    
-    private final SSLSocketChannelOutputStream out;
-    private final BufferedOutputStream bufferedOut;
-
-    public SSLCommsSession(final SSLContext sslContext, final String hostname, final int port) throws IOException { 
-        sslSocketChannel = new SSLSocketChannel(sslContext, hostname, port, true);
-        
-        in = new SSLSocketChannelInputStream(sslSocketChannel);
-        bufferedIn = new BufferedInputStream(in);
-        
-        out = new SSLSocketChannelOutputStream(sslSocketChannel);
-        bufferedOut = new BufferedOutputStream(out);
-        
-        this.sslContext = sslContext;
-        this.hostname = hostname;
-        this.port = port;
-    }
-    
-    @Override
-    public void interrupt() {
-        sslSocketChannel.interrupt();
-    }
-    
-    @Override
-    public void close() throws IOException {
-        sslSocketChannel.close();
-    }
-
-    @Override
-    public void setTimeout(final long value, final TimeUnit timeUnit) {
-        sslSocketChannel.setTimeout((int) TimeUnit.MILLISECONDS.convert(value, timeUnit));
-    }
-
-    @Override
-    public InputStream getInputStream() throws IOException {
-        return bufferedIn;
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        return bufferedOut;
-    }
-
-    @Override
-    public boolean isClosed() {
-        return sslSocketChannel.isClosed();
-    }
-    
-    @Override
-    public String getHostname() {
-        return hostname;
-    }
-    
-    @Override
-    public int getPort() {
-        return port;
-    }
-    @Override
-    public SSLContext getSSLContext() {
-        return sslContext;
-    }
-    @Override
-    public long getTimeout(final TimeUnit timeUnit) {
-        return timeUnit.convert(sslSocketChannel.getTimeout(), TimeUnit.MILLISECONDS);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java
deleted file mode 100644
index bbe2917..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.nio.channels.SocketChannel;
-import java.util.concurrent.TimeUnit;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.io.BufferedInputStream;
-import org.apache.nifi.io.BufferedOutputStream;
-import org.apache.nifi.remote.io.InterruptableInputStream;
-import org.apache.nifi.remote.io.InterruptableOutputStream;
-import org.apache.nifi.remote.io.socket.SocketChannelInputStream;
-import org.apache.nifi.remote.io.socket.SocketChannelOutputStream;
-
-public class StandardCommsSession implements CommsSession {
-    private final SocketChannel socketChannel;
-    private final String hostname;
-    private final int port;
-    private volatile long timeoutMillis;
-
-    private final SocketChannelInputStream in;
-    private final InterruptableInputStream bufferedIn;
-
-    private final SocketChannelOutputStream out;
-    private final InterruptableOutputStream bufferedOut;
-
-    public StandardCommsSession(final String hostname, final int port) throws IOException {
-        socketChannel = SocketChannel.open(new InetSocketAddress(hostname, port));
-        socketChannel.configureBlocking(false);
-        in = new SocketChannelInputStream(socketChannel);
-        bufferedIn = new InterruptableInputStream(new BufferedInputStream(in));
-
-        out = new SocketChannelOutputStream(socketChannel);
-        bufferedOut = new InterruptableOutputStream(new BufferedOutputStream(out));
-
-        this.hostname = hostname;
-        this.port = port;
-    }
-
-    @Override
-    public void interrupt() {
-        bufferedIn.interrupt();
-        bufferedOut.interrupt();
-    }
-
-    @Override
-    public void close() throws IOException {
-        socketChannel.close();
-    }
-
-    @Override
-    public void setTimeout(final long value, final TimeUnit timeUnit) {
-        in.setTimeout((int) TimeUnit.MILLISECONDS.convert(value, timeUnit));
-        out.setTimeout((int) TimeUnit.MILLISECONDS.convert(value, timeUnit));
-        timeoutMillis = TimeUnit.MILLISECONDS.convert(value, timeUnit);
-    }
-
-    @Override
-    public InputStream getInputStream() throws IOException {
-        return bufferedIn;
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        return bufferedOut;
-    }
-
-    @Override
-    public boolean isClosed() {
-        boolean closed = !socketChannel.isConnected();
-        if (!closed) {
-            try {
-                this.in.isDataAvailable();
-            } catch (IOException e) {
-                try {
-                    close();
-                } catch (IOException e1) {
-                }
-                closed = true;
-            }
-        }
-        return closed;
-    }
-
-    @Override
-    public String getHostname() {
-        return hostname;
-    }
-
-    @Override
-    public int getPort() {
-        return port;
-    }
-
-    @Override
-    public SSLContext getSSLContext() {
-        return null;
-    }
-
-    @Override
-    public long getTimeout(final TimeUnit timeUnit) {
-        return timeUnit.convert(timeoutMillis, TimeUnit.MILLISECONDS);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
deleted file mode 100644
index a91f7ee..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService
-org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html
deleted file mode 100644
index d5f3595..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<!--
-  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.
--->
-<head>
-<meta charset="utf-8" />
-<title>Distributed Map Cache Client Service</title>
-<link rel="stylesheet" href="../../css/component-usage.css" type="text/css" />
-</head>
-
-<body>
-	<h2>Description:</h2>
-
-	<p>A Controller Service that can be used to communicate with a
-		Distributed Map Cache Server.</p>
-
-
-
-	<p>
-		<strong>Properties:</strong>
-	</p>
-	<p>In the list below, the names of required properties appear
-		in bold. Any other properties (not in bold) are considered optional.
-		If a property has a default value, it is indicated. If a property
-		supports the use of the NiFi Expression Language (or simply,
-		"expression language"), that is also indicated.</p>
-
-	<ul>
-		<li><strong>Server Hostname</strong>
-			<ul>
-				<li>The name of the server that is running the DistributedMapCacheServer service</li>
-				<li>Default value: no default</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li><strong>Server Port</strong>
-			<ul>
-				<li>The port on the remote server that is to be used when communicating with the 
-				<a href="../nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html">DistributedMapCacheServer</a> service</li>
-				
-				<li>Default value: 4557</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li>SSL Context Service
-			<ul>
-				<li>If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted
-				<li>Default value: no default</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li><strong>Communications Timeout</strong>
-			<ul>
-				<li>Specifices how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received
-				<li>Default value: 30 secs</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-			
-	</ul>
-
-
-	<i>See Also:</i>
-	<ul>
-		<li><a href="../org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html">Distributed Map Cache Server</a></li>
-		<li><a href="../org.apache.nifi.ssl.StandardSSLContextService/index.html">Standard SSL Context Service</a></li>
-	</ul>
-
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService/index.html b/nar-bundles/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService/index.html
deleted file mode 100755
index e69de29..0000000

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml b/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml
deleted file mode 100644
index bc612ae..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>distributed-cache-services-bundle</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
-
-	<artifactId>distributed-cache-protocol</artifactId>
-	<name>Distributed Cache Protocol</name>
-
-	<description>
-	  	Defines the communications protocol that is used between clients and servers 
-	  	for the Distributed Cache services
-	</description>
-
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>remote-communications-utils</artifactId>
-		</dependency>
-	</dependencies>
-
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java
deleted file mode 100644
index da2acad..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * 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.nifi.distributed.cache.protocol;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
-import org.apache.nifi.remote.VersionNegotiator;
-
-public class ProtocolHandshake {
-
-    public static final byte[] MAGIC_HEADER = new byte[] { 'N', 'i', 'F', 'i' };
-    
-    public static final int RESOURCE_OK = 20;
-    public static final int DIFFERENT_RESOURCE_VERSION = 21;
-    public static final int ABORT = 255;
-
-    
-    public static void initiateHandshake(final InputStream in, final OutputStream out, final VersionNegotiator versionNegotiator) throws IOException, HandshakeException {
-        final DataInputStream dis = new DataInputStream(in);
-        final DataOutputStream dos = new DataOutputStream(out);
-        
-        try {
-            dos.write(MAGIC_HEADER);
-            
-            initiateVersionNegotiation(versionNegotiator, dis, dos);
-        } finally {
-            dos.flush();
-        }
-    }
-
-    
-    public static void receiveHandshake(final InputStream in, final OutputStream out, final VersionNegotiator versionNegotiator) throws IOException, HandshakeException {
-        final DataInputStream dis = new DataInputStream(in);
-        final DataOutputStream dos = new DataOutputStream(out);
-        
-        try {
-            final byte[] magicHeaderBuffer = new byte[4];
-            dis.readFully(magicHeaderBuffer);
-            
-            receiveVersionNegotiation(versionNegotiator, dis, dos);
-        } finally {
-            dos.flush();
-        }
-    }
-    
-    
-    private static void initiateVersionNegotiation(final VersionNegotiator negotiator, final DataInputStream dis, final DataOutputStream dos) throws IOException, HandshakeException {
-        // Write the classname of the RemoteStreamCodec, followed by its version
-        dos.writeInt(negotiator.getVersion());
-        dos.flush();
-        
-        // wait for response from server.
-        final int statusCode = dis.read();
-        switch (statusCode) {
-            case RESOURCE_OK:   // server accepted our proposal of codec name/version
-                return;
-            case DIFFERENT_RESOURCE_VERSION:    // server accepted our proposal of codec name but not the version
-                // Get server's preferred version
-                final int newVersion = dis.readInt();
-                
-                // Determine our new preferred version that is no greater than the server's preferred version.
-                final Integer newPreference = negotiator.getPreferredVersion(newVersion);
-                // If we could not agree with server on a version, fail now.
-                if ( newPreference == null ) {
-                    throw new HandshakeException("Could not agree on protocol version");
-                }
-                
-                negotiator.setVersion(newPreference);
-                
-                // Attempt negotiation of resource based on our new preferred version.
-                initiateVersionNegotiation(negotiator, dis, dos);
-            case ABORT:
-                throw new HandshakeException("Remote destination aborted connection with message: " + dis.readUTF());
-            default:
-                throw new HandshakeException("Received unexpected response code " + statusCode + " when negotiating version with remote server");
-        }
-    }
-    
-    private static void receiveVersionNegotiation(final VersionNegotiator negotiator, final DataInputStream dis, final DataOutputStream dos) throws IOException, HandshakeException {
-        final int version = dis.readInt();
-        if ( negotiator.isVersionSupported(version) ) {
-            dos.write(RESOURCE_OK);
-            dos.flush();
-            
-            negotiator.setVersion(version);
-        } else {
-            final Integer preferred = negotiator.getPreferredVersion(version);
-            if ( preferred == null ) {
-                dos.write(ABORT);
-                dos.flush();
-                throw new HandshakeException("Unable to negotiate an acceptable version of the Distributed Cache Protocol");
-            }
-            dos.write(DIFFERENT_RESOURCE_VERSION);
-            dos.writeInt(preferred);
-            dos.flush();
-            
-            receiveVersionNegotiation(negotiator, dis, dos);
-        }
-    }
-}


[09/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java
deleted file mode 100644
index 8049d42..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.nifi.distributed.cache.protocol.exception;
-
-public class HandshakeException extends Exception {
-    public HandshakeException(final String message) {
-        super(message);
-    }
-    
-    public HandshakeException(final Throwable cause) {
-        super(cause);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/pom.xml b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/pom.xml
deleted file mode 100644
index 5dec322..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/pom.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
-	<modelVersion>4.0.0</modelVersion>
-
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>distributed-cache-services-bundle</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
-
-	<artifactId>distributed-cache-server</artifactId>
-
-	<name>Distributed Cache Server</name>
-	<description>Provides a Controller Service for hosting Distributed Caches</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-protocol</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>remote-communications-utils</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-processor-utils</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-stream-utils</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>ssl-context-service-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>wali</groupId>
-			<artifactId>wali</artifactId>
-		</dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>distributed-cache-client-service-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-client-service</artifactId>
-			<version>${project.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-mock</artifactId>
-		</dependency>
-
-		<dependency>
-		    <groupId>org.apache.nifi</groupId>
-		    <artifactId>ssl-context-service</artifactId>
-		</dependency>
-	</dependencies>
-
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java
deleted file mode 100644
index 9b4e70e..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.net.SocketTimeoutException;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.distributed.cache.protocol.ProtocolHandshake;
-import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
-import org.apache.nifi.io.BufferedInputStream;
-import org.apache.nifi.io.BufferedOutputStream;
-import org.apache.nifi.remote.StandardVersionNegotiator;
-import org.apache.nifi.remote.VersionNegotiator;
-import org.apache.nifi.remote.io.socket.SocketChannelInputStream;
-import org.apache.nifi.remote.io.socket.SocketChannelOutputStream;
-import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel;
-import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream;
-import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractCacheServer implements CacheServer {
-
-    private static final Logger logger = LoggerFactory.getLogger(AbstractCacheServer.class);
-
-    private final String identifier;
-    private final int port;
-    private final SSLContext sslContext;
-    protected volatile boolean stopped = false;
-    private final Set<Thread> processInputThreads = new CopyOnWriteArraySet<>();;
-
-    private volatile ServerSocketChannel serverSocketChannel;
-
-    public AbstractCacheServer(final String identifier, final SSLContext sslContext, final int port) {
-        this.identifier = identifier;
-        this.port = port;
-        this.sslContext = sslContext;
-    }
-
-    @Override
-    public void start() throws IOException {
-        serverSocketChannel = ServerSocketChannel.open();
-        serverSocketChannel.configureBlocking(true);
-        serverSocketChannel.bind(new InetSocketAddress(port));
-
-        final Runnable runnable = new Runnable() {
-
-            @Override
-            public void run() {
-                while (true) {
-                    final SocketChannel socketChannel;
-                    try {
-                        socketChannel = serverSocketChannel.accept();
-                        logger.debug("Connected to {}", new Object[] { socketChannel });
-                    } catch (final IOException e) {
-                        if (!stopped) {
-                            logger.error("{} unable to accept connection from remote peer due to {}", this, e.toString());
-                            if (logger.isDebugEnabled()) {
-                                logger.error("", e);
-                            }
-                        }
-                        return;
-                    }
-
-                    final Runnable processInputRunnable = new Runnable() {
-                        @Override
-                        public void run() {
-                            final InputStream rawInputStream;
-                            final OutputStream rawOutputStream;
-                            final String peer = socketChannel.socket().getInetAddress().getHostName();
-
-                            try {
-                                if (sslContext == null) {
-                                    rawInputStream = new SocketChannelInputStream(socketChannel);
-                                    rawOutputStream = new SocketChannelOutputStream(socketChannel);
-                                } else {
-                                    final SSLSocketChannel sslSocketChannel = new SSLSocketChannel(sslContext, socketChannel, false);
-                                    sslSocketChannel.connect();
-                                    rawInputStream = new SSLSocketChannelInputStream(sslSocketChannel);
-                                    rawOutputStream = new SSLSocketChannelOutputStream(sslSocketChannel);
-                                }
-                            } catch (IOException e) {
-                                logger.error("Cannot create input and/or output streams for {}", new Object[] { identifier }, e);
-                                if (logger.isDebugEnabled()) {
-                                    logger.error("", e);
-                                }
-                                try {
-                                    socketChannel.close();
-                                } catch (IOException swallow) {
-                                }
-                               
-                                return;
-                            }
-                            try (final InputStream in = new BufferedInputStream(rawInputStream);
-                                    final OutputStream out = new BufferedOutputStream(rawOutputStream)) {
-
-                                final VersionNegotiator versionNegotiator = new StandardVersionNegotiator(1);
-
-                                ProtocolHandshake.receiveHandshake(in, out, versionNegotiator);
-
-                                boolean continueComms = true;
-                                while (continueComms) {
-                                    continueComms = listen(in, out, versionNegotiator.getVersion());
-                                }
-                                // client has issued 'close'
-                                logger.debug("Client issued close on {}", new Object[] { socketChannel });
-                            } catch (final SocketTimeoutException e) {
-                                logger.debug("30 sec timeout reached", e);
-                            } catch (final IOException | HandshakeException e) {
-                                if (!stopped) {
-                                    logger.error("{} unable to communicate with remote peer {} due to {}", new Object[] { this, peer, e.toString() });
-                                    if (logger.isDebugEnabled()) {
-                                        logger.error("", e);
-                                    }
-                                }
-                            } finally {
-                                processInputThreads.remove(Thread.currentThread());
-                            }
-                        }
-                    };
-
-                    final Thread processInputThread = new Thread(processInputRunnable);
-                    processInputThread.setName("Distributed Cache Server Communications Thread: " + identifier);
-                    processInputThread.setDaemon(true);
-                    processInputThread.start();
-                    processInputThreads.add(processInputThread);
-                }
-            }
-        };
-
-        final Thread thread = new Thread(runnable);
-        thread.setDaemon(true);
-        thread.setName("Distributed Cache Server: " + identifier);
-        thread.start();
-    }
-
-    @Override
-    public void stop() throws IOException {
-        stopped = true;
-        logger.info("Stopping CacheServer {}", new Object[] { this.identifier });
-
-        if (serverSocketChannel != null) {
-            serverSocketChannel.close();
-        }
-        // need to close out the created SocketChannels...this is done by interrupting
-        // the created threads that loop on listen().
-        for (Thread processInputThread : processInputThreads) {
-            processInputThread.interrupt();
-            int i = 0;
-            while (!processInputThread.isInterrupted() && i++ < 5) {
-                try {
-                    Thread.sleep(50); // allow thread to gracefully terminate
-                } catch (InterruptedException e) {
-                }
-            }
-        }
-        processInputThreads.clear();
-    }
-
-    @Override
-    public String toString() {
-        return "CacheServer[id=" + identifier + "]";
-    }
-
-    /**
-     * Listens for incoming data and communicates with remote peer
-     * 
-     * @param in
-     * @param out
-     * @param version
-     * @return <code>true</code> if communications should continue, <code>false</code> otherwise
-     * @throws IOException
-     */
-    protected abstract boolean listen(InputStream in, OutputStream out, int version) throws IOException;
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java
deleted file mode 100644
index 71ac56d..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class CacheRecord {
-
-    private static final AtomicLong idGenerator = new AtomicLong(0L);
-    
-    private final long id;
-    private final long entryDate;
-    private volatile long lastHitDate;
-    private final AtomicInteger hitCount = new AtomicInteger(0);
-    
-    public CacheRecord() {
-        entryDate = System.currentTimeMillis();
-        lastHitDate = entryDate;
-        id = idGenerator.getAndIncrement();
-    }
-    
-    public long getEntryDate() {
-        return entryDate;
-    }
-    
-    public long getLastHitDate() {
-        return lastHitDate;
-    }
-    
-    public int getHitCount() {
-        return hitCount.get();
-    }
-
-    public void hit() {
-        hitCount.getAndIncrement();
-        lastHitDate = System.currentTimeMillis();
-    }
-    
-    public long getId() {
-        return id;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java
deleted file mode 100644
index 2c85cd8..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.io.IOException;
-
-public interface CacheServer {
-
-    void start() throws IOException;
-    void stop() throws IOException;
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java
deleted file mode 100644
index 0f962d0..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.controller.AbstractControllerService;
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.controller.annotation.OnConfigured;
-import org.apache.nifi.processor.annotation.OnShutdown;
-import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.ssl.SSLContextService;
-
-public abstract class DistributedCacheServer extends AbstractControllerService {
-    public static final String EVICTION_STRATEGY_LFU = "Least Frequently Used";
-    public static final String EVICTION_STRATEGY_LRU = "Least Recently Used";
-    public static final String EVICTION_STRATEGY_FIFO = "First In, First Out";
-
-    public static final PropertyDescriptor PORT = new PropertyDescriptor.Builder()
-            .name("Port")
-            .description("The port to listen on for incoming connections")
-            .required(true)
-            .addValidator(StandardValidators.PORT_VALIDATOR)
-            .defaultValue("4557")
-            .build();
-    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
-            .name("SSL Context Service")
-            .description(
-                    "If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure")
-            .required(false)
-            .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
-            .build();
-    public static final PropertyDescriptor MAX_CACHE_ENTRIES = new PropertyDescriptor.Builder()
-            .name("Maximum Cache Entries")
-            .description("The maximum number of cache entries that the cache can hold")
-            .required(true)
-            .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR)
-            .defaultValue("10000")
-            .build();
-    public static final PropertyDescriptor EVICTION_POLICY = new PropertyDescriptor.Builder()
-            .name("Eviction Strategy")
-            .description("Determines which strategy should be used to evict values from the cache to make room for new entries")
-            .required(true)
-            .allowableValues(EVICTION_STRATEGY_LFU, EVICTION_STRATEGY_LRU, EVICTION_STRATEGY_FIFO)
-            .defaultValue(EVICTION_STRATEGY_LFU)
-            .build();
-    public static final PropertyDescriptor PERSISTENCE_PATH = new PropertyDescriptor.Builder()
-            .name("Persistence Directory")
-            .description("If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only")
-            .required(false)
-            .addValidator(StandardValidators.createDirectoryExistsValidator(true, true))
-            .build();
-
-    private volatile CacheServer cacheServer;
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        final List<PropertyDescriptor> properties = new ArrayList<>();
-        properties.add(PORT);
-        properties.add(MAX_CACHE_ENTRIES);
-        properties.add(EVICTION_POLICY);
-        properties.add(PERSISTENCE_PATH);
-        properties.add(new PropertyDescriptor.Builder().fromPropertyDescriptor(SSL_CONTEXT_SERVICE).allowableValues(
-                getControllerServiceLookup().getControllerServiceIdentifiers(SSLContextService.class)).build());
-        return properties;
-    }
-
-    @OnConfigured
-    public void startServer(final ConfigurationContext context) throws IOException {
-        if (cacheServer == null) {
-            cacheServer = createCacheServer(context);
-            cacheServer.start();
-        }
-    }
-
-    @OnShutdown
-    public void shutdownServer() throws IOException {
-        if (cacheServer != null) {
-            cacheServer.stop();
-        }
-        cacheServer = null;
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        shutdownServer();
-    }
-
-    protected abstract CacheServer createCacheServer(ConfigurationContext context);
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java
deleted file mode 100644
index 426573f..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.io.File;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.ssl.SSLContextService.ClientAuth;
-
-public class DistributedSetCacheServer extends DistributedCacheServer {
-
-    @Override
-    protected CacheServer createCacheServer(final ConfigurationContext context) {
-        final int port = context.getProperty(PORT).asInteger();
-        final String persistencePath = context.getProperty(PERSISTENCE_PATH).getValue();
-        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
-        final int maxSize = context.getProperty(MAX_CACHE_ENTRIES).asInteger();
-        final String evictionPolicyName = context.getProperty(EVICTION_POLICY).getValue();
-        
-        final SSLContext sslContext;
-        if ( sslContextService == null ) {
-            sslContext = null;
-        } else {
-            sslContext = sslContextService.createSSLContext(ClientAuth.REQUIRED);
-        }
-        
-        final EvictionPolicy evictionPolicy;
-        switch (evictionPolicyName) {
-            case EVICTION_STRATEGY_FIFO:
-                evictionPolicy = EvictionPolicy.FIFO;
-                break;
-            case EVICTION_STRATEGY_LFU:
-                evictionPolicy = EvictionPolicy.LFU;
-                break;
-            case EVICTION_STRATEGY_LRU:
-                evictionPolicy = EvictionPolicy.LRU;
-                break;
-            default:
-                throw new IllegalArgumentException("Illegal Eviction Policy: " + evictionPolicyName);
-        }
-        
-        try {
-            final File persistenceDir = persistencePath == null ? null : new File(persistencePath);
-            
-            return new SetCacheServer(getIdentifier(), sslContext, port, maxSize, evictionPolicy, persistenceDir);
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java
deleted file mode 100644
index 60bd2c1..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.util.Comparator;
-
-public enum EvictionPolicy {
-    LFU(new LFUComparator()),
-    LRU(new LRUComparator()),
-    FIFO(new FIFOComparator());
-    
-    private final Comparator<CacheRecord> comparator;
-    
-    private EvictionPolicy(final Comparator<CacheRecord> comparator) {
-        this.comparator = comparator;
-    }
-    
-    public Comparator<CacheRecord> getComparator() {
-        return comparator;
-    }
-    
-    public static class LFUComparator implements Comparator<CacheRecord> {
-        @Override
-        public int compare(final CacheRecord o1, final CacheRecord o2) {
-            if ( o1.equals(o2) ) {
-                return 0;
-            }
-            
-            final int hitCountComparison = Integer.compare(o1.getHitCount(), o2.getHitCount());
-            final int entryDateComparison = (hitCountComparison == 0) ? Long.compare(o1.getEntryDate(), o2.getEntryDate()) : hitCountComparison;
-            return (entryDateComparison == 0 ? Long.compare(o1.getId(), o2.getId()) : entryDateComparison);
-        }
-    }
-    
-    public static class LRUComparator implements Comparator<CacheRecord> {
-        @Override
-        public int compare(final CacheRecord o1, final CacheRecord o2) {
-            if ( o1.equals(o2) ) {
-                return 0;
-            }
-
-            final int lastHitDateComparison = Long.compare(o1.getLastHitDate(), o2.getLastHitDate());
-            return (lastHitDateComparison == 0 ? Long.compare(o1.getId(), o2.getId()) : lastHitDateComparison);
-        }
-    }
-    
-    public static class FIFOComparator implements Comparator<CacheRecord> {
-        @Override
-        public int compare(final CacheRecord o1, final CacheRecord o2) {
-            if ( o1.equals(o2) ) {
-                return 0;
-            }
-
-            final int entryDateComparison = Long.compare(o1.getEntryDate(), o2.getEntryDate());
-            return (entryDateComparison == 0 ? Long.compare(o1.getId(), o2.getId()) : entryDateComparison);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java
deleted file mode 100644
index 5d2c0f6..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.distributed.cache.server.set.PersistentSetCache;
-import org.apache.nifi.distributed.cache.server.set.SetCache;
-import org.apache.nifi.distributed.cache.server.set.SetCacheResult;
-import org.apache.nifi.distributed.cache.server.set.SimpleSetCache;
-import org.apache.nifi.io.DataOutputStream;
-
-public class SetCacheServer extends AbstractCacheServer {
-
-    private final SetCache cache;
-
-    public SetCacheServer(final String identifier, final SSLContext sslContext, final int port, final int maxSize,
-            final EvictionPolicy evictionPolicy, final File persistencePath) throws IOException {
-        super(identifier, sslContext, port);
-
-        final SetCache simpleCache = new SimpleSetCache(identifier, maxSize, evictionPolicy);
-
-        if (persistencePath == null) {
-            this.cache = simpleCache;
-        } else {
-            final PersistentSetCache persistentCache = new PersistentSetCache(identifier, persistencePath, simpleCache);
-            persistentCache.restore();
-            this.cache = persistentCache;
-        }
-    }
-
-    @Override
-    protected boolean listen(final InputStream in, final OutputStream out, final int version) throws IOException {
-        final DataInputStream dis = new DataInputStream(in);
-        final DataOutputStream dos = new DataOutputStream(out);
-
-        final String action = dis.readUTF();
-        if (action.equals("close")) {
-            return false;
-        }
-
-        final int valueLength = dis.readInt();
-        final byte[] value = new byte[valueLength];
-        dis.readFully(value);
-        final ByteBuffer valueBuffer = ByteBuffer.wrap(value);
-
-        final SetCacheResult response;
-        switch (action) {
-        case "addIfAbsent":
-            response = cache.addIfAbsent(valueBuffer);
-            break;
-        case "contains":
-            response = cache.contains(valueBuffer);
-            break;
-        case "remove":
-            response = cache.remove(valueBuffer);
-            break;
-        default:
-            throw new IOException("IllegalRequest");
-        }
-
-        dos.writeBoolean(response.getResult());
-        dos.flush();
-
-        return true;
-    }
-
-    @Override
-    public void stop() throws IOException {
-        try {
-            super.stop();
-        } finally {
-            cache.shutdown();
-        }
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        if (!stopped)
-            stop();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java
deleted file mode 100644
index 920529d..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.io.File;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.distributed.cache.server.CacheServer;
-import org.apache.nifi.distributed.cache.server.DistributedCacheServer;
-import org.apache.nifi.distributed.cache.server.EvictionPolicy;
-import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.ssl.SSLContextService.ClientAuth;
-
-public class DistributedMapCacheServer extends DistributedCacheServer {
-
-    @Override
-    protected CacheServer createCacheServer(final ConfigurationContext context) {
-        final int port = context.getProperty(PORT).asInteger();
-        final String persistencePath = context.getProperty(PERSISTENCE_PATH).getValue();
-        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
-        final int maxSize = context.getProperty(MAX_CACHE_ENTRIES).asInteger();
-        final String evictionPolicyName = context.getProperty(EVICTION_POLICY).getValue();
-        
-        final SSLContext sslContext;
-        if ( sslContextService == null ) {
-            sslContext = null;
-        } else {
-            sslContext = sslContextService.createSSLContext(ClientAuth.REQUIRED);
-        }
-        
-        final EvictionPolicy evictionPolicy;
-        switch (evictionPolicyName) {
-            case EVICTION_STRATEGY_FIFO:
-                evictionPolicy = EvictionPolicy.FIFO;
-                break;
-            case EVICTION_STRATEGY_LFU:
-                evictionPolicy = EvictionPolicy.LFU;
-                break;
-            case EVICTION_STRATEGY_LRU:
-                evictionPolicy = EvictionPolicy.LRU;
-                break;
-            default:
-                throw new IllegalArgumentException("Illegal Eviction Policy: " + evictionPolicyName);
-        }
-        
-        try {
-            final File persistenceDir = persistencePath == null ? null : new File(persistencePath);
-            
-            return new MapCacheServer(getIdentifier(), sslContext, port, maxSize, evictionPolicy, persistenceDir);
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java
deleted file mode 100644
index 534cb0b..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public interface MapCache {
-
-    MapPutResult putIfAbsent(ByteBuffer key, ByteBuffer value) throws IOException;
-    boolean containsKey(ByteBuffer key) throws IOException;
-    ByteBuffer get(ByteBuffer key) throws IOException;
-    ByteBuffer remove(ByteBuffer key) throws IOException;
-    void shutdown() throws IOException;
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java
deleted file mode 100644
index b0ab0c4..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.nio.ByteBuffer;
-
-import org.apache.nifi.distributed.cache.server.CacheRecord;
-
-public class MapCacheRecord extends CacheRecord {
-    private final ByteBuffer key;
-    private final ByteBuffer value;
-    
-    public MapCacheRecord(final ByteBuffer key, final ByteBuffer value) {
-        this.key = key;
-        this.value = value;
-    }
-    
-    public ByteBuffer getKey() {
-        return key;
-    }
-    
-    public ByteBuffer getValue() {
-        return value;
-    }
-    
-    @Override
-    public int hashCode() {
-        return 2938476 + key.hashCode() * value.hashCode();
-    }
-    
-    @Override
-    public boolean equals(final Object obj) {
-        if ( obj == this ) {
-            return true;
-        }
-        
-        if ( obj instanceof MapCacheRecord ) {
-            final MapCacheRecord that = ((MapCacheRecord) obj);
-            return key.equals(that.key) && value.equals(that.value);
-        }
-        
-        return false;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java
deleted file mode 100644
index 3e8dd0e..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.distributed.cache.server.AbstractCacheServer;
-import org.apache.nifi.distributed.cache.server.EvictionPolicy;
-import org.apache.nifi.io.DataOutputStream;
-
-public class MapCacheServer extends AbstractCacheServer {
-
-    private final MapCache cache;
-
-    public MapCacheServer(final String identifier, final SSLContext sslContext, final int port, final int maxSize,
-            final EvictionPolicy evictionPolicy, final File persistencePath) throws IOException {
-        super(identifier, sslContext, port);
-
-        final MapCache simpleCache = new SimpleMapCache(identifier, maxSize, evictionPolicy);
-
-        if (persistencePath == null) {
-            this.cache = simpleCache;
-        } else {
-            final PersistentMapCache persistentCache = new PersistentMapCache(identifier, persistencePath, simpleCache);
-            persistentCache.restore();
-            this.cache = persistentCache;
-        }
-    }
-
-    @Override
-    protected boolean listen(final InputStream in, final OutputStream out, final int version) throws IOException {
-        final DataInputStream dis = new DataInputStream(in);
-        final DataOutputStream dos = new DataOutputStream(out);
-        final String action = dis.readUTF();
-        try {
-            switch (action) {
-            case "close": {
-                return false;
-            }
-            case "putIfAbsent": {
-                final byte[] key = readValue(dis);
-                final byte[] value = readValue(dis);
-                final MapPutResult putResult = cache.putIfAbsent(ByteBuffer.wrap(key), ByteBuffer.wrap(value));
-                dos.writeBoolean(putResult.isSuccessful());
-                break;
-            }
-            case "containsKey": {
-                final byte[] key = readValue(dis);
-                final boolean contains = cache.containsKey(ByteBuffer.wrap(key));
-                dos.writeBoolean(contains);
-                break;
-            }
-            case "getAndPutIfAbsent": {
-                final byte[] key = readValue(dis);
-                final byte[] value = readValue(dis);
-
-                final MapPutResult putResult = cache.putIfAbsent(ByteBuffer.wrap(key), ByteBuffer.wrap(value));
-                if (putResult.isSuccessful()) {
-                    // Put was successful. There was no old value to get.
-                    dos.writeInt(0);
-                } else {
-                    // we didn't put. Write back the previous value
-                    final byte[] byteArray = putResult.getExistingValue().array();
-                    dos.writeInt(byteArray.length);
-                    dos.write(byteArray);
-                }
-
-                break;
-            }
-            case "get": {
-                final byte[] key = readValue(dis);
-                final ByteBuffer existingValue = cache.get(ByteBuffer.wrap(key));
-                if (existingValue == null) {
-                    // there was no existing value; we did a "put".
-                    dos.writeInt(0);
-                } else {
-                    // a value already existed. we did not update the map
-                    final byte[] byteArray = existingValue.array();
-                    dos.writeInt(byteArray.length);
-                    dos.write(byteArray);
-                }
-
-                break;
-            }
-            case "remove": {
-                final byte[] key = readValue(dis);
-                final boolean removed = cache.remove(ByteBuffer.wrap(key)) != null;
-                dos.writeBoolean(removed);
-                break;
-            }
-            default: {
-                throw new IOException("Illegal Request");
-            }
-            }
-        } finally {
-            dos.flush();
-        }
-
-        return true;
-    }
-
-    @Override
-    public void stop() throws IOException {
-        try {
-            super.stop();
-        } finally {
-            cache.shutdown();
-        }
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        if (!stopped)
-            stop();
-    }
-
-    private byte[] readValue(final DataInputStream dis) throws IOException {
-        final int numBytes = dis.readInt();
-        final byte[] buffer = new byte[numBytes];
-        dis.readFully(buffer);
-        return buffer;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java
deleted file mode 100644
index 29695eb..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.nio.ByteBuffer;
-
-public class MapPutResult {
-    private final boolean successful;
-    private final ByteBuffer key, value;
-    private final ByteBuffer existingValue;
-    private final ByteBuffer evictedKey, evictedValue;
-    
-    public MapPutResult(final boolean successful, final ByteBuffer key, final ByteBuffer value, final ByteBuffer existingValue, final ByteBuffer evictedKey, final ByteBuffer evictedValue) {
-        this.successful = successful;
-        this.key = key;
-        this.value = value;
-        this.existingValue = existingValue;
-        this.evictedKey = evictedKey;
-        this.evictedValue = evictedValue;
-    }
-
-    public boolean isSuccessful() {
-        return successful;
-    }
-
-    public ByteBuffer getKey() {
-        return key;
-    }
-
-    public ByteBuffer getValue() {
-        return value;
-    }
-    
-    public ByteBuffer getExistingValue() {
-        return existingValue;
-    }
-
-    public ByteBuffer getEvictedKey() {
-        return evictedKey;
-    }
-
-    public ByteBuffer getEvictedValue() {
-        return evictedValue;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java
deleted file mode 100644
index 77fb77d..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.wali.MinimalLockingWriteAheadLog;
-import org.wali.SerDe;
-import org.wali.UpdateType;
-import org.wali.WriteAheadRepository;
-
-public class PersistentMapCache implements MapCache {
-
-    private final MapCache wrapped;
-    private final WriteAheadRepository<MapWaliRecord> wali;
-    
-    private final AtomicLong modifications = new AtomicLong(0L);
-    
-    public PersistentMapCache(final String serviceIdentifier, final File persistencePath, final MapCache cacheToWrap) throws IOException {
-        wali = new MinimalLockingWriteAheadLog<>(persistencePath.toPath(), 1, new Serde(), null);
-        wrapped = cacheToWrap;
-    }
-
-    synchronized void restore() throws IOException {
-        final Collection<MapWaliRecord> recovered = wali.recoverRecords();
-        for ( final MapWaliRecord record : recovered ) {
-            if ( record.getUpdateType() == UpdateType.CREATE ) {
-                wrapped.putIfAbsent(record.getKey(), record.getValue());
-            }
-        }
-    }
-
-    @Override
-    public MapPutResult putIfAbsent(final ByteBuffer key, final ByteBuffer value) throws IOException {
-        final MapPutResult putResult = wrapped.putIfAbsent(key, value);
-        if ( putResult.isSuccessful() ) {
-            // The put was successful.
-            final MapWaliRecord record = new MapWaliRecord(UpdateType.CREATE, key, value);
-            final List<MapWaliRecord> records = new ArrayList<>();
-            records.add(record);
-
-            if ( putResult.getEvictedKey() != null ) {
-                records.add(new MapWaliRecord(UpdateType.DELETE, putResult.getEvictedKey(), putResult.getEvictedValue()));
-            }
-            
-            wali.update(Collections.singletonList(record), false);
-            
-            final long modCount = modifications.getAndIncrement();
-            if ( modCount > 0 && modCount % 100000 == 0 ) {
-                wali.checkpoint();
-            }
-        }
-        
-        return putResult;
-    }
-
-    @Override
-    public boolean containsKey(final ByteBuffer key) throws IOException {
-        return wrapped.containsKey(key);
-    }
-
-    @Override
-    public ByteBuffer get(final ByteBuffer key) throws IOException {
-        return wrapped.get(key);
-    }
-
-    @Override
-    public ByteBuffer remove(ByteBuffer key) throws IOException {
-        final ByteBuffer removeResult = wrapped.remove(key);
-        if ( removeResult != null ) {
-            final MapWaliRecord record = new MapWaliRecord(UpdateType.DELETE, key, removeResult);
-            final List<MapWaliRecord> records = new ArrayList<>(1);
-            records.add(record);
-            wali.update(records, false);
-            
-            final long modCount = modifications.getAndIncrement();
-            if ( modCount > 0 && modCount % 1000 == 0 ) {
-                wali.checkpoint();
-            }
-        }
-        return removeResult;
-    }
-
-
-    @Override
-    public void shutdown() throws IOException {
-        wali.shutdown();
-    }
-
-
-    private static class MapWaliRecord {
-        private final UpdateType updateType;
-        private final ByteBuffer key;
-        private final ByteBuffer value;
-        
-        public MapWaliRecord(final UpdateType updateType, final ByteBuffer key, final ByteBuffer value) {
-            this.updateType = updateType;
-            this.key = key;
-            this.value = value;
-        }
-        
-        public UpdateType getUpdateType() {
-            return updateType;
-        }
-        
-        public ByteBuffer getKey() {
-            return key;
-        }
-        
-        public ByteBuffer getValue() {
-            return value;
-        }
-    }
-    
-    private static class Serde implements SerDe<MapWaliRecord> {
-
-        @Override
-        public void serializeEdit(MapWaliRecord previousRecordState, MapWaliRecord newRecordState, java.io.DataOutputStream out) throws IOException {
-            final UpdateType updateType = newRecordState.getUpdateType();
-            if ( updateType == UpdateType.DELETE ) {
-                out.write(0);
-            } else {
-                out.write(1);
-            }
-            
-            final byte[] key = newRecordState.getKey().array();
-            final byte[] value = newRecordState.getValue().array();
-            
-            out.writeInt(key.length);
-            out.write(key);
-            out.writeInt(value.length);
-            out.write(value);
-        }
-
-        @Override
-        public void serializeRecord(MapWaliRecord record, java.io.DataOutputStream out) throws IOException {
-            serializeEdit(null, record, out);
-        }
-
-        @Override
-        public MapWaliRecord deserializeEdit(final DataInputStream in, final Map<Object, MapWaliRecord> currentRecordStates, final int version) throws IOException {
-            final int updateTypeValue = in.read();
-            if ( updateTypeValue < 0 ) {
-                throw new EOFException();
-            }
-
-            final UpdateType updateType = (updateTypeValue == 0 ? UpdateType.DELETE : UpdateType.CREATE);
-            
-            final int keySize = in.readInt();
-            final byte[] key = new byte[keySize];
-            in.readFully(key);
-
-            final int valueSize = in.readInt();
-            final byte[] value = new byte[valueSize];
-            in.readFully(value);
-
-            return new MapWaliRecord(updateType, ByteBuffer.wrap(key), ByteBuffer.wrap(value));
-        }
-
-        @Override
-        public MapWaliRecord deserializeRecord(DataInputStream in, int version) throws IOException {
-            return deserializeEdit(in, new HashMap<Object, MapWaliRecord>(), version);
-        }
-
-        @Override
-        public Object getRecordIdentifier(final MapWaliRecord record) {
-            return record.getKey();
-        }
-
-        @Override
-        public UpdateType getUpdateType(final MapWaliRecord record) {
-            return record.getUpdateType();
-        }
-
-        @Override
-        public String getLocation(final MapWaliRecord record) {
-            return null;
-        }
-
-        @Override
-        public int getVersion() {
-            return 1;
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java
deleted file mode 100644
index 10139f1..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.map;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.apache.nifi.distributed.cache.server.EvictionPolicy;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SimpleMapCache implements MapCache {
-    private static final Logger logger = LoggerFactory.getLogger(SimpleMapCache.class);
-
-    private final Map<ByteBuffer, MapCacheRecord> cache = new HashMap<>();
-    private final SortedMap<MapCacheRecord, ByteBuffer> inverseCacheMap;
-    
-    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
-    private final Lock readLock = rwLock.readLock();
-    private final Lock writeLock = rwLock.writeLock();
-    
-    private final String serviceIdentifier;
-    
-    private final int maxSize;
-    
-    public SimpleMapCache(final String serviceIdentifier, final int maxSize, final EvictionPolicy evictionPolicy) {
-        // need to change to ConcurrentMap as this is modified when only the readLock is held
-        inverseCacheMap = new ConcurrentSkipListMap<>(evictionPolicy.getComparator());
-        this.serviceIdentifier = serviceIdentifier;
-        this.maxSize = maxSize;
-    }
-    
-    @Override
-    public String toString() {
-        return "SimpleSetCache[service id=" + serviceIdentifier + "]";
-    }
-
-    // don't need synchronized because this method is only called when the writeLock is held, and all 
-    // public methods obtain either the read or write lock
-    private MapCacheRecord evict() {
-        if ( cache.size() < maxSize ) {
-            return null;
-        }
-        
-        final MapCacheRecord recordToEvict = inverseCacheMap.firstKey();
-        final ByteBuffer valueToEvict = inverseCacheMap.remove(recordToEvict);
-        cache.remove(valueToEvict);
-        
-        if ( logger.isDebugEnabled() ) {
-            logger.debug("Evicting value {} from cache", new String(valueToEvict.array(), StandardCharsets.UTF_8));
-        }
-        
-        return recordToEvict;
-    }
-
-    @Override
-    public MapPutResult putIfAbsent(final ByteBuffer key, final ByteBuffer value) {
-        writeLock.lock();
-        try {
-            final MapCacheRecord record = cache.get(key);
-            if ( record == null ) {
-                // Record is null. We will add.
-                final MapCacheRecord evicted = evict();
-                final MapCacheRecord newRecord = new MapCacheRecord(key, value);
-                cache.put(key, newRecord);
-                inverseCacheMap.put(newRecord, key);
-                
-                if ( evicted == null ) {
-                    return new MapPutResult(true, key, value, null, null, null);
-                } else {
-                    return new MapPutResult(true, key, value, null, evicted.getKey(), evicted.getValue());
-                }
-            }
-            
-            // Record is not null. Increment hit count and return result indicating that record was not added.
-            inverseCacheMap.remove(record);
-            record.hit();
-            inverseCacheMap.put(record, key);
-            
-            return new MapPutResult(false, key, value, record.getValue(), null, null);
-        } finally {
-            writeLock.unlock();
-        }
-    }
-    
-    @Override
-    public boolean containsKey(final ByteBuffer key) {
-        readLock.lock();
-        try {
-            final MapCacheRecord record = cache.get(key);
-            if ( record == null ) {
-                return false;
-            }
-            
-            inverseCacheMap.remove(record);
-            record.hit();
-            inverseCacheMap.put(record, key);
-            
-            return true;
-        } finally {
-            readLock.unlock();
-        }
-    }
-
-    @Override
-    public ByteBuffer get(final ByteBuffer key) {
-        readLock.lock();
-        try {
-            final MapCacheRecord record = cache.get(key);
-            if ( record == null ) {
-                return null;
-            }
-            
-            inverseCacheMap.remove(record);
-            record.hit();
-            inverseCacheMap.put(record, key);
-            
-            return record.getValue();
-        } finally {
-            readLock.unlock();
-        }
-    }
-
-    @Override
-    public ByteBuffer remove(ByteBuffer key) throws IOException {
-        writeLock.lock();
-        try {
-            final MapCacheRecord record = cache.remove(key);
-            if (record == null) {
-                return null;
-            }
-            inverseCacheMap.remove(record);
-            return record.getValue();
-        } finally {
-            writeLock.unlock();
-        }
-    }
-
-    @Override
-    public void shutdown() throws IOException {
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java
deleted file mode 100644
index 4d75fc0..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.set;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.wali.MinimalLockingWriteAheadLog;
-import org.wali.SerDe;
-import org.wali.UpdateType;
-import org.wali.WriteAheadRepository;
-
-public class PersistentSetCache implements SetCache {
-
-    private final SetCache wrapped;
-    private final WriteAheadRepository<SetRecord> wali;
-    
-    private final AtomicLong modifications = new AtomicLong(0L);
-    
-    public PersistentSetCache(final String serviceIdentifier, final File persistencePath, final SetCache cacheToWrap) throws IOException {
-        wali = new MinimalLockingWriteAheadLog<>(persistencePath.toPath(), 1, new Serde(), null);
-        wrapped = cacheToWrap;
-    }
-    
-    public synchronized void restore() throws IOException {
-        final Collection<SetRecord> recovered = wali.recoverRecords();
-        for ( final SetRecord record : recovered ) {
-            if ( record.getUpdateType() == UpdateType.CREATE ) {
-                addIfAbsent(record.getBuffer());
-            }
-        }
-    }
-    
-    @Override
-    public synchronized SetCacheResult remove(final ByteBuffer value) throws IOException {
-        final SetCacheResult removeResult = wrapped.remove(value);
-        if ( removeResult.getResult() ) {
-            final SetRecord record = new SetRecord(UpdateType.DELETE, value);
-            final List<SetRecord> records = new ArrayList<>();
-            records.add(record);
-            wali.update(records, false);
-            
-            final long modCount = modifications.getAndIncrement();
-            if ( modCount > 0 && modCount % 1000 == 0 ) {
-                wali.checkpoint();
-            }
-        }
-
-        return removeResult;
-    }
-
-    @Override
-    public synchronized SetCacheResult addIfAbsent(final ByteBuffer value) throws IOException {
-        final SetCacheResult addResult = wrapped.addIfAbsent(value);
-        if ( addResult.getResult() ) {
-            final SetRecord record = new SetRecord(UpdateType.CREATE, value);
-            final List<SetRecord> records = new ArrayList<>();
-            records.add(record);
-            
-            final SetCacheRecord evictedRecord = addResult.getEvictedRecord();
-            if ( evictedRecord != null ) {
-                records.add(new SetRecord(UpdateType.DELETE, evictedRecord.getValue()));
-            }
-            
-            wali.update(records, false);
-            
-            final long modCount = modifications.getAndIncrement();
-            if ( modCount > 0 && modCount % 1000 == 0 ) {
-                wali.checkpoint();
-            }
-        }
-        
-        return addResult;
-    }
-
-    @Override
-    public synchronized SetCacheResult contains(final ByteBuffer value) throws IOException {
-        return wrapped.contains(value);
-    }
-    
-    @Override
-    public void shutdown() throws IOException {
-        wali.shutdown();
-    }
-    
-    private static class SetRecord {
-        private final UpdateType updateType;
-        private final ByteBuffer value;
-        
-        public SetRecord(final UpdateType updateType, final ByteBuffer value) {
-            this.updateType = updateType;
-            this.value = value;
-        }
-        
-        public UpdateType getUpdateType() {
-            return updateType;
-        }
-        
-        public ByteBuffer getBuffer() {
-            return value;
-        }
-        
-        public byte[] getData() {
-            return value.array();
-        }
-    }
-    
-    private static class Serde implements SerDe<SetRecord> {
-
-        @Override
-        public void serializeEdit(final SetRecord previousRecordState, final SetRecord newRecordState, final DataOutputStream out) throws IOException {
-            final UpdateType updateType = newRecordState.getUpdateType();
-            if ( updateType == UpdateType.DELETE ) {
-                out.write(0);
-            } else {
-                out.write(1);
-            }
-            
-            final byte[] data = newRecordState.getData();
-            out.writeInt(data.length);
-            out.write(newRecordState.getData());
-        }
-
-        @Override
-        public void serializeRecord(SetRecord record, DataOutputStream out) throws IOException {
-            serializeEdit(null, record, out);
-        }
-
-        @Override
-        public SetRecord deserializeEdit(final DataInputStream in, final Map<Object, SetRecord> currentRecordStates, final int version) throws IOException {
-            final int value = in.read();
-            if ( value < 0 ) {
-                throw new EOFException();
-            }
-
-            final UpdateType updateType = (value == 0 ? UpdateType.DELETE : UpdateType.CREATE);
-            
-            final int size = in.readInt();
-            final byte[] data = new byte[size];
-            in.readFully(data);
-            
-            return new SetRecord(updateType, ByteBuffer.wrap(data));
-        }
-
-        @Override
-        public SetRecord deserializeRecord(DataInputStream in, int version) throws IOException {
-            return deserializeEdit(in, new HashMap<Object, SetRecord>(), version);
-        }
-
-        @Override
-        public Object getRecordIdentifier(final SetRecord record) {
-            return record.getBuffer();
-        }
-
-        @Override
-        public UpdateType getUpdateType(final SetRecord record) {
-            return record.getUpdateType();
-        }
-
-        @Override
-        public String getLocation(final SetRecord record) {
-            return null;
-        }
-
-        @Override
-        public int getVersion() {
-            return 1;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java
deleted file mode 100644
index bf6ae3e..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.set;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public interface SetCache {
-
-    SetCacheResult remove(ByteBuffer value) throws IOException;
-    SetCacheResult addIfAbsent(ByteBuffer value) throws IOException;
-    SetCacheResult contains(ByteBuffer value) throws IOException;
-    void shutdown() throws IOException;
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java
deleted file mode 100644
index 20b6fae..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.set;
-
-import java.nio.ByteBuffer;
-
-import org.apache.nifi.distributed.cache.server.CacheRecord;
-
-public class SetCacheRecord extends CacheRecord {
-    private final ByteBuffer value;
-    
-    public SetCacheRecord(final ByteBuffer value) {
-        this.value = value;
-    }
-    
-    public ByteBuffer getValue() {
-        return value;
-    }
-    
-    @Override
-    public int hashCode() {
-        return value.hashCode();
-    }
-    
-    @Override
-    public boolean equals(final Object obj) {
-        if ( this == obj ) {
-            return true;
-        }
-        
-        if (obj instanceof SetCacheRecord) {
-            return value.equals(((SetCacheRecord) obj).value);
-        }
-        return false;
-    }
-    
-    @Override
-    public String toString() {
-        return "SetCacheRecord[value=" + new String(value.array()) + ", hitCount=" + getHitCount() + "]";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java
deleted file mode 100644
index 732c4f0..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.set;
-
-
-
-public class SetCacheResult {
-    private final boolean result;
-    private final SetCacheRecord stats;
-    private final SetCacheRecord evictedRecord;
-    
-    public SetCacheResult(final boolean result, final SetCacheRecord stats, final SetCacheRecord evictedRecord) {
-        this.result = result;
-        this.stats = stats;
-        this.evictedRecord = evictedRecord;
-    }
-    
-    public boolean getResult() {
-        return result;
-    }
-    
-    public SetCacheRecord getRecord() {
-        return stats;
-    }
-    
-    public SetCacheRecord getEvictedRecord() {
-        return evictedRecord;
-    }
-}


[19/19] incubator-nifi git commit: Merge branch 'develop' into NIFI-169

Posted by jo...@apache.org.
Merge branch 'develop' into NIFI-169


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

Branch: refs/heads/develop
Commit: a94cf4be4b339bf520517d2d00390f8bc3b249e1
Parents: d9dab00 d7b1113
Author: joewitt <jo...@apache.org>
Authored: Tue Dec 16 12:53:40 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Tue Dec 16 12:53:40 2014 -0500

----------------------------------------------------------------------
 .../webapp/WEB-INF/pages/bulletin-board.jsp     |    8 +-
 .../src/main/webapp/WEB-INF/pages/canvas.jsp    |   14 +-
 .../src/main/webapp/WEB-INF/pages/cluster.jsp   |   10 +-
 .../src/main/webapp/WEB-INF/pages/counters.jsp  |   10 +-
 .../src/main/webapp/WEB-INF/pages/history.jsp   |   10 +-
 .../main/webapp/WEB-INF/pages/provenance.jsp    |   10 +-
 .../src/main/webapp/WEB-INF/pages/summary.jsp   |   10 +-
 .../src/main/webapp/WEB-INF/pages/templates.jsp |   12 +-
 .../src/main/webapp/WEB-INF/pages/users.jsp     |   10 +-
 .../WEB-INF/partials/canvas/canvas-header.jsp   |    1 +
 .../canvas/secure-port-configuration.jsp        |    3 +-
 .../summary/view-single-node-dialog.jsp         |    1 +
 .../nifi-web-ui/src/main/webapp/css/header.css  |   29 +-
 .../src/main/webapp/css/port-configuration.css  |   16 +-
 .../main/webapp/css/processor-configuration.css |    6 +
 .../nifi-web-ui/src/main/webapp/css/summary.css |   11 +-
 .../src/main/webapp/js/codemirror/LICENSE       |   38 +-
 .../js/codemirror/addon/edit/matchbrackets.js   |  125 -
 .../js/codemirror/addon/hint/show-hint.css      |   54 +-
 .../js/codemirror/addon/hint/show-hint.js       |  411 -
 .../js/codemirror/lib/codemirror-compressed.js  |   16 +
 .../webapp/js/codemirror/lib/codemirror.css     |  282 +-
 .../main/webapp/js/codemirror/lib/codemirror.js | 8488 -----------------
 .../nifi-web-ui/src/main/webapp/js/d3/LICENSE   |   52 +-
 .../nifi-web-ui/src/main/webapp/js/d3/d3.min.js | 5390 +----------
 .../main/webapp/js/jquery/combo/jquery.combo.js |    5 +-
 .../images/ui-bg_flat_0_aaaaaa_40x100.png       |  Bin 180 -> 0 bytes
 .../images/ui-bg_flat_75_ffffff_40x100.png      |  Bin 178 -> 0 bytes
 .../images/ui-bg_glass_55_fbf9ee_1x400.png      |  Bin 120 -> 0 bytes
 .../images/ui-bg_glass_65_ffffff_1x400.png      |  Bin 105 -> 0 bytes
 .../images/ui-bg_glass_75_dadada_1x400.png      |  Bin 111 -> 0 bytes
 .../images/ui-bg_glass_75_e6e6e6_1x400.png      |  Bin 110 -> 0 bytes
 .../images/ui-bg_glass_95_fef1ec_1x400.png      |  Bin 119 -> 0 bytes
 .../ui-bg_highlight-soft_75_cccccc_1x100.png    |  Bin 101 -> 0 bytes
 .../images/ui-icons_222222_256x240.png          |  Bin 4369 -> 0 bytes
 .../images/ui-icons_2e83ff_256x240.png          |  Bin 4369 -> 0 bytes
 .../images/ui-icons_454545_256x240.png          |  Bin 8543 -> 0 bytes
 .../images/ui-icons_888888_256x240.png          |  Bin 4369 -> 0 bytes
 .../images/ui-icons_cd0a0a_256x240.png          |  Bin 4369 -> 0 bytes
 .../images/ui-icons_ffffff_256x240.png          |  Bin 8358 -> 0 bytes
 .../css/smoothness/jquery-ui-1.8.10.custom.css  |  625 --
 .../src/main/webapp/js/jquery/jquery-1.7.js     | 9017 ------------------
 .../src/main/webapp/js/jquery/jquery-1.7.min.js | 2934 ------
 .../main/webapp/js/jquery/jquery-2.1.1.min.js   |    4 +
 .../js/jquery/jquery-ui-1.8.10.custom.min.js    | 6354 ------------
 .../js/jquery/jquery.event.drag-2.0.min.js      |  194 -
 .../js/jquery/jquery.event.drag-2.2.min.js      |    6 +
 .../src/main/webapp/js/jquery/jquery.form.js    | 1118 ---
 .../main/webapp/js/jquery/jquery.form.min.js    |   11 +
 .../js/jquery/minicolors/jquery.minicolors.css  |  274 +-
 .../jquery/minicolors/jquery.minicolors.min.js  |  415 +-
 .../main/webapp/js/jquery/qtip2/jquery.qtip.css |  557 --
 .../webapp/js/jquery/qtip2/jquery.qtip.min.css  |    3 +
 .../webapp/js/jquery/qtip2/jquery.qtip.min.js   |  711 +-
 .../webapp/js/jquery/slickgrid/MIT-LICENSE.txt  |   20 +
 .../js/jquery/slickgrid/css/images/collapse.gif |  Bin 0 -> 846 bytes
 .../js/jquery/slickgrid/css/images/expand.gif   |  Bin 0 -> 851 bytes
 .../slickgrid/css/slick-default-theme.css       |   68 +-
 .../js/jquery/slickgrid/css/slick.grid.css      |  174 +-
 .../slickgrid/plugins/slick.autotooltips.js     |  121 +-
 .../plugins/slick.cellrangedecorator.js         |  110 +-
 .../plugins/slick.cellrangeselector.js          |  194 +-
 .../plugins/slick.cellselectionmodel.js         |  210 +-
 .../plugins/slick.rowselectionmodel.js          |  325 +-
 .../webapp/js/jquery/slickgrid/slick.core.js    |  796 +-
 .../js/jquery/slickgrid/slick.dataview.js       | 1920 ++--
 .../webapp/js/jquery/slickgrid/slick.editors.js |  994 +-
 .../js/jquery/slickgrid/slick.formatters.js     |   86 +-
 .../webapp/js/jquery/slickgrid/slick.grid.js    | 6254 ++++++------
 .../ui-smoothness/images/animated-overlay.gif   |  Bin 0 -> 1738 bytes
 .../images/ui-bg_flat_0_aaaaaa_40x100.png       |  Bin 0 -> 212 bytes
 .../images/ui-bg_flat_75_ffffff_40x100.png      |  Bin 0 -> 208 bytes
 .../images/ui-bg_glass_55_fbf9ee_1x400.png      |  Bin 0 -> 335 bytes
 .../images/ui-bg_glass_65_ffffff_1x400.png      |  Bin 0 -> 207 bytes
 .../images/ui-bg_glass_75_dadada_1x400.png      |  Bin 0 -> 262 bytes
 .../images/ui-bg_glass_75_e6e6e6_1x400.png      |  Bin 0 -> 262 bytes
 .../images/ui-bg_glass_95_fef1ec_1x400.png      |  Bin 0 -> 332 bytes
 .../ui-bg_highlight-soft_75_cccccc_1x100.png    |  Bin 0 -> 280 bytes
 .../images/ui-icons_222222_256x240.png          |  Bin 0 -> 6922 bytes
 .../images/ui-icons_2e83ff_256x240.png          |  Bin 0 -> 4549 bytes
 .../images/ui-icons_454545_256x240.png          |  Bin 0 -> 6992 bytes
 .../images/ui-icons_888888_256x240.png          |  Bin 0 -> 6999 bytes
 .../images/ui-icons_cd0a0a_256x240.png          |  Bin 0 -> 4549 bytes
 .../ui-smoothness/jquery-ui-1.10.4.min.css      |    7 +
 .../ui-smoothness/jquery-ui-1.10.4.min.js       |    7 +
 .../js/nf/bulletin-board/nf-bulletin-board.js   |   16 +-
 .../src/main/webapp/js/nf/canvas/nf-actions.js  |   65 +-
 .../src/main/webapp/js/nf/canvas/nf-birdseye.js |    1 +
 .../webapp/js/nf/canvas/nf-canvas-header.js     |   12 +-
 .../webapp/js/nf/canvas/nf-canvas-toolbar.js    |    1 +
 .../webapp/js/nf/canvas/nf-canvas-toolbox.js    |   45 +-
 .../main/webapp/js/nf/canvas/nf-canvas-utils.js |   73 +-
 .../src/main/webapp/js/nf/canvas/nf-canvas.js   |   59 +-
 .../main/webapp/js/nf/canvas/nf-clipboard.js    |    4 +
 .../main/webapp/js/nf/canvas/nf-connectable.js  |    1 +
 .../js/nf/canvas/nf-connection-configuration.js |   43 +-
 .../main/webapp/js/nf/canvas/nf-connection.js   |   20 +-
 .../main/webapp/js/nf/canvas/nf-context-menu.js |    2 +
 .../main/webapp/js/nf/canvas/nf-draggable.js    |    9 +-
 .../src/main/webapp/js/nf/canvas/nf-funnel.js   |    8 +
 .../src/main/webapp/js/nf/canvas/nf-go-to.js    |   50 +-
 .../src/main/webapp/js/nf/canvas/nf-graph.js    |    6 +
 .../js/nf/canvas/nf-label-configuration.js      |    5 +-
 .../src/main/webapp/js/nf/canvas/nf-label.js    |   14 +-
 .../js/nf/canvas/nf-port-configuration.js       |    5 +-
 .../main/webapp/js/nf/canvas/nf-port-details.js |    1 +
 .../src/main/webapp/js/nf/canvas/nf-port.js     |   10 +
 .../nf/canvas/nf-process-group-configuration.js |    5 +-
 .../js/nf/canvas/nf-process-group-details.js    |    1 +
 .../webapp/js/nf/canvas/nf-process-group.js     |   10 +
 .../js/nf/canvas/nf-processor-configuration.js  |   13 +-
 .../js/nf/canvas/nf-processor-property-table.js |   14 +
 .../main/webapp/js/nf/canvas/nf-processor.js    |   11 +
 .../main/webapp/js/nf/canvas/nf-registration.js |    4 +-
 .../nf-remote-process-group-configuration.js    |    5 +-
 .../canvas/nf-remote-process-group-details.js   |    1 +
 .../nf/canvas/nf-remote-process-group-ports.js  |   13 +-
 .../js/nf/canvas/nf-remote-process-group.js     |   10 +
 .../src/main/webapp/js/nf/canvas/nf-search.js   |   26 +-
 .../nf/canvas/nf-secure-port-configuration.js   |   35 +-
 .../js/nf/canvas/nf-secure-port-details.js      |    1 +
 .../main/webapp/js/nf/canvas/nf-selectable.js   |    2 +
 .../src/main/webapp/js/nf/canvas/nf-settings.js |   13 +-
 .../src/main/webapp/js/nf/canvas/nf-snippet.js  |    6 +
 .../src/main/webapp/js/nf/canvas/nf-storage.js  |    3 +
 .../webapp/js/nf/cluster/nf-cluster-table.js    |   31 +-
 .../src/main/webapp/js/nf/cluster/nf-cluster.js |   12 +-
 .../webapp/js/nf/counters/nf-counters-table.js  |   11 +-
 .../main/webapp/js/nf/counters/nf-counters.js   |   12 +-
 .../webapp/js/nf/history/nf-history-model.js    |    4 +-
 .../webapp/js/nf/history/nf-history-table.js    |    7 +-
 .../src/main/webapp/js/nf/history/nf-history.js |   12 +-
 .../src/main/webapp/js/nf/nf-common.js          |   40 +
 .../main/webapp/js/nf/nf-connection-details.js  |   19 +-
 .../src/main/webapp/js/nf/nf-dialog.js          |    1 +
 .../main/webapp/js/nf/nf-processor-details.js   |    5 +-
 .../src/main/webapp/js/nf/nf-shell.js           |    1 +
 .../src/main/webapp/js/nf/nf-status-history.js  |  102 +-
 .../js/nf/provenance/nf-provenance-lineage.js   |   17 +-
 .../js/nf/provenance/nf-provenance-table.js     |   37 +-
 .../webapp/js/nf/provenance/nf-provenance.js    |   20 +-
 .../webapp/js/nf/summary/nf-cluster-search.js   |   29 +-
 .../webapp/js/nf/summary/nf-summary-table.js    |   62 +-
 .../src/main/webapp/js/nf/summary/nf-summary.js |   20 +-
 .../js/nf/templates/nf-templates-table.js       |   12 +-
 .../main/webapp/js/nf/templates/nf-templates.js |   12 +-
 .../main/webapp/js/nf/users/nf-users-table.js   |   46 +-
 .../src/main/webapp/js/nf/users/nf-users.js     |   12 +-
 .../ui/src/main/webapp/WEB-INF/jsp/index.jsp    |    6 +-
 .../js/jquery/jqgrid/css/ellipsis-xbl.xml       |   29 -
 .../webapp/js/jquery/jqgrid/css/ui.jqgrid.css   |  251 +-
 .../js/jquery/jqgrid/js/i18n/grid.locale-en.js  |  175 +-
 .../js/jquery/jqgrid/js/jquery.jqGrid.min.js    |  959 +-
 .../ui/src/main/webapp/js/nf-common.js          |    7 +-
 .../src/main/webapp/WEB-INF/jsp/worksheet.jsp   |   33 +-
 .../ui/src/main/webapp/css/main.css             |   17 +-
 .../ui/src/main/webapp/css/reset.css            |   59 -
 .../ui/src/main/webapp/js/application.js        |   67 +-
 158 files changed, 8307 insertions(+), 42974 deletions(-)
----------------------------------------------------------------------



[16/19] incubator-nifi git commit: Merge branch 'develop' into NIFI-169

Posted by jo...@apache.org.
Merge branch 'develop' into NIFI-169


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

Branch: refs/heads/develop
Commit: 3a4c6ed887cd2e13aa861ed99028de33678bcbe8
Parents: 614349b 1cc3ce5
Author: joewitt <jo...@apache.org>
Authored: Tue Dec 16 08:16:52 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Tue Dec 16 08:16:52 2014 -0500

----------------------------------------------------------------------
 .../nifi/controller/FileSystemSwapManager.java  | 33 ++++++---
 .../apache/nifi/controller/FlowController.java  | 20 +++---
 .../org/apache/nifi/util/ReflectionUtils.java   | 72 +++++++++++---------
 .../processors/standard/TestScanContent.java    |  2 +-
 .../nifi/components/PropertyDescriptor.java     |  2 +-
 .../repository/FlowFileSwapManager.java         |  5 +-
 .../nifi/components/TestPropertyDescriptor.java | 59 ++++++++++++++++
 7 files changed, 142 insertions(+), 51 deletions(-)
----------------------------------------------------------------------



[11/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-parent/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-parent/pom.xml b/commons/nifi-parent/pom.xml
deleted file mode 100644
index 7684d53..0000000
--- a/commons/nifi-parent/pom.xml
+++ /dev/null
@@ -1,217 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.nifi</groupId>
-    <artifactId>nifi-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>NiFi Parent</name>
-
-    <description>A helpful parent pom which can be used for all NiFi components.  Helps establish the basic requirements/depdencies.</description>
-	
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <org.slf4j.version>1.7.7</org.slf4j.version>
-    </properties>
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>findbugs-maven-plugin</artifactId>
-                    <version>3.0.0</version>
-                    <configuration>
-                        <effort>Max</effort>
-                        <threshold>Medium</threshold>
-                        <xmlOutput>true</xmlOutput>
-                    </configuration>
-                    <executions>
-                        <execution>
-                            <goals>
-                                <goal>check</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nar-maven-plugin</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <extensions>true</extensions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.7</source>
-                    <target>1.7</target>
-                    <fork>true</fork>
-                </configuration>
-                <version>3.2</version>
-            </plugin>
-            <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>2.5</version>
-            </plugin>
-            <plugin>
-                <artifactId>maven-war-plugin</artifactId>
-                <version>2.5</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.9</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <version>2.7</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.18</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.5.2</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-release-plugin</artifactId>
-                <version>2.5.1</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>jaxb2-maven-plugin</artifactId>
-                <version>1.6</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>2.4</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <version>1.3.2</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-site-plugin</artifactId>
-                <version>3.4</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.10.1</version>
-                <configuration>
-                    <failOnError>false</failOnError>
-                    <quiet>true</quiet>
-                    <show>private</show>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>ch.qos.logback</groupId>
-                <artifactId>logback-classic</artifactId>
-                <version>1.1.2</version>
-                <scope>provided</scope>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.slf4j</groupId>
-                        <artifactId>slf4j-api</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jcl-over-slf4j</artifactId>
-                <version>${org.slf4j.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jul-to-slf4j</artifactId>
-                <version>${org.slf4j.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>${org.slf4j.version}</version>
-                <scope>provided</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-    <dependencies>
-        <!-- required for libraries using commons-loggings -->
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.11</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>1.10.8</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <version>${org.slf4j.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    <!-- All projects use the same distrubution Manager for publishing artifacts 
-    but for obtaining them this is specified in the settings.xml file for each 
-    user -->
-    <distributionManagement>
-        <repository>
-            <id>nifi-releases</id>
-            <url>${nifi.repo.url}</url>
-        </repository>
-        <snapshotRepository>
-            <id>nifi-snapshots</id>
-            <url>${nifi.snapshot.repo.url}</url>
-        </snapshotRepository>
-    </distributionManagement>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>findbugs-maven-plugin</artifactId>
-                <version>3.0.0</version>
-                <configuration>
-                    <effort>Max</effort>
-                    <threshold>Medium</threshold>
-                    <xmlOutput>true</xmlOutput>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-properties/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-properties/pom.xml b/commons/nifi-properties/pom.xml
index 70f90aa..43ef7c2 100644
--- a/commons/nifi-properties/pom.xml
+++ b/commons/nifi-properties/pom.xml
@@ -15,15 +15,15 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
+
     <artifactId>nifi-properties</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>NiFi Properties</name>
 
-    <dependencies>
-    </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-security-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-security-utils/pom.xml b/commons/nifi-security-utils/pom.xml
index 76e9ac1..0eaaeb4 100644
--- a/commons/nifi-security-utils/pom.xml
+++ b/commons/nifi-security-utils/pom.xml
@@ -14,9 +14,10 @@
       limitations under the License.
     -->
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -33,7 +34,6 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>3.3.2</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-socket-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-socket-utils/pom.xml b/commons/nifi-socket-utils/pom.xml
index 8e06433..efb5a8e 100644
--- a/commons/nifi-socket-utils/pom.xml
+++ b/commons/nifi-socket-utils/pom.xml
@@ -15,9 +15,10 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -34,32 +35,26 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-logging-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>commons-net</groupId>
             <artifactId>commons-net</artifactId>
-            <version>3.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>3.3.2</version>
         </dependency>
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
-            <version>2.4</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-properties</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-stream-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-stream-utils/pom.xml b/commons/nifi-stream-utils/pom.xml
index 0413575..ae06436 100644
--- a/commons/nifi-stream-utils/pom.xml
+++ b/commons/nifi-stream-utils/pom.xml
@@ -15,9 +15,10 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -26,17 +27,4 @@
     <packaging>jar</packaging>
     <name>NiFi Stream Utils</name>
     
-    <build>
-        <plugins>
-            <!-- Enforce 1.6 compliance -->
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.6</source>
-                    <target>1.6</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-utils/pom.xml b/commons/nifi-utils/pom.xml
index 8aeccd7..6a6cee1 100644
--- a/commons/nifi-utils/pom.xml
+++ b/commons/nifi-utils/pom.xml
@@ -15,9 +15,10 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-web-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-web-utils/pom.xml b/commons/nifi-web-utils/pom.xml
index 434e1a3..63d6e57 100644
--- a/commons/nifi-web-utils/pom.xml
+++ b/commons/nifi-web-utils/pom.xml
@@ -15,9 +15,10 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -29,27 +30,26 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-security-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
-            <version>1.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-client</artifactId>
-            <version>1.18.2</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-json</artifactId>
-            <version>1.18.2</version>
         </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
-            <version>3.1.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/pom.xml
----------------------------------------------------------------------
diff --git a/commons/pom.xml b/commons/pom.xml
new file mode 100644
index 0000000..fc7a1c3
--- /dev/null
+++ b/commons/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+  
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nifi-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.nifi</groupId>
+    <artifactId>nifi-commons-parent</artifactId>
+    <packaging>pom</packaging>
+    <name>NiFi :: Commons Parent</name>
+
+    <modules>
+        <module>core-flowfile-attributes</module>
+        <module>data-provenance-utils</module>
+        <module>flowfile-packager</module>
+        <module>naive-search-ring-buffer</module>
+        <module>nifi-expression-language</module>
+        <module>nifi-file-utils</module>
+        <module>nifi-logging-utils</module>
+        <module>nifi-properties</module>
+        <module>nifi-security-utils</module>
+        <module>nifi-socket-utils</module>
+        <module>nifi-stream-utils</module>
+        <module>nifi-utils</module>
+        <module>nifi-web-utils</module>
+        <module>processor-utilities</module>
+        <module>remote-communications-utils</module>
+        <module>search-utils</module>
+        <module>wali</module>
+    </modules>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/processor-utilities/pom.xml
----------------------------------------------------------------------
diff --git a/commons/processor-utilities/pom.xml b/commons/processor-utilities/pom.xml
index 0519b7f..2e952de 100644
--- a/commons/processor-utilities/pom.xml
+++ b/commons/processor-utilities/pom.xml
@@ -15,9 +15,10 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     
@@ -30,18 +31,15 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-api</artifactId>
-            <version>[0.0.1-SNAPSHOT, 1.0.0-SNAPSHOT)</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-utils</artifactId>
-            <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-security-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/remote-communications-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/remote-communications-utils/pom.xml b/commons/remote-communications-utils/pom.xml
index 5e5ebc1..4eb0133 100644
--- a/commons/remote-communications-utils/pom.xml
+++ b/commons/remote-communications-utils/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/search-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/search-utils/pom.xml b/commons/search-utils/pom.xml
index 569958f..7caacc8 100644
--- a/commons/search-utils/pom.xml
+++ b/commons/search-utils/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -27,6 +27,4 @@
 
     <name>search-utils</name>
 
-    <dependencies>
-    </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/wali/pom.xml
----------------------------------------------------------------------
diff --git a/commons/wali/pom.xml b/commons/wali/pom.xml
index ce04973..5a06a3f 100644
--- a/commons/wali/pom.xml
+++ b/commons/wali/pom.xml
@@ -15,17 +15,17 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
-    <groupId>wali</groupId>
     <artifactId>wali</artifactId>
-
-    <version>3.0.0-SNAPSHOT</version>
+    <version>0.0.1-SNAPSHOT</version>
     <packaging>jar</packaging>
+    
     <name>WALI : Write-Ahead Log Implementation</name>
     
     <dependencies>
@@ -36,7 +36,6 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-stream-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/extensions/file-authorization-provider/pom.xml
----------------------------------------------------------------------
diff --git a/extensions/file-authorization-provider/pom.xml b/extensions/file-authorization-provider/pom.xml
deleted file mode 100644
index f8d823f..0000000
--- a/extensions/file-authorization-provider/pom.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>file-authorization-provider</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>Authorization Provider: File</name>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-            </resource>
-            <resource>
-                <directory>src/main/xsd</directory>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.tools.xjc.maven2</groupId>
-                <artifactId>maven-jaxb-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>current</id>
-                        <goals>
-                            <goal>generate</goal>
-                        </goals>
-                        <configuration>
-                            <schemaDirectory>src/main/xsd</schemaDirectory>
-                            <includeSchemas>
-                                <includeSchema>**/*.xsd</includeSchema>
-                            </includeSchemas>
-                            <generatePackage>org.apache.nifi.user.generated</generatePackage>
-                        </configuration>
-                    </execution>
-                </executions>
-                <configuration>
-                    <generateDirectory>${project.build.directory}/generated-sources/jaxb</generateDirectory>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-            <version>[0.0.1-SNAPSHOT, 1.0.0-SNAPSHOT)</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-file-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-properties</artifactId>
-            <version>[0.0.1-SNAPSHOT, 1.0.0-SNAPSHOT)</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.10</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/extensions/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java
----------------------------------------------------------------------
diff --git a/extensions/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java b/extensions/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java
deleted file mode 100644
index 55f59ba..0000000
--- a/extensions/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * 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.nifi.authorization;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import org.apache.nifi.authorization.annotation.AuthorityProviderContext;
-import org.apache.nifi.authorization.exception.AuthorityAccessException;
-import org.apache.nifi.authorization.exception.IdentityAlreadyExistsException;
-import org.apache.nifi.authorization.exception.ProviderCreationException;
-import org.apache.nifi.authorization.exception.UnknownIdentityException;
-import org.apache.nifi.file.FileUtils;
-import org.apache.nifi.user.generated.ObjectFactory;
-import org.apache.nifi.user.generated.Role;
-import org.apache.nifi.user.generated.User;
-import org.apache.nifi.user.generated.Users;
-import org.apache.nifi.util.NiFiProperties;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
-
-/**
- * Provides identity checks and grants authorities.
- */
-public class FileAuthorizationProvider implements AuthorityProvider {
-
-    private static final Logger logger = LoggerFactory.getLogger(FileAuthorizationProvider.class);
-    private static final String USERS_XSD = "/users.xsd";
-    private static final String JAXB_GENERATED_PATH = "org.apache.nifi.user.generated";
-    private static final JAXBContext JAXB_CONTEXT = initializeJaxbContext();
-
-    /**
-     * Load the JAXBContext.
-     */
-    private static JAXBContext initializeJaxbContext() {
-        try {
-            return JAXBContext.newInstance(JAXB_GENERATED_PATH, FileAuthorizationProvider.class.getClassLoader());
-        } catch (JAXBException e) {
-            throw new RuntimeException("Unable to create JAXBContext.");
-        }
-    }
-
-    private NiFiProperties properties;
-    private File usersFile;
-    private File restoreUsersFile;
-    private Users users;
-    private final Set<String> defaultAuthorities = new HashSet<>();
-
-    @Override
-    public void initialize(final AuthorityProviderInitializationContext initializationContext) throws ProviderCreationException {
-    }
-
-    @Override
-    public void onConfigured(final AuthorityProviderConfigurationContext configurationContext) throws ProviderCreationException {
-        try {
-            final String usersFilePath = configurationContext.getProperty("Authorized Users File");
-            if (usersFilePath == null || usersFilePath.trim().isEmpty()) {
-                throw new ProviderCreationException("The authorized users file must be specified.");
-            }
-
-            // the users file instance will never be null because a default is used
-            usersFile = new File(usersFilePath);
-            final File usersFileDirectory = usersFile.getParentFile();
-
-            // the restore directory is optional and may be null
-            final File restoreDirectory = properties.getRestoreDirectory();
-
-            if (restoreDirectory != null) {
-
-                // sanity check that restore directory is a directory, creating it if necessary
-                FileUtils.ensureDirectoryExistAndCanAccess(restoreDirectory);
-
-                // check that restore directory is not the same as the primary directory
-                if (usersFileDirectory.getAbsolutePath().equals(restoreDirectory.getAbsolutePath())) {
-                    throw new ProviderCreationException(String.format("Authorized User's directory '%s' is the same as restore directory '%s' ",
-                            usersFileDirectory.getAbsolutePath(), restoreDirectory.getAbsolutePath()));
-                }
-
-                // the restore copy will have same file name, but reside in a different directory
-                restoreUsersFile = new File(restoreDirectory, usersFile.getName());
-
-                // sync the primary copy with the restore copy
-                try {
-                    FileUtils.syncWithRestore(usersFile, restoreUsersFile, logger);
-                } catch (final IOException | IllegalStateException ioe) {
-                    throw new ProviderCreationException(ioe);
-                }
-
-            }
-
-            // load the users from the specified file
-            if (usersFile.exists()) {
-                // find the schema
-                final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-                final Schema schema = schemaFactory.newSchema(FileAuthorizationProvider.class.getResource(USERS_XSD));
-
-                // attempt to unmarshal
-                final Unmarshaller unmarshaller = JAXB_CONTEXT.createUnmarshaller();
-                unmarshaller.setSchema(schema);
-                final JAXBElement<Users> element = unmarshaller.unmarshal(new StreamSource(usersFile), Users.class);
-                users = element.getValue();
-            } else {
-                final ObjectFactory objFactory = new ObjectFactory();
-                users = objFactory.createUsers();
-            }
-
-            // attempt to load a default roles
-            final String rawDefaultAuthorities = configurationContext.getProperty("Default User Roles");
-            if (StringUtils.isNotBlank(rawDefaultAuthorities)) {
-                final Set<String> invalidDefaultAuthorities = new HashSet<>();
-
-                // validate the specified authorities
-                final String[] rawDefaultAuthorityList = rawDefaultAuthorities.split(",");
-                for (String rawAuthority : rawDefaultAuthorityList) {
-                    rawAuthority = rawAuthority.trim();
-                    final Authority authority = Authority.valueOfAuthority(rawAuthority);
-                    if (authority == null) {
-                        invalidDefaultAuthorities.add(rawAuthority);
-                    } else {
-                        defaultAuthorities.add(rawAuthority);
-                    }
-                }
-
-                // report any unrecognized authorities
-                if (!invalidDefaultAuthorities.isEmpty()) {
-                    logger.warn(String.format("The following default role(s) '%s' were not recognized. Possible values: %s.",
-                            StringUtils.join(invalidDefaultAuthorities, ", "), StringUtils.join(Authority.getRawAuthorities(), ", ")));
-                }
-            }
-        } catch (IOException | ProviderCreationException | SAXException | JAXBException e) {
-            throw new ProviderCreationException(e);
-        }
-
-    }
-
-    @Override
-    public void preDestruction() {
-    }
-
-    /**
-     * Determines if this provider has a default role.
-     *
-     * @return
-     */
-    private boolean hasDefaultRoles() {
-        return !defaultAuthorities.isEmpty();
-    }
-
-    /**
-     * Determines if the specified dn is known to this authority provider. When
-     * this provider is configured to have default role(s), all dn are
-     * considered to exist.
-     *
-     * @param dn
-     * @return True if he dn is known, false otherwise
-     */
-    @Override
-    public boolean doesDnExist(String dn) throws AuthorityAccessException {
-        if (hasDefaultRoles()) {
-            return true;
-        }
-
-        final User user = getUser(dn);
-        return user != null;
-    }
-
-    /**
-     * Loads the authorities for the specified user. If this provider is
-     * configured for default user role(s) and a non existent dn is specified, a
-     * new user will be automatically created with the default role(s).
-     *
-     * @param dn
-     * @return
-     * @throws UnknownIdentityException
-     * @throws AuthorityAccessException
-     */
-    @Override
-    public synchronized Set<Authority> getAuthorities(String dn) throws UnknownIdentityException, AuthorityAccessException {
-        final Set<Authority> authorities = EnumSet.noneOf(Authority.class);
-
-        // get the user 
-        final User user = getUser(dn);
-
-        // ensure the user was located
-        if (user == null) {
-            if (hasDefaultRoles()) {
-                logger.debug(String.format("User DN not found: %s. Creating new user with default roles.", dn));
-
-                // create the user (which will automatically add any default authorities)
-                addUser(dn, null);
-
-                // get the authorities for the newly created user
-                authorities.addAll(getAuthorities(dn));
-            } else {
-                throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
-            }
-        } else {
-            // create the authorities that this user has
-            for (final Role role : user.getRole()) {
-                authorities.add(Authority.valueOfAuthority(role.getName()));
-            }
-        }
-
-        return authorities;
-    }
-
-    /**
-     * Adds the specified authorities to the specified user. Regardless of
-     * whether this provider is configured for a default user role, when a non
-     * existent dn is specified, an UnknownIdentityException will be thrown.
-     *
-     * @param dn
-     * @param authorities
-     * @throws UnknownIdentityException
-     * @throws AuthorityAccessException
-     */
-    @Override
-    public synchronized void setAuthorities(String dn, Set<Authority> authorities) throws UnknownIdentityException, AuthorityAccessException {
-        // get the user
-        final User user = getUser(dn);
-
-        // ensure the user was located
-        if (user == null) {
-            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
-        }
-
-        // add the user authorities
-        setUserAuthorities(user, authorities);
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Adds the specified authorities to the specified user.
-     *
-     * @param user
-     * @param authorities
-     */
-    private void setUserAuthorities(final User user, final Set<Authority> authorities) {
-        // clear the existing rules
-        user.getRole().clear();
-
-        // set the new roles
-        final ObjectFactory objFactory = new ObjectFactory();
-        for (final Authority authority : authorities) {
-            final Role role = objFactory.createRole();
-            role.setName(authority.toString());
-
-            // add the new role
-            user.getRole().add(role);
-        }
-    }
-
-    /**
-     * Adds the specified user. If this provider is configured with default
-     * role(s) they will be added to the new user.
-     *
-     * @param dn
-     * @param group
-     * @throws UnknownIdentityException
-     * @throws AuthorityAccessException
-     */
-    @Override
-    public synchronized void addUser(String dn, String group) throws IdentityAlreadyExistsException, AuthorityAccessException {
-        final User user = getUser(dn);
-
-        // ensure the user doesn't already exist
-        if (user != null) {
-            throw new IdentityAlreadyExistsException(String.format("User DN already exists: %s", dn));
-        }
-
-        // create the new user
-        final ObjectFactory objFactory = new ObjectFactory();
-        final User newUser = objFactory.createUser();
-
-        // set the user properties
-        newUser.setDn(dn);
-        newUser.setGroup(group);
-
-        // add default roles if appropriate
-        if (hasDefaultRoles()) {
-            for (final String authority : defaultAuthorities) {
-                Role role = objFactory.createRole();
-                role.setName(authority);
-
-                // add the role
-                newUser.getRole().add(role);
-            }
-        }
-
-        // add the user
-        users.getUser().add(newUser);
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Gets the users for the specified authority.
-     *
-     * @param authority
-     * @return
-     * @throws AuthorityAccessException
-     */
-    @Override
-    public synchronized Set<String> getUsers(Authority authority) throws AuthorityAccessException {
-        final Set<String> userSet = new HashSet<>();
-        for (final User user : users.getUser()) {
-            for (final Role role : user.getRole()) {
-                if (role.getName().equals(authority.toString())) {
-                    userSet.add(user.getDn());
-                }
-            }
-        }
-        return userSet;
-    }
-
-    /**
-     * Removes the specified user. Regardless of whether this provider is
-     * configured for a default user role, when a non existent dn is specified,
-     * an UnknownIdentityException will be thrown.
-     *
-     * @param dn
-     * @throws UnknownIdentityException
-     * @throws AuthorityAccessException
-     */
-    @Override
-    public synchronized void revokeUser(String dn) throws UnknownIdentityException, AuthorityAccessException {
-        // get the user
-        final User user = getUser(dn);
-
-        // ensure the user was located
-        if (user == null) {
-            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
-        }
-
-        // remove the specified user
-        users.getUser().remove(user);
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void setUsersGroup(Set<String> dns, String group) throws UnknownIdentityException, AuthorityAccessException {
-        final Collection<User> groupedUsers = new HashSet<>();
-
-        // get the specified users
-        for (final String dn : dns) {
-            // get the user
-            final User user = getUser(dn);
-
-            // ensure the user was located
-            if (user == null) {
-                throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
-            }
-
-            groupedUsers.add(user);
-        }
-
-        // update each user group
-        for (final User user : groupedUsers) {
-            user.setGroup(group);
-        }
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void ungroupUser(String dn) throws UnknownIdentityException, AuthorityAccessException {
-        // get the user
-        final User user = getUser(dn);
-
-        // ensure the user was located
-        if (user == null) {
-            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
-        }
-
-        // remove the users group
-        user.setGroup(null);
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void ungroup(String group) throws AuthorityAccessException {
-        // get the user group
-        final Collection<User> userGroup = getUserGroup(group);
-
-        // ensure the user group was located
-        if (userGroup == null) {
-            return;
-        }
-
-        // update each user group
-        for (final User user : userGroup) {
-            user.setGroup(null);
-        }
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public String getGroupForUser(String dn) throws UnknownIdentityException, AuthorityAccessException {
-        // get the user
-        final User user = getUser(dn);
-
-        // ensure the user was located
-        if (user == null) {
-            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
-        }
-
-        return user.getGroup();
-    }
-
-    @Override
-    public void revokeGroup(String group) throws UnknownIdentityException, AuthorityAccessException {
-        // get the user group
-        final Collection<User> userGroup = getUserGroup(group);
-
-        // ensure the user group was located
-        if (userGroup == null) {
-            throw new UnknownIdentityException(String.format("User group not found: %s.", group));
-        }
-
-        // remove each user in the group
-        for (final User user : userGroup) {
-            users.getUser().remove(user);
-        }
-
-        try {
-            // save the file
-            save();
-        } catch (Exception e) {
-            throw new AuthorityAccessException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Locates the user with the specified DN.
-     *
-     * @param dn
-     * @return
-     */
-    private User getUser(String dn) throws UnknownIdentityException {
-        // ensure the DN was specified
-        if (dn == null) {
-            throw new UnknownIdentityException("User DN not specified.");
-        }
-
-        // attempt to get the user and ensure it was located
-        User desiredUser = null;
-        for (final User user : users.getUser()) {
-            if (dn.equalsIgnoreCase(user.getDn())) {
-                desiredUser = user;
-                break;
-            }
-        }
-
-        return desiredUser;
-    }
-
-    /**
-     * Locates all users that are part of the specified group.
-     *
-     * @param group
-     * @return
-     * @throws UnknownIdentityException
-     */
-    private Collection<User> getUserGroup(String group) throws UnknownIdentityException {
-        // ensure the DN was specified
-        if (group == null) {
-            throw new UnknownIdentityException("User group not specified.");
-        }
-
-        // get all users with this group
-        Collection<User> userGroup = null;
-        for (final User user : users.getUser()) {
-            if (group.equals(user.getGroup())) {
-                if (userGroup == null) {
-                    userGroup = new HashSet<>();
-                }
-                userGroup.add(user);
-            }
-        }
-
-        return userGroup;
-    }
-
-    /**
-     * Saves the users file.
-     *
-     * @throws Exception
-     */
-    private void save() throws Exception {
-        final Marshaller marshaller = JAXB_CONTEXT.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
-
-        // save users to restore directory before primary directory
-        if (restoreUsersFile != null) {
-            marshaller.marshal(users, restoreUsersFile);
-        }
-
-        // save users to primary directory
-        marshaller.marshal(users, usersFile);
-    }
-
-    @AuthorityProviderContext
-    public void setNiFiProperties(NiFiProperties properties) {
-        this.properties = properties;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/extensions/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider
----------------------------------------------------------------------
diff --git a/extensions/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider b/extensions/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider
deleted file mode 100755
index 93d2941..0000000
--- a/extensions/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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.
-org.apache.nifi.authorization.FileAuthorizationProvider

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/extensions/file-authorization-provider/src/main/xsd/users.xsd
----------------------------------------------------------------------
diff --git a/extensions/file-authorization-provider/src/main/xsd/users.xsd b/extensions/file-authorization-provider/src/main/xsd/users.xsd
deleted file mode 100644
index 4ee1e17..0000000
--- a/extensions/file-authorization-provider/src/main/xsd/users.xsd
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
-    <!-- role -->
-    <xs:complexType name="Role">
-        <xs:attribute name="name">
-            <xs:simpleType>
-                <xs:restriction base="xs:string">
-                    <xs:enumeration value="ROLE_MONITOR"/>
-                    <xs:enumeration value="ROLE_PROVENANCE"/>
-                    <xs:enumeration value="ROLE_DFM"/>
-                    <xs:enumeration value="ROLE_ADMIN"/>
-                    <xs:enumeration value="ROLE_PROXY"/>
-                    <xs:enumeration value="ROLE_NIFI"/>
-                </xs:restriction>
-            </xs:simpleType>
-        </xs:attribute>
-    </xs:complexType>
-
-    <!-- user -->
-    <xs:complexType name="User">
-        <xs:sequence>
-            <xs:element name="role" type="Role" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-        <xs:attribute name="dn">
-            <xs:simpleType>
-                <xs:restriction base="xs:string">
-                    <xs:minLength value="1"/>
-                    <xs:pattern value=".*[^\s].*"/>
-                </xs:restriction>
-            </xs:simpleType>
-        </xs:attribute>
-        <xs:attribute name="group">
-            <xs:simpleType>
-                <xs:restriction base="xs:string">
-                    <xs:minLength value="1"/>
-                    <xs:pattern value=".*[^\s].*"/>
-                </xs:restriction>
-            </xs:simpleType>
-        </xs:attribute>
-    </xs:complexType>
-
-    <!-- users -->
-    <xs:element name="users">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element name="user" type="User" minOccurs="0" maxOccurs="unbounded"/>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/extensions/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java
----------------------------------------------------------------------
diff --git a/extensions/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java b/extensions/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java
deleted file mode 100644
index 3d0196d..0000000
--- a/extensions/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.nifi.authorization;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import org.apache.nifi.authorization.exception.ProviderCreationException;
-import org.apache.nifi.file.FileUtils;
-import org.apache.nifi.util.NiFiProperties;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.*;
-import static org.junit.Assert.*;
-import org.junit.Ignore;
-import org.mockito.Mockito;
-
-@Ignore
-public class FileAuthorizationProviderTest {
-    
-    private FileAuthorizationProvider provider;
-    
-    private File primary;
-    
-    private File restore;
-    
-    private NiFiProperties mockProperties;
-    
-    private AuthorityProviderConfigurationContext mockConfigurationContext;
-    
-    @Before
-    public void setup() throws IOException {
-        
-        primary = new File("target/primary/users.txt");
-        restore = new File("target/restore/users.txt");
-        
-        System.out.println("absolute path: " + primary.getAbsolutePath());
-        
-        mockProperties = mock(NiFiProperties.class);
-        when(mockProperties.getRestoreDirectory()).thenReturn(restore.getParentFile());
-        
-        mockConfigurationContext = mock(AuthorityProviderConfigurationContext.class);
-        when(mockConfigurationContext.getProperty(Mockito.eq("Authorized Users File"))).thenReturn(primary.getPath());
-        
-        provider = new FileAuthorizationProvider();
-        provider.setNiFiProperties(mockProperties);
-        provider.initialize(null);
-    }     
-    
-    @After
-    public void cleanup() throws Exception {
-        deleteFile(primary);
-        deleteFile(restore);
-    }
-    
-    private boolean deleteFile(final File file) {
-        if(file.isDirectory()) {
-            FileUtils.deleteFilesInDir(file, null, null, true, true);
-        }
-        return FileUtils.deleteFile(file, null, 10);
-    }
-    
-    @Test
-    public void testPostContructionWhenRestoreDoesNotExist() throws Exception {
-        
-        byte[] primaryBytes = "<users/>".getBytes();
-        FileOutputStream fos = new FileOutputStream(primary);
-        fos.write(primaryBytes);
-        fos.close();
-        
-        provider.onConfigured(mockConfigurationContext);
-        assertEquals(primary.length(), restore.length());
-    }
-    
-    @Test
-    public void testPostContructionWhenPrimaryDoesNotExist() throws Exception {
-        
-        byte[] restoreBytes = "<users/>".getBytes();
-        FileOutputStream fos = new FileOutputStream(restore);
-        fos.write(restoreBytes);
-        fos.close();
-        
-        provider.onConfigured(mockConfigurationContext);
-        assertEquals(restore.length(), primary.length());
-        
-    }
-    
-    @Test(expected = ProviderCreationException.class)
-    public void testPostContructionWhenPrimaryDifferentThanRestore() throws Exception {
-        
-        byte[] primaryBytes = "<users></users>".getBytes();
-        FileOutputStream fos = new FileOutputStream(primary);
-        fos.write(primaryBytes);
-        fos.close();
-        
-        byte[] restoreBytes = "<users/>".getBytes();
-        fos = new FileOutputStream(restore);
-        fos.write(restoreBytes);
-        fos.close();
-        
-        provider.onConfigured(mockConfigurationContext);
-    }
-    
-    @Test
-    public void testPostContructionWhenPrimaryAndBackupDoNotExist() throws Exception {
-        
-        provider.onConfigured(mockConfigurationContext);
-        assertEquals(0, restore.length());
-        assertEquals(restore.length(), primary.length());
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/misc/nar-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/misc/nar-maven-plugin/pom.xml b/misc/nar-maven-plugin/pom.xml
deleted file mode 100644
index 5c7ca7f..0000000
--- a/misc/nar-maven-plugin/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.nifi</groupId>
-    <artifactId>nar-maven-plugin</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>maven-plugin</packaging>
-    <name>Apache NiFi NAR Plugin</name>
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-    <build>
-        <defaultGoal>install</defaultGoal>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.2</version>
-                <configuration>
-                    <source>1.7</source>
-                    <target>1.7</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>2.5</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.3</version>
-                <executions>
-                  <execution>
-                    <id>default-descriptor</id>
-                    <goals>
-                      <goal>descriptor</goal>
-                    </goals>
-                    <phase>process-classes</phase>
-                  </execution>
-                  <execution>
-                    <id>help-descriptor</id>
-                    <goals>
-                      <goal>helpmojo</goal>
-                    </goals>
-                    <phase>process-classes</phase>
-                  </execution>
-                </executions>
-              </plugin>
-        </plugins>
-    </build>    
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-api</artifactId>
-            <version>2.0.11</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-dependency-plugin</artifactId>
-            <version>2.9</version>
-            <type>maven-plugin</type>
-        </dependency>
-        <dependency>
-            <!-- No code from maven-jar-plugin is actually used; it's included
-            just to simplify the dependencies list.                     -->
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-jar-plugin</artifactId>
-            <version>2.5</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-tools</groupId>
-            <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.3</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-    <distributionManagement>
-        <repository>
-            <id>nifi-releases</id>
-            <url>${nifi.repo.url}</url>
-        </repository>
-        <snapshotRepository>
-            <id>nifi-snapshots</id>
-            <url>${nifi.snapshot.repo.url}</url>
-        </snapshotRepository>
-    </distributionManagement>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/misc/nar-maven-plugin/src/main/java/nifi/NarMojo.java
----------------------------------------------------------------------
diff --git a/misc/nar-maven-plugin/src/main/java/nifi/NarMojo.java b/misc/nar-maven-plugin/src/main/java/nifi/NarMojo.java
deleted file mode 100644
index 5196f73..0000000
--- a/misc/nar-maven-plugin/src/main/java/nifi/NarMojo.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * 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 nifi;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.apache.maven.archiver.MavenArchiveConfiguration;
-import org.apache.maven.archiver.MavenArchiver;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.installer.ArtifactInstaller;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.dependency.utils.DependencyStatusSets;
-import org.apache.maven.plugin.dependency.utils.DependencyUtil;
-import org.apache.maven.plugin.dependency.utils.filters.DestFileFilter;
-import org.apache.maven.plugin.dependency.utils.resolvers.ArtifactsResolver;
-import org.apache.maven.plugin.dependency.utils.resolvers.DefaultArtifactsResolver;
-import org.apache.maven.plugin.dependency.utils.translators.ArtifactTranslator;
-import org.apache.maven.plugin.dependency.utils.translators.ClassifierTypeTranslator;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
-import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
-import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
-import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
-import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
-import org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
-import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
-import org.codehaus.plexus.archiver.ArchiverException;
-import org.codehaus.plexus.archiver.jar.JarArchiver;
-import org.codehaus.plexus.archiver.jar.ManifestException;
-import org.codehaus.plexus.archiver.manager.ArchiverManager;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Packages the current project as an Apache NiFi Archive (NAR).
- *
- * The following code is derived from maven-dependencies-plugin and
- * maven-jar-plugin. The functionality of CopyDependenciesMojo and JarMojo was
- * simplified to the use case of NarMojo.
- *
- */
-@Mojo(name = "nar", defaultPhase = LifecyclePhase.PACKAGE, threadSafe = false, requiresDependencyResolution = ResolutionScope.RUNTIME)
-public class NarMojo extends AbstractMojo {
-
-    private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"};
-    private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
-
-    /**
-     * POM
-     *
-     */
-    @Parameter(defaultValue = "${project}", readonly = true, required = true)
-    protected MavenProject project;
-
-    @Parameter(defaultValue = "${session}", readonly = true, required = true)
-    protected MavenSession session;
-
-    /**
-     * List of files to include. Specified as fileset patterns.
-     */
-    @Parameter(property = "includes")
-    protected String[] includes;
-    /**
-     * List of files to exclude. Specified as fileset patterns.
-     */
-    @Parameter(property = "excludes")
-    protected String[] excludes;
-    /**
-     * Name of the generated NAR.
-     *
-     */
-    @Parameter(alias = "narName", property = "nar.finalName", defaultValue = "${project.build.finalName}", required = true)
-    protected String finalName;
-
-    /**
-     * The Jar archiver.
-     *
-     * \@\component role="org.codehaus.plexus.archiver.Archiver" roleHint="jar"
-     */
-    @Component(role = org.codehaus.plexus.archiver.Archiver.class, hint = "jar")
-    private JarArchiver jarArchiver;
-    /**
-     * The archive configuration to use.
-     *
-     * See <a
-     * href="http://maven.apache.org/shared/maven-archiver/index.html">the
-     * documentation for Maven Archiver</a>.
-     *
-     */
-    @Parameter(property = "archive")
-    protected final MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
-    /**
-     * Path to the default MANIFEST file to use. It will be used if
-     * <code>useDefaultManifestFile</code> is set to <code>true</code>.
-     *
-     */
-    @Parameter(property = "defaultManifestFiles", defaultValue = "${project.build.outputDirectory}/META-INF/MANIFEST.MF", readonly = true, required = true)
-    protected File defaultManifestFile;
-
-    /**
-     * Set this to <code>true</code> to enable the use of the
-     * <code>defaultManifestFile</code>.
-     *
-     * @since 2.2
-     */
-    @Parameter(property = "nar.useDefaultManifestFile", defaultValue = "false")
-    protected boolean useDefaultManifestFile;
-
-    @Component
-    protected MavenProjectHelper projectHelper;
-
-    /**
-     * Whether creating the archive should be forced.
-     *
-     */
-    @Parameter(property = "nar.forceCreation", defaultValue = "false")
-    protected boolean forceCreation;
-
-    /**
-     * Classifier to add to the artifact generated. If given, the artifact will
-     * be an attachment instead.
-     *
-     */
-    @Parameter(property = "classifier")
-    protected String classifier;
-
-    @Component
-    protected ArtifactInstaller installer;
-
-    @Component
-    protected ArtifactRepositoryFactory repositoryFactory;
-
-    /**
-     * This only applies if the classifier parameter is used.
-     *
-     */
-    @Parameter(property = "mdep.failOnMissingClassifierArtifact", defaultValue = "true", required = false)
-    protected boolean failOnMissingClassifierArtifact = true;
-
-    /**
-     * Comma Separated list of Types to include. Empty String indicates include
-     * everything (default).
-     *
-     */
-    @Parameter(property = "includeTypes", required = false)
-    protected String includeTypes;
-
-    /**
-     * Comma Separated list of Types to exclude. Empty String indicates don't
-     * exclude anything (default).
-     *
-     */
-    @Parameter(property = "excludeTypes", required = false)
-    protected String excludeTypes;
-
-    /**
-     * Scope to include. An Empty string indicates all scopes (default).
-     *
-     */
-    @Parameter(property = "includeScope", required = false)
-    protected String includeScope;
-
-    /**
-     * Scope to exclude. An Empty string indicates no scopes (default).
-     *
-     */
-    @Parameter(property = "excludeScope", required = false)
-    protected String excludeScope;
-
-    /**
-     * Comma Separated list of Classifiers to include. Empty String indicates
-     * include everything (default).
-     *
-     */
-    @Parameter(property = "includeClassifiers", required = false)
-    protected String includeClassifiers;
-
-    /**
-     * Comma Separated list of Classifiers to exclude. Empty String indicates
-     * don't exclude anything (default).
-     *
-     */
-    @Parameter(property = "excludeClassifiers", required = false)
-    protected String excludeClassifiers;
-
-    /**
-     * Specify classifier to look for. Example: sources
-     *
-     */
-    @Parameter(property = "classifier", required = false)
-    protected String copyDepClassifier;
-
-    /**
-     * Specify type to look for when constructing artifact based on classifier.
-     * Example: java-source,jar,war, nar
-     *
-     */
-    @Parameter(property = "type", required = false, defaultValue = "nar")
-    protected String type;
-
-    /**
-     * Comma separated list of Artifact names too exclude.
-     *
-     */
-    @Parameter(property = "excludeArtifacts", required = false)
-    protected String excludeArtifactIds;
-
-    /**
-     * Comma separated list of Artifact names to include.
-     *
-     */
-    @Parameter(property = "includeArtifacts", required = false)
-    protected String includeArtifactIds;
-
-    /**
-     * Comma separated list of GroupId Names to exclude.
-     *
-     */
-    @Parameter(property = "excludeArtifacts", required = false)
-    protected String excludeGroupIds;
-
-    /**
-     * Comma separated list of GroupIds to include.
-     *
-     */
-    @Parameter(property = "includeGroupIds", required = false)
-    protected String includeGroupIds;
-
-    /**
-     * Directory to store flag files
-     *
-     */
-    @Parameter(property = "markersDirectory", required = false, defaultValue = "${project.build.directory}/dependency-maven-plugin-markers")
-    protected File markersDirectory;
-
-    /**
-     * Overwrite release artifacts
-     *
-     */
-    @Parameter(property = "overWriteReleases", required = false)
-    protected boolean overWriteReleases;
-
-    /**
-     * Overwrite snapshot artifacts
-     *
-     */
-    @Parameter(property = "overWriteSnapshots", required = false)
-    protected boolean overWriteSnapshots;
-
-    /**
-     * Overwrite artifacts that don't exist or are older than the source.
-     *
-     */
-    @Parameter(property = "overWriteIfNewer", required = false, defaultValue = "true")
-    protected boolean overWriteIfNewer;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     */
-    @Component
-    protected ArtifactFactory factory;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     *
-     */
-    @Component
-    protected ArtifactResolver resolver;
-
-    /**
-     * Artifact collector, needed to resolve dependencies.
-     *
-     */
-    @Component(role = org.apache.maven.artifact.resolver.ArtifactCollector.class)
-    protected ArtifactCollector artifactCollector;
-
-    @Component(role = org.apache.maven.artifact.metadata.ArtifactMetadataSource.class)
-    protected ArtifactMetadataSource artifactMetadataSource;
-
-    /**
-     * Location of the local repository.
-     *
-     */
-    @Parameter(property = "localRepository", required = true, readonly = true)
-    protected ArtifactRepository local;
-
-    /**
-     * List of Remote Repositories used by the resolver
-     *
-     */
-    @Parameter(property = "project.remoteArtifactRepositories", required = true, readonly = true)
-    protected List remoteRepos;
-
-    /**
-     * To look up Archiver/UnArchiver implementations
-     *
-     */
-    @Component
-    protected ArchiverManager archiverManager;
-
-    /**
-     * Contains the full list of projects in the reactor.
-     *
-     */
-    @Parameter(property = "reactorProjects", required = true, readonly = true)
-    protected List reactorProjects;
-
-    /**
-     * If the plugin should be silent.
-     *
-     */
-    @Parameter(property = "silent", required = false, defaultValue = "false")
-    public boolean silent;
-
-    /**
-     * Output absolute filename for resolved artifacts
-     *
-     */
-    @Parameter(property = "outputAbsoluteArtifactFilename", defaultValue = "false", required = false)
-    protected boolean outputAbsoluteArtifactFilename;
-
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        copyDependencies();
-        makeNar();
-    }
-
-    private void copyDependencies() throws MojoExecutionException {
-        DependencyStatusSets dss = getDependencySets(this.failOnMissingClassifierArtifact);
-        Set artifacts = dss.getResolvedDependencies();
-
-        for (Object artifactObj : artifacts) {
-            copyArtifact((Artifact) artifactObj);
-        }
-
-        artifacts = dss.getSkippedDependencies();
-        for (Object artifactOjb : artifacts) {
-            Artifact artifact = (Artifact) artifactOjb;
-            getLog().info(artifact.getFile().getName() + " already exists in destination.");
-        }
-    }
-
-    protected void copyArtifact(Artifact artifact) throws MojoExecutionException {
-        String destFileName = DependencyUtil.getFormattedFileName(artifact, false);
-        final File destDir = DependencyUtil.getFormattedOutputDirectory(false, false, false, false, false, getDependenciesDirectory(), artifact);
-        final File destFile = new File(destDir, destFileName);
-        copyFile(artifact.getFile(), destFile);
-    }
-
-    protected Artifact getResolvedPomArtifact(Artifact artifact) {
-        Artifact pomArtifact = this.factory.createArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "", "pom");
-        // Resolve the pom artifact using repos
-        try {
-            this.resolver.resolve(pomArtifact, this.remoteRepos, this.local);
-        } catch (ArtifactResolutionException | ArtifactNotFoundException e) {
-            getLog().info(e.getMessage());
-        }
-        return pomArtifact;
-    }
-
-    protected ArtifactsFilter getMarkedArtifactFilter() {
-        return new DestFileFilter(this.overWriteReleases, this.overWriteSnapshots, this.overWriteIfNewer, false, false, false, false, false, getDependenciesDirectory());
-    }
-
-    protected DependencyStatusSets getDependencySets(boolean stopOnFailure) throws MojoExecutionException {
-        // add filters in well known order, least specific to most specific
-        FilterArtifacts filter = new FilterArtifacts();
-
-        filter.addFilter(new ProjectTransitivityFilter(project.getDependencyArtifacts(), false));
-        filter.addFilter(new ScopeFilter(this.includeScope, this.excludeScope));
-        filter.addFilter(new TypeFilter(this.includeTypes, this.excludeTypes));
-        filter.addFilter(new ClassifierFilter(this.includeClassifiers, this.excludeClassifiers));
-        filter.addFilter(new GroupIdFilter(this.includeGroupIds, this.excludeGroupIds));
-        filter.addFilter(new ArtifactIdFilter(this.includeArtifactIds, this.excludeArtifactIds));
-
-        // explicitly filter our nar dependencies
-        filter.addFilter(new TypeFilter("", "nar"));
-
-        // start with all artifacts.
-        Set artifacts = project.getArtifacts();
-
-        // perform filtering
-        try {
-            artifacts = filter.filter(artifacts);
-        } catch (ArtifactFilterException e) {
-            throw new MojoExecutionException(e.getMessage(), e);
-        }
-
-        // transform artifacts if classifier is set
-        final DependencyStatusSets status;
-        if (StringUtils.isNotEmpty(copyDepClassifier)) {
-            status = getClassifierTranslatedDependencies(artifacts, stopOnFailure);
-        } else {
-            status = filterMarkedDependencies(artifacts);
-        }
-
-        return status;
-    }
-
-    protected DependencyStatusSets getClassifierTranslatedDependencies(Set artifacts, boolean stopOnFailure) throws MojoExecutionException {
-        Set unResolvedArtifacts = new HashSet();
-        Set resolvedArtifacts = artifacts;
-        DependencyStatusSets status = new DependencyStatusSets();
-
-        // possibly translate artifacts into a new set of artifacts based on the
-        // classifier and type
-        // if this did something, we need to resolve the new artifacts
-        if (StringUtils.isNotEmpty(copyDepClassifier)) {
-            ArtifactTranslator translator = new ClassifierTypeTranslator(this.copyDepClassifier, this.type, this.factory);
-            artifacts = translator.translate(artifacts, getLog());
-
-            status = filterMarkedDependencies(artifacts);
-
-            // the unskipped artifacts are in the resolved set.
-            artifacts = status.getResolvedDependencies();
-
-            // resolve the rest of the artifacts
-            ArtifactsResolver artifactsResolver = new DefaultArtifactsResolver(this.resolver, this.local,
-                    this.remoteRepos, stopOnFailure);
-            resolvedArtifacts = artifactsResolver.resolve(artifacts, getLog());
-
-            // calculate the artifacts not resolved.
-            unResolvedArtifacts.addAll(artifacts);
-            unResolvedArtifacts.removeAll(resolvedArtifacts);
-        }
-
-        // return a bean of all 3 sets.
-        status.setResolvedDependencies(resolvedArtifacts);
-        status.setUnResolvedDependencies(unResolvedArtifacts);
-
-        return status;
-    }
-
-    protected DependencyStatusSets filterMarkedDependencies(Set artifacts) throws MojoExecutionException {
-        // remove files that have markers already
-        FilterArtifacts filter = new FilterArtifacts();
-        filter.clearFilters();
-        filter.addFilter(getMarkedArtifactFilter());
-
-        Set unMarkedArtifacts;
-        try {
-            unMarkedArtifacts = filter.filter(artifacts);
-        } catch (ArtifactFilterException e) {
-            throw new MojoExecutionException(e.getMessage(), e);
-        }
-
-        // calculate the skipped artifacts
-        Set skippedArtifacts = new HashSet();
-        skippedArtifacts.addAll(artifacts);
-        skippedArtifacts.removeAll(unMarkedArtifacts);
-
-        return new DependencyStatusSets(unMarkedArtifacts, null, skippedArtifacts);
-    }
-
-    protected void copyFile(File artifact, File destFile) throws MojoExecutionException {
-        try {
-            getLog().info("Copying " + (this.outputAbsoluteArtifactFilename ? artifact.getAbsolutePath() : artifact.getName()) + " to " + destFile);
-            FileUtils.copyFile(artifact, destFile);
-        } catch (Exception e) {
-            throw new MojoExecutionException("Error copying artifact from " + artifact + " to " + destFile, e);
-        }
-    }
-
-    private File getClassesDirectory() {
-        final File outputDirectory = new File(project.getBasedir(), "target");
-        return new File(outputDirectory, "classes");
-    }
-
-    private File getDependenciesDirectory() {
-        return new File(getClassesDirectory(), "META-INF/dependencies");
-    }
-
-    private void makeNar() throws MojoExecutionException {
-        File narFile = createArchive();
-
-        if (classifier != null) {
-            projectHelper.attachArtifact(project, "nar", classifier, narFile);
-        } else {
-            project.getArtifact().setFile(narFile);
-        }
-    }
-
-    public File createArchive() throws MojoExecutionException {
-        final File outputDirectory = new File(project.getBasedir(), "target");
-        File narFile = getNarFile(outputDirectory, finalName, classifier);
-        MavenArchiver archiver = new MavenArchiver();
-        archiver.setArchiver(jarArchiver);
-        archiver.setOutputFile(narFile);
-        archive.setForced(forceCreation);
-
-        try {
-            File contentDirectory = getClassesDirectory();
-            if (!contentDirectory.exists()) {
-                getLog().warn("NAR will be empty - no content was marked for inclusion!");
-            } else {
-                archiver.getArchiver().addDirectory(contentDirectory, getIncludes(), getExcludes());
-            }
-
-            File existingManifest = defaultManifestFile;
-            if (useDefaultManifestFile && existingManifest.exists() && archive.getManifestFile() == null) {
-                getLog().info("Adding existing MANIFEST to archive. Found under: " + existingManifest.getPath());
-                archive.setManifestFile(existingManifest);
-            }
-
-            // automatically add the artifact id to the manifest
-            archive.addManifestEntry("Nar-Id", project.getArtifactId());
-
-            // look for a nar dependency
-            String narDependency = getNarDependency();
-            if (narDependency != null) {
-                archive.addManifestEntry("Nar-Dependency-Id", narDependency);
-            }
-
-            archiver.createArchive(session, project, archive);
-            return narFile;
-        } catch (ArchiverException | MojoExecutionException | ManifestException | IOException | DependencyResolutionRequiredException e) {
-            throw new MojoExecutionException("Error assembling NAR", e);
-        }
-    }
-
-    private String[] getIncludes() {
-        if (includes != null && includes.length > 0) {
-            return includes;
-        }
-        return DEFAULT_INCLUDES;
-    }
-
-    private String[] getExcludes() {
-        if (excludes != null && excludes.length > 0) {
-            return excludes;
-        }
-        return DEFAULT_EXCLUDES;
-    }
-
-    protected File getNarFile(File basedir, String finalName, String classifier) {
-        if (classifier == null) {
-            classifier = "";
-        } else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) {
-            classifier = "-" + classifier;
-        }
-
-        return new File(basedir, finalName + classifier + ".nar");
-    }
-
-    private String getNarDependency() throws MojoExecutionException {
-        String narDependency = null;
-
-        // get nar dependencies
-        FilterArtifacts filter = new FilterArtifacts();
-        filter.addFilter(new TypeFilter("nar", ""));
-
-        // start with all artifacts.
-        Set artifacts = project.getArtifacts();
-
-        // perform filtering
-        try {
-            artifacts = filter.filter(artifacts);
-        } catch (ArtifactFilterException e) {
-            throw new MojoExecutionException(e.getMessage(), e);
-        }
-
-        // ensure there is a single nar dependency
-        if (artifacts.size() > 1) {
-            throw new MojoExecutionException("Each NAR represents a ClassLoader. A NAR dependency allows that NAR's ClassLoader to be "
-                    + "used as the parent of this NAR's ClassLoader. As a result, only a single NAR dependency is allowed.");
-        } else if (artifacts.size() == 1) {
-            final Artifact artifact = (Artifact) artifacts.iterator().next();
-            narDependency = artifact.getArtifactId();
-        }
-
-        return narDependency;
-    }
-}


[05/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java
new file mode 100644
index 0000000..5bead8c
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java
@@ -0,0 +1,114 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.IOException;
+
+import org.apache.nifi.controller.ControllerService;
+
+/**
+ * This interface defines an API that can be used for interacting with a
+ * Distributed Cache that functions similarly to a {@link java.util.Map Map}.
+ *
+ */
+public interface DistributedMapCacheClient extends ControllerService {
+
+    /**
+     * Adds the specified key and value to the cache, if they are not already
+     * present, serializing the key and value with the given
+     * {@link Serializer}s.
+     *
+     * @param <K>
+     * @param <V>
+     * @param key the key for into the map
+     * @param value the value to add to the map if and only if the key is absent
+     * @param keySerializer
+     * @param valueSerializer
+     * @return true if the value was added to the cache, false if the value
+     * already existed in the cache
+     *
+     * @throws IOException if unable to communicate with the remote instance
+     */
+    <K, V> boolean putIfAbsent(K key, V value, Serializer<K> keySerializer, Serializer<V> valueSerializer) throws IOException;
+
+    /**
+     * Adds the specified key and value to the cache, if they are not already
+     * present, serializing the key and value with the given
+     * {@link Serializer}s. If a value already exists in the cache for the given
+     * key, the value associated with the key is returned, after being
+     * deserialized with the given valueDeserializer.
+     *
+     * @param <K>
+     * @param <V>
+     * @param key
+     * @param value
+     * @param keySerializer
+     * @param valueSerializer
+     * @param valueDeserializer
+     * @return
+     * @throws IOException
+     */
+    <K, V> V getAndPutIfAbsent(K key, V value, Serializer<K> keySerializer, Serializer<V> valueSerializer, Deserializer<V> valueDeserializer) throws IOException;
+
+    /**
+     * Determines if the given value is present in the cache and if so returns
+     * <code>true</code>, else returns <code>false</code>
+     *
+     * @param <K>
+     * @param key
+     * @param keySerializer
+     * @return
+     *
+     * @throws IOException if unable to communicate with the remote instance
+     */
+    <K> boolean containsKey(K key, Serializer<K> keySerializer) throws IOException;
+
+    /**
+     * Returns the value in the cache for the given key, if one exists;
+     * otherwise returns <code>null</code>
+     *
+     * @param <K>
+     * @param <V>
+     * @param key the key to lookup in the map
+     * @param keySerializer
+     * @param valueDeserializer
+     *
+     * @return
+     * @throws IOException
+     */
+    <K, V> V get(K key, Serializer<K> keySerializer, Deserializer<V> valueDeserializer) throws IOException;
+
+    /**
+     * Attempts to notify the server that we are finished communicating with it
+     * and cleans up resources
+     * @throws java.io.IOException
+     */
+    void close() throws IOException;
+
+    /**
+     * Removes the entry with the given key from the cache, if it is present.
+     *
+     * @param <K>
+     * @param key
+     * @param serializer
+     * @return <code>true</code> if the entry is removed, <code>false</code> if
+     * the key did not exist in the cache
+     * @throws IOException
+     */
+    <K> boolean remove(K key, Serializer<K> serializer) throws IOException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java
new file mode 100644
index 0000000..12aae3e
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java
@@ -0,0 +1,74 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.IOException;
+
+import org.apache.nifi.controller.ControllerService;
+
+/**
+ * This interface defines an API that can be used for interacting with a
+ * Distributed Cache that functions similarly to a {@link java.util.Set Set}.
+ */
+public interface DistributedSetCacheClient extends ControllerService {
+
+    /**
+     * Adds the specified value to the cache, serializing the value with the
+     * given {@link Serializer}.
+     *
+     * @param <T>
+     * @param value
+     * @param serializer
+     * @return true if the value was added to the cache, false if the value
+     * already existed in the cache
+     *
+     * @throws IOException if unable to communicate with the remote instance
+     */
+    <T> boolean addIfAbsent(T value, Serializer<T> serializer) throws IOException;
+
+    /**
+     * Returns if the given value is present in the cache and if so returns
+     * <code>true</code>, else returns <code>false</code>
+     *
+     * @param <T>
+     * @param value
+     * @param serializer
+     * @return
+     *
+     * @throws IOException if unable to communicate with the remote instance
+     */
+    <T> boolean contains(T value, Serializer<T> serializer) throws IOException;
+
+    /**
+     * Removes the given value from the cache, if it is present.
+     *
+     * @param <T>
+     * @param value
+     * @param serializer
+     * @return <code>true</code> if the value is removed, <code>false</code> if
+     * the value did not exist in the cache
+     * @throws IOException
+     */
+    <T> boolean remove(T value, Serializer<T> serializer) throws IOException;
+
+    /**
+     * Attempts to notify the server that we are finished communicating with it
+     * and cleans up resources
+     * @throws java.io.IOException
+     */
+    void close() throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java
new file mode 100644
index 0000000..f1896be
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java
@@ -0,0 +1,40 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.nifi.distributed.cache.client.exception.SerializationException;
+
+/**
+ * Provides a mechanism by which a value can be serialized to a stream of bytes
+ * @param <T>
+ */
+public interface Serializer<T> {
+
+    /**
+     * Serializes the given value to the {@link OutputStream}
+     *
+     * @param value
+     * @param output
+     * @throws SerializationException If unable to serialize the given value
+     * @throws java.io.IOException
+     */
+    void serialize(T value, OutputStream output) throws SerializationException, IOException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java
new file mode 100644
index 0000000..bb2fcb2
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.nifi.distributed.cache.client.exception;
+
+public class DeserializationException extends RuntimeException {
+
+    public DeserializationException(final Throwable cause) {
+        super(cause);
+    }
+
+    public DeserializationException(final String message) {
+        super(message);
+    }
+
+    public DeserializationException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java
new file mode 100644
index 0000000..aac59f5
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.nifi.distributed.cache.client.exception;
+
+public class SerializationException extends RuntimeException {
+
+    public SerializationException(final Throwable cause) {
+        super(cause);
+    }
+
+    public SerializationException(final String message) {
+        super(message);
+    }
+
+    public SerializationException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml
new file mode 100644
index 0000000..a251393
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/pom.xml
@@ -0,0 +1,60 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>distributed-cache-services-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>distributed-cache-client-service</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Distributed Cache Client Service</name>
+    <description>Provides a Client for interfacing with a Distributed Cache</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-client-service-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-protocol</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>remote-communications-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-processor-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-stream-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service-api</artifactId>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java
new file mode 100644
index 0000000..f838c2f
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/CommsSession.java
@@ -0,0 +1,46 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.SSLContext;
+
+public interface CommsSession extends Closeable {
+
+    void setTimeout(final long value, final TimeUnit timeUnit);
+    
+    InputStream getInputStream() throws IOException;
+    
+    OutputStream getOutputStream() throws IOException;
+    
+    boolean isClosed();
+    
+    void interrupt();
+    
+    String getHostname();
+    
+    int getPort();
+    
+    long getTimeout(TimeUnit timeUnit);
+    
+    SSLContext getSSLContext();
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java
new file mode 100644
index 0000000..ee96660
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClientService.java
@@ -0,0 +1,301 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.controller.AbstractControllerService;
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.controller.annotation.OnConfigured;
+import org.apache.nifi.distributed.cache.protocol.ProtocolHandshake;
+import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
+import org.apache.nifi.io.ByteArrayOutputStream;
+import org.apache.nifi.io.DataOutputStream;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.remote.StandardVersionNegotiator;
+import org.apache.nifi.remote.VersionNegotiator;
+import org.apache.nifi.ssl.SSLContextService;
+import org.apache.nifi.ssl.SSLContextService.ClientAuth;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DistributedMapCacheClientService extends AbstractControllerService implements DistributedMapCacheClient {
+
+    private static final Logger logger = LoggerFactory.getLogger(DistributedMapCacheClientService.class);
+
+    public static final PropertyDescriptor HOSTNAME = new PropertyDescriptor.Builder()
+            .name("Server Hostname")
+            .description("The name of the server that is running the DistributedMapCacheServer service")
+            .required(true)
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .build();
+    public static final PropertyDescriptor PORT = new PropertyDescriptor.Builder()
+            .name("Server Port")
+            .description("The port on the remote server that is to be used when communicating with the DistributedMapCacheServer service")
+            .required(true)
+            .addValidator(StandardValidators.PORT_VALIDATOR)
+            .defaultValue("4557")
+            .build();
+    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
+            .name("SSL Context Service")
+            .description(
+                    "If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted")
+            .required(false)
+            .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
+            .defaultValue(null)
+            .build();
+    public static final PropertyDescriptor COMMUNICATIONS_TIMEOUT = new PropertyDescriptor.Builder()
+            .name("Communications Timeout")
+            .description(
+                    "Specifies how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received")
+            .required(true)
+            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
+            .defaultValue("30 secs")
+            .build();
+
+    private final BlockingQueue<CommsSession> queue = new LinkedBlockingQueue<>();
+    private volatile ConfigurationContext configContext;
+    private volatile boolean closed = false;
+
+    @Override
+    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+        final List<PropertyDescriptor> descriptors = new ArrayList<>();
+        descriptors.add(HOSTNAME);
+        descriptors.add(PORT);
+        descriptors.add(SSL_CONTEXT_SERVICE);
+        descriptors.add(COMMUNICATIONS_TIMEOUT);
+        return descriptors;
+    }
+
+    @OnConfigured
+    public void cacheConfig(final ConfigurationContext context) {
+        this.configContext = context;
+    }
+
+    @Override
+    public <K, V> boolean putIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer)
+            throws IOException {
+        return withCommsSession(new CommsAction<Boolean>() {
+            @Override
+            public Boolean execute(final CommsSession session) throws IOException {
+                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
+                dos.writeUTF("putIfAbsent");
+
+                serialize(key, keySerializer, dos);
+                serialize(value, valueSerializer, dos);
+
+                dos.flush();
+
+                final DataInputStream dis = new DataInputStream(session.getInputStream());
+                return dis.readBoolean();
+            }
+        });
+    }
+
+    @Override
+    public <K> boolean containsKey(final K key, final Serializer<K> keySerializer) throws IOException {
+        return withCommsSession(new CommsAction<Boolean>() {
+            @Override
+            public Boolean execute(final CommsSession session) throws IOException {
+                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
+                dos.writeUTF("containsKey");
+
+                serialize(key, keySerializer, dos);
+                dos.flush();
+
+                final DataInputStream dis = new DataInputStream(session.getInputStream());
+                return dis.readBoolean();
+            }
+        });
+    }
+
+    @Override
+    public <K, V> V getAndPutIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer,
+            final Deserializer<V> valueDeserializer) throws IOException {
+        return withCommsSession(new CommsAction<V>() {
+            @Override
+            public V execute(final CommsSession session) throws IOException {
+                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
+                dos.writeUTF("getAndPutIfAbsent");
+
+                serialize(key, keySerializer, dos);
+                serialize(value, valueSerializer, dos);
+                dos.flush();
+
+                // read response
+                final DataInputStream dis = new DataInputStream(session.getInputStream());
+                final byte[] responseBuffer = readLengthDelimitedResponse(dis);
+                return valueDeserializer.deserialize(responseBuffer);
+            }
+        });
+    }
+
+    @Override
+    public <K, V> V get(final K key, final Serializer<K> keySerializer, final Deserializer<V> valueDeserializer) throws IOException {
+        return withCommsSession(new CommsAction<V>() {
+            @Override
+            public V execute(final CommsSession session) throws IOException {
+                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
+                dos.writeUTF("get");
+
+                serialize(key, keySerializer, dos);
+                dos.flush();
+
+                // read response
+                final DataInputStream dis = new DataInputStream(session.getInputStream());
+                final byte[] responseBuffer = readLengthDelimitedResponse(dis);
+                return valueDeserializer.deserialize(responseBuffer);
+            }
+        });
+    }
+
+    @Override
+    public <K> boolean remove(final K key, final Serializer<K> serializer) throws IOException {
+        return withCommsSession(new CommsAction<Boolean>() {
+            @Override
+            public Boolean execute(final CommsSession session) throws IOException {
+                final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
+                dos.writeUTF("remove");
+
+                serialize(key, serializer, dos);
+                dos.flush();
+
+                // read response
+                final DataInputStream dis = new DataInputStream(session.getInputStream());
+                return dis.readBoolean();
+            }
+        });
+    }
+
+    private byte[] readLengthDelimitedResponse(final DataInputStream dis) throws IOException {
+        final int responseLength = dis.readInt();
+        final byte[] responseBuffer = new byte[responseLength];
+        dis.readFully(responseBuffer);
+        return responseBuffer;
+    }
+
+    public CommsSession createCommsSession(final ConfigurationContext context) throws IOException {
+        final String hostname = context.getProperty(HOSTNAME).getValue();
+        final int port = context.getProperty(PORT).asInteger();
+        final long timeoutMillis = context.getProperty(COMMUNICATIONS_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS);
+        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
+
+        final CommsSession commsSession;
+        if (sslContextService == null) {
+            commsSession = new StandardCommsSession(hostname, port);
+        } else {
+            commsSession = new SSLCommsSession(sslContextService.createSSLContext(ClientAuth.REQUIRED), hostname, port);
+        }
+
+        commsSession.setTimeout(timeoutMillis, TimeUnit.MILLISECONDS);
+        return commsSession;
+    }
+
+    private CommsSession leaseCommsSession() throws IOException {
+        CommsSession session = queue.poll();
+        if (session != null && !session.isClosed()) {
+            return session;
+        }
+
+        session = createCommsSession(configContext);
+        final VersionNegotiator versionNegotiator = new StandardVersionNegotiator(1);
+        try {
+            ProtocolHandshake.initiateHandshake(session.getInputStream(), session.getOutputStream(), versionNegotiator);
+        } catch (final HandshakeException e) {
+            try {
+                session.close();
+            } catch (final IOException ioe) {
+            }
+
+            throw new IOException(e);
+        }
+
+        return session;
+    }
+
+    @Override
+    public void close() throws IOException {
+        this.closed = true;
+
+        CommsSession commsSession;
+        while ((commsSession = queue.poll()) != null) {
+            try (final DataOutputStream dos = new DataOutputStream(commsSession.getOutputStream())) {
+                dos.writeUTF("close");
+                dos.flush();
+                commsSession.close();
+            } catch (final IOException e) {
+            }
+        }
+        logger.info("Closed {}", new Object[] { getIdentifier() });
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        if (!closed)
+            close();
+        logger.debug("Finalize called");
+    }
+
+    private <T> void serialize(final T value, final Serializer<T> serializer, final DataOutputStream dos) throws IOException {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        serializer.serialize(value, baos);
+        dos.writeInt(baos.size());
+        baos.writeTo(dos);
+    }
+
+    private <T> T withCommsSession(final CommsAction<T> action) throws IOException {
+        if (closed) {
+            throw new IllegalStateException("Client is closed");
+        }
+
+        final CommsSession session = leaseCommsSession();
+        try {
+            return action.execute(session);
+        } catch (final IOException ioe) {
+            try {
+                session.close();
+            } catch (final IOException ignored) {
+            }
+
+            throw ioe;
+        } finally {
+            if (!session.isClosed()) {
+                if (this.closed) {
+                    try {
+                        session.close();
+                    } catch (final IOException ioe) {
+                    }
+                } else {
+                    queue.offer(session);
+                }
+            }
+        }
+    }
+
+    private static interface CommsAction<T> {
+        T execute(CommsSession commsSession) throws IOException;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java
new file mode 100644
index 0000000..1d7c94c
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClientService.java
@@ -0,0 +1,212 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.controller.AbstractControllerService;
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.controller.annotation.OnConfigured;
+import org.apache.nifi.distributed.cache.protocol.ProtocolHandshake;
+import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
+import org.apache.nifi.io.ByteArrayOutputStream;
+import org.apache.nifi.io.DataOutputStream;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.remote.StandardVersionNegotiator;
+import org.apache.nifi.remote.VersionNegotiator;
+import org.apache.nifi.ssl.SSLContextService;
+import org.apache.nifi.ssl.SSLContextService.ClientAuth;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DistributedSetCacheClientService extends AbstractControllerService implements DistributedSetCacheClient {
+
+    private static final Logger logger = LoggerFactory.getLogger(DistributedMapCacheClientService.class);
+
+    public static final PropertyDescriptor HOSTNAME = new PropertyDescriptor.Builder()
+            .name("Server Hostname")
+            .description("The name of the server that is running the DistributedSetCacheServer service")
+            .required(true)
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .build();
+    public static final PropertyDescriptor PORT = new PropertyDescriptor.Builder()
+            .name("Server Port")
+            .description("The port on the remote server that is to be used when communicating with the DistributedSetCacheServer service")
+            .required(true)
+            .addValidator(StandardValidators.PORT_VALIDATOR)
+            .defaultValue("4557")
+            .build();
+    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
+            .name("SSL Context Service")
+            .description(
+                    "If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted")
+            .required(false)
+            .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
+            .defaultValue(null)
+            .build();
+    public static final PropertyDescriptor COMMUNICATIONS_TIMEOUT = new PropertyDescriptor.Builder()
+            .name("Communications Timeout")
+            .description(
+                    "Specifices how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received")
+            .required(true)
+            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
+            .defaultValue("30 secs")
+            .build();
+
+    private final BlockingQueue<CommsSession> queue = new LinkedBlockingQueue<>();
+    private volatile ConfigurationContext configContext;
+    private volatile boolean closed = false;
+
+    @Override
+    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+        final List<PropertyDescriptor> descriptors = new ArrayList<>();
+        descriptors.add(HOSTNAME);
+        descriptors.add(PORT);
+        descriptors.add(SSL_CONTEXT_SERVICE);
+        descriptors.add(COMMUNICATIONS_TIMEOUT);
+        return descriptors;
+    }
+
+    @OnConfigured
+    public void onConfigured(final ConfigurationContext context) {
+        this.configContext = context;
+    }
+
+    public CommsSession createCommsSession(final ConfigurationContext context) throws IOException {
+        final String hostname = context.getProperty(HOSTNAME).getValue();
+        final int port = context.getProperty(PORT).asInteger();
+        final long timeoutMillis = context.getProperty(COMMUNICATIONS_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS);
+        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
+
+        final CommsSession commsSession;
+        if (sslContextService == null) {
+            commsSession = new StandardCommsSession(hostname, port);
+        } else {
+            commsSession = new SSLCommsSession(sslContextService.createSSLContext(ClientAuth.REQUIRED), hostname, port);
+        }
+
+        commsSession.setTimeout(timeoutMillis, TimeUnit.MILLISECONDS);
+        return commsSession;
+    }
+
+    private CommsSession leaseCommsSession() throws IOException {
+        CommsSession session = queue.poll();
+        if (session != null && !session.isClosed()) {
+            return session;
+        }
+
+        session = createCommsSession(configContext);
+        final VersionNegotiator versionNegotiator = new StandardVersionNegotiator(1);
+        try {
+            ProtocolHandshake.initiateHandshake(session.getInputStream(), session.getOutputStream(), versionNegotiator);
+        } catch (final HandshakeException e) {
+            try {
+                session.close();
+            } catch (final IOException ioe) {
+            }
+
+            throw new IOException(e);
+        }
+
+        return session;
+    }
+
+    @Override
+    public <T> boolean addIfAbsent(final T value, final Serializer<T> serializer) throws IOException {
+        return invokeRemoteBoolean("addIfAbsent", value, serializer);
+    }
+
+    @Override
+    public <T> boolean contains(final T value, final Serializer<T> serializer) throws IOException {
+        return invokeRemoteBoolean("contains", value, serializer);
+    }
+
+    @Override
+    public <T> boolean remove(final T value, final Serializer<T> serializer) throws IOException {
+        return invokeRemoteBoolean("remove", value, serializer);
+    }
+
+    @Override
+    public void close() throws IOException {
+        this.closed = true;
+
+        CommsSession commsSession;
+        while ((commsSession = queue.poll()) != null) {
+            try (final DataOutputStream dos = new DataOutputStream(commsSession.getOutputStream())) {
+                dos.writeUTF("close");
+                dos.flush();
+                commsSession.close();
+            } catch (final IOException e) {
+            }
+        }
+        logger.info("Closed {}", new Object[] { getIdentifier() });
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        if (!closed)
+            close();
+        logger.debug("Finalize called");
+    }
+
+    private <T> boolean invokeRemoteBoolean(final String methodName, final T value, final Serializer<T> serializer) throws IOException {
+        if (closed) {
+            throw new IllegalStateException("Client is closed");
+        }
+
+        final CommsSession session = leaseCommsSession();
+        try {
+            final DataOutputStream dos = new DataOutputStream(session.getOutputStream());
+            dos.writeUTF(methodName);
+
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            serializer.serialize(value, baos);
+            dos.writeInt(baos.size());
+            baos.writeTo(dos);
+            dos.flush();
+
+            final DataInputStream dis = new DataInputStream(session.getInputStream());
+            return dis.readBoolean();
+        } catch (final IOException ioe) {
+            try {
+                session.close();
+            } catch (final IOException ignored) {
+            }
+
+            throw ioe;
+        } finally {
+            if (!session.isClosed()) {
+                if (this.closed) {
+                    try {
+                        session.close();
+                    } catch (final IOException ioe) {
+                    }
+                } else {
+                    queue.offer(session);
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.java
new file mode 100644
index 0000000..c8be082
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/SSLCommsSession.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 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.nifi.distributed.cache.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.io.BufferedInputStream;
+import org.apache.nifi.io.BufferedOutputStream;
+import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel;
+import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream;
+import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream;
+
+public class SSLCommsSession implements CommsSession {
+    private final SSLSocketChannel sslSocketChannel;
+    private final SSLContext sslContext;
+    private final String hostname;
+    private final int port;
+    
+    private final SSLSocketChannelInputStream in;
+    private final BufferedInputStream bufferedIn;
+    
+    private final SSLSocketChannelOutputStream out;
+    private final BufferedOutputStream bufferedOut;
+
+    public SSLCommsSession(final SSLContext sslContext, final String hostname, final int port) throws IOException { 
+        sslSocketChannel = new SSLSocketChannel(sslContext, hostname, port, true);
+        
+        in = new SSLSocketChannelInputStream(sslSocketChannel);
+        bufferedIn = new BufferedInputStream(in);
+        
+        out = new SSLSocketChannelOutputStream(sslSocketChannel);
+        bufferedOut = new BufferedOutputStream(out);
+        
+        this.sslContext = sslContext;
+        this.hostname = hostname;
+        this.port = port;
+    }
+    
+    @Override
+    public void interrupt() {
+        sslSocketChannel.interrupt();
+    }
+    
+    @Override
+    public void close() throws IOException {
+        sslSocketChannel.close();
+    }
+
+    @Override
+    public void setTimeout(final long value, final TimeUnit timeUnit) {
+        sslSocketChannel.setTimeout((int) TimeUnit.MILLISECONDS.convert(value, timeUnit));
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return bufferedIn;
+    }
+
+    @Override
+    public OutputStream getOutputStream() throws IOException {
+        return bufferedOut;
+    }
+
+    @Override
+    public boolean isClosed() {
+        return sslSocketChannel.isClosed();
+    }
+    
+    @Override
+    public String getHostname() {
+        return hostname;
+    }
+    
+    @Override
+    public int getPort() {
+        return port;
+    }
+    @Override
+    public SSLContext getSSLContext() {
+        return sslContext;
+    }
+    @Override
+    public long getTimeout(final TimeUnit timeUnit) {
+        return timeUnit.convert(sslSocketChannel.getTimeout(), TimeUnit.MILLISECONDS);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java
new file mode 100644
index 0000000..bbe2917
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/java/org/apache/nifi/distributed/cache/client/StandardCommsSession.java
@@ -0,0 +1,124 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.nio.channels.SocketChannel;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.io.BufferedInputStream;
+import org.apache.nifi.io.BufferedOutputStream;
+import org.apache.nifi.remote.io.InterruptableInputStream;
+import org.apache.nifi.remote.io.InterruptableOutputStream;
+import org.apache.nifi.remote.io.socket.SocketChannelInputStream;
+import org.apache.nifi.remote.io.socket.SocketChannelOutputStream;
+
+public class StandardCommsSession implements CommsSession {
+    private final SocketChannel socketChannel;
+    private final String hostname;
+    private final int port;
+    private volatile long timeoutMillis;
+
+    private final SocketChannelInputStream in;
+    private final InterruptableInputStream bufferedIn;
+
+    private final SocketChannelOutputStream out;
+    private final InterruptableOutputStream bufferedOut;
+
+    public StandardCommsSession(final String hostname, final int port) throws IOException {
+        socketChannel = SocketChannel.open(new InetSocketAddress(hostname, port));
+        socketChannel.configureBlocking(false);
+        in = new SocketChannelInputStream(socketChannel);
+        bufferedIn = new InterruptableInputStream(new BufferedInputStream(in));
+
+        out = new SocketChannelOutputStream(socketChannel);
+        bufferedOut = new InterruptableOutputStream(new BufferedOutputStream(out));
+
+        this.hostname = hostname;
+        this.port = port;
+    }
+
+    @Override
+    public void interrupt() {
+        bufferedIn.interrupt();
+        bufferedOut.interrupt();
+    }
+
+    @Override
+    public void close() throws IOException {
+        socketChannel.close();
+    }
+
+    @Override
+    public void setTimeout(final long value, final TimeUnit timeUnit) {
+        in.setTimeout((int) TimeUnit.MILLISECONDS.convert(value, timeUnit));
+        out.setTimeout((int) TimeUnit.MILLISECONDS.convert(value, timeUnit));
+        timeoutMillis = TimeUnit.MILLISECONDS.convert(value, timeUnit);
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return bufferedIn;
+    }
+
+    @Override
+    public OutputStream getOutputStream() throws IOException {
+        return bufferedOut;
+    }
+
+    @Override
+    public boolean isClosed() {
+        boolean closed = !socketChannel.isConnected();
+        if (!closed) {
+            try {
+                this.in.isDataAvailable();
+            } catch (IOException e) {
+                try {
+                    close();
+                } catch (IOException e1) {
+                }
+                closed = true;
+            }
+        }
+        return closed;
+    }
+
+    @Override
+    public String getHostname() {
+        return hostname;
+    }
+
+    @Override
+    public int getPort() {
+        return port;
+    }
+
+    @Override
+    public SSLContext getSSLContext() {
+        return null;
+    }
+
+    @Override
+    public long getTimeout(final TimeUnit timeUnit) {
+        return timeUnit.convert(timeoutMillis, TimeUnit.MILLISECONDS);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
new file mode 100644
index 0000000..a91f7ee
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
@@ -0,0 +1,16 @@
+# 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.
+org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService
+org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html
new file mode 100644
index 0000000..d5f3595
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en">
+<!--
+  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.
+-->
+<head>
+<meta charset="utf-8" />
+<title>Distributed Map Cache Client Service</title>
+<link rel="stylesheet" href="../../css/component-usage.css" type="text/css" />
+</head>
+
+<body>
+	<h2>Description:</h2>
+
+	<p>A Controller Service that can be used to communicate with a
+		Distributed Map Cache Server.</p>
+
+
+
+	<p>
+		<strong>Properties:</strong>
+	</p>
+	<p>In the list below, the names of required properties appear
+		in bold. Any other properties (not in bold) are considered optional.
+		If a property has a default value, it is indicated. If a property
+		supports the use of the NiFi Expression Language (or simply,
+		"expression language"), that is also indicated.</p>
+
+	<ul>
+		<li><strong>Server Hostname</strong>
+			<ul>
+				<li>The name of the server that is running the DistributedMapCacheServer service</li>
+				<li>Default value: no default</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li><strong>Server Port</strong>
+			<ul>
+				<li>The port on the remote server that is to be used when communicating with the 
+				<a href="../nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html">DistributedMapCacheServer</a> service</li>
+				
+				<li>Default value: 4557</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li>SSL Context Service
+			<ul>
+				<li>If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted
+				<li>Default value: no default</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li><strong>Communications Timeout</strong>
+			<ul>
+				<li>Specifices how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received
+				<li>Default value: 30 secs</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+			
+	</ul>
+
+
+	<i>See Also:</i>
+	<ul>
+		<li><a href="../org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html">Distributed Map Cache Server</a></li>
+		<li><a href="../org.apache.nifi.ssl.StandardSSLContextService/index.html">Standard SSL Context Service</a></li>
+	</ul>
+
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService/index.html b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-client-service/src/main/resources/docs/org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService/index.html
new file mode 100755
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml
new file mode 100644
index 0000000..f636261
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/pom.xml
@@ -0,0 +1,39 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>distributed-cache-services-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>distributed-cache-protocol</artifactId>
+    <name>Distributed Cache Protocol</name>
+
+    <description>
+        Defines the communications protocol that is used between clients and servers 
+        for the Distributed Cache services
+    </description>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>remote-communications-utils</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java
new file mode 100644
index 0000000..da2acad
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/ProtocolHandshake.java
@@ -0,0 +1,119 @@
+/*
+ * 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.nifi.distributed.cache.protocol;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
+import org.apache.nifi.remote.VersionNegotiator;
+
+public class ProtocolHandshake {
+
+    public static final byte[] MAGIC_HEADER = new byte[] { 'N', 'i', 'F', 'i' };
+    
+    public static final int RESOURCE_OK = 20;
+    public static final int DIFFERENT_RESOURCE_VERSION = 21;
+    public static final int ABORT = 255;
+
+    
+    public static void initiateHandshake(final InputStream in, final OutputStream out, final VersionNegotiator versionNegotiator) throws IOException, HandshakeException {
+        final DataInputStream dis = new DataInputStream(in);
+        final DataOutputStream dos = new DataOutputStream(out);
+        
+        try {
+            dos.write(MAGIC_HEADER);
+            
+            initiateVersionNegotiation(versionNegotiator, dis, dos);
+        } finally {
+            dos.flush();
+        }
+    }
+
+    
+    public static void receiveHandshake(final InputStream in, final OutputStream out, final VersionNegotiator versionNegotiator) throws IOException, HandshakeException {
+        final DataInputStream dis = new DataInputStream(in);
+        final DataOutputStream dos = new DataOutputStream(out);
+        
+        try {
+            final byte[] magicHeaderBuffer = new byte[4];
+            dis.readFully(magicHeaderBuffer);
+            
+            receiveVersionNegotiation(versionNegotiator, dis, dos);
+        } finally {
+            dos.flush();
+        }
+    }
+    
+    
+    private static void initiateVersionNegotiation(final VersionNegotiator negotiator, final DataInputStream dis, final DataOutputStream dos) throws IOException, HandshakeException {
+        // Write the classname of the RemoteStreamCodec, followed by its version
+        dos.writeInt(negotiator.getVersion());
+        dos.flush();
+        
+        // wait for response from server.
+        final int statusCode = dis.read();
+        switch (statusCode) {
+            case RESOURCE_OK:   // server accepted our proposal of codec name/version
+                return;
+            case DIFFERENT_RESOURCE_VERSION:    // server accepted our proposal of codec name but not the version
+                // Get server's preferred version
+                final int newVersion = dis.readInt();
+                
+                // Determine our new preferred version that is no greater than the server's preferred version.
+                final Integer newPreference = negotiator.getPreferredVersion(newVersion);
+                // If we could not agree with server on a version, fail now.
+                if ( newPreference == null ) {
+                    throw new HandshakeException("Could not agree on protocol version");
+                }
+                
+                negotiator.setVersion(newPreference);
+                
+                // Attempt negotiation of resource based on our new preferred version.
+                initiateVersionNegotiation(negotiator, dis, dos);
+            case ABORT:
+                throw new HandshakeException("Remote destination aborted connection with message: " + dis.readUTF());
+            default:
+                throw new HandshakeException("Received unexpected response code " + statusCode + " when negotiating version with remote server");
+        }
+    }
+    
+    private static void receiveVersionNegotiation(final VersionNegotiator negotiator, final DataInputStream dis, final DataOutputStream dos) throws IOException, HandshakeException {
+        final int version = dis.readInt();
+        if ( negotiator.isVersionSupported(version) ) {
+            dos.write(RESOURCE_OK);
+            dos.flush();
+            
+            negotiator.setVersion(version);
+        } else {
+            final Integer preferred = negotiator.getPreferredVersion(version);
+            if ( preferred == null ) {
+                dos.write(ABORT);
+                dos.flush();
+                throw new HandshakeException("Unable to negotiate an acceptable version of the Distributed Cache Protocol");
+            }
+            dos.write(DIFFERENT_RESOURCE_VERSION);
+            dos.writeInt(preferred);
+            dos.flush();
+            
+            receiveVersionNegotiation(negotiator, dis, dos);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java
new file mode 100644
index 0000000..8049d42
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-protocol/src/main/java/org/apache/nifi/distributed/cache/protocol/exception/HandshakeException.java
@@ -0,0 +1,27 @@
+/*
+ * 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.nifi.distributed.cache.protocol.exception;
+
+public class HandshakeException extends Exception {
+    public HandshakeException(final String message) {
+        super(message);
+    }
+    
+    public HandshakeException(final Throwable cause) {
+        super(cause);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/pom.xml b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/pom.xml
new file mode 100644
index 0000000..b57d284
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/pom.xml
@@ -0,0 +1,78 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>distributed-cache-services-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>distributed-cache-server</artifactId>
+
+    <name>Distributed Cache Server</name>
+    <description>Provides a Controller Service for hosting Distributed Caches</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-protocol</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>remote-communications-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-processor-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-stream-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>wali</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-client-service-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-client-service</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-mock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java
new file mode 100644
index 0000000..9b4e70e
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/AbstractCacheServer.java
@@ -0,0 +1,199 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.SocketTimeoutException;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.distributed.cache.protocol.ProtocolHandshake;
+import org.apache.nifi.distributed.cache.protocol.exception.HandshakeException;
+import org.apache.nifi.io.BufferedInputStream;
+import org.apache.nifi.io.BufferedOutputStream;
+import org.apache.nifi.remote.StandardVersionNegotiator;
+import org.apache.nifi.remote.VersionNegotiator;
+import org.apache.nifi.remote.io.socket.SocketChannelInputStream;
+import org.apache.nifi.remote.io.socket.SocketChannelOutputStream;
+import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel;
+import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream;
+import org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractCacheServer implements CacheServer {
+
+    private static final Logger logger = LoggerFactory.getLogger(AbstractCacheServer.class);
+
+    private final String identifier;
+    private final int port;
+    private final SSLContext sslContext;
+    protected volatile boolean stopped = false;
+    private final Set<Thread> processInputThreads = new CopyOnWriteArraySet<>();;
+
+    private volatile ServerSocketChannel serverSocketChannel;
+
+    public AbstractCacheServer(final String identifier, final SSLContext sslContext, final int port) {
+        this.identifier = identifier;
+        this.port = port;
+        this.sslContext = sslContext;
+    }
+
+    @Override
+    public void start() throws IOException {
+        serverSocketChannel = ServerSocketChannel.open();
+        serverSocketChannel.configureBlocking(true);
+        serverSocketChannel.bind(new InetSocketAddress(port));
+
+        final Runnable runnable = new Runnable() {
+
+            @Override
+            public void run() {
+                while (true) {
+                    final SocketChannel socketChannel;
+                    try {
+                        socketChannel = serverSocketChannel.accept();
+                        logger.debug("Connected to {}", new Object[] { socketChannel });
+                    } catch (final IOException e) {
+                        if (!stopped) {
+                            logger.error("{} unable to accept connection from remote peer due to {}", this, e.toString());
+                            if (logger.isDebugEnabled()) {
+                                logger.error("", e);
+                            }
+                        }
+                        return;
+                    }
+
+                    final Runnable processInputRunnable = new Runnable() {
+                        @Override
+                        public void run() {
+                            final InputStream rawInputStream;
+                            final OutputStream rawOutputStream;
+                            final String peer = socketChannel.socket().getInetAddress().getHostName();
+
+                            try {
+                                if (sslContext == null) {
+                                    rawInputStream = new SocketChannelInputStream(socketChannel);
+                                    rawOutputStream = new SocketChannelOutputStream(socketChannel);
+                                } else {
+                                    final SSLSocketChannel sslSocketChannel = new SSLSocketChannel(sslContext, socketChannel, false);
+                                    sslSocketChannel.connect();
+                                    rawInputStream = new SSLSocketChannelInputStream(sslSocketChannel);
+                                    rawOutputStream = new SSLSocketChannelOutputStream(sslSocketChannel);
+                                }
+                            } catch (IOException e) {
+                                logger.error("Cannot create input and/or output streams for {}", new Object[] { identifier }, e);
+                                if (logger.isDebugEnabled()) {
+                                    logger.error("", e);
+                                }
+                                try {
+                                    socketChannel.close();
+                                } catch (IOException swallow) {
+                                }
+                               
+                                return;
+                            }
+                            try (final InputStream in = new BufferedInputStream(rawInputStream);
+                                    final OutputStream out = new BufferedOutputStream(rawOutputStream)) {
+
+                                final VersionNegotiator versionNegotiator = new StandardVersionNegotiator(1);
+
+                                ProtocolHandshake.receiveHandshake(in, out, versionNegotiator);
+
+                                boolean continueComms = true;
+                                while (continueComms) {
+                                    continueComms = listen(in, out, versionNegotiator.getVersion());
+                                }
+                                // client has issued 'close'
+                                logger.debug("Client issued close on {}", new Object[] { socketChannel });
+                            } catch (final SocketTimeoutException e) {
+                                logger.debug("30 sec timeout reached", e);
+                            } catch (final IOException | HandshakeException e) {
+                                if (!stopped) {
+                                    logger.error("{} unable to communicate with remote peer {} due to {}", new Object[] { this, peer, e.toString() });
+                                    if (logger.isDebugEnabled()) {
+                                        logger.error("", e);
+                                    }
+                                }
+                            } finally {
+                                processInputThreads.remove(Thread.currentThread());
+                            }
+                        }
+                    };
+
+                    final Thread processInputThread = new Thread(processInputRunnable);
+                    processInputThread.setName("Distributed Cache Server Communications Thread: " + identifier);
+                    processInputThread.setDaemon(true);
+                    processInputThread.start();
+                    processInputThreads.add(processInputThread);
+                }
+            }
+        };
+
+        final Thread thread = new Thread(runnable);
+        thread.setDaemon(true);
+        thread.setName("Distributed Cache Server: " + identifier);
+        thread.start();
+    }
+
+    @Override
+    public void stop() throws IOException {
+        stopped = true;
+        logger.info("Stopping CacheServer {}", new Object[] { this.identifier });
+
+        if (serverSocketChannel != null) {
+            serverSocketChannel.close();
+        }
+        // need to close out the created SocketChannels...this is done by interrupting
+        // the created threads that loop on listen().
+        for (Thread processInputThread : processInputThreads) {
+            processInputThread.interrupt();
+            int i = 0;
+            while (!processInputThread.isInterrupted() && i++ < 5) {
+                try {
+                    Thread.sleep(50); // allow thread to gracefully terminate
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+        processInputThreads.clear();
+    }
+
+    @Override
+    public String toString() {
+        return "CacheServer[id=" + identifier + "]";
+    }
+
+    /**
+     * Listens for incoming data and communicates with remote peer
+     * 
+     * @param in
+     * @param out
+     * @param version
+     * @return <code>true</code> if communications should continue, <code>false</code> otherwise
+     * @throws IOException
+     */
+    protected abstract boolean listen(InputStream in, OutputStream out, int version) throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java
new file mode 100644
index 0000000..71ac56d
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheRecord.java
@@ -0,0 +1,57 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class CacheRecord {
+
+    private static final AtomicLong idGenerator = new AtomicLong(0L);
+    
+    private final long id;
+    private final long entryDate;
+    private volatile long lastHitDate;
+    private final AtomicInteger hitCount = new AtomicInteger(0);
+    
+    public CacheRecord() {
+        entryDate = System.currentTimeMillis();
+        lastHitDate = entryDate;
+        id = idGenerator.getAndIncrement();
+    }
+    
+    public long getEntryDate() {
+        return entryDate;
+    }
+    
+    public long getLastHitDate() {
+        return lastHitDate;
+    }
+    
+    public int getHitCount() {
+        return hitCount.get();
+    }
+
+    public void hit() {
+        hitCount.getAndIncrement();
+        lastHitDate = System.currentTimeMillis();
+    }
+    
+    public long getId() {
+        return id;
+    }
+}


[18/19] incubator-nifi git commit: NIFI-173 fixed web war finding

Posted by jo...@apache.org.
NIFI-173 fixed web war finding


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

Branch: refs/heads/develop
Commit: d9dab00612521ba5dd49d8b78c6593b082834c3f
Parents: 8fb78d2
Author: joewitt <jo...@apache.org>
Authored: Tue Dec 16 11:46:37 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Tue Dec 16 11:46:37 2014 -0500

----------------------------------------------------------------------
 .../src/main/java/org/apache/nifi/web/server/JettyServer.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/d9dab006/nar-bundles/framework-bundle/framework/web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java b/nar-bundles/framework-bundle/framework/web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
index 9ed29ff..3900cfc 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
+++ b/nar-bundles/framework-bundle/framework/web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
@@ -273,7 +273,7 @@ public class JettyServer implements NiFiServer {
 
         // consider each nar working directory
         for (final File narWorkingDirectory : narWorkingDirectories) {
-            final File narDependencies = new File(narWorkingDirectory, "META-INF/dependencies");
+            final File narDependencies = new File(narWorkingDirectory, "META-INF/bundled-dependencies");
             if (narDependencies.isDirectory()) {
                 // list the wars from this nar
                 final File[] narDependencyDirs = narDependencies.listFiles(WAR_FILTER);


[15/19] incubator-nifi git commit: NIFI-169 updating a few tests and build

Posted by jo...@apache.org.
NIFI-169 updating a few tests and build


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

Branch: refs/heads/develop
Commit: 614349bdfdb4b73509d6c9384b9094aefc41d7a8
Parents: 675ea66
Author: joewitt <jo...@apache.org>
Authored: Mon Dec 15 10:43:07 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Mon Dec 15 10:43:07 2014 -0500

----------------------------------------------------------------------
 .../impl/ClusterServiceDiscoveryTest.java       |   2 +
 .../impl/MulticastProtocolListenerTest.java     |   2 +-
 .../impl/MulticastProtocolListenerTest.java     |   1 +
 .../cache/server/TestServerAndClient.java       |   5 +
 nar-maven-plugin/pom.xml                        | 173 ++++++++++++++++++-
 pom.xml                                         |   7 +-
 6 files changed, 177 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/614349bd/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/ClusterServiceDiscoveryTest.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/ClusterServiceDiscoveryTest.java b/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/ClusterServiceDiscoveryTest.java
index 91f81af..e3703e2 100644
--- a/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/ClusterServiceDiscoveryTest.java
+++ b/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/ClusterServiceDiscoveryTest.java
@@ -80,6 +80,7 @@ public class ClusterServiceDiscoveryTest {
         }
     }
     
+    @Ignore("Test needs to be fixed.  Requires an active network connection")
     @Test
     public void testGetAddressOnStartup() {
         assertNull(discovery.getService());
@@ -111,6 +112,7 @@ public class ClusterServiceDiscoveryTest {
         
     }
     
+    @Ignore("Test needs to be fixed.  Requires an active network connection")
     @Test
     public void testBadBroadcastMessage() throws Exception {
         

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/614349bd/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java b/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
index af00590..4233d88 100644
--- a/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
+++ b/nar-bundles/framework-bundle/framework/cluster-protocol/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.nifi.cluster.protocol.impl;
 
-import org.apache.nifi.cluster.protocol.impl.MulticastProtocolListener;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.net.DatagramPacket;
@@ -81,6 +80,7 @@ public class MulticastProtocolListenerTest {
         }
     }
     
+    @Ignore("Test needs to be reworked.  Fails if on a system without actiev network connection")
     @Test
     public void testBadRequest() throws Exception {
         DelayedProtocolHandler handler = new DelayedProtocolHandler(0);

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/614349bd/nar-bundles/framework-bundle/framework/cluster/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/cluster/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java b/nar-bundles/framework-bundle/framework/cluster/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
index acd21e8..6c79b90 100644
--- a/nar-bundles/framework-bundle/framework/cluster/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
+++ b/nar-bundles/framework-bundle/framework/cluster/src/test/java/org/apache/nifi/cluster/protocol/impl/MulticastProtocolListenerTest.java
@@ -80,6 +80,7 @@ public class MulticastProtocolListenerTest {
         }
     }
 
+    @Ignore("This test must be reworked.  Requires an active network connection")
     @Test
     public void testBadRequest() throws Exception {
         DelayedProtocolHandler handler = new DelayedProtocolHandler(0);

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/614349bd/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
index b5f3fd6..34e8267 100644
--- a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
@@ -63,6 +63,7 @@ public class TestServerAndClient {
         LOGGER = LoggerFactory.getLogger(TestServerAndClient.class);
     }
 
+    @Ignore("Test fails when in a maven parallel build due to address/port already taken - need to vary these so tests can run in parallel")
     @Test
     public void testNonPersistentSetServerAndClient() throws InitializationException, IOException {
         LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
@@ -95,6 +96,7 @@ public class TestServerAndClient {
         server.shutdownServer();
     }
 
+    @Ignore("Test fails when in a maven parallel build due to address/port already taken - need to vary these so tests can run in parallel")
     @Test
     public void testPersistentSetServerAndClient() throws InitializationException, IOException {
         LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
@@ -148,6 +150,7 @@ public class TestServerAndClient {
         newServer.shutdownServer();
     }
 
+    @Ignore("Test fails when in a maven parallel build due to address/port already taken - need to vary these so tests can run in parallel")    
     @Test
     public void testPersistentSetServerAndClientWithLFUEvictions() throws InitializationException, IOException {
         LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
@@ -210,6 +213,7 @@ public class TestServerAndClient {
         newServer.shutdownServer();
     }
 
+    @Ignore("Test fails when in a maven parallel build due to address/port already taken - need to vary these so tests can run in parallel")    
     @Test
     public void testPersistentSetServerAndClientWithFIFOEvictions() throws InitializationException, IOException {
         LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
@@ -278,6 +282,7 @@ public class TestServerAndClient {
         newServer.shutdownServer();
     }
 
+    @Ignore("Test fails when in a maven parallel build due to address/port already taken - need to vary these so tests can run in parallel")
     @Test
     public void testNonPersistentMapServerAndClient() throws InitializationException, IOException, InterruptedException {
         LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/614349bd/nar-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/nar-maven-plugin/pom.xml b/nar-maven-plugin/pom.xml
index 7b7aabf..26b6a11 100644
--- a/nar-maven-plugin/pom.xml
+++ b/nar-maven-plugin/pom.xml
@@ -17,17 +17,153 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>16</version>
     </parent>
-
     <groupId>org.apache.nifi</groupId>
     <artifactId>nar-maven-plugin</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <packaging>maven-plugin</packaging>
     <name>Apache NiFi NAR Plugin</name>
+    <description>Apache NiFi is a dataflow system based on the concepts of flow-based programming. It is currently a part of the Apache Incubator.</description>
+    <url>http://nifi.incubator.apache.org/maven-site/</url>
+    <organization>
+        <name>Apache NiFi (incubating) Project</name>
+        <url>http://nifi.incubating.apache.org/</url>
+    </organization>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <mailingLists>
+        <mailingList>
+            <name>Dev</name>
+            <subscribe>dev-subscribe@nifi.incubator.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@nifi.incubator.apache.org</unsubscribe>
+            <post>dev@nifi.incubator.apache.org</post>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-dev</archive>
+        </mailingList>
+        <mailingList>
+            <name>Commits</name>
+            <subscribe>commits-subscribe@nifi.incubator.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@nifi.incubator.apache.org</unsubscribe>
+            <post>commits@nifi.incubator.apache.org</post>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-commits</archive>
+        </mailingList>
+    </mailingLists>
+    <prerequisites>
+        <maven>${maven.min-version}</maven>
+    </prerequisites>
+    <scm>
+        <connection>scm:git:git://git.apache.org/incubator-nifi.git</connection>
+        <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-nifi.git</developerConnection>
+        <url>https://git-wip-us.apache.org/repos/asf?p=incubator-nifi.git</url>
+    </scm>
+    <issueManagement>
+        <system>JIRA</system>
+        <url>https://issues.apache.org/jira/browse/NIFI</url>
+    </issueManagement>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    </properties>
     <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.2</version>
+                    <configuration>
+                        <source>1.7</source>
+                        <target>1.7</target>
+                        <fork>true</fork>
+                        <optimize>true</optimize>
+                        <encoding>UTF-8</encoding>
+                        <showDeprecation>true</showDeprecation>
+                        <showWarnings>true</showWarnings>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-plugin-plugin</artifactId>
+                    <version>3.3</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>2.9</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.7</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.18</version>
+                    <configuration>
+                        <argLine>-Xmx1G</argLine>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-assembly-plugin</artifactId>
+                    <version>2.5.2</version>
+                    <configuration>
+                        <attach>false</attach>
+                        <tarLongFileMode>gnu</tarLongFileMode>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.5.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>jaxb2-maven-plugin</artifactId>
+                    <version>1.6</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>2.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>exec-maven-plugin</artifactId>
+                    <version>1.3.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>2.10.1</version>
+                    <configuration>
+                        <failOnError>false</failOnError>
+                        <quiet>true</quiet>
+                        <show>private</show>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>       
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
@@ -51,8 +187,33 @@
             </plugin>
         </plugins>
     </build>
-    <dependencies>
-        <dependency>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.maven</groupId>
+                <artifactId>maven-plugin-api</artifactId>
+                <version>2.0.11</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>2.9</version>
+                <type>maven-plugin</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.5</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.plugin-tools</groupId>
+                <artifactId>maven-plugin-annotations</artifactId>
+                <version>3.3</version>
+            </dependency>                        
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>                    
+        <dependency>          
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-plugin-api</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/614349bd/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 8747bc4..3dc1bdd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -849,11 +849,6 @@
         <pluginManagement>
             <plugins>
                 <plugin>
-                    <groupId>org.apache.nifi</groupId>
-                    <artifactId>nar-maven-plugin</artifactId>
-                    <version>${project.version}</version>
-                </plugin>
-                <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
                     <version>3.2</version>
@@ -958,7 +953,7 @@
             <plugin>
                 <groupId>org.apache.nifi</groupId>
                 <artifactId>nar-maven-plugin</artifactId>
-                <version>${project.version}</version>
+                <version>0.0.1-SNAPSHOT</version>
                 <extensions>true</extensions>
             </plugin>
         </plugins>


[12/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
NIFI-169 well it finally all builds.  There is a classpath issue still to sort out which impacts startup


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

Branch: refs/heads/develop
Commit: 19d4a150a875e0862d458e03ffb413797f2bf81b
Parents: 9ccbf8b
Author: joewitt <jo...@apache.org>
Authored: Mon Dec 15 05:14:32 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Mon Dec 15 05:14:32 2014 -0500

----------------------------------------------------------------------
 assemblies/nifi/pom.xml                         | 490 ----------
 .../nifi/src/main/assembly/dependencies.xml     | 135 ---
 assembly/pom.xml                                | 446 +++++++++
 assembly/src/main/assembly/dependencies.xml     | 135 +++
 commons/core-flowfile-attributes/pom.xml        |   5 +-
 commons/data-provenance-utils/pom.xml           |   4 +-
 commons/flowfile-packager/pom.xml               |   4 +-
 .../apache/nifi/util/FlowFilePackagerV1.java    |   4 +-
 commons/naive-search-ring-buffer/pom.xml        |   2 +-
 commons/nifi-expression-language/pom.xml        |   5 +-
 commons/nifi-file-utils/pom.xml                 |   4 +-
 commons/nifi-logging-utils/pom.xml              |   5 +-
 commons/nifi-parent/pom.xml                     | 217 -----
 commons/nifi-properties/pom.xml                 |   6 +-
 commons/nifi-security-utils/pom.xml             |   4 +-
 commons/nifi-socket-utils/pom.xml               |   9 +-
 commons/nifi-stream-utils/pom.xml               |  16 +-
 commons/nifi-utils/pom.xml                      |   3 +-
 commons/nifi-web-utils/pom.xml                  |  12 +-
 commons/pom.xml                                 |  50 +
 commons/processor-utilities/pom.xml             |   6 +-
 commons/remote-communications-utils/pom.xml     |   2 +-
 commons/search-utils/pom.xml                    |   4 +-
 commons/wali/pom.xml                            |   9 +-
 extensions/file-authorization-provider/pom.xml  |  90 --
 .../FileAuthorizationProvider.java              | 568 -----------
 ....apache.nifi.authorization.AuthorityProvider |  15 -
 .../src/main/xsd/users.xsd                      |  64 --
 .../FileAuthorizationProviderTest.java          | 127 ---
 misc/nar-maven-plugin/pom.xml                   | 100 --
 .../src/main/java/nifi/NarMojo.java             | 610 ------------
 .../resources/META-INF/plexus/components.xml    |  52 -
 misc/pom.xml                                    | 100 ++
 misc/src/main/java/nifi/NarMojo.java            | 610 ++++++++++++
 .../resources/META-INF/plexus/components.xml    |  52 +
 .../distributed-cache-client-service/pom.xml    |  67 --
 .../distributed/cache/client/CommsSession.java  |  46 -
 .../DistributedMapCacheClientService.java       | 301 ------
 .../DistributedSetCacheClientService.java       | 212 ----
 .../cache/client/SSLCommsSession.java           | 106 --
 .../cache/client/StandardCommsSession.java      | 124 ---
 ...org.apache.nifi.controller.ControllerService |  16 -
 .../index.html                                  |  78 --
 .../index.html                                  |   0
 .../distributed-cache-protocol/pom.xml          |  39 -
 .../cache/protocol/ProtocolHandshake.java       | 119 ---
 .../protocol/exception/HandshakeException.java  |  27 -
 .../distributed-cache-server/pom.xml            |  81 --
 .../cache/server/AbstractCacheServer.java       | 199 ----
 .../distributed/cache/server/CacheRecord.java   |  57 --
 .../distributed/cache/server/CacheServer.java   |  26 -
 .../cache/server/DistributedCacheServer.java    | 107 --
 .../cache/server/DistributedSetCacheServer.java |  68 --
 .../cache/server/EvictionPolicy.java            |  73 --
 .../cache/server/SetCacheServer.java            | 104 --
 .../server/map/DistributedMapCacheServer.java   |  71 --
 .../distributed/cache/server/map/MapCache.java  |  29 -
 .../cache/server/map/MapCacheRecord.java        |  58 --
 .../cache/server/map/MapCacheServer.java        | 145 ---
 .../cache/server/map/MapPutResult.java          |  59 --
 .../cache/server/map/PersistentMapCache.java    | 210 ----
 .../cache/server/map/SimpleMapCache.java        | 165 ----
 .../cache/server/set/PersistentSetCache.java    | 194 ----
 .../distributed/cache/server/set/SetCache.java  |  29 -
 .../cache/server/set/SetCacheRecord.java        |  55 --
 .../cache/server/set/SetCacheResult.java        |  43 -
 .../cache/server/set/SimpleSetCache.java        | 117 ---
 ...org.apache.nifi.controller.ControllerService |  16 -
 .../index.html                                  |  82 --
 .../cache/server/TestServerAndClient.java       | 530 ----------
 .../src/test/resources/localhost-ks.jks         | Bin 1298 -> 0 bytes
 .../src/test/resources/localhost-ts.jks         | Bin 891 -> 0 bytes
 .../distributed-cache-services-nar/pom.xml      |  49 -
 .../distributed-cache-services-bundle/pom.xml   |  83 --
 .../framework-bundle/framework/cluster/pom.xml  |   1 -
 .../framework-bundle/framework/core/pom.xml     |   3 +-
 .../file-authorization-provider/pom.xml         |  81 ++
 .../FileAuthorizationProvider.java              | 568 +++++++++++
 ....apache.nifi.authorization.AuthorityProvider |  15 +
 .../src/main/xsd/users.xsd                      |  64 ++
 .../FileAuthorizationProviderTest.java          | 127 +++
 nar-bundles/framework-bundle/framework/pom.xml  |   1 +
 .../framework/resources/pom.xml                 |   3 +
 .../framework-bundle/framework/runtime/pom.xml  |   4 +
 .../framework/site-to-site/pom.xml              |   6 +-
 .../framework/web/nifi-jetty/pom.xml            |  22 +
 .../framework/web/nifi-web-api/pom.xml          |   8 +-
 .../framework-bundle/framework/web/pom.xml      |  11 -
 nar-bundles/framework-bundle/nar/pom.xml        |  47 -
 nar-bundles/framework-bundle/pom.xml            | 378 +-------
 .../hadoop-bundle/hdfs-processors/pom.xml       |   8 -
 nar-bundles/hadoop-bundle/nar/pom.xml           |   2 +-
 nar-bundles/hadoop-bundle/pom.xml               |  98 +-
 nar-bundles/hadoop-libraries-bundle/nar/pom.xml |   7 -
 nar-bundles/hadoop-libraries-bundle/pom.xml     |  26 +-
 nar-bundles/jetty-bundle/pom.xml                |   2 +-
 .../monitor-threshold-bundle/nar/pom.xml        |   3 +-
 nar-bundles/monitor-threshold-bundle/pom.xml    |  72 +-
 nar-bundles/nar-container-common/pom.xml        | 121 ---
 .../nar/pom.xml                                 |  60 +-
 .../pom.xml                                     |  46 +-
 nar-bundles/pom.xml                             | 120 +++
 nar-bundles/ssl-context-bundle/nar/pom.xml      |  39 -
 nar-bundles/ssl-context-bundle/pom.xml          |  49 -
 .../ssl-context-service/pom.xml                 |  51 -
 .../nifi/ssl/StandardSSLContextService.java     | 354 -------
 ...org.apache.nifi.controller.ControllerService |  15 -
 .../index.html                                  |  63 --
 .../apache/nifi/ssl/SSLContextServiceTest.java  | 197 ----
 .../java/org/apache/nifi/ssl/TestProcessor.java |  47 -
 .../src/test/resources/localhost-ks.jks         | Bin 1298 -> 0 bytes
 .../src/test/resources/localhost-ts.jks         | Bin 891 -> 0 bytes
 .../standard-bundle/jms-processors/pom.xml      |   4 -
 nar-bundles/standard-bundle/nar/pom.xml         |   6 +-
 nar-bundles/standard-bundle/pom.xml             |  62 +-
 .../standard-ganglia-reporter/pom.xml           |   1 -
 .../standard-bundle/standard-processors/pom.xml |  32 +-
 .../processors/standard/DetectDuplicate.java    |   2 +-
 .../processors/standard/DistributeLoad.java     |   2 +-
 .../standard/EvaluateRegularExpression.java     |   2 +-
 .../standard/ExecuteStreamCommand.java          |   2 +-
 .../nifi/processors/standard/HashAttribute.java |   2 +-
 .../nifi/processors/standard/InvokeHTTP.java    |   4 +-
 .../nifi/processors/standard/ListenUDP.java     |   2 +-
 .../nifi/processors/standard/LogAttribute.java  |   2 +-
 .../standard/ReplaceTextWithMapping.java        |   2 +-
 .../nifi/processors/standard/SplitXml.java      |   2 +-
 .../standard/servlets/ListenHTTPServlet.java    |   2 +-
 .../standard/util/UDPStreamConsumer.java        |   6 +-
 .../standard/TestDetectDuplicate.java           |   2 +-
 .../standard-reporting-tasks/pom.xml            |   7 -
 .../pom.xml                                     |  36 -
 .../distributed/cache/client/Deserializer.java  |  41 -
 .../cache/client/DistributedMapCacheClient.java | 114 ---
 .../cache/client/DistributedSetCacheClient.java |  74 --
 .../distributed/cache/client/Serializer.java    |  40 -
 .../exception/DeserializationException.java     |  33 -
 .../exception/SerializationException.java       |  33 -
 .../load-distribution-service-api/pom.xml       |  36 -
 .../nifi/loading/LoadDistributionListener.java  |  24 -
 .../nifi/loading/LoadDistributionService.java   |  33 -
 .../standard-services-api-bundle/pom.xml        |  74 --
 .../ssl-context-service-api/pom.xml             |  36 -
 .../org/apache/nifi/ssl/SSLContextService.java  |  55 --
 .../standard-services-api-nar/pom.xml           |  44 -
 .../pom.xml                                     |  36 +
 .../distributed/cache/client/Deserializer.java  |  41 +
 .../cache/client/DistributedMapCacheClient.java | 114 +++
 .../cache/client/DistributedSetCacheClient.java |  74 ++
 .../distributed/cache/client/Serializer.java    |  40 +
 .../exception/DeserializationException.java     |  33 +
 .../exception/SerializationException.java       |  33 +
 .../distributed-cache-client-service/pom.xml    |  60 ++
 .../distributed/cache/client/CommsSession.java  |  46 +
 .../DistributedMapCacheClientService.java       | 301 ++++++
 .../DistributedSetCacheClientService.java       | 212 ++++
 .../cache/client/SSLCommsSession.java           | 106 ++
 .../cache/client/StandardCommsSession.java      | 124 +++
 ...org.apache.nifi.controller.ControllerService |  16 +
 .../index.html                                  |  78 ++
 .../index.html                                  |   0
 .../distributed-cache-protocol/pom.xml          |  39 +
 .../cache/protocol/ProtocolHandshake.java       | 119 +++
 .../protocol/exception/HandshakeException.java  |  27 +
 .../distributed-cache-server/pom.xml            |  78 ++
 .../cache/server/AbstractCacheServer.java       | 199 ++++
 .../distributed/cache/server/CacheRecord.java   |  57 ++
 .../distributed/cache/server/CacheServer.java   |  26 +
 .../cache/server/DistributedCacheServer.java    | 107 ++
 .../cache/server/DistributedSetCacheServer.java |  68 ++
 .../cache/server/EvictionPolicy.java            |  73 ++
 .../cache/server/SetCacheServer.java            | 104 ++
 .../server/map/DistributedMapCacheServer.java   |  71 ++
 .../distributed/cache/server/map/MapCache.java  |  29 +
 .../cache/server/map/MapCacheRecord.java        |  58 ++
 .../cache/server/map/MapCacheServer.java        | 145 +++
 .../cache/server/map/MapPutResult.java          |  59 ++
 .../cache/server/map/PersistentMapCache.java    | 210 ++++
 .../cache/server/map/SimpleMapCache.java        | 165 ++++
 .../cache/server/set/PersistentSetCache.java    | 194 ++++
 .../distributed/cache/server/set/SetCache.java  |  29 +
 .../cache/server/set/SetCacheRecord.java        |  55 ++
 .../cache/server/set/SetCacheResult.java        |  43 +
 .../cache/server/set/SimpleSetCache.java        | 117 +++
 ...org.apache.nifi.controller.ControllerService |  16 +
 .../index.html                                  |  82 ++
 .../cache/server/TestServerAndClient.java       | 530 ++++++++++
 .../src/test/resources/localhost-ks.jks         | Bin 0 -> 1298 bytes
 .../src/test/resources/localhost-ts.jks         | Bin 0 -> 891 bytes
 .../distributed-cache-services-nar/pom.xml      |  47 +
 .../distributed-cache-services-bundle/pom.xml   |  35 +
 .../load-distribution-service-api/pom.xml       |  37 +
 .../nifi/loading/LoadDistributionListener.java  |  24 +
 .../nifi/loading/LoadDistributionService.java   |  33 +
 nar-bundles/standard-services/pom.xml           |  39 +
 .../ssl-context-bundle/nar/pom.xml              |  39 +
 .../ssl-context-bundle/pom.xml                  |  34 +
 .../ssl-context-service/pom.xml                 |  52 +
 .../nifi/ssl/StandardSSLContextService.java     | 354 +++++++
 ...org.apache.nifi.controller.ControllerService |  15 +
 .../index.html                                  |  63 ++
 .../apache/nifi/ssl/SSLContextServiceTest.java  | 197 ++++
 .../java/org/apache/nifi/ssl/TestProcessor.java |  47 +
 .../src/test/resources/localhost-ks.jks         | Bin 0 -> 1298 bytes
 .../src/test/resources/localhost-ts.jks         | Bin 0 -> 891 bytes
 .../ssl-context-service-api/pom.xml             |  36 +
 .../org/apache/nifi/ssl/SSLContextService.java  |  55 ++
 .../standard-services-api-nar/pom.xml           |  45 +
 nar-bundles/update-attribute-bundle/nar/pom.xml |  37 +-
 nar-bundles/update-attribute-bundle/pom.xml     |  29 +-
 .../update-attribute-bundle/processor/pom.xml   |   1 -
 nar-bundles/update-attribute-bundle/ui/pom.xml  |  10 +-
 .../update/attributes/api/RuleResource.java     |   2 +-
 .../nar/pom.xml                                 |   4 +-
 .../pom.xml                                     |  16 +-
 .../volatile-provenance-repository/pom.xml      |   2 +-
 nar-maven-plugin/pom.xml                        |  76 ++
 .../src/main/java/nifi/NarMojo.java             | 610 ++++++++++++
 .../resources/META-INF/plexus/components.xml    |  52 +
 nifi-api/pom.xml                                |   3 +-
 nifi-bootstrap/pom.xml                          |  22 +-
 nifi-mock/pom.xml                               |   6 -
 .../apache/nifi/util/MockProcessSession.java    |   2 +-
 pom.xml                                         | 966 +++++++++++++++++++
 224 files changed, 9465 insertions(+), 8825 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/assemblies/nifi/pom.xml
----------------------------------------------------------------------
diff --git a/assemblies/nifi/pom.xml b/assemblies/nifi/pom.xml
deleted file mode 100644
index 556b8fe..0000000
--- a/assemblies/nifi/pom.xml
+++ /dev/null
@@ -1,490 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-    
-    <artifactId>nifi</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    
-    <name>NiFi Release</name>
-    <description>This is the assembly for the Main Standard Release of NiFi</description>
-    
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>unpack-shared-resources</id>
-                        <goals>
-                            <goal>unpack-dependencies</goal>
-                        </goals>
-                        <phase>generate-resources</phase>
-                        <configuration>
-                            <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
-                            <includeArtifactIds>nifi-resources</includeArtifactIds>
-                            <includeGroupIds>org.apache.nifi</includeGroupIds>
-                            <excludeTransitive>false</excludeTransitive>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <configuration>
-                    <descriptors>
-                        <descriptor>src/main/assembly/dependencies.xml</descriptor>
-                    </descriptors>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <version>1.3.2</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <executable>${project.build.directory}/${project.artifactId}-${project.version}-${nifi.assembly.id}.dir/${nifi.executable}</executable>
-                </configuration>
-            </plugin>
-        </plugins>
-        <resources>
-            <resource>
-                <directory>${basedir}/src/main/resources</directory>
-            </resource>
-            <resource>
-                <directory>${project.build.directory}/generated-resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-    <dependencies>
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jul-to-slf4j</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>log4j-over-slf4j</artifactId>
-            <version>${org.slf4j.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-runtime</artifactId>
-            <version>${framework.version}</version>
-        </dependency>
-        <dependency>
-        	<groupId>org.apache.nifi</groupId>
-        	<artifactId>nifi-bootstrap</artifactId>
-        	<version>0.0.1-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-resources</artifactId>
-            <version>${framework.version}</version>
-            <classifier>resources</classifier>
-            <scope>provided</scope> <!-- Provided - we don't want the zip in the libs -->
-            <type>zip</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-framework-nar</artifactId>
-            <version>${framework.version}</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>volatile-provenance-repository-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>persistent-provenance-repository-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-		
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>standard-services-api-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>ssl-context-service-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>distributed-cache-services-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-standard-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-jetty-bundle</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>update-attribute-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-		
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>monitor-threshold-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>hadoop-libraries-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>hadoop-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <!--        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>execute-script-nar</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>-->
-    </dependencies>
-    
-    <properties>
-        <framework.version>0.0.1-SNAPSHOT</framework.version>
-        
-        <!--Wrapper Properties-->
-        <nifi.wrapper.jvm.heap.initial.mb>256</nifi.wrapper.jvm.heap.initial.mb>
-        <nifi.wrapper.jvm.heap.max.mb>512</nifi.wrapper.jvm.heap.max.mb>
-        <nifi.initial.permgen.size.mb>128</nifi.initial.permgen.size.mb>
-        <nifi.max.permgen.size.mb>128</nifi.max.permgen.size.mb>
-        <nifi.wrapper.logfile.maxsize>10m</nifi.wrapper.logfile.maxsize>
-        <nifi.wrapper.logfile.maxfiles>10</nifi.wrapper.logfile.maxfiles>
-        
-        <!-- nifi.properties: core properties -->
-        <nifi.flowcontroller.autoResumeState>true</nifi.flowcontroller.autoResumeState>
-        <nifi.flowcontroller.graceful.shutdown.period>10 sec</nifi.flowcontroller.graceful.shutdown.period>
-        <nifi.flowservice.writedelay.interval>500 ms</nifi.flowservice.writedelay.interval>
-        <nifi.administrative.yield.duration>30 sec</nifi.administrative.yield.duration>
-
-        <nifi.flow.configuration.file>./conf/flow.xml.gz</nifi.flow.configuration.file>
-        <nifi.flow.configuration.archive.dir>./conf/archive/</nifi.flow.configuration.archive.dir>
-        <nifi.reporting.task.configuration.file>./conf/reporting-tasks.xml</nifi.reporting.task.configuration.file>
-        <nifi.controller.service.configuration.file>./conf/controller-services.xml</nifi.controller.service.configuration.file>
-        <nifi.authority.provider.configuration.file>./conf/authority-providers.xml</nifi.authority.provider.configuration.file>
-        <nifi.templates.directory>./conf/templates</nifi.templates.directory>
-        <nifi.database.directory>./database_repository</nifi.database.directory>
-
-        <nifi.flowfile.repository.implementation>org.apache.nifi.controller.repository.WriteAheadFlowFileRepository</nifi.flowfile.repository.implementation>
-        <nifi.flowfile.repository.directory>./flowfile_repository</nifi.flowfile.repository.directory>
-        <nifi.flowfile.repository.partitions>256</nifi.flowfile.repository.partitions>
-        <nifi.flowfile.repository.checkpoint.interval>2 mins</nifi.flowfile.repository.checkpoint.interval>
-        <nifi.flowfile.repository.always.sync>false</nifi.flowfile.repository.always.sync>
-        <nifi.swap.manager.implementation>org.apache.nifi.controller.FileSystemSwapManager</nifi.swap.manager.implementation>
-        <nifi.queue.swap.threshold>20000</nifi.queue.swap.threshold>
-        <nifi.swap.storage.directory>./flowfile_repository/swap</nifi.swap.storage.directory>
-        <nifi.swap.in.period>5 sec</nifi.swap.in.period>
-        <nifi.swap.in.threads>1</nifi.swap.in.threads>
-        <nifi.swap.out.period>5 sec</nifi.swap.out.period>
-        <nifi.swap.out.threads>4</nifi.swap.out.threads>
-		
-        <nifi.content.repository.implementation>org.apache.nifi.controller.repository.FileSystemRepository</nifi.content.repository.implementation>
-        <nifi.content.claim.max.appendable.size>10 MB</nifi.content.claim.max.appendable.size>
-        <nifi.content.claim.max.flow.files>100</nifi.content.claim.max.flow.files>
-        <nifi.content.repository.directory.default>./content_repository</nifi.content.repository.directory.default>
-        <nifi.content.repository.archive.max.retention.period />
-        <nifi.content.repository.archive.max.usage.percentage />
-        <nifi.content.repository.archive.enabled>false</nifi.content.repository.archive.enabled>
-        <nifi.content.repository.always.sync>false</nifi.content.repository.always.sync>
-        <nifi.content.viewer.url />
-        
-        
-        <nifi.restore.directory />
-        <nifi.ui.banner.text></nifi.ui.banner.text>
-        <nifi.ui.autorefresh.interval>30 sec</nifi.ui.autorefresh.interval>
-        <nifi.nar.library.directory>./lib</nifi.nar.library.directory>
-        <nifi.nar.working.directory>./work/nar/</nifi.nar.working.directory>
-        <nifi.documentation.working.directory>./work/docs/components</nifi.documentation.working.directory>
-        
-        <nifi.sensitive.props.algorithm>PBEWITHMD5AND256BITAES-CBC-OPENSSL</nifi.sensitive.props.algorithm>
-        <nifi.sensitive.props.provider>BC</nifi.sensitive.props.provider>
-        <nifi.h2.url.append>;LOCK_TIMEOUT=25000;WRITE_DELAY=0;AUTO_SERVER=FALSE</nifi.h2.url.append>
-
-        <nifi.remote.input.socket.port>9990</nifi.remote.input.socket.port>
-        
-        <!-- persistent provenance repository properties -->
-        <nifi.provenance.repository.implementation>org.apache.nifi.provenance.PersistentProvenanceRepository</nifi.provenance.repository.implementation>
-        <nifi.provenance.repository.directory.default>./provenance_repository</nifi.provenance.repository.directory.default>
-        <nifi.provenance.repository.max.storage.time>24 hours</nifi.provenance.repository.max.storage.time>
-        <nifi.provenance.repository.max.storage.size>1 GB</nifi.provenance.repository.max.storage.size>
-        <nifi.provenance.repository.rollover.time>5 mins</nifi.provenance.repository.rollover.time>
-        <nifi.provenance.repository.rollover.size>100 MB</nifi.provenance.repository.rollover.size>
-        <nifi.provenance.repository.query.threads>2</nifi.provenance.repository.query.threads>
-        <nifi.provenance.repository.compress.on.rollover>true</nifi.provenance.repository.compress.on.rollover>
-        <nifi.provenance.repository.indexed.fields>EventType, FlowFileUUID, Filename, ProcessorID</nifi.provenance.repository.indexed.fields>
-        <nifi.provenance.repository.indexed.attributes />
-        <nifi.provenance.repository.index.shard.size>500 MB</nifi.provenance.repository.index.shard.size>
-        <nifi.provenance.repository.always.sync>false</nifi.provenance.repository.always.sync>
-        <nifi.provenance.repository.journal.count>16</nifi.provenance.repository.journal.count>
-        
-        <!-- volatile provenance repository properties -->
-        <nifi.provenance.repository.buffer.size>100000</nifi.provenance.repository.buffer.size>
-        
-        <!-- Component status repository properties -->
-        <nifi.components.status.repository.implementation>org.apache.nifi.controller.status.history.VolatileComponentStatusRepository</nifi.components.status.repository.implementation>
-        <nifi.components.status.repository.buffer.size>288</nifi.components.status.repository.buffer.size>
-        <nifi.components.status.snapshot.frequency>5 mins</nifi.components.status.snapshot.frequency>
-        
-        <!-- nifi.properties: web properties -->
-        <nifi.web.war.directory>./lib</nifi.web.war.directory>
-        <nifi.web.http.host />
-        <nifi.web.http.port>8080</nifi.web.http.port>
-        <nifi.web.https.host />
-        <nifi.web.https.port />
-        <nifi.jetty.work.dir>./work/jetty</nifi.jetty.work.dir>
-        
-        <!-- nifi.properties: security properties -->
-        <nifi.security.keystore />
-        <nifi.security.keystoreType />
-        <nifi.security.keystorePasswd />
-        <nifi.security.keyPasswd />
-        <nifi.security.truststore />
-        <nifi.security.truststoreType />
-        <nifi.security.truststorePasswd />
-        <nifi.security.needClientAuth />
-        <nifi.security.authorizedUsers.file>./conf/authorized-users.xml</nifi.security.authorizedUsers.file>
-        <nifi.security.user.credential.cache.duration>24 hours</nifi.security.user.credential.cache.duration>
-        <nifi.security.user.authority.provider>file-provider</nifi.security.user.authority.provider>
-        <nifi.security.x509.principal.extractor />
-        <nifi.security.support.new.account.requests />
-        <nifi.security.ocsp.responder.url />
-        <nifi.security.ocsp.responder.certificate />
-        
-        <!-- nifi.properties: cluster common properties (cluster manager and nodes must have same values) -->
-        <nifi.cluster.protocol.heartbeat.interval>5 sec</nifi.cluster.protocol.heartbeat.interval>
-        <nifi.cluster.protocol.is.secure>false</nifi.cluster.protocol.is.secure>
-        <nifi.cluster.protocol.socket.timeout>30 sec</nifi.cluster.protocol.socket.timeout>
-        <nifi.cluster.protocol.connection.handshake.timeout>45 sec</nifi.cluster.protocol.connection.handshake.timeout> 
-        <nifi.cluster.protocol.use.multicast>false</nifi.cluster.protocol.use.multicast>
-        <nifi.cluster.protocol.multicast.address />
-        <nifi.cluster.protocol.multicast.port />
-        <nifi.cluster.protocol.multicast.service.broadcast.delay>500 ms</nifi.cluster.protocol.multicast.service.broadcast.delay>
-        <nifi.cluster.protocol.multicast.service.locator.attempts>3</nifi.cluster.protocol.multicast.service.locator.attempts>
-        <nifi.cluster.protocol.multicast.service.locator.attempts.delay>1 sec</nifi.cluster.protocol.multicast.service.locator.attempts.delay>
-
-        <!-- nifi.properties: cluster node properties (only configure for cluster nodes) -->
-        <nifi.cluster.is.node>false</nifi.cluster.is.node>
-        <nifi.cluster.node.address />
-        <nifi.cluster.node.protocol.port />
-        <nifi.cluster.node.protocol.threads>2</nifi.cluster.node.protocol.threads>
-        <nifi.cluster.node.unicast.manager.address />
-        <nifi.cluster.node.unicast.manager.protocol.port />
-        
-        <!-- nifi.properties: cluster manager properties (only configure for cluster manager) -->
-        <nifi.cluster.is.manager>false</nifi.cluster.is.manager>
-        <nifi.cluster.manager.address />
-        <nifi.cluster.manager.protocol.port />
-        <nifi.cluster.manager.node.firewall.file />
-        <nifi.cluster.manager.node.event.history.size>10</nifi.cluster.manager.node.event.history.size>
-        <nifi.cluster.manager.node.api.connection.timeout>30 sec</nifi.cluster.manager.node.api.connection.timeout>
-        <nifi.cluster.manager.node.api.read.timeout>30 sec</nifi.cluster.manager.node.api.read.timeout>
-        <nifi.cluster.manager.node.api.request.threads>10</nifi.cluster.manager.node.api.request.threads>
-        <nifi.cluster.manager.flow.retrieval.delay>5 sec</nifi.cluster.manager.flow.retrieval.delay>
-        <nifi.cluster.manager.protocol.threads>10</nifi.cluster.manager.protocol.threads>
-        <nifi.cluster.manager.safemode.duration>0 sec</nifi.cluster.manager.safemode.duration>
-        
-        <!--
-            Properties to execute nifi using Maven.  It is assumed that the assembly has a
-            format of type 'dir' so that the executable can be referenced in a defined location.
-        -->
-        <nifi.assembly.id>bin</nifi.assembly.id>
-        <nifi.executable>${project.artifactId}-${project.version}/bin/${project.artifactId}</nifi.executable>
-        
-    </properties>
-    <profiles>
-        <profile>
-            <id>standard-rpm</id>
-            <activation>
-                <activeByDefault>false</activeByDefault>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>rpm-maven-plugin</artifactId>
-                        <version>2.0.1</version>
-                        <executions>
-                            <execution>
-                                <goals>
-                                    <goal>rpm</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <name>${project.artifactId}</name>
-                            <projversion>${project.version}</projversion>
-                            <summary>NiFi data flow framework</summary>
-                            <description>
-                                Nifi is a simple event processing framework largely
-                                based on the Flow-Based Programming concepts.
-                            </description>
-                            <copyright>NONE</copyright>
-                            <url>http://nifi.apache.org</url>
-                            <group>Utilities</group>
-                            <requires>
-                                <require>jdk</require>
-                            </requires>
-                            <prefix>/opt/${project.artifactId}</prefix>
-                            <defineStatements>
-                                <defineStatement>_use_internal_dependency_generator 0</defineStatement>
-                            </defineStatements>
-                            <defaultDirmode>750</defaultDirmode>
-                            <defaultFilemode>640</defaultFilemode>
-                            <defaultUsername>dataflow</defaultUsername>
-                            <defaultGroupname>dataflow</defaultGroupname>
-                            <mappings>
-                                <mapping>
-                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}</directory>
-                                </mapping>
-                                <mapping>
-                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/bin</directory>
-                                    <filemode>750</filemode>
-                                    <sources>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/bin/nifi</location>
-                                            <destination>${project.artifactId}</destination>
-                                            <filter>true</filter>
-                                        </source>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/bin/wrapper-linux-x86-32</location>
-                                        </source>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/bin/wrapper-linux-x86-64</location>
-                                        </source>
-                                    </sources>
-                                </mapping>
-                                <mapping>
-                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/conf</directory>
-                                    <configuration>true</configuration>
-                                    <sources>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/conf</location>
-                                            <excludes>
-                                                <exclude>nifi.properties</exclude>
-                                            </excludes>
-                                            <filter>true</filter>
-                                        </source>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/conf/nifi.properties</location>
-                                            <destination>${project.artifactId}.properties</destination>
-                                            <filter>true</filter>
-                                        </source>
-                                    </sources>
-                                </mapping>
-                                <mapping>
-                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/lib</directory>
-                                    <dependency />
-                                    <sources>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/lib</location>
-                                            <excludes>
-                                                <exclude>**/*-aix*</exclude>
-                                                <exclude>**/*-freebsd*</exclude>
-                                                <exclude>**/*-hpux*</exclude>                                                
-                                                <exclude>**/*-linux-ia*</exclude>
-                                                <exclude>**/*-linux-ppc*</exclude>
-                                                <exclude>**/*-macosx*</exclude>
-                                                <exclude>**/*-solaris*</exclude>
-                                                <exclude>**/*-windows*</exclude>
-                                            </excludes>
-                                        </source>
-                                    </sources>
-                                </mapping>
-                                <mapping>
-                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/docs</directory>
-                                    <sources>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/docs</location>
-                                        </source>
-                                    </sources>
-                                </mapping>
-                                <mapping>
-                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/logs</directory>
-                                    <sources>
-                                        <source>
-                                            <location>${project.build.directory}/generated-resources/logs</location>
-                                        </source>
-                                    </sources>
-                                </mapping>
-                            </mappings>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/assemblies/nifi/src/main/assembly/dependencies.xml
----------------------------------------------------------------------
diff --git a/assemblies/nifi/src/main/assembly/dependencies.xml b/assemblies/nifi/src/main/assembly/dependencies.xml
deleted file mode 100644
index 97f3d4e..0000000
--- a/assemblies/nifi/src/main/assembly/dependencies.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<assembly>
-    <id>bin</id>
-    <formats>
-        <format>dir</format>
-        <format>tar.gz</format>
-    </formats>
-    <includeBaseDirectory>true</includeBaseDirectory>
-    <baseDirectory>${project.artifactId}-${project.version}</baseDirectory>
-
-    <dependencySets>
-        <dependencySet>
-            <scope>runtime</scope>
-            <outputDirectory>lib</outputDirectory>
-            <useTransitiveFiltering>true</useTransitiveFiltering>
-            <excludes>
-            	<exclude>nifi-bootstrap</exclude>
-            </excludes>
-        </dependencySet>
-        
-        <dependencySet>
-            <scope>runtime</scope>
-            <outputDirectory>lib/bootstrap</outputDirectory>
-            <useTransitiveFiltering>true</useTransitiveFiltering>
-            <includes>
-            	<include>nifi-bootstrap</include>
-            </includes>
-        </dependencySet>
-    </dependencySets>
-
-    <fileSets>
-        <fileSet>
-            <directory>${project.build.directory}/generated-resources/bin</directory>
-            <outputDirectory>bin</outputDirectory>
-            <directoryMode>0750</directoryMode>
-            <fileMode>0750</fileMode>
-            <filtered>false</filtered>
-        </fileSet>
-        <fileSet>
-            <directory>${project.build.directory}/generated-resources/conf</directory>
-            <outputDirectory>conf</outputDirectory>
-            <excludes>
-                <exclude>nifi.properties</exclude>
-            </excludes>
-            <directoryMode>0750</directoryMode>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </fileSet>
-        <fileSet>
-            <directory>${project.build.directory}/generated-resources/lib</directory>
-            <outputDirectory>lib</outputDirectory>
-            <directoryMode>0750</directoryMode>
-            <fileMode>0640</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.build.directory}/generated-resources/logs</directory>
-            <outputDirectory>logs</outputDirectory>
-            <directoryMode>0750</directoryMode>
-            <fileMode>0640</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.build.directory}/generated-resources/docs</directory>
-            <outputDirectory>docs</outputDirectory>
-            <directoryMode>0750</directoryMode>
-            <fileMode>0640</fileMode>
-            <filtered>false</filtered>
-        </fileSet>
-    </fileSets>
-
-    <files>
-        <file>
-            <source>${project.build.directory}/generated-resources/conf/nifi.properties</source>
-            <outputDirectory>conf</outputDirectory>
-            <destName>${project.artifactId}.properties</destName>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </file>
-        <file>
-            <source>${project.build.directory}/generated-resources/bin/nifi.sh</source>
-            <outputDirectory>bin</outputDirectory>
-            <destName>nifi.sh</destName>
-            <fileMode>0750</fileMode>
-            <filtered>true</filtered>
-        </file>
-        <file>
-            <source>${project.build.directory}/generated-resources/docs/README.md</source>
-            <outputDirectory>docs</outputDirectory>
-            <destName>README.md</destName>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </file>
-        <file>
-            <source>${project.build.directory}/generated-resources/DISCLAIMER</source>
-            <outputDirectory>./</outputDirectory>
-            <destName>DISCLAIMER</destName>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </file>
-        <file>
-            <source>${project.build.directory}/generated-resources/DISCLAIMER</source>
-            <outputDirectory>./</outputDirectory>
-            <destName>DISCLAIMER</destName>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </file>    
-        <file>
-            <source>${project.build.directory}/generated-resources/LICENSE</source>
-            <outputDirectory>./</outputDirectory>
-            <destName>LICENSE</destName>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </file>       
-        <file>
-            <source>${project.build.directory}/generated-resources/NOTICE</source>
-            <outputDirectory>./</outputDirectory>
-            <destName>NOTICE</destName>
-            <fileMode>0640</fileMode>
-            <filtered>true</filtered>
-        </file>
-    </files>
-</assembly>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/assembly/pom.xml
----------------------------------------------------------------------
diff --git a/assembly/pom.xml b/assembly/pom.xml
new file mode 100644
index 0000000..17cf29b
--- /dev/null
+++ b/assembly/pom.xml
@@ -0,0 +1,446 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nifi-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <artifactId>nifi</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>NiFi Release</name>
+    <description>This is the assembly Apache NiFi (incubating)</description>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>unpack-shared-resources</id>
+                        <goals>
+                            <goal>unpack-dependencies</goal>
+                        </goals>
+                        <phase>generate-resources</phase>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
+                            <includeArtifactIds>nifi-resources</includeArtifactIds>
+                            <includeGroupIds>org.apache.nifi</includeGroupIds>
+                            <excludeTransitive>false</excludeTransitive>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <descriptors>
+                        <descriptor>src/main/assembly/dependencies.xml</descriptor>
+                    </descriptors>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>exec</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <executable>${project.build.directory}/${project.artifactId}-${project.version}-${nifi.assembly.id}.dir/${nifi.executable}</executable>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>${basedir}/src/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>${project.build.directory}/generated-resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jul-to-slf4j</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>log4j-over-slf4j</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-runtime</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-resources</artifactId>
+            <classifier>resources</classifier>
+            <scope>provided</scope> <!-- Provided - we don't want the zip in the libs -->
+            <type>zip</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-framework-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>volatile-provenance-repository-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>persistent-provenance-repository-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>standard-services-api-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-services-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-standard-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-jetty-bundle</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>update-attribute-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>monitor-threshold-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>hadoop-libraries-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>hadoop-nar</artifactId>
+            <type>nar</type>
+        </dependency>
+    </dependencies>
+    
+    <properties>        
+        <!--Wrapper Properties-->
+        <nifi.wrapper.jvm.heap.initial.mb>256</nifi.wrapper.jvm.heap.initial.mb>
+        <nifi.wrapper.jvm.heap.max.mb>512</nifi.wrapper.jvm.heap.max.mb>
+        <nifi.initial.permgen.size.mb>128</nifi.initial.permgen.size.mb>
+        <nifi.max.permgen.size.mb>128</nifi.max.permgen.size.mb>
+        <nifi.wrapper.logfile.maxsize>10m</nifi.wrapper.logfile.maxsize>
+        <nifi.wrapper.logfile.maxfiles>10</nifi.wrapper.logfile.maxfiles>
+        
+        <!-- nifi.properties: core properties -->
+        <nifi.flowcontroller.autoResumeState>true</nifi.flowcontroller.autoResumeState>
+        <nifi.flowcontroller.graceful.shutdown.period>10 sec</nifi.flowcontroller.graceful.shutdown.period>
+        <nifi.flowservice.writedelay.interval>500 ms</nifi.flowservice.writedelay.interval>
+        <nifi.administrative.yield.duration>30 sec</nifi.administrative.yield.duration>
+
+        <nifi.flow.configuration.file>./conf/flow.xml.gz</nifi.flow.configuration.file>
+        <nifi.flow.configuration.archive.dir>./conf/archive/</nifi.flow.configuration.archive.dir>
+        <nifi.reporting.task.configuration.file>./conf/reporting-tasks.xml</nifi.reporting.task.configuration.file>
+        <nifi.controller.service.configuration.file>./conf/controller-services.xml</nifi.controller.service.configuration.file>
+        <nifi.authority.provider.configuration.file>./conf/authority-providers.xml</nifi.authority.provider.configuration.file>
+        <nifi.templates.directory>./conf/templates</nifi.templates.directory>
+        <nifi.database.directory>./database_repository</nifi.database.directory>
+
+        <nifi.flowfile.repository.implementation>org.apache.nifi.controller.repository.WriteAheadFlowFileRepository</nifi.flowfile.repository.implementation>
+        <nifi.flowfile.repository.directory>./flowfile_repository</nifi.flowfile.repository.directory>
+        <nifi.flowfile.repository.partitions>256</nifi.flowfile.repository.partitions>
+        <nifi.flowfile.repository.checkpoint.interval>2 mins</nifi.flowfile.repository.checkpoint.interval>
+        <nifi.flowfile.repository.always.sync>false</nifi.flowfile.repository.always.sync>
+        <nifi.swap.manager.implementation>org.apache.nifi.controller.FileSystemSwapManager</nifi.swap.manager.implementation>
+        <nifi.queue.swap.threshold>20000</nifi.queue.swap.threshold>
+        <nifi.swap.storage.directory>./flowfile_repository/swap</nifi.swap.storage.directory>
+        <nifi.swap.in.period>5 sec</nifi.swap.in.period>
+        <nifi.swap.in.threads>1</nifi.swap.in.threads>
+        <nifi.swap.out.period>5 sec</nifi.swap.out.period>
+        <nifi.swap.out.threads>4</nifi.swap.out.threads>
+		
+        <nifi.content.repository.implementation>org.apache.nifi.controller.repository.FileSystemRepository</nifi.content.repository.implementation>
+        <nifi.content.claim.max.appendable.size>10 MB</nifi.content.claim.max.appendable.size>
+        <nifi.content.claim.max.flow.files>100</nifi.content.claim.max.flow.files>
+        <nifi.content.repository.directory.default>./content_repository</nifi.content.repository.directory.default>
+        <nifi.content.repository.archive.max.retention.period />
+        <nifi.content.repository.archive.max.usage.percentage />
+        <nifi.content.repository.archive.enabled>false</nifi.content.repository.archive.enabled>
+        <nifi.content.repository.always.sync>false</nifi.content.repository.always.sync>
+        <nifi.content.viewer.url />
+        
+        
+        <nifi.restore.directory />
+        <nifi.ui.banner.text></nifi.ui.banner.text>
+        <nifi.ui.autorefresh.interval>30 sec</nifi.ui.autorefresh.interval>
+        <nifi.nar.library.directory>./lib</nifi.nar.library.directory>
+        <nifi.nar.working.directory>./work/nar/</nifi.nar.working.directory>
+        <nifi.documentation.working.directory>./work/docs/components</nifi.documentation.working.directory>
+        
+        <nifi.sensitive.props.algorithm>PBEWITHMD5AND256BITAES-CBC-OPENSSL</nifi.sensitive.props.algorithm>
+        <nifi.sensitive.props.provider>BC</nifi.sensitive.props.provider>
+        <nifi.h2.url.append>;LOCK_TIMEOUT=25000;WRITE_DELAY=0;AUTO_SERVER=FALSE</nifi.h2.url.append>
+
+        <nifi.remote.input.socket.port>9990</nifi.remote.input.socket.port>
+        
+        <!-- persistent provenance repository properties -->
+        <nifi.provenance.repository.implementation>org.apache.nifi.provenance.PersistentProvenanceRepository</nifi.provenance.repository.implementation>
+        <nifi.provenance.repository.directory.default>./provenance_repository</nifi.provenance.repository.directory.default>
+        <nifi.provenance.repository.max.storage.time>24 hours</nifi.provenance.repository.max.storage.time>
+        <nifi.provenance.repository.max.storage.size>1 GB</nifi.provenance.repository.max.storage.size>
+        <nifi.provenance.repository.rollover.time>5 mins</nifi.provenance.repository.rollover.time>
+        <nifi.provenance.repository.rollover.size>100 MB</nifi.provenance.repository.rollover.size>
+        <nifi.provenance.repository.query.threads>2</nifi.provenance.repository.query.threads>
+        <nifi.provenance.repository.compress.on.rollover>true</nifi.provenance.repository.compress.on.rollover>
+        <nifi.provenance.repository.indexed.fields>EventType, FlowFileUUID, Filename, ProcessorID</nifi.provenance.repository.indexed.fields>
+        <nifi.provenance.repository.indexed.attributes />
+        <nifi.provenance.repository.index.shard.size>500 MB</nifi.provenance.repository.index.shard.size>
+        <nifi.provenance.repository.always.sync>false</nifi.provenance.repository.always.sync>
+        <nifi.provenance.repository.journal.count>16</nifi.provenance.repository.journal.count>
+        
+        <!-- volatile provenance repository properties -->
+        <nifi.provenance.repository.buffer.size>100000</nifi.provenance.repository.buffer.size>
+        
+        <!-- Component status repository properties -->
+        <nifi.components.status.repository.implementation>org.apache.nifi.controller.status.history.VolatileComponentStatusRepository</nifi.components.status.repository.implementation>
+        <nifi.components.status.repository.buffer.size>288</nifi.components.status.repository.buffer.size>
+        <nifi.components.status.snapshot.frequency>5 mins</nifi.components.status.snapshot.frequency>
+        
+        <!-- nifi.properties: web properties -->
+        <nifi.web.war.directory>./lib</nifi.web.war.directory>
+        <nifi.web.http.host />
+        <nifi.web.http.port>8080</nifi.web.http.port>
+        <nifi.web.https.host />
+        <nifi.web.https.port />
+        <nifi.jetty.work.dir>./work/jetty</nifi.jetty.work.dir>
+        
+        <!-- nifi.properties: security properties -->
+        <nifi.security.keystore />
+        <nifi.security.keystoreType />
+        <nifi.security.keystorePasswd />
+        <nifi.security.keyPasswd />
+        <nifi.security.truststore />
+        <nifi.security.truststoreType />
+        <nifi.security.truststorePasswd />
+        <nifi.security.needClientAuth />
+        <nifi.security.authorizedUsers.file>./conf/authorized-users.xml</nifi.security.authorizedUsers.file>
+        <nifi.security.user.credential.cache.duration>24 hours</nifi.security.user.credential.cache.duration>
+        <nifi.security.user.authority.provider>file-provider</nifi.security.user.authority.provider>
+        <nifi.security.x509.principal.extractor />
+        <nifi.security.support.new.account.requests />
+        <nifi.security.ocsp.responder.url />
+        <nifi.security.ocsp.responder.certificate />
+        
+        <!-- nifi.properties: cluster common properties (cluster manager and nodes must have same values) -->
+        <nifi.cluster.protocol.heartbeat.interval>5 sec</nifi.cluster.protocol.heartbeat.interval>
+        <nifi.cluster.protocol.is.secure>false</nifi.cluster.protocol.is.secure>
+        <nifi.cluster.protocol.socket.timeout>30 sec</nifi.cluster.protocol.socket.timeout>
+        <nifi.cluster.protocol.connection.handshake.timeout>45 sec</nifi.cluster.protocol.connection.handshake.timeout> 
+        <nifi.cluster.protocol.use.multicast>false</nifi.cluster.protocol.use.multicast>
+        <nifi.cluster.protocol.multicast.address />
+        <nifi.cluster.protocol.multicast.port />
+        <nifi.cluster.protocol.multicast.service.broadcast.delay>500 ms</nifi.cluster.protocol.multicast.service.broadcast.delay>
+        <nifi.cluster.protocol.multicast.service.locator.attempts>3</nifi.cluster.protocol.multicast.service.locator.attempts>
+        <nifi.cluster.protocol.multicast.service.locator.attempts.delay>1 sec</nifi.cluster.protocol.multicast.service.locator.attempts.delay>
+
+        <!-- nifi.properties: cluster node properties (only configure for cluster nodes) -->
+        <nifi.cluster.is.node>false</nifi.cluster.is.node>
+        <nifi.cluster.node.address />
+        <nifi.cluster.node.protocol.port />
+        <nifi.cluster.node.protocol.threads>2</nifi.cluster.node.protocol.threads>
+        <nifi.cluster.node.unicast.manager.address />
+        <nifi.cluster.node.unicast.manager.protocol.port />
+        
+        <!-- nifi.properties: cluster manager properties (only configure for cluster manager) -->
+        <nifi.cluster.is.manager>false</nifi.cluster.is.manager>
+        <nifi.cluster.manager.address />
+        <nifi.cluster.manager.protocol.port />
+        <nifi.cluster.manager.node.firewall.file />
+        <nifi.cluster.manager.node.event.history.size>10</nifi.cluster.manager.node.event.history.size>
+        <nifi.cluster.manager.node.api.connection.timeout>30 sec</nifi.cluster.manager.node.api.connection.timeout>
+        <nifi.cluster.manager.node.api.read.timeout>30 sec</nifi.cluster.manager.node.api.read.timeout>
+        <nifi.cluster.manager.node.api.request.threads>10</nifi.cluster.manager.node.api.request.threads>
+        <nifi.cluster.manager.flow.retrieval.delay>5 sec</nifi.cluster.manager.flow.retrieval.delay>
+        <nifi.cluster.manager.protocol.threads>10</nifi.cluster.manager.protocol.threads>
+        <nifi.cluster.manager.safemode.duration>0 sec</nifi.cluster.manager.safemode.duration>
+        <!--
+            Properties to execute nifi using Maven.  It is assumed that the assembly has a
+            format of type 'dir' so that the executable can be referenced in a defined location.
+        -->
+        <nifi.assembly.id>bin</nifi.assembly.id>
+        <nifi.executable>${project.artifactId}-${project.version}/bin/${project.artifactId}</nifi.executable>
+    </properties>
+    <profiles>
+        <profile>
+            <id>standard-rpm</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>rpm-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>rpm</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <name>${project.artifactId}</name>
+                            <projversion>${project.version}</projversion>
+                            <summary>Apache NiFi (incubating)</summary>
+                            <description>
+                                Apache Nifi (incubating) is dataflow system
+                                based on the Flow-Based Programming concepts.
+                            </description>
+                            <copyright>NONE</copyright>
+                            <url>http://nifi.apache.org</url>
+                            <group>Utilities</group>
+                            <requires>
+                                <require>jdk</require>
+                            </requires>
+                            <prefix>/opt/${project.artifactId}</prefix>
+                            <defineStatements>
+                                <defineStatement>_use_internal_dependency_generator 0</defineStatement>
+                            </defineStatements>
+                            <defaultDirmode>750</defaultDirmode>
+                            <defaultFilemode>640</defaultFilemode>
+                            <defaultUsername>nifi</defaultUsername>
+                            <defaultGroupname>nifi</defaultGroupname>
+                            <mappings>
+                                <mapping>
+                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}</directory>
+                                </mapping>
+                                <mapping>
+                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/bin</directory>
+                                    <filemode>750</filemode>
+                                    <sources>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/bin/nifi</location>
+                                            <destination>${project.artifactId}</destination>
+                                            <filter>true</filter>
+                                        </source>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/bin/wrapper-linux-x86-32</location>
+                                        </source>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/bin/wrapper-linux-x86-64</location>
+                                        </source>
+                                    </sources>
+                                </mapping>
+                                <mapping>
+                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/conf</directory>
+                                    <configuration>true</configuration>
+                                    <sources>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/conf</location>
+                                            <excludes>
+                                                <exclude>nifi.properties</exclude>
+                                            </excludes>
+                                            <filter>true</filter>
+                                        </source>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/conf/nifi.properties</location>
+                                            <destination>${project.artifactId}.properties</destination>
+                                            <filter>true</filter>
+                                        </source>
+                                    </sources>
+                                </mapping>
+                                <mapping>
+                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/lib</directory>
+                                    <dependency />
+                                    <sources>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/lib</location>
+                                        </source>
+                                    </sources>
+                                </mapping>
+                                <mapping>
+                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/docs</directory>
+                                    <sources>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/docs</location>
+                                        </source>
+                                    </sources>
+                                </mapping>
+                                <mapping>
+                                    <directory>/opt/${project.artifactId}/${project.artifactId}-${project.version}/logs</directory>
+                                    <sources>
+                                        <source>
+                                            <location>${project.build.directory}/generated-resources/logs</location>
+                                        </source>
+                                    </sources>
+                                </mapping>
+                            </mappings>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/assembly/src/main/assembly/dependencies.xml
----------------------------------------------------------------------
diff --git a/assembly/src/main/assembly/dependencies.xml b/assembly/src/main/assembly/dependencies.xml
new file mode 100644
index 0000000..97f3d4e
--- /dev/null
+++ b/assembly/src/main/assembly/dependencies.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<assembly>
+    <id>bin</id>
+    <formats>
+        <format>dir</format>
+        <format>tar.gz</format>
+    </formats>
+    <includeBaseDirectory>true</includeBaseDirectory>
+    <baseDirectory>${project.artifactId}-${project.version}</baseDirectory>
+
+    <dependencySets>
+        <dependencySet>
+            <scope>runtime</scope>
+            <outputDirectory>lib</outputDirectory>
+            <useTransitiveFiltering>true</useTransitiveFiltering>
+            <excludes>
+            	<exclude>nifi-bootstrap</exclude>
+            </excludes>
+        </dependencySet>
+        
+        <dependencySet>
+            <scope>runtime</scope>
+            <outputDirectory>lib/bootstrap</outputDirectory>
+            <useTransitiveFiltering>true</useTransitiveFiltering>
+            <includes>
+            	<include>nifi-bootstrap</include>
+            </includes>
+        </dependencySet>
+    </dependencySets>
+
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/generated-resources/bin</directory>
+            <outputDirectory>bin</outputDirectory>
+            <directoryMode>0750</directoryMode>
+            <fileMode>0750</fileMode>
+            <filtered>false</filtered>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/generated-resources/conf</directory>
+            <outputDirectory>conf</outputDirectory>
+            <excludes>
+                <exclude>nifi.properties</exclude>
+            </excludes>
+            <directoryMode>0750</directoryMode>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/generated-resources/lib</directory>
+            <outputDirectory>lib</outputDirectory>
+            <directoryMode>0750</directoryMode>
+            <fileMode>0640</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/generated-resources/logs</directory>
+            <outputDirectory>logs</outputDirectory>
+            <directoryMode>0750</directoryMode>
+            <fileMode>0640</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/generated-resources/docs</directory>
+            <outputDirectory>docs</outputDirectory>
+            <directoryMode>0750</directoryMode>
+            <fileMode>0640</fileMode>
+            <filtered>false</filtered>
+        </fileSet>
+    </fileSets>
+
+    <files>
+        <file>
+            <source>${project.build.directory}/generated-resources/conf/nifi.properties</source>
+            <outputDirectory>conf</outputDirectory>
+            <destName>${project.artifactId}.properties</destName>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </file>
+        <file>
+            <source>${project.build.directory}/generated-resources/bin/nifi.sh</source>
+            <outputDirectory>bin</outputDirectory>
+            <destName>nifi.sh</destName>
+            <fileMode>0750</fileMode>
+            <filtered>true</filtered>
+        </file>
+        <file>
+            <source>${project.build.directory}/generated-resources/docs/README.md</source>
+            <outputDirectory>docs</outputDirectory>
+            <destName>README.md</destName>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </file>
+        <file>
+            <source>${project.build.directory}/generated-resources/DISCLAIMER</source>
+            <outputDirectory>./</outputDirectory>
+            <destName>DISCLAIMER</destName>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </file>
+        <file>
+            <source>${project.build.directory}/generated-resources/DISCLAIMER</source>
+            <outputDirectory>./</outputDirectory>
+            <destName>DISCLAIMER</destName>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </file>    
+        <file>
+            <source>${project.build.directory}/generated-resources/LICENSE</source>
+            <outputDirectory>./</outputDirectory>
+            <destName>LICENSE</destName>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </file>       
+        <file>
+            <source>${project.build.directory}/generated-resources/NOTICE</source>
+            <outputDirectory>./</outputDirectory>
+            <destName>NOTICE</destName>
+            <fileMode>0640</fileMode>
+            <filtered>true</filtered>
+        </file>
+    </files>
+</assembly>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/core-flowfile-attributes/pom.xml
----------------------------------------------------------------------
diff --git a/commons/core-flowfile-attributes/pom.xml b/commons/core-flowfile-attributes/pom.xml
index d611134..5a82ffa 100644
--- a/commons/core-flowfile-attributes/pom.xml
+++ b/commons/core-flowfile-attributes/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -26,7 +26,4 @@
     <packaging>jar</packaging>
 
     <name>NiFi: Core FlowFile Attributes</name>
-    
-    <dependencies>
-    </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/data-provenance-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/data-provenance-utils/pom.xml b/commons/data-provenance-utils/pom.xml
index 0f33c06..162d4f3 100644
--- a/commons/data-provenance-utils/pom.xml
+++ b/commons/data-provenance-utils/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -31,12 +31,10 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-api</artifactId>
-            <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-core-flowfile-attributes</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/flowfile-packager/pom.xml
----------------------------------------------------------------------
diff --git a/commons/flowfile-packager/pom.xml b/commons/flowfile-packager/pom.xml
index f4001fe..9cf4ba8 100644
--- a/commons/flowfile-packager/pom.xml
+++ b/commons/flowfile-packager/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -31,12 +31,10 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-compress</artifactId>
-            <version>1.9</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>3.3.2</version>
         </dependency>
     </dependencies>
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/flowfile-packager/src/main/java/org/apache/nifi/util/FlowFilePackagerV1.java
----------------------------------------------------------------------
diff --git a/commons/flowfile-packager/src/main/java/org/apache/nifi/util/FlowFilePackagerV1.java b/commons/flowfile-packager/src/main/java/org/apache/nifi/util/FlowFilePackagerV1.java
index 2437279..07baab1 100644
--- a/commons/flowfile-packager/src/main/java/org/apache/nifi/util/FlowFilePackagerV1.java
+++ b/commons/flowfile-packager/src/main/java/org/apache/nifi/util/FlowFilePackagerV1.java
@@ -58,8 +58,8 @@ public class FlowFilePackagerV1 implements FlowFilePackager {
         sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE properties\n  SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n");
         sb.append("<properties>");
         for (final Map.Entry<String, String> entry : attributes.entrySet()) {
-            final String escapedKey = StringEscapeUtils.escapeXml(entry.getKey());
-            final String escapedValue = StringEscapeUtils.escapeXml(entry.getValue());
+            final String escapedKey = StringEscapeUtils.escapeXml11(entry.getKey());
+            final String escapedValue = StringEscapeUtils.escapeXml11(entry.getValue());
             sb.append("\n  <entry key=\"").append(escapedKey).append("\">").append(escapedValue).append("</entry>");
         }
         sb.append("</properties>");

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/naive-search-ring-buffer/pom.xml
----------------------------------------------------------------------
diff --git a/commons/naive-search-ring-buffer/pom.xml b/commons/naive-search-ring-buffer/pom.xml
index e84be0f..c9628f0 100644
--- a/commons/naive-search-ring-buffer/pom.xml
+++ b/commons/naive-search-ring-buffer/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-expression-language/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-expression-language/pom.xml b/commons/nifi-expression-language/pom.xml
index dfb1ea5..196c048 100644
--- a/commons/nifi-expression-language/pom.xml
+++ b/commons/nifi-expression-language/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -32,7 +32,6 @@
             <plugin>
                 <groupId>org.antlr</groupId>
                 <artifactId>antlr3-maven-plugin</artifactId>
-                <version>3.5.2</version>
                 <executions>
                     <execution>
                         <goals>
@@ -48,12 +47,10 @@
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr-runtime</artifactId>
-            <version>3.5.2</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-api</artifactId>
-            <version>[0.0.1-SNAPSHOT, 1.0.0-SNAPSHOT)</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-file-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-file-utils/pom.xml b/commons/nifi-file-utils/pom.xml
index e3cf792..2af4d63 100644
--- a/commons/nifi-file-utils/pom.xml
+++ b/commons/nifi-file-utils/pom.xml
@@ -14,9 +14,10 @@
       limitations under the License.
     -->
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -29,7 +30,6 @@
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
-            <version>1.10</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/commons/nifi-logging-utils/pom.xml
----------------------------------------------------------------------
diff --git a/commons/nifi-logging-utils/pom.xml b/commons/nifi-logging-utils/pom.xml
index ce5064b..a6c3f44 100644
--- a/commons/nifi-logging-utils/pom.xml
+++ b/commons/nifi-logging-utils/pom.xml
@@ -15,9 +15,10 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
+        <artifactId>nifi-commons-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -26,7 +27,7 @@
     <name>NiFi Logging Utils</name>
     <description>Utilities for logging</description>
     
-	<dependencies>
+    <dependencies>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>


[17/19] incubator-nifi git commit: NIFI-173 changed meta-inf/dependencies to meta-inf/bundled-dependencies

Posted by jo...@apache.org.
NIFI-173 changed meta-inf/dependencies to meta-inf/bundled-dependencies


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

Branch: refs/heads/develop
Commit: 8fb78d2a5862c7b147e652c1d69c0ba58b10c226
Parents: 3a4c6ed
Author: joewitt <jo...@apache.org>
Authored: Tue Dec 16 10:38:59 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Tue Dec 16 10:38:59 2014 -0500

----------------------------------------------------------------------
 .../src/main/java/org/apache/nifi/nar/NarClassLoader.java | 10 +++++-----
 nar-maven-plugin/src/main/java/nifi/NarMojo.java          |  9 ++++++---
 2 files changed, 11 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/8fb78d2a/nar-bundles/framework-bundle/framework/nar/src/main/java/org/apache/nifi/nar/NarClassLoader.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/nar/src/main/java/org/apache/nifi/nar/NarClassLoader.java b/nar-bundles/framework-bundle/framework/nar/src/main/java/org/apache/nifi/nar/NarClassLoader.java
index b3b7e7f..946c26e 100644
--- a/nar-bundles/framework-bundle/framework/nar/src/main/java/org/apache/nifi/nar/NarClassLoader.java
+++ b/nar-bundles/framework-bundle/framework/nar/src/main/java/org/apache/nifi/nar/NarClassLoader.java
@@ -50,7 +50,7 @@ import org.slf4j.LoggerFactory;
  *
  * <pre>
  *	+META-INF/
- *	+-- dependencies/
+ *	+-- bundled-dependencies/
  *	    +-- &lt;JAR files&gt;
  *	+-- MANIFEST.MF
  * </pre>
@@ -186,9 +186,9 @@ public class NarClassLoader extends URLClassLoader {
     private void updateClasspath(File root) throws IOException {
         addURL(root.toURI().toURL()); // for compiled classes, META-INF/, etc.
 
-        File dependencies = new File(root, "META-INF/dependencies");
+        File dependencies = new File(root, "META-INF/bundled-dependencies");
         if (!dependencies.isDirectory()) {
-            LOGGER.warn(narWorkingDirectory + " does not contain META-INF/dependencies!");
+            LOGGER.warn(narWorkingDirectory + " does not contain META-INF/bundled-dependencies!");
         }
         addURL(dependencies.toURI().toURL());
         if (dependencies.isDirectory()) {
@@ -200,9 +200,9 @@ public class NarClassLoader extends URLClassLoader {
 
     @Override
     protected String findLibrary(final String libname) {
-        File dependencies = new File(narWorkingDirectory, "META-INF/dependencies");
+        File dependencies = new File(narWorkingDirectory, "META-INF/bundled-dependencies");
         if (!dependencies.isDirectory()) {
-            LOGGER.warn(narWorkingDirectory + " does not contain META-INF/dependencies!");
+            LOGGER.warn(narWorkingDirectory + " does not contain META-INF/bundled-dependencies!");
         }
         
         final File nativeDir = new File(dependencies, "native");

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/8fb78d2a/nar-maven-plugin/src/main/java/nifi/NarMojo.java
----------------------------------------------------------------------
diff --git a/nar-maven-plugin/src/main/java/nifi/NarMojo.java b/nar-maven-plugin/src/main/java/nifi/NarMojo.java
index 5196f73..9b70ec0 100644
--- a/nar-maven-plugin/src/main/java/nifi/NarMojo.java
+++ b/nar-maven-plugin/src/main/java/nifi/NarMojo.java
@@ -290,6 +290,9 @@ public class NarMojo extends AbstractMojo {
      */
     @Parameter(property = "overWriteIfNewer", required = false, defaultValue = "true")
     protected boolean overWriteIfNewer;
+    
+    @Parameter( property = "projectBuildDirectory", required = false, defaultValue = "${project.build.directory}")
+    protected File projectBuildDirectory;
 
     /**
      * Used to look up Artifacts in the remote repository.
@@ -499,12 +502,12 @@ public class NarMojo extends AbstractMojo {
     }
 
     private File getClassesDirectory() {
-        final File outputDirectory = new File(project.getBasedir(), "target");
+        final File outputDirectory = projectBuildDirectory;
         return new File(outputDirectory, "classes");
     }
 
     private File getDependenciesDirectory() {
-        return new File(getClassesDirectory(), "META-INF/dependencies");
+        return new File(getClassesDirectory(), "META-INF/bundled-dependencies");
     }
 
     private void makeNar() throws MojoExecutionException {
@@ -518,7 +521,7 @@ public class NarMojo extends AbstractMojo {
     }
 
     public File createArchive() throws MojoExecutionException {
-        final File outputDirectory = new File(project.getBasedir(), "target");
+        final File outputDirectory = projectBuildDirectory;
         File narFile = getNarFile(outputDirectory, finalName, classifier);
         MavenArchiver archiver = new MavenArchiver();
         archiver.setArchiver(jarArchiver);


[06/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html b/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html
deleted file mode 100644
index 0ce9aa4..0000000
--- a/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/docs/org.apache.nifi.ssl.StandardSSLContextService/index.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-    <!--
-      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.
-    -->
-    <head>
-        <meta charset="utf-8" />
-        <title>StandardSSLContextService</title>
-
-        <link rel="stylesheet" href="../../css/component-usage.css" type="text/css" />
-    </head>
-
-    <body>
-
-        <!-- Service Documentation ================================================== -->
-        <h2>Configuring the SSLContext Controller Service:</h2>
-        <p>
-            The SSLContext controller service is a mechanism for providing all the security properties that 
-            allow for secure communications between NiFi extensions and other systems. NiFi extensions include 
-            processors, reporting tasks, and other controller services. 
-        </p>
-
-        <p>
-            The <code>controller-services.xml</code> file is located in the NiFi <code>conf</code> 
-            directory. The user may set up any number of controller services within this file.
-        </p>
-
-        <p>
-            Below is an example of the template for a SSLContext controller service. Note that the identifier 
-            in this example is <code>ssl-context</code>. If using this template to create your own SSLContext controller 
-            service, replace the property values with values that are suitable for your system. Possible options for 
-            <code>Keystore Type</code> and <code>Truststore Type</code> are <span style="font-style: italic;">JKS</span>
-            or <span style="font-style: italic;">PKCS12</span>.
-        </p>
-
-        <pre>
-&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
-&lt;services&gt;
-    &lt;service&gt;
-        &lt;identifier&gt;ssl-context&lt;/identifier&gt;
-        &lt;class&gt;nifi.ssl.StandardSSLContextService&lt;/class&gt;
-        &lt;property name="Keystore Filename"&gt;C:/testpki/localtest-ks.jks&lt;/property&gt;
-        &lt;property name="Keystore Password"&gt;localtest&lt;/property&gt;
-        &lt;property name="Keystore Type"&gt;JKS&lt;/property&gt;
-        &lt;property name="Truststore Filename"&gt;C:/testpki/localtest-ts.jks&lt;/property&gt;
-        &lt;property name="Truststore Password"&gt;localtest&lt;/property&gt;
-        &lt;property name="Truststore Type"&gt;JKS&lt;/property&gt;
-    &lt;/service&gt;
-&lt;/services&gt;
-        </pre>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java b/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java
deleted file mode 100644
index 5d583ca..0000000
--- a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/SSLContextServiceTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * 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.nifi.ssl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-
-import org.apache.nifi.controller.ControllerService;
-import org.apache.nifi.reporting.InitializationException;
-import org.apache.nifi.ssl.SSLContextService.ClientAuth;
-import org.apache.nifi.util.TestRunner;
-import org.apache.nifi.util.TestRunners;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SSLContextServiceTest {
-
-    @Test
-    public void testBad1() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            runner.addControllerService("test-bad1", service, properties);
-            Assert.fail("Should have thrown an Exception");
-        } catch (InitializationException e) {
-            assertEquals(
-                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad1] does not have the KeyStore or the TrustStore populated",
-                    e.getCause().getCause().toString());
-        }
-    }
-
-    @Test
-    public void testBad2() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
-            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
-            runner.addControllerService("test-bad2", service, properties);
-            Assert.fail("Should have thrown an Exception");
-        } catch (InitializationException e) {
-            assertEquals(
-                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad2] is not valid due to:\n'Keystore Properties' is invalid because Must set either 0 or 3 properties for Keystore",
-                    e.getCause().getCause().toString());
-        }
-    }
-
-    @Test
-    public void testBad3() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
-            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "JKS");
-            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
-            runner.addControllerService("test-bad3", service, properties);
-            Assert.fail("Should have thrown an Exception");
-        } catch (InitializationException e) {
-            assertEquals(
-                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad3] is not valid due to:\n'Truststore Properties' is invalid because Must set either 0 or 3 properties for Truststore",
-                    e.getCause().getCause().toString());
-        }
-    }
-
-    @Test
-    public void testBad4() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
-            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "wrongpassword");
-            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
-            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
-            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "wrongpassword");
-            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-            runner.addControllerService("test-bad4", service, properties);
-            Assert.fail("Should have thrown an Exception");
-        } catch (InitializationException e) {
-            assertEquals(
-                    "org.apache.nifi.reporting.InitializationException: SSLContextService[id=test-bad4] is not valid due to:\n"
-                    + "'Keystore Properties' is invalid because Invalid KeyStore Password or Type specified for file src/test/resources/localhost-ks.jks\n"
-                    + "'Truststore Properties' is invalid because Invalid KeyStore Password or Type specified for file src/test/resources/localhost-ts.jks",
-                    e.getCause().getCause().toString());
-        }
-    }
-
-    @Test
-    public void testBad5() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/DOES-NOT-EXIST.jks");
-            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
-            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
-            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-            runner.addControllerService("test-bad5", service, properties);
-            Assert.fail("Should have thrown an Exception");
-        } catch (InitializationException e) {
-            assertTrue(e.getCause().getCause().toString().startsWith("org.apache.nifi.reporting.InitializationException: "
-                    + "SSLContextService[id=test-bad5] is not valid due to:\n'Keystore Properties' is invalid "
-                    + "because Cannot access file"));
-        }
-    }
-
-    @Test
-    public void testGood() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            ControllerService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
-            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
-            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
-            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-            runner.addControllerService("test-good1", service, properties);
-            runner.setProperty("SSL Context Svc ID", "test-good1");
-            runner.assertValid();
-            service = runner.getProcessContext().getControllerServiceLookup().getControllerService("test-good1");
-            Assert.assertNotNull(service);
-            Assert.assertTrue(service instanceof StandardSSLContextService);
-            SSLContextService sslService = (SSLContextService) service;
-            sslService.createSSLContext(ClientAuth.REQUIRED);
-            sslService.createSSLContext(ClientAuth.WANT);
-            sslService.createSSLContext(ClientAuth.NONE);
-        } catch (InitializationException e) {
-        }
-    }
-
-    @Test
-    public void testGoodTrustOnly() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/localhost-ts.jks");
-            properties.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-            runner.addControllerService("test-good2", service, properties);
-            runner.setProperty("SSL Context Svc ID", "test-good2");
-            runner.assertValid();
-            Assert.assertNotNull(service);
-            Assert.assertTrue(service instanceof StandardSSLContextService);
-            service.createSSLContext(ClientAuth.NONE);
-        } catch (InitializationException e) {
-        }
-    }
-
-    @Test
-    public void testGoodKeyOnly() {
-        try {
-            TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
-            SSLContextService service = new StandardSSLContextService();
-            HashMap<String, String> properties = new HashMap<String, String>();
-            properties.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");
-            properties.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "localtest");
-            properties.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "JKS");
-            runner.addControllerService("test-good3", service, properties);
-            runner.setProperty("SSL Context Svc ID", "test-good3");
-            runner.assertValid();
-            Assert.assertNotNull(service);
-            Assert.assertTrue(service instanceof StandardSSLContextService);
-            SSLContextService sslService = service;
-            sslService.createSSLContext(ClientAuth.NONE);
-        } catch (Exception e) {
-            System.out.println(e);
-            Assert.fail("Should not have thrown a exception " + e.getMessage());
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java b/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java
deleted file mode 100644
index 6cb2fb6..0000000
--- a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/java/org/apache/nifi/ssl/TestProcessor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.nifi.ssl;
-
-import org.apache.nifi.ssl.SSLContextService;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.processor.AbstractProcessor;
-import org.apache.nifi.processor.ProcessContext;
-import org.apache.nifi.processor.ProcessSession;
-import org.apache.nifi.processor.exception.ProcessException;
-import org.apache.nifi.processor.util.StandardValidators;
-
-public class TestProcessor extends AbstractProcessor {
-
-    @Override
-    public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
-    }
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        List<PropertyDescriptor> propDescs = new ArrayList<>();
-        propDescs.add(new PropertyDescriptor.Builder()
-                .name("SSL Context Svc ID")
-                .description("ID of SSL Context Svc")
-                .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
-                .required(true)
-                .build());
-        return propDescs;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks b/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks
deleted file mode 100755
index 81be31d..0000000
Binary files a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ks.jks and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks b/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks
deleted file mode 100755
index 820e1e1..0000000
Binary files a/nar-bundles/ssl-context-bundle/ssl-context-service/src/test/resources/localhost-ts.jks and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/jms-processors/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/jms-processors/pom.xml b/nar-bundles/standard-bundle/jms-processors/pom.xml
index c29e5a5..7dae21d 100644
--- a/nar-bundles/standard-bundle/jms-processors/pom.xml
+++ b/nar-bundles/standard-bundle/jms-processors/pom.xml
@@ -38,21 +38,17 @@
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-stream-utils</artifactId>
         </dependency>
-
         <dependency>
             <groupId>javax.jms</groupId>
             <artifactId>javax.jms-api</artifactId>
-            <version>2.0</version>
         </dependency>
         <dependency>
             <groupId>org.apache.activemq</groupId>
             <artifactId>activemq-client</artifactId>
-            <version>5.10.0</version>
         </dependency>
         <dependency>
             <groupId>org.hornetq</groupId>
             <artifactId>hornetq-jms-client</artifactId>
-            <version>2.4.5.Final</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/nar/pom.xml b/nar-bundles/standard-bundle/nar/pom.xml
index 144588a..06f9727 100644
--- a/nar-bundles/standard-bundle/nar/pom.xml
+++ b/nar-bundles/standard-bundle/nar/pom.xml
@@ -22,6 +22,7 @@
     </parent>
 
     <artifactId>nifi-standard-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
     <name>NiFi Standard NAR</name>
     <packaging>nar</packaging>
     <description>NiFi Standard Extensions NAR</description>
@@ -35,27 +36,22 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>standard-processors</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>standard-prioritizers</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>standard-reporting-tasks</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>standard-ganglia-reporter</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>jms-processors</artifactId>
-            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/pom.xml b/nar-bundles/standard-bundle/pom.xml
index 92c9e1d..9903666 100644
--- a/nar-bundles/standard-bundle/pom.xml
+++ b/nar-bundles/standard-bundle/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -36,70 +36,36 @@
         <module>standard-reporting-tasks</module>
         <module>nar</module>
     </modules>
-
-
+    
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-stream-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-processor-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>flowfile-packager</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>standard-processors</artifactId>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>naive-search-ring-buffer</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>standard-prioritizers</artifactId>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-search-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>standard-reporting-tasks</artifactId>
+                <version>${project.version}</version>
             </dependency>
-
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-core-flowfile-attributes</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>standard-ganglia-reporter</artifactId>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-socket-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>load-distribution-service</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>distributed-cache-client-service</artifactId>
-                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
-                <scope>test</scope>
-            </dependency>
+                <artifactId>jms-processors</artifactId>
+                <version>${project.version}</version>
+            </dependency>            
         </dependencies>
     </dependencyManagement>
 
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-ganglia-reporter/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-ganglia-reporter/pom.xml b/nar-bundles/standard-bundle/standard-ganglia-reporter/pom.xml
index 07967de..4e7a5a2 100644
--- a/nar-bundles/standard-bundle/standard-ganglia-reporter/pom.xml
+++ b/nar-bundles/standard-bundle/standard-ganglia-reporter/pom.xml
@@ -42,7 +42,6 @@
         <dependency>
             <groupId>com.yammer.metrics</groupId>
             <artifactId>metrics-ganglia</artifactId>
-            <version>2.2.0</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/pom.xml b/nar-bundles/standard-bundle/standard-processors/pom.xml
index e2fa165..244f524 100644
--- a/nar-bundles/standard-bundle/standard-processors/pom.xml
+++ b/nar-bundles/standard-bundle/standard-processors/pom.xml
@@ -63,46 +63,37 @@
             <groupId>org.apache.nifi</groupId>
             <artifactId>distributed-cache-client-service-api</artifactId>
         </dependency>
-        
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
-            <version>2.4</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-client</artifactId>
-            <version>1.12</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-server</artifactId>
-            <version>1.12</version>
         </dependency>
         <dependency>
             <groupId>commons-net</groupId>
             <artifactId>commons-net</artifactId>
-            <version>3.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-compress</artifactId>
-            <version>1.9</version>
         </dependency>
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
         </dependency>
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcprov-jdk16</artifactId>
-            <version>1.46</version>
         </dependency>
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
-            <version>1.10</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
@@ -111,12 +102,10 @@
         <dependency>
             <groupId>com.jcraft</groupId>
             <artifactId>jsch</artifactId>
-            <version>0.1.51</version>
         </dependency>
-        <dependency> <!-- Required if using compression with SFTP -->
+        <dependency>
             <groupId>com.jcraft</groupId>
             <artifactId>jzlib</artifactId>
-            <version>1.1.1</version>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
@@ -129,27 +118,22 @@
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
-            <version>4.3.6</version>
         </dependency>
         <dependency>
             <groupId>javax.mail</groupId>
             <artifactId>mail</artifactId>
-            <version>1.4.7</version>
         </dependency>
         <dependency>
             <groupId>com.github.jponge</groupId>
             <artifactId>lzma-java</artifactId>
-            <version>1.3</version>
         </dependency>
         <dependency>
             <groupId>org.tukaani</groupId>
             <artifactId>xz</artifactId>
-            <version>1.5</version>
         </dependency>
         <dependency>
             <groupId>net.sf.saxon</groupId>
             <artifactId>Saxon-HE</artifactId>
-            <version>9.6.0-2</version>
         </dependency>
         
         <dependency>
@@ -157,7 +141,6 @@
             <artifactId>nifi-mock</artifactId>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-socket-utils</artifactId>
@@ -166,26 +149,17 @@
             <groupId>org.apache.nifi</groupId>
             <artifactId>load-distribution-service-api</artifactId>
         </dependency>
-        <!--        <dependency>
-    <groupId>org.apache.nifi</groupId>
-    <artifactId>load-distribution-service</artifactId>
-    <scope>test</scope>
-</dependency>
-        -->
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>distributed-cache-client-service</artifactId>
         </dependency>
-		
         <dependency>
             <groupId>joda-time</groupId>
             <artifactId>joda-time</artifactId>
-            <version>2.5</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>ssl-context-service</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DetectDuplicate.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DetectDuplicate.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DetectDuplicate.java
index 2d97bf1..1fea36d 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DetectDuplicate.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DetectDuplicate.java
@@ -46,7 +46,7 @@ import org.apache.nifi.processor.annotation.Tags;
 import org.apache.nifi.processor.exception.ProcessException;
 import org.apache.nifi.processor.util.StandardValidators;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @EventDriven
 @SupportsBatching

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DistributeLoad.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DistributeLoad.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DistributeLoad.java
index 2973756..a755b1a 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DistributeLoad.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/DistributeLoad.java
@@ -51,7 +51,7 @@ import org.apache.nifi.processor.annotation.Tags;
 import org.apache.nifi.processor.annotation.TriggerWhenAnyDestinationAvailable;
 import org.apache.nifi.processor.util.StandardValidators;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @EventDriven
 @SideEffectFree

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/EvaluateRegularExpression.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/EvaluateRegularExpression.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/EvaluateRegularExpression.java
index ae4c20f..704ec33 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/EvaluateRegularExpression.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/EvaluateRegularExpression.java
@@ -47,7 +47,7 @@ import org.apache.nifi.processor.annotation.Tags;
 import org.apache.nifi.processor.io.InputStreamCallback;
 import org.apache.nifi.processor.util.StandardValidators;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @EventDriven
 @SideEffectFree

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
index a67a92e..f430199 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
@@ -56,7 +56,7 @@ import org.apache.nifi.processor.io.OutputStreamCallback;
 import org.apache.nifi.processor.util.StandardValidators;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/HashAttribute.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/HashAttribute.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/HashAttribute.java
index c899cf5..5fc7e5a 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/HashAttribute.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/HashAttribute.java
@@ -45,7 +45,7 @@ import org.apache.nifi.processor.annotation.Tags;
 import org.apache.nifi.processor.util.StandardValidators;
 
 import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
index 7ed1bd4..febb37b 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
@@ -16,7 +16,7 @@
  */
 package org.apache.nifi.processors.standard;
 
-import static org.apache.commons.lang.StringUtils.*;
+import static org.apache.commons.lang3.StringUtils.*;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -62,7 +62,7 @@ import org.apache.nifi.processor.util.StandardValidators;
 import org.apache.nifi.ssl.SSLContextService;
 import org.apache.nifi.ssl.SSLContextService.ClientAuth;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ListenUDP.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ListenUDP.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ListenUDP.java
index c4c4533..65b3c66 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ListenUDP.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ListenUDP.java
@@ -69,7 +69,7 @@ import org.apache.nifi.processor.util.StandardValidators;
 import org.apache.nifi.processors.standard.util.UDPStreamConsumer;
 import org.apache.nifi.util.Tuple;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/LogAttribute.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/LogAttribute.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/LogAttribute.java
index ead786f..9708c49 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/LogAttribute.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/LogAttribute.java
@@ -44,7 +44,7 @@ import org.apache.nifi.processor.io.InputStreamCallback;
 import org.apache.nifi.processor.util.StandardValidators;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @EventDriven
 @SideEffectFree

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
index 2c1526b..0cce0f2 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
@@ -62,7 +62,7 @@ import org.apache.nifi.processor.io.StreamCallback;
 import org.apache.nifi.processor.util.StandardValidators;
 import org.apache.nifi.util.StopWatch;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @EventDriven
 @SideEffectFree

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/SplitXml.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/SplitXml.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/SplitXml.java
index b51b7e9..5f0993f 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/SplitXml.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/SplitXml.java
@@ -49,7 +49,7 @@ import org.apache.nifi.processor.util.StandardValidators;
 import org.apache.nifi.processors.standard.util.XmlElementNotifier;
 import org.apache.nifi.util.BooleanHolder;
 
-import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang3.StringEscapeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
index 2d4f445..d78c139 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
@@ -58,7 +58,7 @@ import org.apache.nifi.util.FlowFileUnpackagerV2;
 import org.apache.nifi.util.FlowFileUnpackagerV3;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @Path(ListenHTTP.URI)
 public class ListenHTTPServlet extends HttpServlet {

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/util/UDPStreamConsumer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/util/UDPStreamConsumer.java b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/util/UDPStreamConsumer.java
index e8f9259..f0802a8 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/util/UDPStreamConsumer.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/main/java/org/apache/nifi/processors/standard/util/UDPStreamConsumer.java
@@ -35,9 +35,9 @@ import org.apache.nifi.logging.ProcessorLog;
 import org.apache.nifi.processor.ProcessSession;
 import org.apache.nifi.processor.io.OutputStreamCallback;
 
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
  *

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-processors/src/test/java/org/apache/nifi/processors/standard/TestDetectDuplicate.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-processors/src/test/java/org/apache/nifi/processors/standard/TestDetectDuplicate.java b/nar-bundles/standard-bundle/standard-processors/src/test/java/org/apache/nifi/processors/standard/TestDetectDuplicate.java
index 8ee22a1..4fae6ed 100644
--- a/nar-bundles/standard-bundle/standard-processors/src/test/java/org/apache/nifi/processors/standard/TestDetectDuplicate.java
+++ b/nar-bundles/standard-bundle/standard-processors/src/test/java/org/apache/nifi/processors/standard/TestDetectDuplicate.java
@@ -37,7 +37,7 @@ import org.apache.nifi.util.MockControllerServiceInitializationContext;
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 
-import org.apache.commons.lang.SerializationException;
+import org.apache.commons.lang3.SerializationException;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-bundle/standard-reporting-tasks/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-bundle/standard-reporting-tasks/pom.xml b/nar-bundles/standard-bundle/standard-reporting-tasks/pom.xml
index 924c64c..605614b 100644
--- a/nar-bundles/standard-bundle/standard-reporting-tasks/pom.xml
+++ b/nar-bundles/standard-bundle/standard-reporting-tasks/pom.xml
@@ -52,15 +52,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.9</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
-            <version>1.9.5</version>
             <scope>test</scope>
         </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/pom.xml b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/pom.xml
deleted file mode 100644
index 0f8040a..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>distributed-cache-client-service-api</artifactId>
-    <packaging>jar</packaging>
-
-    <name>Distributed Cache Client Service API</name>
-    <description>Provides an API for a Client that interfaces with a Distributed Cache</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-        </dependency>
-    </dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java
deleted file mode 100644
index 017119f..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.IOException;
-
-import org.apache.nifi.distributed.cache.client.exception.DeserializationException;
-
-/**
- * Provides an interface for deserializing an array of bytes into an Object
- *
- * @param <T>
- */
-public interface Deserializer<T> {
-
-    /**
-     * Deserializes the given byte array input an Object and returns that value.
-     *
-     * @param input
-     * @return
-     * @throws DeserializationException if a valid object cannot be deserialized
-     * from the given byte array
-     * @throws java.io.IOException
-     */
-    T deserialize(byte[] input) throws DeserializationException, IOException;
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java
deleted file mode 100644
index 5bead8c..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedMapCacheClient.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.IOException;
-
-import org.apache.nifi.controller.ControllerService;
-
-/**
- * This interface defines an API that can be used for interacting with a
- * Distributed Cache that functions similarly to a {@link java.util.Map Map}.
- *
- */
-public interface DistributedMapCacheClient extends ControllerService {
-
-    /**
-     * Adds the specified key and value to the cache, if they are not already
-     * present, serializing the key and value with the given
-     * {@link Serializer}s.
-     *
-     * @param <K>
-     * @param <V>
-     * @param key the key for into the map
-     * @param value the value to add to the map if and only if the key is absent
-     * @param keySerializer
-     * @param valueSerializer
-     * @return true if the value was added to the cache, false if the value
-     * already existed in the cache
-     *
-     * @throws IOException if unable to communicate with the remote instance
-     */
-    <K, V> boolean putIfAbsent(K key, V value, Serializer<K> keySerializer, Serializer<V> valueSerializer) throws IOException;
-
-    /**
-     * Adds the specified key and value to the cache, if they are not already
-     * present, serializing the key and value with the given
-     * {@link Serializer}s. If a value already exists in the cache for the given
-     * key, the value associated with the key is returned, after being
-     * deserialized with the given valueDeserializer.
-     *
-     * @param <K>
-     * @param <V>
-     * @param key
-     * @param value
-     * @param keySerializer
-     * @param valueSerializer
-     * @param valueDeserializer
-     * @return
-     * @throws IOException
-     */
-    <K, V> V getAndPutIfAbsent(K key, V value, Serializer<K> keySerializer, Serializer<V> valueSerializer, Deserializer<V> valueDeserializer) throws IOException;
-
-    /**
-     * Determines if the given value is present in the cache and if so returns
-     * <code>true</code>, else returns <code>false</code>
-     *
-     * @param <K>
-     * @param key
-     * @param keySerializer
-     * @return
-     *
-     * @throws IOException if unable to communicate with the remote instance
-     */
-    <K> boolean containsKey(K key, Serializer<K> keySerializer) throws IOException;
-
-    /**
-     * Returns the value in the cache for the given key, if one exists;
-     * otherwise returns <code>null</code>
-     *
-     * @param <K>
-     * @param <V>
-     * @param key the key to lookup in the map
-     * @param keySerializer
-     * @param valueDeserializer
-     *
-     * @return
-     * @throws IOException
-     */
-    <K, V> V get(K key, Serializer<K> keySerializer, Deserializer<V> valueDeserializer) throws IOException;
-
-    /**
-     * Attempts to notify the server that we are finished communicating with it
-     * and cleans up resources
-     * @throws java.io.IOException
-     */
-    void close() throws IOException;
-
-    /**
-     * Removes the entry with the given key from the cache, if it is present.
-     *
-     * @param <K>
-     * @param key
-     * @param serializer
-     * @return <code>true</code> if the entry is removed, <code>false</code> if
-     * the key did not exist in the cache
-     * @throws IOException
-     */
-    <K> boolean remove(K key, Serializer<K> serializer) throws IOException;
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java
deleted file mode 100644
index 12aae3e..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/DistributedSetCacheClient.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.IOException;
-
-import org.apache.nifi.controller.ControllerService;
-
-/**
- * This interface defines an API that can be used for interacting with a
- * Distributed Cache that functions similarly to a {@link java.util.Set Set}.
- */
-public interface DistributedSetCacheClient extends ControllerService {
-
-    /**
-     * Adds the specified value to the cache, serializing the value with the
-     * given {@link Serializer}.
-     *
-     * @param <T>
-     * @param value
-     * @param serializer
-     * @return true if the value was added to the cache, false if the value
-     * already existed in the cache
-     *
-     * @throws IOException if unable to communicate with the remote instance
-     */
-    <T> boolean addIfAbsent(T value, Serializer<T> serializer) throws IOException;
-
-    /**
-     * Returns if the given value is present in the cache and if so returns
-     * <code>true</code>, else returns <code>false</code>
-     *
-     * @param <T>
-     * @param value
-     * @param serializer
-     * @return
-     *
-     * @throws IOException if unable to communicate with the remote instance
-     */
-    <T> boolean contains(T value, Serializer<T> serializer) throws IOException;
-
-    /**
-     * Removes the given value from the cache, if it is present.
-     *
-     * @param <T>
-     * @param value
-     * @param serializer
-     * @return <code>true</code> if the value is removed, <code>false</code> if
-     * the value did not exist in the cache
-     * @throws IOException
-     */
-    <T> boolean remove(T value, Serializer<T> serializer) throws IOException;
-
-    /**
-     * Attempts to notify the server that we are finished communicating with it
-     * and cleans up resources
-     * @throws java.io.IOException
-     */
-    void close() throws IOException;
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java
deleted file mode 100644
index f1896be..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Serializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.nifi.distributed.cache.client.exception.SerializationException;
-
-/**
- * Provides a mechanism by which a value can be serialized to a stream of bytes
- * @param <T>
- */
-public interface Serializer<T> {
-
-    /**
-     * Serializes the given value to the {@link OutputStream}
-     *
-     * @param value
-     * @param output
-     * @throws SerializationException If unable to serialize the given value
-     * @throws java.io.IOException
-     */
-    void serialize(T value, OutputStream output) throws SerializationException, IOException;
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java
deleted file mode 100644
index bb2fcb2..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/DeserializationException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client.exception;
-
-public class DeserializationException extends RuntimeException {
-
-    public DeserializationException(final Throwable cause) {
-        super(cause);
-    }
-
-    public DeserializationException(final String message) {
-        super(message);
-    }
-
-    public DeserializationException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java b/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java
deleted file mode 100644
index aac59f5..0000000
--- a/nar-bundles/standard-services-api-bundle/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/exception/SerializationException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.nifi.distributed.cache.client.exception;
-
-public class SerializationException extends RuntimeException {
-
-    public SerializationException(final Throwable cause) {
-        super(cause);
-    }
-
-    public SerializationException(final String message) {
-        super(message);
-    }
-
-    public SerializationException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/load-distribution-service-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/load-distribution-service-api/pom.xml b/nar-bundles/standard-services-api-bundle/load-distribution-service-api/pom.xml
deleted file mode 100644
index df8a40c..0000000
--- a/nar-bundles/standard-services-api-bundle/load-distribution-service-api/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>load-distribution-service-api</artifactId>
-    <packaging>jar</packaging>
-
-    <name>Load Distribution Service API</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java b/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java
deleted file mode 100644
index 656bf99..0000000
--- a/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.nifi.loading;
-
-import java.util.Map;
-
-public interface LoadDistributionListener {
-
-    public void update(Map<String, Integer> loadInfo);
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java b/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java
deleted file mode 100644
index c413975..0000000
--- a/nar-bundles/standard-services-api-bundle/load-distribution-service-api/src/main/java/org/apache/nifi/loading/LoadDistributionService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.nifi.loading;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.nifi.controller.ControllerService;
-
-/**
- * A service that will provide a Map of Fully Qualified Domain Names (fqdn) with
- * their respective weights (scale of 1 - 100).
- */
-public interface LoadDistributionService extends ControllerService {
-
-    public Map<String, Integer> getLoadDistribution(Set<String> fqdns);
-
-    public Map<String, Integer> getLoadDistribution(Set<String> fqdns, LoadDistributionListener listener);
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/pom.xml b/nar-bundles/standard-services-api-bundle/pom.xml
deleted file mode 100644
index 27c0545..0000000
--- a/nar-bundles/standard-services-api-bundle/pom.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>standard-services-api-bundle</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>pom</packaging>
-
-    <name>Standard Services API Bundle</name>
-
-    <properties>
-        <standard.services.api.version>0.0.1-SNAPSHOT</standard.services.api.version>
-    </properties>
-    
-    <modules>
-        <module>distributed-cache-client-service-api</module>
-        <module>ssl-context-service-api</module>
-        <module>load-distribution-service-api</module>
-        <module>standard-services-api-nar</module>
-    </modules>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>standard-services-api-nar</artifactId>
-                <version>${standard.services.api.version}</version>
-                <type>nar</type>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-security-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>ssl-context-service-api</artifactId>
-                <version>${standard.services.api.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>distributed-cache-client-service-api</artifactId>
-                <version>${standard.services.api.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>load-distribution-service-api</artifactId>
-                <version>${standard.services.api.version}</version>
-                <scope>provided</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/ssl-context-service-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/ssl-context-service-api/pom.xml b/nar-bundles/standard-services-api-bundle/ssl-context-service-api/pom.xml
deleted file mode 100644
index a25e624..0000000
--- a/nar-bundles/standard-services-api-bundle/ssl-context-service-api/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>ssl-context-service-api</artifactId>
-    <packaging>jar</packaging>
-
-    <name>SSL Context Service API</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java b/nar-bundles/standard-services-api-bundle/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java
deleted file mode 100644
index 7c71a8e..0000000
--- a/nar-bundles/standard-services-api-bundle/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.nifi.ssl;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.controller.ControllerService;
-import org.apache.nifi.processor.exception.ProcessException;
-
-/**
- * Definition for SSLContextService.
- *
- */
-public interface SSLContextService extends ControllerService {
-
-    public static enum ClientAuth {
-
-        WANT,
-        REQUIRED,
-        NONE
-    }
-
-    public SSLContext createSSLContext(final ClientAuth clientAuth) throws ProcessException;
-
-    public String getTrustStoreFile();
-
-    public String getTrustStoreType();
-
-    public String getTrustStorePassword();
-
-    public boolean isTrustStoreConfigured();
-
-    public String getKeyStoreFile();
-
-    public String getKeyStoreType();
-
-    public String getKeyStorePassword();
-
-    public boolean isKeyStoreConfigured();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services-api-bundle/standard-services-api-nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services-api-bundle/standard-services-api-nar/pom.xml b/nar-bundles/standard-services-api-bundle/standard-services-api-nar/pom.xml
deleted file mode 100644
index bb83a8e..0000000
--- a/nar-bundles/standard-services-api-bundle/standard-services-api-nar/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>standard-services-api-bundle</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
-	
-	<artifactId>standard-services-api-nar</artifactId>
-	<name>Standard Services API Nar</name>
-	<packaging>nar</packaging>
-	
-	<dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>ssl-context-service-api</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>distributed-cache-client-service-api</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-        	<groupId>org.apache.nifi</groupId>
-        	<artifactId>load-distribution-service-api</artifactId>
-        	<scope>compile</scope>
-        </dependency>
-	</dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/pom.xml b/nar-bundles/standard-services/distributed-cache-client-service-api/pom.xml
new file mode 100644
index 0000000..1a7241f
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/pom.xml
@@ -0,0 +1,36 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>standard-services-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>distributed-cache-client-service-api</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Distributed Cache Client Service API</name>
+    <description>Provides an API for a Client that interfaces with a Distributed Cache</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java
new file mode 100644
index 0000000..017119f
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-client-service-api/src/main/java/org/apache/nifi/distributed/cache/client/Deserializer.java
@@ -0,0 +1,41 @@
+/*
+ * 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.nifi.distributed.cache.client;
+
+import java.io.IOException;
+
+import org.apache.nifi.distributed.cache.client.exception.DeserializationException;
+
+/**
+ * Provides an interface for deserializing an array of bytes into an Object
+ *
+ * @param <T>
+ */
+public interface Deserializer<T> {
+
+    /**
+     * Deserializes the given byte array input an Object and returns that value.
+     *
+     * @param input
+     * @return
+     * @throws DeserializationException if a valid object cannot be deserialized
+     * from the given byte array
+     * @throws java.io.IOException
+     */
+    T deserialize(byte[] input) throws DeserializationException, IOException;
+
+}


[14/19] incubator-nifi git commit: NIFI-169 Fixed classpath issue affecting startup

Posted by jo...@apache.org.
NIFI-169 Fixed classpath issue affecting startup


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

Branch: refs/heads/develop
Commit: 675ea6611c3e941df05f88dacb6c691bd9712206
Parents: dd57a33
Author: joewitt <jo...@apache.org>
Authored: Mon Dec 15 05:53:03 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Mon Dec 15 05:53:03 2014 -0500

----------------------------------------------------------------------
 nar-bundles/framework-bundle/framework/runtime/pom.xml        | 2 ++
 nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml | 5 +++++
 2 files changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/675ea661/nar-bundles/framework-bundle/framework/runtime/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/runtime/pom.xml b/nar-bundles/framework-bundle/framework/runtime/pom.xml
index e193729..defa994 100644
--- a/nar-bundles/framework-bundle/framework/runtime/pom.xml
+++ b/nar-bundles/framework-bundle/framework/runtime/pom.xml
@@ -27,10 +27,12 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-nar</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-properties</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/675ea661/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml b/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
index 3cdeb07..f896479 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
+++ b/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
@@ -42,6 +42,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-properties</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-security</artifactId>
             <scope>compile</scope>
         </dependency>


[02/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java b/nar-bundles/standard-services/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.java
new file mode 100644
index 0000000..7c71a8e
--- /dev/null
+++ b/nar-bundles/standard-services/ssl-context-service-api/src/main/java/org/apache/nifi/ssl/SSLContextService.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 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.nifi.ssl;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.controller.ControllerService;
+import org.apache.nifi.processor.exception.ProcessException;
+
+/**
+ * Definition for SSLContextService.
+ *
+ */
+public interface SSLContextService extends ControllerService {
+
+    public static enum ClientAuth {
+
+        WANT,
+        REQUIRED,
+        NONE
+    }
+
+    public SSLContext createSSLContext(final ClientAuth clientAuth) throws ProcessException;
+
+    public String getTrustStoreFile();
+
+    public String getTrustStoreType();
+
+    public String getTrustStorePassword();
+
+    public boolean isTrustStoreConfigured();
+
+    public String getKeyStoreFile();
+
+    public String getKeyStoreType();
+
+    public String getKeyStorePassword();
+
+    public boolean isKeyStoreConfigured();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/standard-services-api-nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/standard-services-api-nar/pom.xml b/nar-bundles/standard-services/standard-services-api-nar/pom.xml
new file mode 100644
index 0000000..18cb7c8
--- /dev/null
+++ b/nar-bundles/standard-services/standard-services-api-nar/pom.xml
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>standard-services-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+	
+    <artifactId>standard-services-api-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>Standard Services API Nar</name>
+    <packaging>nar</packaging>
+	
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>ssl-context-service-api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>distributed-cache-client-service-api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>load-distribution-service-api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/update-attribute-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/update-attribute-bundle/nar/pom.xml b/nar-bundles/update-attribute-bundle/nar/pom.xml
index dcebdd1..8a5a5c7 100644
--- a/nar-bundles/update-attribute-bundle/nar/pom.xml
+++ b/nar-bundles/update-attribute-bundle/nar/pom.xml
@@ -1,18 +1,18 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-<!--
-  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.
--->
+    <!--
+      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.
+    -->
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.nifi</groupId>
@@ -28,24 +28,21 @@
     
     <dependencies>
         <dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>nifi-processor-utils</artifactId>
-		</dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-processor-utils</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>update-attribute-processor</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>update-attribute-model</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>update-attribute-ui</artifactId>
             <type>war</type>
-            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/update-attribute-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/update-attribute-bundle/pom.xml b/nar-bundles/update-attribute-bundle/pom.xml
index bc43337..18d16da 100644
--- a/nar-bundles/update-attribute-bundle/pom.xml
+++ b/nar-bundles/update-attribute-bundle/pom.xml
@@ -17,7 +17,7 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -26,7 +26,6 @@
     <name>Update Attribute Bundle</name>
     <packaging>pom</packaging>
 
-
     <modules>
         <module>model</module>
         <module>processor</module>
@@ -38,31 +37,19 @@
         <dependencies>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-processor-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>update-attribute-model</artifactId>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-expression-language</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>update-attribute-processor</artifactId>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-core-flowfile-attributes</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>custom-ui-utilities</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-
-
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
+                <artifactId>update-attribute-ui</artifactId>
+                <type>war</type>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/update-attribute-bundle/processor/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/update-attribute-bundle/processor/pom.xml b/nar-bundles/update-attribute-bundle/processor/pom.xml
index eba467a..5167de6 100644
--- a/nar-bundles/update-attribute-bundle/processor/pom.xml
+++ b/nar-bundles/update-attribute-bundle/processor/pom.xml
@@ -28,7 +28,6 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>update-attribute-model</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/update-attribute-bundle/ui/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/update-attribute-bundle/ui/pom.xml b/nar-bundles/update-attribute-bundle/ui/pom.xml
index 8fab0e9..458027f 100644
--- a/nar-bundles/update-attribute-bundle/ui/pom.xml
+++ b/nar-bundles/update-attribute-bundle/ui/pom.xml
@@ -27,7 +27,6 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>update-attribute-model</artifactId>
-            <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -71,27 +70,22 @@
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-server</artifactId>
-            <version>1.12</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-core</artifactId>
-            <version>1.12</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-json</artifactId>
-            <version>1.12</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-servlet</artifactId>
-            <version>1.12</version>
         </dependency>
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/update-attribute-bundle/ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java
----------------------------------------------------------------------
diff --git a/nar-bundles/update-attribute-bundle/ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java b/nar-bundles/update-attribute-bundle/ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java
index 6cb9b53..cb978cc 100644
--- a/nar-bundles/update-attribute-bundle/ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java
+++ b/nar-bundles/update-attribute-bundle/ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java
@@ -64,7 +64,7 @@ import org.apache.nifi.web.NiFiWebContextConfig;
 import org.apache.nifi.web.ProcessorInfo;
 import org.apache.nifi.web.Revision;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import com.sun.jersey.api.NotFoundException;
 import org.apache.nifi.update.attributes.FlowFilePolicy;

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/volatile-provenance-repository-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/volatile-provenance-repository-bundle/nar/pom.xml b/nar-bundles/volatile-provenance-repository-bundle/nar/pom.xml
index 8e85dd9..bfa9daa 100644
--- a/nar-bundles/volatile-provenance-repository-bundle/nar/pom.xml
+++ b/nar-bundles/volatile-provenance-repository-bundle/nar/pom.xml
@@ -17,11 +17,12 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>volatile-provenance-repository-bundle</artifactId>
+        <artifactId>volatile-provenance-repository-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>volatile-provenance-repository-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
     <packaging>nar</packaging>
 
     <name>volatile-provenance-repository-nar</name>
@@ -30,7 +31,6 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>volatile-provenance-repository</artifactId>
-            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/volatile-provenance-repository-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/volatile-provenance-repository-bundle/pom.xml b/nar-bundles/volatile-provenance-repository-bundle/pom.xml
index 4449e30..34b1fa1 100644
--- a/nar-bundles/volatile-provenance-repository-bundle/pom.xml
+++ b/nar-bundles/volatile-provenance-repository-bundle/pom.xml
@@ -17,11 +17,11 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
-    <artifactId>volatile-provenance-repository-bundle</artifactId>
+    <artifactId>volatile-provenance-repository-parent</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>Volatile Provenance Repository</name>
     <packaging>pom</packaging>
@@ -30,19 +30,15 @@
         <module>volatile-provenance-repository</module>
         <module>nar</module>
     </modules>
-	
+    
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>data-provenance-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>volatile-provenance-repository</artifactId>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/volatile-provenance-repository-bundle/volatile-provenance-repository/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/volatile-provenance-repository-bundle/volatile-provenance-repository/pom.xml b/nar-bundles/volatile-provenance-repository-bundle/volatile-provenance-repository/pom.xml
index 5bc0cc3..854bf31 100644
--- a/nar-bundles/volatile-provenance-repository-bundle/volatile-provenance-repository/pom.xml
+++ b/nar-bundles/volatile-provenance-repository-bundle/volatile-provenance-repository/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>volatile-provenance-repository-bundle</artifactId>
+        <artifactId>volatile-provenance-repository-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/nar-maven-plugin/pom.xml b/nar-maven-plugin/pom.xml
new file mode 100644
index 0000000..7b7aabf
--- /dev/null
+++ b/nar-maven-plugin/pom.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nifi-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.nifi</groupId>
+    <artifactId>nar-maven-plugin</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>maven-plugin</packaging>
+    <name>Apache NiFi NAR Plugin</name>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>default-descriptor</id>
+                        <goals>
+                            <goal>descriptor</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                    <execution>
+                        <id>help-descriptor</id>
+                        <goals>
+                            <goal>helpmojo</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <type>maven-plugin</type>
+        </dependency>
+        <dependency>
+            <!-- No code from maven-jar-plugin is actually used; it's included
+            just to simplify the dependencies list.                     -->
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-jar-plugin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.plugin-tools</groupId>
+            <artifactId>maven-plugin-annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-maven-plugin/src/main/java/nifi/NarMojo.java
----------------------------------------------------------------------
diff --git a/nar-maven-plugin/src/main/java/nifi/NarMojo.java b/nar-maven-plugin/src/main/java/nifi/NarMojo.java
new file mode 100644
index 0000000..5196f73
--- /dev/null
+++ b/nar-maven-plugin/src/main/java/nifi/NarMojo.java
@@ -0,0 +1,610 @@
+/*
+ * 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 nifi;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.archiver.MavenArchiver;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.installer.ArtifactInstaller;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.dependency.utils.DependencyStatusSets;
+import org.apache.maven.plugin.dependency.utils.DependencyUtil;
+import org.apache.maven.plugin.dependency.utils.filters.DestFileFilter;
+import org.apache.maven.plugin.dependency.utils.resolvers.ArtifactsResolver;
+import org.apache.maven.plugin.dependency.utils.resolvers.DefaultArtifactsResolver;
+import org.apache.maven.plugin.dependency.utils.translators.ArtifactTranslator;
+import org.apache.maven.plugin.dependency.utils.translators.ClassifierTypeTranslator;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
+import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
+import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
+import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
+import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
+import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
+import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
+import org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
+import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
+import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.archiver.jar.JarArchiver;
+import org.codehaus.plexus.archiver.jar.ManifestException;
+import org.codehaus.plexus.archiver.manager.ArchiverManager;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * Packages the current project as an Apache NiFi Archive (NAR).
+ *
+ * The following code is derived from maven-dependencies-plugin and
+ * maven-jar-plugin. The functionality of CopyDependenciesMojo and JarMojo was
+ * simplified to the use case of NarMojo.
+ *
+ */
+@Mojo(name = "nar", defaultPhase = LifecyclePhase.PACKAGE, threadSafe = false, requiresDependencyResolution = ResolutionScope.RUNTIME)
+public class NarMojo extends AbstractMojo {
+
+    private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"};
+    private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
+
+    /**
+     * POM
+     *
+     */
+    @Parameter(defaultValue = "${project}", readonly = true, required = true)
+    protected MavenProject project;
+
+    @Parameter(defaultValue = "${session}", readonly = true, required = true)
+    protected MavenSession session;
+
+    /**
+     * List of files to include. Specified as fileset patterns.
+     */
+    @Parameter(property = "includes")
+    protected String[] includes;
+    /**
+     * List of files to exclude. Specified as fileset patterns.
+     */
+    @Parameter(property = "excludes")
+    protected String[] excludes;
+    /**
+     * Name of the generated NAR.
+     *
+     */
+    @Parameter(alias = "narName", property = "nar.finalName", defaultValue = "${project.build.finalName}", required = true)
+    protected String finalName;
+
+    /**
+     * The Jar archiver.
+     *
+     * \@\component role="org.codehaus.plexus.archiver.Archiver" roleHint="jar"
+     */
+    @Component(role = org.codehaus.plexus.archiver.Archiver.class, hint = "jar")
+    private JarArchiver jarArchiver;
+    /**
+     * The archive configuration to use.
+     *
+     * See <a
+     * href="http://maven.apache.org/shared/maven-archiver/index.html">the
+     * documentation for Maven Archiver</a>.
+     *
+     */
+    @Parameter(property = "archive")
+    protected final MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+    /**
+     * Path to the default MANIFEST file to use. It will be used if
+     * <code>useDefaultManifestFile</code> is set to <code>true</code>.
+     *
+     */
+    @Parameter(property = "defaultManifestFiles", defaultValue = "${project.build.outputDirectory}/META-INF/MANIFEST.MF", readonly = true, required = true)
+    protected File defaultManifestFile;
+
+    /**
+     * Set this to <code>true</code> to enable the use of the
+     * <code>defaultManifestFile</code>.
+     *
+     * @since 2.2
+     */
+    @Parameter(property = "nar.useDefaultManifestFile", defaultValue = "false")
+    protected boolean useDefaultManifestFile;
+
+    @Component
+    protected MavenProjectHelper projectHelper;
+
+    /**
+     * Whether creating the archive should be forced.
+     *
+     */
+    @Parameter(property = "nar.forceCreation", defaultValue = "false")
+    protected boolean forceCreation;
+
+    /**
+     * Classifier to add to the artifact generated. If given, the artifact will
+     * be an attachment instead.
+     *
+     */
+    @Parameter(property = "classifier")
+    protected String classifier;
+
+    @Component
+    protected ArtifactInstaller installer;
+
+    @Component
+    protected ArtifactRepositoryFactory repositoryFactory;
+
+    /**
+     * This only applies if the classifier parameter is used.
+     *
+     */
+    @Parameter(property = "mdep.failOnMissingClassifierArtifact", defaultValue = "true", required = false)
+    protected boolean failOnMissingClassifierArtifact = true;
+
+    /**
+     * Comma Separated list of Types to include. Empty String indicates include
+     * everything (default).
+     *
+     */
+    @Parameter(property = "includeTypes", required = false)
+    protected String includeTypes;
+
+    /**
+     * Comma Separated list of Types to exclude. Empty String indicates don't
+     * exclude anything (default).
+     *
+     */
+    @Parameter(property = "excludeTypes", required = false)
+    protected String excludeTypes;
+
+    /**
+     * Scope to include. An Empty string indicates all scopes (default).
+     *
+     */
+    @Parameter(property = "includeScope", required = false)
+    protected String includeScope;
+
+    /**
+     * Scope to exclude. An Empty string indicates no scopes (default).
+     *
+     */
+    @Parameter(property = "excludeScope", required = false)
+    protected String excludeScope;
+
+    /**
+     * Comma Separated list of Classifiers to include. Empty String indicates
+     * include everything (default).
+     *
+     */
+    @Parameter(property = "includeClassifiers", required = false)
+    protected String includeClassifiers;
+
+    /**
+     * Comma Separated list of Classifiers to exclude. Empty String indicates
+     * don't exclude anything (default).
+     *
+     */
+    @Parameter(property = "excludeClassifiers", required = false)
+    protected String excludeClassifiers;
+
+    /**
+     * Specify classifier to look for. Example: sources
+     *
+     */
+    @Parameter(property = "classifier", required = false)
+    protected String copyDepClassifier;
+
+    /**
+     * Specify type to look for when constructing artifact based on classifier.
+     * Example: java-source,jar,war, nar
+     *
+     */
+    @Parameter(property = "type", required = false, defaultValue = "nar")
+    protected String type;
+
+    /**
+     * Comma separated list of Artifact names too exclude.
+     *
+     */
+    @Parameter(property = "excludeArtifacts", required = false)
+    protected String excludeArtifactIds;
+
+    /**
+     * Comma separated list of Artifact names to include.
+     *
+     */
+    @Parameter(property = "includeArtifacts", required = false)
+    protected String includeArtifactIds;
+
+    /**
+     * Comma separated list of GroupId Names to exclude.
+     *
+     */
+    @Parameter(property = "excludeArtifacts", required = false)
+    protected String excludeGroupIds;
+
+    /**
+     * Comma separated list of GroupIds to include.
+     *
+     */
+    @Parameter(property = "includeGroupIds", required = false)
+    protected String includeGroupIds;
+
+    /**
+     * Directory to store flag files
+     *
+     */
+    @Parameter(property = "markersDirectory", required = false, defaultValue = "${project.build.directory}/dependency-maven-plugin-markers")
+    protected File markersDirectory;
+
+    /**
+     * Overwrite release artifacts
+     *
+     */
+    @Parameter(property = "overWriteReleases", required = false)
+    protected boolean overWriteReleases;
+
+    /**
+     * Overwrite snapshot artifacts
+     *
+     */
+    @Parameter(property = "overWriteSnapshots", required = false)
+    protected boolean overWriteSnapshots;
+
+    /**
+     * Overwrite artifacts that don't exist or are older than the source.
+     *
+     */
+    @Parameter(property = "overWriteIfNewer", required = false, defaultValue = "true")
+    protected boolean overWriteIfNewer;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     */
+    @Component
+    protected ArtifactFactory factory;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     *
+     */
+    @Component
+    protected ArtifactResolver resolver;
+
+    /**
+     * Artifact collector, needed to resolve dependencies.
+     *
+     */
+    @Component(role = org.apache.maven.artifact.resolver.ArtifactCollector.class)
+    protected ArtifactCollector artifactCollector;
+
+    @Component(role = org.apache.maven.artifact.metadata.ArtifactMetadataSource.class)
+    protected ArtifactMetadataSource artifactMetadataSource;
+
+    /**
+     * Location of the local repository.
+     *
+     */
+    @Parameter(property = "localRepository", required = true, readonly = true)
+    protected ArtifactRepository local;
+
+    /**
+     * List of Remote Repositories used by the resolver
+     *
+     */
+    @Parameter(property = "project.remoteArtifactRepositories", required = true, readonly = true)
+    protected List remoteRepos;
+
+    /**
+     * To look up Archiver/UnArchiver implementations
+     *
+     */
+    @Component
+    protected ArchiverManager archiverManager;
+
+    /**
+     * Contains the full list of projects in the reactor.
+     *
+     */
+    @Parameter(property = "reactorProjects", required = true, readonly = true)
+    protected List reactorProjects;
+
+    /**
+     * If the plugin should be silent.
+     *
+     */
+    @Parameter(property = "silent", required = false, defaultValue = "false")
+    public boolean silent;
+
+    /**
+     * Output absolute filename for resolved artifacts
+     *
+     */
+    @Parameter(property = "outputAbsoluteArtifactFilename", defaultValue = "false", required = false)
+    protected boolean outputAbsoluteArtifactFilename;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        copyDependencies();
+        makeNar();
+    }
+
+    private void copyDependencies() throws MojoExecutionException {
+        DependencyStatusSets dss = getDependencySets(this.failOnMissingClassifierArtifact);
+        Set artifacts = dss.getResolvedDependencies();
+
+        for (Object artifactObj : artifacts) {
+            copyArtifact((Artifact) artifactObj);
+        }
+
+        artifacts = dss.getSkippedDependencies();
+        for (Object artifactOjb : artifacts) {
+            Artifact artifact = (Artifact) artifactOjb;
+            getLog().info(artifact.getFile().getName() + " already exists in destination.");
+        }
+    }
+
+    protected void copyArtifact(Artifact artifact) throws MojoExecutionException {
+        String destFileName = DependencyUtil.getFormattedFileName(artifact, false);
+        final File destDir = DependencyUtil.getFormattedOutputDirectory(false, false, false, false, false, getDependenciesDirectory(), artifact);
+        final File destFile = new File(destDir, destFileName);
+        copyFile(artifact.getFile(), destFile);
+    }
+
+    protected Artifact getResolvedPomArtifact(Artifact artifact) {
+        Artifact pomArtifact = this.factory.createArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "", "pom");
+        // Resolve the pom artifact using repos
+        try {
+            this.resolver.resolve(pomArtifact, this.remoteRepos, this.local);
+        } catch (ArtifactResolutionException | ArtifactNotFoundException e) {
+            getLog().info(e.getMessage());
+        }
+        return pomArtifact;
+    }
+
+    protected ArtifactsFilter getMarkedArtifactFilter() {
+        return new DestFileFilter(this.overWriteReleases, this.overWriteSnapshots, this.overWriteIfNewer, false, false, false, false, false, getDependenciesDirectory());
+    }
+
+    protected DependencyStatusSets getDependencySets(boolean stopOnFailure) throws MojoExecutionException {
+        // add filters in well known order, least specific to most specific
+        FilterArtifacts filter = new FilterArtifacts();
+
+        filter.addFilter(new ProjectTransitivityFilter(project.getDependencyArtifacts(), false));
+        filter.addFilter(new ScopeFilter(this.includeScope, this.excludeScope));
+        filter.addFilter(new TypeFilter(this.includeTypes, this.excludeTypes));
+        filter.addFilter(new ClassifierFilter(this.includeClassifiers, this.excludeClassifiers));
+        filter.addFilter(new GroupIdFilter(this.includeGroupIds, this.excludeGroupIds));
+        filter.addFilter(new ArtifactIdFilter(this.includeArtifactIds, this.excludeArtifactIds));
+
+        // explicitly filter our nar dependencies
+        filter.addFilter(new TypeFilter("", "nar"));
+
+        // start with all artifacts.
+        Set artifacts = project.getArtifacts();
+
+        // perform filtering
+        try {
+            artifacts = filter.filter(artifacts);
+        } catch (ArtifactFilterException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // transform artifacts if classifier is set
+        final DependencyStatusSets status;
+        if (StringUtils.isNotEmpty(copyDepClassifier)) {
+            status = getClassifierTranslatedDependencies(artifacts, stopOnFailure);
+        } else {
+            status = filterMarkedDependencies(artifacts);
+        }
+
+        return status;
+    }
+
+    protected DependencyStatusSets getClassifierTranslatedDependencies(Set artifacts, boolean stopOnFailure) throws MojoExecutionException {
+        Set unResolvedArtifacts = new HashSet();
+        Set resolvedArtifacts = artifacts;
+        DependencyStatusSets status = new DependencyStatusSets();
+
+        // possibly translate artifacts into a new set of artifacts based on the
+        // classifier and type
+        // if this did something, we need to resolve the new artifacts
+        if (StringUtils.isNotEmpty(copyDepClassifier)) {
+            ArtifactTranslator translator = new ClassifierTypeTranslator(this.copyDepClassifier, this.type, this.factory);
+            artifacts = translator.translate(artifacts, getLog());
+
+            status = filterMarkedDependencies(artifacts);
+
+            // the unskipped artifacts are in the resolved set.
+            artifacts = status.getResolvedDependencies();
+
+            // resolve the rest of the artifacts
+            ArtifactsResolver artifactsResolver = new DefaultArtifactsResolver(this.resolver, this.local,
+                    this.remoteRepos, stopOnFailure);
+            resolvedArtifacts = artifactsResolver.resolve(artifacts, getLog());
+
+            // calculate the artifacts not resolved.
+            unResolvedArtifacts.addAll(artifacts);
+            unResolvedArtifacts.removeAll(resolvedArtifacts);
+        }
+
+        // return a bean of all 3 sets.
+        status.setResolvedDependencies(resolvedArtifacts);
+        status.setUnResolvedDependencies(unResolvedArtifacts);
+
+        return status;
+    }
+
+    protected DependencyStatusSets filterMarkedDependencies(Set artifacts) throws MojoExecutionException {
+        // remove files that have markers already
+        FilterArtifacts filter = new FilterArtifacts();
+        filter.clearFilters();
+        filter.addFilter(getMarkedArtifactFilter());
+
+        Set unMarkedArtifacts;
+        try {
+            unMarkedArtifacts = filter.filter(artifacts);
+        } catch (ArtifactFilterException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // calculate the skipped artifacts
+        Set skippedArtifacts = new HashSet();
+        skippedArtifacts.addAll(artifacts);
+        skippedArtifacts.removeAll(unMarkedArtifacts);
+
+        return new DependencyStatusSets(unMarkedArtifacts, null, skippedArtifacts);
+    }
+
+    protected void copyFile(File artifact, File destFile) throws MojoExecutionException {
+        try {
+            getLog().info("Copying " + (this.outputAbsoluteArtifactFilename ? artifact.getAbsolutePath() : artifact.getName()) + " to " + destFile);
+            FileUtils.copyFile(artifact, destFile);
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error copying artifact from " + artifact + " to " + destFile, e);
+        }
+    }
+
+    private File getClassesDirectory() {
+        final File outputDirectory = new File(project.getBasedir(), "target");
+        return new File(outputDirectory, "classes");
+    }
+
+    private File getDependenciesDirectory() {
+        return new File(getClassesDirectory(), "META-INF/dependencies");
+    }
+
+    private void makeNar() throws MojoExecutionException {
+        File narFile = createArchive();
+
+        if (classifier != null) {
+            projectHelper.attachArtifact(project, "nar", classifier, narFile);
+        } else {
+            project.getArtifact().setFile(narFile);
+        }
+    }
+
+    public File createArchive() throws MojoExecutionException {
+        final File outputDirectory = new File(project.getBasedir(), "target");
+        File narFile = getNarFile(outputDirectory, finalName, classifier);
+        MavenArchiver archiver = new MavenArchiver();
+        archiver.setArchiver(jarArchiver);
+        archiver.setOutputFile(narFile);
+        archive.setForced(forceCreation);
+
+        try {
+            File contentDirectory = getClassesDirectory();
+            if (!contentDirectory.exists()) {
+                getLog().warn("NAR will be empty - no content was marked for inclusion!");
+            } else {
+                archiver.getArchiver().addDirectory(contentDirectory, getIncludes(), getExcludes());
+            }
+
+            File existingManifest = defaultManifestFile;
+            if (useDefaultManifestFile && existingManifest.exists() && archive.getManifestFile() == null) {
+                getLog().info("Adding existing MANIFEST to archive. Found under: " + existingManifest.getPath());
+                archive.setManifestFile(existingManifest);
+            }
+
+            // automatically add the artifact id to the manifest
+            archive.addManifestEntry("Nar-Id", project.getArtifactId());
+
+            // look for a nar dependency
+            String narDependency = getNarDependency();
+            if (narDependency != null) {
+                archive.addManifestEntry("Nar-Dependency-Id", narDependency);
+            }
+
+            archiver.createArchive(session, project, archive);
+            return narFile;
+        } catch (ArchiverException | MojoExecutionException | ManifestException | IOException | DependencyResolutionRequiredException e) {
+            throw new MojoExecutionException("Error assembling NAR", e);
+        }
+    }
+
+    private String[] getIncludes() {
+        if (includes != null && includes.length > 0) {
+            return includes;
+        }
+        return DEFAULT_INCLUDES;
+    }
+
+    private String[] getExcludes() {
+        if (excludes != null && excludes.length > 0) {
+            return excludes;
+        }
+        return DEFAULT_EXCLUDES;
+    }
+
+    protected File getNarFile(File basedir, String finalName, String classifier) {
+        if (classifier == null) {
+            classifier = "";
+        } else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) {
+            classifier = "-" + classifier;
+        }
+
+        return new File(basedir, finalName + classifier + ".nar");
+    }
+
+    private String getNarDependency() throws MojoExecutionException {
+        String narDependency = null;
+
+        // get nar dependencies
+        FilterArtifacts filter = new FilterArtifacts();
+        filter.addFilter(new TypeFilter("nar", ""));
+
+        // start with all artifacts.
+        Set artifacts = project.getArtifacts();
+
+        // perform filtering
+        try {
+            artifacts = filter.filter(artifacts);
+        } catch (ArtifactFilterException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // ensure there is a single nar dependency
+        if (artifacts.size() > 1) {
+            throw new MojoExecutionException("Each NAR represents a ClassLoader. A NAR dependency allows that NAR's ClassLoader to be "
+                    + "used as the parent of this NAR's ClassLoader. As a result, only a single NAR dependency is allowed.");
+        } else if (artifacts.size() == 1) {
+            final Artifact artifact = (Artifact) artifacts.iterator().next();
+            narDependency = artifact.getArtifactId();
+        }
+
+        return narDependency;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml
----------------------------------------------------------------------
diff --git a/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml b/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..0680d18
--- /dev/null
+++ b/nar-maven-plugin/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<component-set>
+    <components>
+        <component>
+            <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+            <role-hint>nar</role-hint>
+            <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+            <configuration>
+                <lifecycles>
+                    <lifecycle>
+                        <id>default</id>
+                        <phases>
+                            <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
+                            <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
+                            <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                            <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
+                            <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
+                            <package>org.apache.nifi:nar-maven-plugin:nar</package>
+                            <install>org.apache.maven.plugins:maven-install-plugin:install</install>
+                            <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
+                        </phases>
+                    </lifecycle>
+                </lifecycles>
+            </configuration>
+        </component>
+        <component>
+            <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
+            <role-hint>nar</role-hint>
+            <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
+            <configuration>
+                <type>nar</type>
+                <language>java</language>
+                <addedToClasspath>false</addedToClasspath>
+                <includesDependencies>true</includesDependencies>
+            </configuration>
+        </component>
+    </components>
+</component-set>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nifi-api/pom.xml
----------------------------------------------------------------------
diff --git a/nifi-api/pom.xml b/nifi-api/pom.xml
index 3fe1d45..4d334b9 100644
--- a/nifi-api/pom.xml
+++ b/nifi-api/pom.xml
@@ -15,6 +15,7 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.nifi</groupId>
         <artifactId>nifi-parent</artifactId>
@@ -27,6 +28,4 @@
     <packaging>jar</packaging>
     <name>NiFi Api</name>
     
-    <dependencies>
-    </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nifi-bootstrap/pom.xml
----------------------------------------------------------------------
diff --git a/nifi-bootstrap/pom.xml b/nifi-bootstrap/pom.xml
index a992018..b82adb3 100644
--- a/nifi-bootstrap/pom.xml
+++ b/nifi-bootstrap/pom.xml
@@ -1,5 +1,5 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<!--
+    <!--
       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.
@@ -13,19 +13,17 @@
       See the License for the specific language governing permissions and
       limitations under the License.
     -->
-	<modelVersion>4.0.0</modelVersion>
+    <modelVersion>4.0.0</modelVersion>
 
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>nifi-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nifi-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
 
-	<artifactId>nifi-bootstrap</artifactId>
-	<packaging>jar</packaging>
+    <artifactId>nifi-bootstrap</artifactId>
+    <packaging>jar</packaging>
 
-	<name>nifi-bootstrap</name>
+    <name>nifi-bootstrap</name>
 
-	<dependencies>
-	</dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nifi-mock/pom.xml
----------------------------------------------------------------------
diff --git a/nifi-mock/pom.xml b/nifi-mock/pom.xml
index 0e6e264..2bd53c7 100644
--- a/nifi-mock/pom.xml
+++ b/nifi-mock/pom.xml
@@ -30,34 +30,28 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-api</artifactId>
-            <version>[0.0.1-SNAPSHOT, 1.0.0-SNAPSHOT)</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-expression-language</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-core-flowfile-attributes</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>data-provenance-utils</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <!-- Dependency marked as provided, not test, because we have assertion 
             methods in our MockSession & MockFlowFile -->
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>4.11</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
----------------------------------------------------------------------
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
index 474bca5..552780c 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
@@ -40,7 +40,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
 
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.flowfile.attributes.CoreAttributes;
 import org.apache.nifi.processor.FlowFileFilter;


[07/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml b/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
index bde025b..3cdeb07 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
+++ b/nar-bundles/framework-bundle/framework/web/nifi-jetty/pom.xml
@@ -28,86 +28,107 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-api</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-runtime</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-nar</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-security</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-server</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-servlet</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-webapp</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-servlets</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-jsp</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-client</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey.contribs</groupId>
             <artifactId>jersey-spring</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey.contribs</groupId>
             <artifactId>jersey-multipart</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-server</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-json</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjweaver</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>cglib</groupId> 
             <artifactId>cglib-nodep</artifactId> 
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>client-dto</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>custom-ui-utilities</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>web-security</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-web-utils</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>web-optimistic-locking</artifactId>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
@@ -132,6 +153,7 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>framework-cluster</artifactId>
+            <scope>compile</scope>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/web/nifi-web-api/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/nifi-web-api/pom.xml b/nar-bundles/framework-bundle/framework/web/nifi-web-api/pom.xml
index f4ec6b1..e7cb0e7 100644
--- a/nar-bundles/framework-bundle/framework/web/nifi-web-api/pom.xml
+++ b/nar-bundles/framework-bundle/framework/web/nifi-web-api/pom.xml
@@ -115,6 +115,7 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>client-dto</artifactId>
+            <version>${project.version}</version>
             <classifier>sources</classifier>
             <scope>provided</scope>
             <optional>true</optional>
@@ -131,13 +132,15 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>framework-cluster-web</artifactId>
-            <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-api</artifactId>
-            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-nar</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
@@ -295,7 +298,6 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>volatile-provenance-repository</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/web/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/web/pom.xml b/nar-bundles/framework-bundle/framework/web/pom.xml
index 8ef5780..12fda97 100644
--- a/nar-bundles/framework-bundle/framework/web/pom.xml
+++ b/nar-bundles/framework-bundle/framework/web/pom.xml
@@ -42,17 +42,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>client-dto</artifactId>
-                <version>${project.version}</version>
-                <classifier>sources</classifier>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>custom-ui-utilities</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
                 <artifactId>web-security</artifactId>
                 <version>${project.version}</version>
             </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/nar/pom.xml b/nar-bundles/framework-bundle/nar/pom.xml
index d53c9e2..5d28c6d 100644
--- a/nar-bundles/framework-bundle/nar/pom.xml
+++ b/nar-bundles/framework-bundle/nar/pom.xml
@@ -62,52 +62,5 @@
             <scope>provided</scope>
         </dependency>
                         
-        <!-- mark jetty deps as provided since they are included in the parent nar -->
-        <!--<dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-webapp</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlets</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-jsp</artifactId>
-            <scope>provided</scope>
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet.jsp</groupId>
-            <artifactId>javax.servlet.jsp-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.el</groupId>
-            <artifactId>javax.el-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet.jsp.jstl</groupId>
-            <artifactId>javax.servlet.jsp.jstl-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <scope>provided</scope>
-        </dependency>-->
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/pom.xml b/nar-bundles/framework-bundle/pom.xml
index cf5b6b6..daa5256 100644
--- a/nar-bundles/framework-bundle/pom.xml
+++ b/nar-bundles/framework-bundle/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -31,14 +31,7 @@
         <module>framework</module>
         <module>nar</module>
     </modules>
-    <properties>
-        <nifi.api.version>0.0.1-SNAPSHOT</nifi.api.version>
-        <h2.version>1.3.176</h2.version>
-        <jasypt.version>1.9.2</jasypt.version>
-        <jersey.version>1.18.2</jersey.version>
-        <spring.version>4.1.2.RELEASE</spring.version>
-        <spring.security.version>3.2.5.RELEASE</spring.security.version>
-    </properties>
+
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -48,13 +41,13 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>remote-communications-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>framework-cluster-web</artifactId>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
                 <artifactId>file-authorization-provider</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
@@ -68,11 +61,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-nar</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
                 <artifactId>nifi-runtime</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -88,16 +76,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-properties</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>data-provenance-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
                 <artifactId>core-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -131,352 +109,6 @@
                 <artifactId>web-optimistic-locking</artifactId>
                 <version>${project.version}</version>
             </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-api</artifactId>
-                <version>${nifi.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-expression-language</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-core-flowfile-attributes</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-security-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcprov-jdk16</artifactId>
-                <version>1.46</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>18.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-file-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-stream-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-web-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-socket-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-logging-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>com.h2database</groupId>
-                <artifactId>h2</artifactId>
-                <version>${h2.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jasypt</groupId>
-                <artifactId>jasypt</artifactId>
-                <version>${jasypt.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-server</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-client</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-json</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.mail</groupId>
-                <artifactId>mail</artifactId>
-                <version>1.4.7</version>
-            </dependency>
-            <dependency>
-                <groupId>stax</groupId>
-                <artifactId>stax-api</artifactId>
-                <version>1.0.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.quartz-scheduler</groupId>
-                <artifactId>quartz</artifactId>
-                <version>2.2.1</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey.contribs</groupId>
-                <artifactId>jersey-spring</artifactId>
-                <version>${jersey.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-web</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-aop</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-context</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-beans</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey.contribs</groupId>
-                <artifactId>jersey-multipart</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-beans</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context-support</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-expression</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-tx</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-core</artifactId>
-                <version>${spring.version}</version>
-                <exclusions>
-                    <!-- <artifactId>jcl-over-slf4j</artifactId> is used in dependencies 
-                    section -->
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-web</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-aop</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-jdbc</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-core</artifactId>
-                <version>${spring.security.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-web</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-expression</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-aop</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-context</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-beans</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-web</artifactId>
-                <version>${spring.security.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-tx</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-jdbc</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-expression</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-web</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-aop</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-context</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-beans</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-acl</artifactId>
-                <version>${spring.security.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-tx</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-jdbc</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-aop</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-context</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-config</artifactId>
-                <version>${spring.security.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-aop</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-context</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-beans</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.aspectj</groupId>
-                <artifactId>aspectjweaver</artifactId>
-                <version>1.8.4</version>
-            </dependency>
-            <dependency>
-                <groupId>cglib</groupId>
-                <artifactId>cglib-nodep</artifactId>
-                <version>3.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-lang3</artifactId>
-                <version>3.3.2</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>2.4</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-collections4</artifactId>
-                <version>4.0</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-net</groupId>
-                <artifactId>commons-net</artifactId>
-                <version>3.3</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-pool2</artifactId>
-                <version>2.2</version>
-            </dependency>
         </dependencies>
     </dependencyManagement>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/hadoop-bundle/hdfs-processors/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/hadoop-bundle/hdfs-processors/pom.xml b/nar-bundles/hadoop-bundle/hdfs-processors/pom.xml
index 369efe7..9a4bf2b 100644
--- a/nar-bundles/hadoop-bundle/hdfs-processors/pom.xml
+++ b/nar-bundles/hadoop-bundle/hdfs-processors/pom.xml
@@ -46,12 +46,6 @@
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-stream-utils</artifactId>
         </dependency>
-
-        <!--        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-core</artifactId>
-        </dependency>-->
-
         <dependency> 
             <groupId>org.apache.hadoop</groupId> 
             <artifactId>hadoop-common</artifactId> 
@@ -62,13 +56,11 @@
             <artifactId>hadoop-hdfs</artifactId> 
             <scope>provided</scope> 
         </dependency>
-
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-mock</artifactId>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/hadoop-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/hadoop-bundle/nar/pom.xml b/nar-bundles/hadoop-bundle/nar/pom.xml
index 481de92..426ca86 100644
--- a/nar-bundles/hadoop-bundle/nar/pom.xml
+++ b/nar-bundles/hadoop-bundle/nar/pom.xml
@@ -22,6 +22,7 @@
     </parent>
 
     <artifactId>hadoop-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
     <packaging>nar</packaging>
 
     <name>Hadoop NAR</name>
@@ -35,7 +36,6 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>hdfs-processors</artifactId>
-            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/hadoop-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/hadoop-bundle/pom.xml b/nar-bundles/hadoop-bundle/pom.xml
index caf23de..1a6a160 100644
--- a/nar-bundles/hadoop-bundle/pom.xml
+++ b/nar-bundles/hadoop-bundle/pom.xml
@@ -1,23 +1,23 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
+    <!--
+      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.
+    -->
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -32,75 +32,15 @@
         <module>hdfs-processors</module>
         <module>nar</module>
     </modules>
-
-    <!-- When changing Hadoop version, be sure to include the proper dependencies both here and in child POM's -->
-    <properties>
-        <hadoop.version>2.5.2</hadoop.version>
-    </properties>
-
+    
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-core-flowfile-attributes</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-processor-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-stream-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-
-<!--            <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-core</artifactId>
-                <version>${hadoop.version}</version>
-                <scope>provided</scope>
-            </dependency>-->
-
-            <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-common</artifactId>
-                <version>${hadoop.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-hdfs</artifactId>
-                <version>${hadoop.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>flowfile-packager</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>hadoop-libraries-nar</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <type>nar</type>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>2.4</version>
+                <artifactId>hdfs-processors</artifactId>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/hadoop-libraries-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/hadoop-libraries-bundle/nar/pom.xml b/nar-bundles/hadoop-libraries-bundle/nar/pom.xml
index feb4eac..3e54051 100644
--- a/nar-bundles/hadoop-libraries-bundle/nar/pom.xml
+++ b/nar-bundles/hadoop-libraries-bundle/nar/pom.xml
@@ -33,13 +33,6 @@
             <artifactId>standard-services-api-nar</artifactId>
             <type>nar</type>
         </dependency>
-
-<!--        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-core</artifactId>
-        </dependency>-->
-
-        
         <dependency>
             <groupId>org.apache.hadoop</groupId>
             <artifactId>hadoop-common</artifactId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/hadoop-libraries-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/hadoop-libraries-bundle/pom.xml b/nar-bundles/hadoop-libraries-bundle/pom.xml
index bf81346..15055d8 100644
--- a/nar-bundles/hadoop-libraries-bundle/pom.xml
+++ b/nar-bundles/hadoop-libraries-bundle/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -29,32 +29,8 @@
     <name>Hadoop Libraries Bundle</name>
     <description>A bundle which provides the Hadoop libraries</description>
 
-    
-
     <modules>
         <module>nar</module>
     </modules>
 
-    <!-- When changing Hadoop version, be sure to include the proper dependencies both here and in child POM's -->
-    <dependencyManagement>
-        <dependencies>
-            <!--            <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-core</artifactId>
-                <version>${project.version}</version>
-            </dependency>-->
-
-            <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-common</artifactId>
-                <version>2.5.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-hdfs</artifactId>
-                <version>2.5.2</version>
-            </dependency>
-
-        </dependencies>
-    </dependencyManagement>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/jetty-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/jetty-bundle/pom.xml b/nar-bundles/jetty-bundle/pom.xml
index a4fa57a..6586f09 100644
--- a/nar-bundles/jetty-bundle/pom.xml
+++ b/nar-bundles/jetty-bundle/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/monitor-threshold-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/monitor-threshold-bundle/nar/pom.xml b/nar-bundles/monitor-threshold-bundle/nar/pom.xml
index 8323a05..480b5ee 100644
--- a/nar-bundles/monitor-threshold-bundle/nar/pom.xml
+++ b/nar-bundles/monitor-threshold-bundle/nar/pom.xml
@@ -21,6 +21,7 @@
     </parent>
     
     <artifactId>monitor-threshold-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
     <name>MonitorThreshold-NAR</name>
     <packaging>nar</packaging>
     
@@ -28,13 +29,11 @@
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>monitor-threshold-processor</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>monitor-threshold-ui</artifactId>
             <type>war</type>
-            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/monitor-threshold-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/monitor-threshold-bundle/pom.xml b/nar-bundles/monitor-threshold-bundle/pom.xml
index 9914b35..6cb3af2 100644
--- a/nar-bundles/monitor-threshold-bundle/pom.xml
+++ b/nar-bundles/monitor-threshold-bundle/pom.xml
@@ -16,7 +16,7 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -35,76 +35,16 @@
 
     <dependencyManagement>
         <dependencies>
-            <!-- Common  Dependencies -->
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-file-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
+                <artifactId>monitor-threshold-processor</artifactId>
+                <version>${project.version}</version>
             </dependency>
-            <!-- Processor Dependencies -->
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-stream-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-processor-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            
-            <!-- UI Dependencies -->
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-client</artifactId>
-                <version>1.18.2</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-server</artifactId>
-                <version>1.18.2</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-core</artifactId>
-                <version>1.18.2</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-json</artifactId>
-                <version>1.18.2</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-servlet</artifactId>
-                <version>1.18.2</version>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.11</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-lang3</artifactId>
-                <version>3.3.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>custom-ui-utilities</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
+                <artifactId>monitor-threshold-ui</artifactId>
+                <type>war</type>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/nar-container-common/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/nar-container-common/pom.xml b/nar-bundles/nar-container-common/pom.xml
deleted file mode 100644
index a9fdf6a..0000000
--- a/nar-bundles/nar-container-common/pom.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-<!--
-  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.
--->
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-parent</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nar-container-common</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>NiFi NAR Container Common</name>
-    <packaging>pom</packaging>
-    <description>NiFi: NAR Container Common - these are the libraries that NAR bundles can refer to as provided because the container must provide them.</description>
-
-    <properties>
-        <jetty.version>9.2.5.v20141112</jetty.version>
-    </properties>    
-	
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-api</artifactId>
-                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-runtime</artifactId>
-                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-nar</artifactId>
-                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-properties</artifactId>
-                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>${jetty.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-servlet</artifactId>
-                <version>${jetty.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-webapp</artifactId>
-                <version>${jetty.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-servlets</artifactId>
-                <version>${jetty.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-jsp</artifactId>
-                <version>${jetty.version}</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet.jsp</groupId>
-                <artifactId>javax.servlet.jsp-api</artifactId>
-                <version>2.3.1</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>javax.el</groupId>
-                <artifactId>javax.el-api</artifactId>
-                <version>3.0.0</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet.jsp.jstl</groupId>
-                <artifactId>javax.servlet.jsp.jstl-api</artifactId>
-                <version>1.2.1</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>3.1.0</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.toolchain</groupId>
-                <artifactId>jetty-jsp-jdt</artifactId>
-                <version>2.3.3</version>
-                <scope>provided</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/persistent-provenance-repository-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/persistent-provenance-repository-bundle/nar/pom.xml b/nar-bundles/persistent-provenance-repository-bundle/nar/pom.xml
index dd67fe9..b58ecb8 100644
--- a/nar-bundles/persistent-provenance-repository-bundle/nar/pom.xml
+++ b/nar-bundles/persistent-provenance-repository-bundle/nar/pom.xml
@@ -1,36 +1,36 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
-	<modelVersion>4.0.0</modelVersion>
+    <!--
+      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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
 
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>persistent-provenance-repository-bundle</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>persistent-provenance-repository-bundle</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
 
-	<artifactId>persistent-provenance-repository-nar</artifactId>
-	<packaging>nar</packaging>
+    <artifactId>persistent-provenance-repository-nar</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>nar</packaging>
 
-	<name>Persistent Provenance Repository Nar</name>
+    <name>Persistent Provenance Repository Nar</name>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>persistent-provenance-repository</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-	</dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>persistent-provenance-repository</artifactId>
+        </dependency>
+    </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/persistent-provenance-repository-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/persistent-provenance-repository-bundle/pom.xml b/nar-bundles/persistent-provenance-repository-bundle/pom.xml
index c0c9f56..7dc3f34 100644
--- a/nar-bundles/persistent-provenance-repository-bundle/pom.xml
+++ b/nar-bundles/persistent-provenance-repository-bundle/pom.xml
@@ -17,7 +17,7 @@
 
     <parent>
         <groupId>org.apache.nifi</groupId>
-        <artifactId>nar-container-common</artifactId>
+        <artifactId>nar-bundle-parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
 
@@ -30,52 +30,12 @@
         <module>persistent-provenance-repository</module>
         <module>nar</module>
     </modules>
-	
-    <properties>
-        <lucene.version>4.10.2</lucene.version>
-    </properties>
-
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.apache.nifi</groupId>
-                <artifactId>data-provenance-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-stream-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-properties</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-core-flowfile-attributes</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.lucene</groupId>
-                <artifactId>lucene-core</artifactId>
-                <version>${lucene.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.lucene</groupId>
-                <artifactId>lucene-analyzers-common</artifactId>
-                <version>${lucene.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.lucene</groupId>
-                <artifactId>lucene-queryparser</artifactId>
-                <version>${lucene.version}</version>
+                <artifactId>persistent-provenance-repository</artifactId>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/pom.xml b/nar-bundles/pom.xml
new file mode 100644
index 0000000..9daf0ba
--- /dev/null
+++ b/nar-bundles/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nifi-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.nifi</groupId>
+    <artifactId>nar-bundle-parent</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>NiFi :: Nar Bundles Parent</name>
+
+    <modules>
+        <module>framework-bundle</module>
+        <module>hadoop-bundle</module>
+        <module>hadoop-libraries-bundle</module>
+        <module>jetty-bundle</module>
+        <module>monitor-threshold-bundle</module>
+        <module>persistent-provenance-repository-bundle</module>
+        <module>standard-bundle</module>
+        <module>standard-services</module>
+        <module>update-attribute-bundle</module>
+        <module>volatile-provenance-repository-bundle</module>
+    </modules>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>load-distribution-service</artifactId>
+                <version>${project.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>distributed-cache-client-service</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>distributed-cache-client-service-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>ssl-context-service-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>load-distribution-service-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>distributed-cache-protocol</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>distributed-cache-server</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>ssl-context-service</artifactId>
+                <version>${project.version}</version>
+            </dependency>                      
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>volatile-provenance-repository</artifactId>
+                <version>${project.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <!-- The following dependencies are marked provided because they must be provided by the container.  Nars can assume they are there-->
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-api</artifactId>
+                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-runtime</artifactId>
+                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-nar</artifactId>
+                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.nifi</groupId>
+                <artifactId>nifi-properties</artifactId>
+                <version>[0.0.1-SNAPSHOT,1.0.0-SNAPSHOT)</version>
+                <scope>provided</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/nar/pom.xml b/nar-bundles/ssl-context-bundle/nar/pom.xml
deleted file mode 100644
index ac7a145..0000000
--- a/nar-bundles/ssl-context-bundle/nar/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>ssl-context-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-	
-    <artifactId>ssl-context-service-nar</artifactId>
-    <name>SSL Context Services Nar</name>
-    <packaging>nar</packaging>
-	
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>standard-services-api-nar</artifactId>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>ssl-context-service</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/pom.xml b/nar-bundles/ssl-context-bundle/pom.xml
deleted file mode 100644
index 1fa2a74..0000000
--- a/nar-bundles/ssl-context-bundle/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>ssl-context-bundle</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>pom</packaging>
-
-    <name>SSL Context Bundle</name>
-
-    <modules>
-        <module>ssl-context-service</module>
-        <module>nar</module>
-    </modules>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-processor-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/pom.xml b/nar-bundles/ssl-context-bundle/ssl-context-service/pom.xml
deleted file mode 100644
index f667574..0000000
--- a/nar-bundles/ssl-context-bundle/ssl-context-service/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>ssl-context-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>ssl-context-service</artifactId>
-    <packaging>jar</packaging>
-
-    <name>SSL Context Controller Service</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>ssl-context-service-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-processor-utils</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-security-utils</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-mock</artifactId>
-        </dependency>
-    </dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java b/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java
deleted file mode 100644
index d7aae16..0000000
--- a/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/java/org/apache/nifi/ssl/StandardSSLContextService.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * 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.nifi.ssl;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.components.ValidationContext;
-import org.apache.nifi.components.ValidationResult;
-import org.apache.nifi.components.Validator;
-import org.apache.nifi.controller.AbstractControllerService;
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.controller.annotation.OnConfigured;
-import org.apache.nifi.processor.exception.ProcessException;
-import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.reporting.InitializationException;
-import org.apache.nifi.security.util.CertificateUtils;
-import org.apache.nifi.security.util.KeystoreType;
-import org.apache.nifi.security.util.SslContextFactory;
-
-public class StandardSSLContextService extends AbstractControllerService implements SSLContextService {
-
-    public static final String STORE_TYPE_JKS = "JKS";
-    public static final String STORE_TYPE_PKCS12 = "PKCS12";
-
-    public static final PropertyDescriptor TRUSTSTORE = new PropertyDescriptor.Builder()
-            .name("Truststore Filename")
-            .description("The fully-qualified filename of the Truststore")
-            .defaultValue(null)
-            .addValidator(createFileExistsAndReadableValidator())
-            .sensitive(false)
-            .build();
-    public static final PropertyDescriptor TRUSTSTORE_TYPE = new PropertyDescriptor.Builder()
-            .name("Truststore Type")
-            .description("The Type of the Truststore. Either JKS or PKCS12")
-            .allowableValues(STORE_TYPE_JKS, STORE_TYPE_PKCS12)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .defaultValue(STORE_TYPE_JKS)
-            .sensitive(false)
-            .build();
-    public static final PropertyDescriptor TRUSTSTORE_PASSWORD = new PropertyDescriptor.Builder()
-            .name("Truststore Password")
-            .description("The password for the Truststore")
-            .defaultValue(null)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .sensitive(true)
-            .build();
-    public static final PropertyDescriptor KEYSTORE = new PropertyDescriptor.Builder()
-            .name("Keystore Filename")
-            .description("The fully-qualified filename of the Keystore")
-            .defaultValue(null)
-            .addValidator(createFileExistsAndReadableValidator())
-            .sensitive(false)
-            .build();
-    public static final PropertyDescriptor KEYSTORE_TYPE = new PropertyDescriptor.Builder()
-            .name("Keystore Type")
-            .description("The Type of the Keystore")
-            .allowableValues(STORE_TYPE_JKS, STORE_TYPE_PKCS12)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .defaultValue(STORE_TYPE_JKS)
-            .sensitive(false)
-            .build();
-    public static final PropertyDescriptor KEYSTORE_PASSWORD = new PropertyDescriptor.Builder()
-            .name("Keystore Password")
-            .defaultValue(null)
-            .description("The password for the Keystore")
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .sensitive(true)
-            .build();
-
-    private static final List<PropertyDescriptor> properties;
-
-    static {
-        List<PropertyDescriptor> props = new ArrayList<>();
-        props.add(KEYSTORE);
-        props.add(KEYSTORE_PASSWORD);
-        props.add(KEYSTORE_TYPE);
-        props.add(TRUSTSTORE);
-        props.add(TRUSTSTORE_PASSWORD);
-        props.add(TRUSTSTORE_TYPE);
-        properties = Collections.unmodifiableList(props);
-    }
-    private ConfigurationContext configContext;
-
-    @OnConfigured
-    public void onConfigured(final ConfigurationContext context) throws InitializationException {
-        configContext = context;
-
-        final Collection<ValidationResult> results = new ArrayList<>();
-        results.addAll(validateStore(context.getProperties(), KeystoreValidationGroup.KEYSTORE));
-        results.addAll(validateStore(context.getProperties(), KeystoreValidationGroup.TRUSTSTORE));
-
-        if (!results.isEmpty()) {
-            final StringBuilder sb = new StringBuilder(this + " is not valid due to:");
-            for (final ValidationResult result : results) {
-                sb.append("\n").append(result.toString());
-            }
-            throw new InitializationException(sb.toString());
-        }
-
-        if (countNulls(context.getProperty(KEYSTORE).getValue(),
-                context.getProperty(KEYSTORE_PASSWORD).getValue(),
-                context.getProperty(KEYSTORE_TYPE).getValue(),
-                context.getProperty(TRUSTSTORE).getValue(),
-                context.getProperty(TRUSTSTORE_PASSWORD).getValue(),
-                context.getProperty(TRUSTSTORE_TYPE).getValue()) >= 4) {
-            throw new InitializationException(this + " does not have the KeyStore or the TrustStore populated");
-        }
-
-        // verify that the filename, password, and type match
-        createSSLContext(ClientAuth.REQUIRED);
-    }
-
-    private static Validator createFileExistsAndReadableValidator() {
-        return new Validator() {
-            // Not using the FILE_EXISTS_VALIDATOR because the default is to
-            // allow expression language
-            @Override
-            public ValidationResult validate(String subject, String input, ValidationContext context) {
-                final String substituted;
-                try {
-                    substituted = context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
-                } catch (final Exception e) {
-                    return new ValidationResult.Builder()
-                            .subject(subject)
-                            .input(input)
-                            .valid(false)
-                            .explanation("Not a valid Expression Language value: " + e.getMessage())
-                            .build();
-                }
-
-                final File file = new File(substituted);
-                final boolean valid = file.exists() && file.canRead();
-                final String explanation = valid ? null : "File " + file + " does not exist or cannot be read";
-                return new ValidationResult.Builder()
-                        .subject(subject)
-                        .input(input)
-                        .valid(valid)
-                        .explanation(explanation)
-                        .build();
-            }
-        };
-    }
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        return properties;
-    }
-
-    @Override
-    protected Collection<ValidationResult> customValidate(ValidationContext validationContext) {
-        final Collection<ValidationResult> results = new ArrayList<>();
-        results.addAll(validateStore(validationContext.getProperties(), KeystoreValidationGroup.KEYSTORE));
-        results.addAll(validateStore(validationContext.getProperties(), KeystoreValidationGroup.TRUSTSTORE));
-
-        if (countNulls(validationContext.getProperty(KEYSTORE).getValue(),
-                validationContext.getProperty(KEYSTORE_PASSWORD).getValue(),
-                validationContext.getProperty(KEYSTORE_TYPE).getValue(),
-                validationContext.getProperty(TRUSTSTORE).getValue(),
-                validationContext.getProperty(TRUSTSTORE_PASSWORD).getValue(),
-                validationContext.getProperty(TRUSTSTORE_TYPE).getValue())
-                >= 4) {
-            results.add(new ValidationResult.Builder()
-                    .subject(this.getClass().getSimpleName() + " : " + getIdentifier())
-                    .valid(false)
-                    .explanation("Does not have the KeyStore or the TrustStore populated")
-                    .build());
-        }
-        if (results.isEmpty()) {
-            // verify that the filename, password, and type match
-            try {
-                createSSLContext(ClientAuth.REQUIRED);
-            } catch (ProcessException e) {
-                results.add(new ValidationResult.Builder()
-                        .subject(getClass().getSimpleName() + " : " + getIdentifier())
-                        .valid(false)
-                        .explanation(e.getMessage())
-                        .build());
-            }
-        }
-        return results;
-    }
-
-    @Override
-    public SSLContext createSSLContext(final ClientAuth clientAuth) throws ProcessException {
-        try {
-            final String keystoreFile = configContext.getProperty(KEYSTORE).getValue();
-            if (keystoreFile == null) {
-                return SslContextFactory.createTrustSslContext(
-                        configContext.getProperty(TRUSTSTORE).getValue(),
-                        configContext.getProperty(TRUSTSTORE_PASSWORD).getValue().toCharArray(),
-                        configContext.getProperty(TRUSTSTORE_TYPE).getValue());
-            }
-            final String truststoreFile = configContext.getProperty(TRUSTSTORE).getValue();
-            if (truststoreFile == null) {
-                return SslContextFactory.createSslContext(
-                        configContext.getProperty(KEYSTORE).getValue(),
-                        configContext.getProperty(KEYSTORE_PASSWORD).getValue().toCharArray(),
-                        configContext.getProperty(KEYSTORE_TYPE).getValue());
-            }
-
-            return SslContextFactory.createSslContext(
-                    configContext.getProperty(KEYSTORE).getValue(),
-                    configContext.getProperty(KEYSTORE_PASSWORD).getValue().toCharArray(),
-                    configContext.getProperty(KEYSTORE_TYPE).getValue(),
-                    configContext.getProperty(TRUSTSTORE).getValue(),
-                    configContext.getProperty(TRUSTSTORE_PASSWORD).getValue().toCharArray(),
-                    configContext.getProperty(TRUSTSTORE_TYPE).getValue(),
-                    org.apache.nifi.security.util.SslContextFactory.ClientAuth.valueOf(clientAuth.name()));
-        } catch (final Exception e) {
-            throw new ProcessException(e);
-        }
-    }
-
-    @Override
-    public String getTrustStoreFile() {
-        return configContext.getProperty(TRUSTSTORE).getValue();
-    }
-
-    @Override
-    public String getTrustStoreType() {
-        return configContext.getProperty(TRUSTSTORE_TYPE).getValue();
-    }
-
-    @Override
-    public String getTrustStorePassword() {
-        return configContext.getProperty(TRUSTSTORE_PASSWORD).getValue();
-    }
-
-    @Override
-    public boolean isTrustStoreConfigured() {
-        return getTrustStoreFile() != null && getTrustStorePassword() != null && getTrustStoreType() != null;
-    }
-
-    @Override
-    public String getKeyStoreFile() {
-        return configContext.getProperty(KEYSTORE).getValue();
-    }
-
-    @Override
-    public String getKeyStoreType() {
-        return configContext.getProperty(KEYSTORE_TYPE).getValue();
-    }
-
-    @Override
-    public String getKeyStorePassword() {
-        return configContext.getProperty(KEYSTORE_PASSWORD).getValue();
-    }
-
-    @Override
-    public boolean isKeyStoreConfigured() {
-        return getKeyStoreFile() != null && getKeyStorePassword() != null && getKeyStoreType() != null;
-    }
-
-    private static Collection<ValidationResult> validateStore(final Map<PropertyDescriptor, String> properties,
-            final KeystoreValidationGroup keyStoreOrTrustStore) {
-        final Collection<ValidationResult> results = new ArrayList<>();
-
-        final String filename;
-        final String password;
-        final String type;
-
-        if (keyStoreOrTrustStore == KeystoreValidationGroup.KEYSTORE) {
-            filename = properties.get(KEYSTORE);
-            password = properties.get(KEYSTORE_PASSWORD);
-            type = properties.get(KEYSTORE_TYPE);
-        } else {
-            filename = properties.get(TRUSTSTORE);
-            password = properties.get(TRUSTSTORE_PASSWORD);
-            type = properties.get(TRUSTSTORE_TYPE);
-        }
-
-        final String keystoreDesc = (keyStoreOrTrustStore == KeystoreValidationGroup.KEYSTORE) ? "Keystore" : "Truststore";
-
-        final int nulls = countNulls(filename, password, type);
-        if (nulls != 3 && nulls != 0) {
-            results.add(new ValidationResult.Builder().valid(false).explanation("Must set either 0 or 3 properties for " + keystoreDesc)
-                    .subject(keystoreDesc + " Properties").build());
-        } else if (nulls == 0) {
-            // all properties were filled in.
-            final File file = new File(filename);
-            if (!file.exists() || !file.canRead()) {
-                results.add(new ValidationResult.Builder()
-                        .valid(false)
-                        .subject(keystoreDesc + " Properties")
-                        .explanation("Cannot access file " + file.getAbsolutePath())
-                        .build());
-            } else {
-                try {
-                    final boolean storeValid = CertificateUtils
-                            .isStoreValid(file.toURI().toURL(), KeystoreType.valueOf(type), password.toCharArray());
-                    if (!storeValid) {
-                        results.add(new ValidationResult.Builder()
-                                .subject(keystoreDesc + " Properties")
-                                .valid(false)
-                                .explanation("Invalid KeyStore Password or Type specified for file " + filename)
-                                .build());
-                    }
-                } catch (MalformedURLException e) {
-                    results.add(new ValidationResult.Builder()
-                            .subject(keystoreDesc + " Properties")
-                            .valid(false)
-                            .explanation("Malformed URL from file: " + e)
-                            .build());
-                }
-            }
-        }
-
-        return results;
-    }
-
-    private static int countNulls(Object... objects) {
-        int count = 0;
-        for (final Object x : objects) {
-            if (x == null) {
-                count++;
-            }
-        }
-
-        return count;
-    }
-
-    public static enum KeystoreValidationGroup {
-
-        KEYSTORE, TRUSTSTORE
-    }
-
-    @Override
-    public String toString() {
-        return "SSLContextService[id=" + getIdentifier() + "]";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
----------------------------------------------------------------------
diff --git a/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
deleted file mode 100644
index b1b6124..0000000
--- a/nar-bundles/ssl-context-bundle/ssl-context-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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.
-org.apache.nifi.ssl.StandardSSLContextService
\ No newline at end of file


[08/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java
deleted file mode 100644
index 77d6481..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server.set;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import org.apache.nifi.distributed.cache.server.EvictionPolicy;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SimpleSetCache implements SetCache {
-    private static final Logger logger = LoggerFactory.getLogger(SimpleSetCache.class);
-    
-    private final Map<ByteBuffer, SetCacheRecord> cache = new HashMap<>();
-    private final SortedMap<SetCacheRecord, ByteBuffer> inverseCacheMap;
-    
-    private final String serviceIdentifier;
-    
-    private final int maxSize;
-    
-    public SimpleSetCache(final String serviceIdentifier, final int maxSize, final EvictionPolicy evictionPolicy) {
-        inverseCacheMap = new TreeMap<>(evictionPolicy.getComparator());
-        this.serviceIdentifier = serviceIdentifier;
-        this.maxSize = maxSize;
-    }
-    
-    private synchronized SetCacheRecord evict() {
-        if ( cache.size() < maxSize ) {
-            return null;
-        }
-        
-        final SetCacheRecord recordToEvict = inverseCacheMap.firstKey();
-        final ByteBuffer valueToEvict = inverseCacheMap.remove(recordToEvict);
-        cache.remove(valueToEvict);
-        
-        if ( logger.isDebugEnabled() ) {
-            logger.debug("Evicting value {} from cache", new String(valueToEvict.array(), StandardCharsets.UTF_8));
-        }
-        
-        return recordToEvict;
-    }
-    
-    @Override
-    public synchronized SetCacheResult addIfAbsent(final ByteBuffer value) {
-        final SetCacheRecord record = cache.get(value);
-        if ( record == null ) {
-            final SetCacheRecord evicted = evict();
-            final SetCacheRecord newRecord = new SetCacheRecord(value);
-            cache.put(value, newRecord);
-            inverseCacheMap.put(newRecord, value);
-            return new SetCacheResult(true, newRecord, evicted);
-        } else {
-            // We have to remove the record and add it again in order to cause the Map to stay sorted
-            inverseCacheMap.remove(record);
-            record.hit();
-            inverseCacheMap.put(record, value);
-            
-            return new SetCacheResult(false, record, null);
-        }
-    }
-    
-    @Override
-    public synchronized SetCacheResult contains(final ByteBuffer value) {
-        final SetCacheRecord record = cache.get(value);
-        if ( record == null ) {
-            return new SetCacheResult(false, null, null);
-        } else {
-            // We have to remove the record and add it again in order to cause the Map to stay sorted
-            inverseCacheMap.remove(record);
-            record.hit();
-            inverseCacheMap.put(record, value);
-            
-            return new SetCacheResult(true, record, null);
-        }
-    }
-    
-    @Override
-    public synchronized SetCacheResult remove(final ByteBuffer value) {
-        final SetCacheRecord record = cache.remove(value);
-        if ( record == null ) {
-            return new SetCacheResult(false, null, null);
-        } else {
-            inverseCacheMap.remove(record);
-            return new SetCacheResult(true, record, null);
-        }
-    }
-    
-    @Override
-    public String toString() {
-        return "SimpleSetCache[service id=" + serviceIdentifier + "]";
-    }
-    
-    @Override
-    public void shutdown() throws IOException {
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
deleted file mode 100644
index 0509c7c..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-org.apache.nifi.distributed.cache.server.DistributedSetCacheServer
-org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html
deleted file mode 100644
index dca3aa1..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<!--
-  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.
--->
-<head>
-<meta charset="utf-8" />
-<title>Distributed Map Cache Client Service</title>
-<link rel="stylesheet" href="../../css/component-usage.css" type="text/css" />
-</head>
-
-<body>
-	<h2>Description:</h2>
-
-	<p>A Controller Service that starts an embedded server and listens for connections from clients. The
-	server provides the ability to query the cache, add data to the cache, and remove data from the cache.</p>
-
-
-
-	<p>
-		<strong>Properties:</strong>
-	</p>
-	<p>In the list below, the names of required properties appear
-		in bold. Any other properties (not in bold) are considered optional.
-		If a property has a default value, it is indicated. If a property
-		supports the use of the NiFi Expression Language (or simply,
-		"expression language"), that is also indicated.</p>
-
-	<ul>
-		<li><strong>Port</strong>
-			<ul>
-				<li>The port to listen on for incoming connections</li>
-				<li>Default value: 4557</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li>SSL Context Service
-			<ul>
-				<li>If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure</li>
-				<li>Default value: no default</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li><strong>Maximum Cache Entries</strong>
-			<ul>
-				<li>The maximum number of cache entries that the cache can hold
-				<li>Default value: 10,000</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li><strong>Eviction Strategy</strong>
-			<ul>
-				<li>Determines which strategy should be used to evict values from the cache to make room for new entries. Valid values: 
-					<code>Least Frequently Used</code>, <code>Least Recently Used</code>, and <code>First In, First Out</code>
-				<li>Default value: Least Frequently Used</li>
-				<li>Supports expression language: false</li>
-			</ul></li>
-		<li>Persistence Directory
-			<ul>
-				<li>If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only</li>
-				<li>Default value: no default (in-memory)</li>
-				<li>Supports expression language: true - JVM and System Properties Only</li>
-			</ul></li>
-	</ul>
-
-
-	<i>See Also:</i>
-	<ul>
-		<li><a href="../org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html">Distributed Map Cache Client Service</a></li>
-		<li><a href="../org.apache.nifi.ssl.StandardSSLContextService/index.html">Standard SSL Context Service</a></li>
-	</ul>
-
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
deleted file mode 100644
index b5f3fd6..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/java/org/apache/nifi/distributed/cache/server/TestServerAndClient.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * 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.nifi.distributed.cache.server;
-
-import org.apache.nifi.distributed.cache.server.DistributedSetCacheServer;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.ConnectException;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.distributed.cache.client.Deserializer;
-import org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService;
-import org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService;
-import org.apache.nifi.distributed.cache.client.Serializer;
-import org.apache.nifi.distributed.cache.client.exception.DeserializationException;
-import org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer;
-import org.apache.nifi.reporting.InitializationException;
-import org.apache.nifi.ssl.SSLContextService.ClientAuth;
-import org.apache.nifi.ssl.StandardSSLContextService;
-import org.apache.nifi.util.MockConfigurationContext;
-import org.apache.nifi.util.MockControllerServiceInitializationContext;
-
-import org.apache.commons.lang3.SerializationException;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TestServerAndClient {
-
-    private static Logger LOGGER;
-
-    static {
-        System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "info");
-        System.setProperty("org.slf4j.simpleLogger.showDateTime", "true");
-        System.setProperty("org.slf4j.simpleLogger.log.nifi.distributed.cache.server.AbstractCacheServer", "debug");
-        System.setProperty("org.slf4j.simpleLogger.log.nifi.distributed.cache.client.DistributedMapCacheClientService", "debug");
-        System.setProperty("org.slf4j.simpleLogger.log.nifi.distributed.cache.server.TestServerAndClient", "debug");
-        System.setProperty("org.slf4j.simpleLogger.log.nifi.remote.io.socket.ssl.SSLSocketChannel", "trace");
-        LOGGER = LoggerFactory.getLogger(TestServerAndClient.class);
-    }
-
-    @Test
-    public void testNonPersistentSetServerAndClient() throws InitializationException, IOException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create server
-        final DistributedSetCacheServer server = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        final DistributedSetCacheClientService client = createClient();
-        final Serializer<String> serializer = new StringSerializer();
-        final boolean added = client.addIfAbsent("test", serializer);
-        assertTrue(added);
-
-        final boolean contains = client.contains("test", serializer);
-        assertTrue(contains);
-
-        final boolean addedAgain = client.addIfAbsent("test", serializer);
-        assertFalse(addedAgain);
-
-        final boolean removed = client.remove("test", serializer);
-        assertTrue(removed);
-
-        final boolean containedAfterRemove = client.contains("test", serializer);
-        assertFalse(containedAfterRemove);
-
-        server.shutdownServer();
-    }
-
-    @Test
-    public void testPersistentSetServerAndClient() throws InitializationException, IOException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create server
-        final DistributedSetCacheServer server = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final File dataFile = new File("target/cache-data");
-        deleteRecursively(dataFile);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        serverProperties.put(DistributedSetCacheServer.PERSISTENCE_PATH, dataFile.getAbsolutePath());
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        final DistributedSetCacheClientService client = createClient();
-        final Serializer<String> serializer = new StringSerializer();
-        final boolean added = client.addIfAbsent("test", serializer);
-        final boolean added2 = client.addIfAbsent("test2", serializer);
-        assertTrue(added);
-        assertTrue(added2);
-
-        final boolean contains = client.contains("test", serializer);
-        final boolean contains2 = client.contains("test2", serializer);
-        assertTrue(contains);
-        assertTrue(contains2);
-
-        final boolean addedAgain = client.addIfAbsent("test", serializer);
-        assertFalse(addedAgain);
-
-        final boolean removed = client.remove("test", serializer);
-        assertTrue(removed);
-
-        final boolean containedAfterRemove = client.contains("test", serializer);
-        assertFalse(containedAfterRemove);
-
-        server.shutdownServer();
-
-        final DistributedSetCacheServer newServer = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext newServerInitContext = new MockControllerServiceInitializationContext(newServer, "server2");
-        newServer.initialize(newServerInitContext);
-
-        final MockConfigurationContext newServerContext = new MockConfigurationContext(serverProperties,
-                newServerInitContext.getControllerServiceLookup());
-        newServer.startServer(newServerContext);
-
-        assertFalse(client.contains("test", serializer));
-        assertTrue(client.contains("test2", serializer));
-
-        newServer.shutdownServer();
-    }
-
-    @Test
-    public void testPersistentSetServerAndClientWithLFUEvictions() throws InitializationException, IOException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create server
-        final DistributedSetCacheServer server = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final File dataFile = new File("target/cache-data");
-        deleteRecursively(dataFile);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        serverProperties.put(DistributedSetCacheServer.PERSISTENCE_PATH, dataFile.getAbsolutePath());
-        serverProperties.put(DistributedSetCacheServer.MAX_CACHE_ENTRIES, "3");
-
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        final DistributedSetCacheClientService client = createClient();
-        final Serializer<String> serializer = new StringSerializer();
-        final boolean added = client.addIfAbsent("test", serializer);
-        waitABit();
-        final boolean added2 = client.addIfAbsent("test2", serializer);
-        waitABit();
-        final boolean added3 = client.addIfAbsent("test3", serializer);
-        waitABit();
-        assertTrue(added);
-        assertTrue(added2);
-        assertTrue(added3);
-
-        final boolean contains = client.contains("test", serializer);
-        final boolean contains2 = client.contains("test2", serializer);
-        assertTrue(contains);
-        assertTrue(contains2);
-
-        final boolean addedAgain = client.addIfAbsent("test", serializer);
-        assertFalse(addedAgain);
-
-        final boolean added4 = client.addIfAbsent("test4", serializer);
-        assertTrue(added4);
-
-        // ensure that added3 was evicted because it was used least frequently
-        assertFalse(client.contains("test3", serializer));
-
-        server.shutdownServer();
-
-        final DistributedSetCacheServer newServer = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext newServerInitContext = new MockControllerServiceInitializationContext(newServer, "server2");
-        newServer.initialize(newServerInitContext);
-
-        final MockConfigurationContext newServerContext = new MockConfigurationContext(serverProperties,
-                newServerInitContext.getControllerServiceLookup());
-        newServer.startServer(newServerContext);
-
-        assertTrue(client.contains("test", serializer));
-        assertTrue(client.contains("test2", serializer));
-        assertFalse(client.contains("test3", serializer));
-        assertTrue(client.contains("test4", serializer));
-
-        newServer.shutdownServer();
-    }
-
-    @Test
-    public void testPersistentSetServerAndClientWithFIFOEvictions() throws InitializationException, IOException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create server
-        final DistributedSetCacheServer server = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final File dataFile = new File("target/cache-data");
-        deleteRecursively(dataFile);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        serverProperties.put(DistributedSetCacheServer.PERSISTENCE_PATH, dataFile.getAbsolutePath());
-        serverProperties.put(DistributedSetCacheServer.MAX_CACHE_ENTRIES, "3");
-        serverProperties.put(DistributedSetCacheServer.EVICTION_POLICY, DistributedSetCacheServer.EVICTION_STRATEGY_FIFO);
-
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        final DistributedSetCacheClientService client = createClient();
-        final Serializer<String> serializer = new StringSerializer();
-
-        // add 3 entries to the cache. But, if we add too fast, we'll have the same millisecond
-        // for the entry time so we don't know which entry will be evicted. So we wait a few millis in between
-        final boolean added = client.addIfAbsent("test", serializer);
-        waitABit();
-        final boolean added2 = client.addIfAbsent("test2", serializer);
-        waitABit();
-        final boolean added3 = client.addIfAbsent("test3", serializer);
-        waitABit();
-
-        assertTrue(added);
-        assertTrue(added2);
-        assertTrue(added3);
-
-        final boolean contains = client.contains("test", serializer);
-        final boolean contains2 = client.contains("test2", serializer);
-        assertTrue(contains);
-        assertTrue(contains2);
-
-        final boolean addedAgain = client.addIfAbsent("test", serializer);
-        assertFalse(addedAgain);
-
-        final boolean added4 = client.addIfAbsent("test4", serializer);
-        assertTrue(added4);
-
-        // ensure that added3 was evicted because it was used least frequently
-        assertFalse(client.contains("test", serializer));
-        assertTrue(client.contains("test3", serializer));
-
-        server.shutdownServer();
-
-        final DistributedSetCacheServer newServer = new DistributedSetCacheServer();
-        MockControllerServiceInitializationContext newServerInitContext = new MockControllerServiceInitializationContext(newServer, "server2");
-        newServer.initialize(newServerInitContext);
-
-        final MockConfigurationContext newServerContext = new MockConfigurationContext(serverProperties,
-                newServerInitContext.getControllerServiceLookup());
-        newServer.startServer(newServerContext);
-
-        assertFalse(client.contains("test", serializer));
-        assertTrue(client.contains("test2", serializer));
-        assertTrue(client.contains("test3", serializer));
-        assertTrue(client.contains("test4", serializer));
-
-        newServer.shutdownServer();
-    }
-
-    @Test
-    public void testNonPersistentMapServerAndClient() throws InitializationException, IOException, InterruptedException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create server
-        final DistributedMapCacheServer server = new DistributedMapCacheServer();
-        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        DistributedMapCacheClientService client = new DistributedMapCacheClientService();
-        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
-        client.initialize(clientInitContext);
-
-        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
-        clientProperties.put(DistributedMapCacheClientService.HOSTNAME, "localhost");
-        clientProperties.put(DistributedMapCacheClientService.COMMUNICATIONS_TIMEOUT, "360 secs");
-        MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
-        client.cacheConfig(clientContext);
-        final Serializer<String> valueSerializer = new StringSerializer();
-        final Serializer<String> keySerializer = new StringSerializer();
-        final Deserializer<String> deserializer = new StringDeserializer();
-
-        final String original = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
-        assertEquals(null, original);
-        LOGGER.debug("end getAndPutIfAbsent");
-
-        final boolean contains = client.containsKey("testKey", keySerializer);
-        assertTrue(contains);
-        LOGGER.debug("end containsKey");
-
-        final boolean added = client.putIfAbsent("testKey", "test", keySerializer, valueSerializer);
-        assertFalse(added);
-        LOGGER.debug("end putIfAbsent");
-
-        final String originalAfterPut = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
-        assertEquals("test", originalAfterPut);
-        LOGGER.debug("end getAndPutIfAbsent");
-
-        final boolean removed = client.remove("testKey", keySerializer);
-        assertTrue(removed);
-        LOGGER.debug("end remove");
-
-        final boolean containedAfterRemove = client.containsKey("testKey", keySerializer);
-        assertFalse(containedAfterRemove);
-
-        client.putIfAbsent("testKey", "test", keySerializer, valueSerializer);
-        client.close();
-        try {
-            client.containsKey("testKey", keySerializer);
-            fail("Should be closed and not accessible");
-        } catch (Exception e) {
-
-        }
-        client = null;
-        clientInitContext = null;
-        clientContext = null;
-
-        DistributedMapCacheClientService client2 = new DistributedMapCacheClientService();
-
-        MockControllerServiceInitializationContext clientInitContext2 = new MockControllerServiceInitializationContext(client2, "client2");
-        client2.initialize(clientInitContext2);
-
-        MockConfigurationContext clientContext2 = new MockConfigurationContext(clientProperties,
-                clientInitContext2.getControllerServiceLookup());
-        client2.cacheConfig(clientContext2);
-        assertFalse(client2.putIfAbsent("testKey", "test", keySerializer, valueSerializer));
-        assertTrue(client2.containsKey("testKey", keySerializer));
-        server.shutdownServer();
-        Thread.sleep(1000);
-        try {
-            client2.containsKey("testKey", keySerializer);
-            fail("Should have blown exception!");
-        } catch (ConnectException e) {
-            client2 = null;
-            clientContext2 = null;
-            clientInitContext2 = null;
-        }
-        Thread.sleep(2000);
-        System.gc();
-        LOGGER.debug("end testNonPersistentMapServerAndClient");
-    }
-
-    @Test
-    public void testClientTermination() throws InitializationException, IOException, InterruptedException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create server
-        final DistributedMapCacheServer server = new DistributedMapCacheServer();
-        MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        DistributedMapCacheClientService client = new DistributedMapCacheClientService();
-        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
-        client.initialize(clientInitContext);
-
-        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
-        clientProperties.put(DistributedMapCacheClientService.HOSTNAME, "localhost");
-        clientProperties.put(DistributedMapCacheClientService.COMMUNICATIONS_TIMEOUT, "360 secs");
-        MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
-        client.cacheConfig(clientContext);
-        final Serializer<String> valueSerializer = new StringSerializer();
-        final Serializer<String> keySerializer = new StringSerializer();
-        final Deserializer<String> deserializer = new StringDeserializer();
-
-        final String original = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
-        assertEquals(null, original);
-
-        final boolean contains = client.containsKey("testKey", keySerializer);
-        assertTrue(contains);
-
-        final boolean added = client.putIfAbsent("testKey", "test", keySerializer, valueSerializer);
-        assertFalse(added);
-
-        final String originalAfterPut = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
-        assertEquals("test", originalAfterPut);
-
-        final boolean removed = client.remove("testKey", keySerializer);
-        assertTrue(removed);
-
-        final boolean containedAfterRemove = client.containsKey("testKey", keySerializer);
-        assertFalse(containedAfterRemove);
-
-        client = null;
-        clientInitContext = null;
-        clientContext = null;
-        Thread.sleep(2000);
-        System.gc();
-        server.shutdownServer();
-    }
-
-    @Ignore
-    @Test
-    public void testSSLWith2RequestsWithServerTimeout() throws InitializationException, IOException, InterruptedException {
-        LOGGER.info("Testing " + Thread.currentThread().getStackTrace()[1].getMethodName());
-        // Create SSLContext Service
-        final StandardSSLContextService sslService = new StandardSSLContextService();
-        final MockControllerServiceInitializationContext sslServerInitContext = new MockControllerServiceInitializationContext(sslService,
-                "ssl-context");
-        sslService.initialize(sslServerInitContext);
-
-        final Map<PropertyDescriptor, String> sslServerProps = new HashMap<>();
-        sslServerProps.put(StandardSSLContextService.KEYSTORE, "src/test/resources/localhost-ks.jks");
-        sslServerProps.put(StandardSSLContextService.KEYSTORE_PASSWORD, "localtest");
-        sslServerProps.put(StandardSSLContextService.KEYSTORE_TYPE, "JKS");
-        sslServerProps.put(StandardSSLContextService.TRUSTSTORE, "src/test/resources/localhost-ts.jks");
-        sslServerProps.put(StandardSSLContextService.TRUSTSTORE_PASSWORD, "localtest");
-        sslServerProps.put(StandardSSLContextService.TRUSTSTORE_TYPE, "JKS");
-        MockConfigurationContext sslServerContext = new MockConfigurationContext(sslServerProps, sslServerInitContext);
-        sslService.onConfigured(sslServerContext);
-        sslService.createSSLContext(ClientAuth.REQUIRED);
-        // Create server
-        final DistributedMapCacheServer server = new DistributedMapCacheServer();
-        final MockControllerServiceInitializationContext serverInitContext = new MockControllerServiceInitializationContext(server, "server");
-        server.initialize(serverInitContext);
-
-        final Map<PropertyDescriptor, String> serverProperties = new HashMap<>();
-        serverProperties.put(DistributedMapCacheServer.SSL_CONTEXT_SERVICE, "ssl-context");
-        final MockConfigurationContext serverContext = new MockConfigurationContext(serverProperties, serverInitContext.getControllerServiceLookup());
-        server.startServer(serverContext);
-
-        DistributedMapCacheClientService client = new DistributedMapCacheClientService();
-        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
-        client.initialize(clientInitContext);
-
-        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
-        clientProperties.put(DistributedMapCacheClientService.HOSTNAME, "localhost");
-        clientProperties.put(DistributedMapCacheClientService.COMMUNICATIONS_TIMEOUT, "360 secs");
-        clientProperties.put(DistributedMapCacheClientService.SSL_CONTEXT_SERVICE, "ssl-context");
-        MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
-        client.cacheConfig(clientContext);
-        final Serializer<String> valueSerializer = new StringSerializer();
-        final Serializer<String> keySerializer = new StringSerializer();
-        final Deserializer<String> deserializer = new StringDeserializer();
-
-        final String original = client.getAndPutIfAbsent("testKey", "test", keySerializer, valueSerializer, deserializer);
-        assertEquals(null, original);
-
-        Thread.sleep(30000);
-        try {
-            final boolean contains = client.containsKey("testKey", keySerializer);
-            assertTrue(contains);
-        } catch (IOException e) {
-            // this is due to the server timing out in the middle of this request
-            assertTrue(e.getMessage().contains("Channel is closed"));
-        }
-
-        server.shutdownServer();
-    }
-
-    private void waitABit() {
-        try {
-            Thread.sleep(10L);
-        } catch (final InterruptedException e) {
-        }
-    }
-
-    private DistributedSetCacheClientService createClient() throws InitializationException {
-        final DistributedSetCacheClientService client = new DistributedSetCacheClientService();
-        MockControllerServiceInitializationContext clientInitContext = new MockControllerServiceInitializationContext(client, "client");
-        client.initialize(clientInitContext);
-
-        final Map<PropertyDescriptor, String> clientProperties = new HashMap<>();
-        clientProperties.put(DistributedSetCacheClientService.HOSTNAME, "localhost");
-        final MockConfigurationContext clientContext = new MockConfigurationContext(clientProperties, clientInitContext.getControllerServiceLookup());
-        client.onConfigured(clientContext);
-
-        return client;
-    }
-
-    private static class StringSerializer implements Serializer<String> {
-        @Override
-        public void serialize(final String value, final OutputStream output) throws SerializationException, IOException {
-            output.write(value.getBytes(StandardCharsets.UTF_8));
-        }
-    }
-
-    private static class StringDeserializer implements Deserializer<String> {
-        @Override
-        public String deserialize(final byte[] input) throws DeserializationException, IOException {
-            return (input.length == 0) ? null : new String(input, StandardCharsets.UTF_8);
-        }
-    }
-
-    private static void deleteRecursively(final File dataFile) throws IOException {
-        if (dataFile == null || !dataFile.exists()) {
-            return;
-        }
-
-        final File[] children = dataFile.listFiles();
-        for (final File child : children) {
-            if (child.isDirectory()) {
-                deleteRecursively(child);
-            } else {
-                for (int i = 0; i < 100 && child.exists(); i++) {
-                    child.delete();
-                }
-
-                if (child.exists()) {
-                    throw new IOException("Could not delete " + dataFile.getAbsolutePath());
-                }
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks
deleted file mode 100755
index 81be31d..0000000
Binary files a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ks.jks and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks b/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks
deleted file mode 100755
index 820e1e1..0000000
Binary files a/nar-bundles/distributed-cache-services-bundle/distributed-cache-server/src/test/resources/localhost-ts.jks and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml b/nar-bundles/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml
deleted file mode 100644
index 75cab34..0000000
--- a/nar-bundles/distributed-cache-services-bundle/distributed-cache-services-nar/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-  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.
--->
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.nifi</groupId>
-		<artifactId>distributed-cache-services-bundle</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
-
-	<artifactId>distributed-cache-services-nar</artifactId>
-	<name>Distributed Cache Services NAR</name>
-	<packaging>nar</packaging>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>standard-services-api-nar</artifactId>
-			<type>nar</type>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-client-service</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-protocol</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.nifi</groupId>
-			<artifactId>distributed-cache-server</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-	</dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/distributed-cache-services-bundle/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/distributed-cache-services-bundle/pom.xml b/nar-bundles/distributed-cache-services-bundle/pom.xml
deleted file mode 100644
index dcfa541..0000000
--- a/nar-bundles/distributed-cache-services-bundle/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <!--
-      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.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>standard-services-api-bundle</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>distributed-cache-services-bundle</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>Distributed Cache Services Bundle</name>
-    <packaging>pom</packaging>
-
-    <modules>
-        <module>distributed-cache-protocol</module>
-        <module>distributed-cache-client-service</module>
-        <module>distributed-cache-server</module>
-        <module>distributed-cache-services-nar</module>
-    </modules>
-
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>distributed-cache-client-service-api</artifactId>
-                <version>${standard.services.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>ssl-context-service-api</artifactId>
-                <version>${standard.services.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-processor-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-stream-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>remote-communications-utils</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>nifi-mock</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>wali</groupId>
-                <artifactId>wali</artifactId>
-                <version>3.0.0-SNAPSHOT</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.nifi</groupId>
-                <artifactId>ssl-context-service</artifactId>
-                <version>0.0.1-SNAPSHOT</version>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/cluster/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/cluster/pom.xml b/nar-bundles/framework-bundle/framework/cluster/pom.xml
index ad5dda7..78f4527 100644
--- a/nar-bundles/framework-bundle/framework/cluster/pom.xml
+++ b/nar-bundles/framework-bundle/framework/cluster/pom.xml
@@ -80,7 +80,6 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-compress</artifactId>
-            <version>1.9</version>
         </dependency>
         
         <!-- third party dependencies -->

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/core/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/core/pom.xml b/nar-bundles/framework-bundle/framework/core/pom.xml
index 547c75d..1836d32 100644
--- a/nar-bundles/framework-bundle/framework/core/pom.xml
+++ b/nar-bundles/framework-bundle/framework/core/pom.xml
@@ -117,9 +117,8 @@
             <artifactId>data-provenance-utils</artifactId>
         </dependency>
         <dependency>
-            <groupId>wali</groupId>
+            <groupId>org.apache.nifi</groupId>
             <artifactId>wali</artifactId>
-            <version>3.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/file-authorization-provider/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/file-authorization-provider/pom.xml b/nar-bundles/framework-bundle/framework/file-authorization-provider/pom.xml
new file mode 100644
index 0000000..cb01488
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/file-authorization-provider/pom.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.nifi</groupId>
+        <artifactId>nifi-framework-parent</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>file-authorization-provider</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>Authorization Provider: File</name>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src/main/xsd</directory>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>jaxb2-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>xjc</id>
+                        <goals>
+                            <goal>xjc</goal>
+                        </goals>
+                        <configuration>
+                            <packageName>org.apache.nifi.user.generated</packageName>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <generateDirectory>${project.build.directory}/generated-sources/jaxb</generateDirectory>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-file-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-properties</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java
new file mode 100644
index 0000000..0f4a75c
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/java/org/apache/nifi/authorization/FileAuthorizationProvider.java
@@ -0,0 +1,568 @@
+/*
+ * 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.nifi.authorization;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Set;
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import org.apache.nifi.authorization.annotation.AuthorityProviderContext;
+import org.apache.nifi.authorization.exception.AuthorityAccessException;
+import org.apache.nifi.authorization.exception.IdentityAlreadyExistsException;
+import org.apache.nifi.authorization.exception.ProviderCreationException;
+import org.apache.nifi.authorization.exception.UnknownIdentityException;
+import org.apache.nifi.file.FileUtils;
+import org.apache.nifi.user.generated.ObjectFactory;
+import org.apache.nifi.user.generated.Role;
+import org.apache.nifi.user.generated.User;
+import org.apache.nifi.user.generated.Users;
+import org.apache.nifi.util.NiFiProperties;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+/**
+ * Provides identity checks and grants authorities.
+ */
+public class FileAuthorizationProvider implements AuthorityProvider {
+
+    private static final Logger logger = LoggerFactory.getLogger(FileAuthorizationProvider.class);
+    private static final String USERS_XSD = "/users.xsd";
+    private static final String JAXB_GENERATED_PATH = "org.apache.nifi.user.generated";
+    private static final JAXBContext JAXB_CONTEXT = initializeJaxbContext();
+
+    /**
+     * Load the JAXBContext.
+     */
+    private static JAXBContext initializeJaxbContext() {
+        try {
+            return JAXBContext.newInstance(JAXB_GENERATED_PATH, FileAuthorizationProvider.class.getClassLoader());
+        } catch (JAXBException e) {
+            throw new RuntimeException("Unable to create JAXBContext.");
+        }
+    }
+
+    private NiFiProperties properties;
+    private File usersFile;
+    private File restoreUsersFile;
+    private Users users;
+    private final Set<String> defaultAuthorities = new HashSet<>();
+
+    @Override
+    public void initialize(final AuthorityProviderInitializationContext initializationContext) throws ProviderCreationException {
+    }
+
+    @Override
+    public void onConfigured(final AuthorityProviderConfigurationContext configurationContext) throws ProviderCreationException {
+        try {
+            final String usersFilePath = configurationContext.getProperty("Authorized Users File");
+            if (usersFilePath == null || usersFilePath.trim().isEmpty()) {
+                throw new ProviderCreationException("The authorized users file must be specified.");
+            }
+
+            // the users file instance will never be null because a default is used
+            usersFile = new File(usersFilePath);
+            final File usersFileDirectory = usersFile.getParentFile();
+
+            // the restore directory is optional and may be null
+            final File restoreDirectory = properties.getRestoreDirectory();
+
+            if (restoreDirectory != null) {
+
+                // sanity check that restore directory is a directory, creating it if necessary
+                FileUtils.ensureDirectoryExistAndCanAccess(restoreDirectory);
+
+                // check that restore directory is not the same as the primary directory
+                if (usersFileDirectory.getAbsolutePath().equals(restoreDirectory.getAbsolutePath())) {
+                    throw new ProviderCreationException(String.format("Authorized User's directory '%s' is the same as restore directory '%s' ",
+                            usersFileDirectory.getAbsolutePath(), restoreDirectory.getAbsolutePath()));
+                }
+
+                // the restore copy will have same file name, but reside in a different directory
+                restoreUsersFile = new File(restoreDirectory, usersFile.getName());
+
+                // sync the primary copy with the restore copy
+                try {
+                    FileUtils.syncWithRestore(usersFile, restoreUsersFile, logger);
+                } catch (final IOException | IllegalStateException ioe) {
+                    throw new ProviderCreationException(ioe);
+                }
+
+            }
+
+            // load the users from the specified file
+            if (usersFile.exists()) {
+                // find the schema
+                final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+                final Schema schema = schemaFactory.newSchema(FileAuthorizationProvider.class.getResource(USERS_XSD));
+
+                // attempt to unmarshal
+                final Unmarshaller unmarshaller = JAXB_CONTEXT.createUnmarshaller();
+                unmarshaller.setSchema(schema);
+                final JAXBElement<Users> element = unmarshaller.unmarshal(new StreamSource(usersFile), Users.class);
+                users = element.getValue();
+            } else {
+                final ObjectFactory objFactory = new ObjectFactory();
+                users = objFactory.createUsers();
+            }
+
+            // attempt to load a default roles
+            final String rawDefaultAuthorities = configurationContext.getProperty("Default User Roles");
+            if (StringUtils.isNotBlank(rawDefaultAuthorities)) {
+                final Set<String> invalidDefaultAuthorities = new HashSet<>();
+
+                // validate the specified authorities
+                final String[] rawDefaultAuthorityList = rawDefaultAuthorities.split(",");
+                for (String rawAuthority : rawDefaultAuthorityList) {
+                    rawAuthority = rawAuthority.trim();
+                    final Authority authority = Authority.valueOfAuthority(rawAuthority);
+                    if (authority == null) {
+                        invalidDefaultAuthorities.add(rawAuthority);
+                    } else {
+                        defaultAuthorities.add(rawAuthority);
+                    }
+                }
+
+                // report any unrecognized authorities
+                if (!invalidDefaultAuthorities.isEmpty()) {
+                    logger.warn(String.format("The following default role(s) '%s' were not recognized. Possible values: %s.",
+                            StringUtils.join(invalidDefaultAuthorities, ", "), StringUtils.join(Authority.getRawAuthorities(), ", ")));
+                }
+            }
+        } catch (IOException | ProviderCreationException | SAXException | JAXBException e) {
+            throw new ProviderCreationException(e);
+        }
+
+    }
+
+    @Override
+    public void preDestruction() {
+    }
+
+    /**
+     * Determines if this provider has a default role.
+     *
+     * @return
+     */
+    private boolean hasDefaultRoles() {
+        return !defaultAuthorities.isEmpty();
+    }
+
+    /**
+     * Determines if the specified dn is known to this authority provider. When
+     * this provider is configured to have default role(s), all dn are
+     * considered to exist.
+     *
+     * @param dn
+     * @return True if he dn is known, false otherwise
+     */
+    @Override
+    public boolean doesDnExist(String dn) throws AuthorityAccessException {
+        if (hasDefaultRoles()) {
+            return true;
+        }
+
+        final User user = getUser(dn);
+        return user != null;
+    }
+
+    /**
+     * Loads the authorities for the specified user. If this provider is
+     * configured for default user role(s) and a non existent dn is specified, a
+     * new user will be automatically created with the default role(s).
+     *
+     * @param dn
+     * @return
+     * @throws UnknownIdentityException
+     * @throws AuthorityAccessException
+     */
+    @Override
+    public synchronized Set<Authority> getAuthorities(String dn) throws UnknownIdentityException, AuthorityAccessException {
+        final Set<Authority> authorities = EnumSet.noneOf(Authority.class);
+
+        // get the user 
+        final User user = getUser(dn);
+
+        // ensure the user was located
+        if (user == null) {
+            if (hasDefaultRoles()) {
+                logger.debug(String.format("User DN not found: %s. Creating new user with default roles.", dn));
+
+                // create the user (which will automatically add any default authorities)
+                addUser(dn, null);
+
+                // get the authorities for the newly created user
+                authorities.addAll(getAuthorities(dn));
+            } else {
+                throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
+            }
+        } else {
+            // create the authorities that this user has
+            for (final Role role : user.getRole()) {
+                authorities.add(Authority.valueOfAuthority(role.getName()));
+            }
+        }
+
+        return authorities;
+    }
+
+    /**
+     * Adds the specified authorities to the specified user. Regardless of
+     * whether this provider is configured for a default user role, when a non
+     * existent dn is specified, an UnknownIdentityException will be thrown.
+     *
+     * @param dn
+     * @param authorities
+     * @throws UnknownIdentityException
+     * @throws AuthorityAccessException
+     */
+    @Override
+    public synchronized void setAuthorities(String dn, Set<Authority> authorities) throws UnknownIdentityException, AuthorityAccessException {
+        // get the user
+        final User user = getUser(dn);
+
+        // ensure the user was located
+        if (user == null) {
+            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
+        }
+
+        // add the user authorities
+        setUserAuthorities(user, authorities);
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Adds the specified authorities to the specified user.
+     *
+     * @param user
+     * @param authorities
+     */
+    private void setUserAuthorities(final User user, final Set<Authority> authorities) {
+        // clear the existing rules
+        user.getRole().clear();
+
+        // set the new roles
+        final ObjectFactory objFactory = new ObjectFactory();
+        for (final Authority authority : authorities) {
+            final Role role = objFactory.createRole();
+            role.setName(authority.toString());
+
+            // add the new role
+            user.getRole().add(role);
+        }
+    }
+
+    /**
+     * Adds the specified user. If this provider is configured with default
+     * role(s) they will be added to the new user.
+     *
+     * @param dn
+     * @param group
+     * @throws UnknownIdentityException
+     * @throws AuthorityAccessException
+     */
+    @Override
+    public synchronized void addUser(String dn, String group) throws IdentityAlreadyExistsException, AuthorityAccessException {
+        final User user = getUser(dn);
+
+        // ensure the user doesn't already exist
+        if (user != null) {
+            throw new IdentityAlreadyExistsException(String.format("User DN already exists: %s", dn));
+        }
+
+        // create the new user
+        final ObjectFactory objFactory = new ObjectFactory();
+        final User newUser = objFactory.createUser();
+
+        // set the user properties
+        newUser.setDn(dn);
+        newUser.setGroup(group);
+
+        // add default roles if appropriate
+        if (hasDefaultRoles()) {
+            for (final String authority : defaultAuthorities) {
+                Role role = objFactory.createRole();
+                role.setName(authority);
+
+                // add the role
+                newUser.getRole().add(role);
+            }
+        }
+
+        // add the user
+        users.getUser().add(newUser);
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Gets the users for the specified authority.
+     *
+     * @param authority
+     * @return
+     * @throws AuthorityAccessException
+     */
+    @Override
+    public synchronized Set<String> getUsers(Authority authority) throws AuthorityAccessException {
+        final Set<String> userSet = new HashSet<>();
+        for (final User user : users.getUser()) {
+            for (final Role role : user.getRole()) {
+                if (role.getName().equals(authority.toString())) {
+                    userSet.add(user.getDn());
+                }
+            }
+        }
+        return userSet;
+    }
+
+    /**
+     * Removes the specified user. Regardless of whether this provider is
+     * configured for a default user role, when a non existent dn is specified,
+     * an UnknownIdentityException will be thrown.
+     *
+     * @param dn
+     * @throws UnknownIdentityException
+     * @throws AuthorityAccessException
+     */
+    @Override
+    public synchronized void revokeUser(String dn) throws UnknownIdentityException, AuthorityAccessException {
+        // get the user
+        final User user = getUser(dn);
+
+        // ensure the user was located
+        if (user == null) {
+            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
+        }
+
+        // remove the specified user
+        users.getUser().remove(user);
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void setUsersGroup(Set<String> dns, String group) throws UnknownIdentityException, AuthorityAccessException {
+        final Collection<User> groupedUsers = new HashSet<>();
+
+        // get the specified users
+        for (final String dn : dns) {
+            // get the user
+            final User user = getUser(dn);
+
+            // ensure the user was located
+            if (user == null) {
+                throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
+            }
+
+            groupedUsers.add(user);
+        }
+
+        // update each user group
+        for (final User user : groupedUsers) {
+            user.setGroup(group);
+        }
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void ungroupUser(String dn) throws UnknownIdentityException, AuthorityAccessException {
+        // get the user
+        final User user = getUser(dn);
+
+        // ensure the user was located
+        if (user == null) {
+            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
+        }
+
+        // remove the users group
+        user.setGroup(null);
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void ungroup(String group) throws AuthorityAccessException {
+        // get the user group
+        final Collection<User> userGroup = getUserGroup(group);
+
+        // ensure the user group was located
+        if (userGroup == null) {
+            return;
+        }
+
+        // update each user group
+        for (final User user : userGroup) {
+            user.setGroup(null);
+        }
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public String getGroupForUser(String dn) throws UnknownIdentityException, AuthorityAccessException {
+        // get the user
+        final User user = getUser(dn);
+
+        // ensure the user was located
+        if (user == null) {
+            throw new UnknownIdentityException(String.format("User DN not found: %s.", dn));
+        }
+
+        return user.getGroup();
+    }
+
+    @Override
+    public void revokeGroup(String group) throws UnknownIdentityException, AuthorityAccessException {
+        // get the user group
+        final Collection<User> userGroup = getUserGroup(group);
+
+        // ensure the user group was located
+        if (userGroup == null) {
+            throw new UnknownIdentityException(String.format("User group not found: %s.", group));
+        }
+
+        // remove each user in the group
+        for (final User user : userGroup) {
+            users.getUser().remove(user);
+        }
+
+        try {
+            // save the file
+            save();
+        } catch (Exception e) {
+            throw new AuthorityAccessException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Locates the user with the specified DN.
+     *
+     * @param dn
+     * @return
+     */
+    private User getUser(String dn) throws UnknownIdentityException {
+        // ensure the DN was specified
+        if (dn == null) {
+            throw new UnknownIdentityException("User DN not specified.");
+        }
+
+        // attempt to get the user and ensure it was located
+        User desiredUser = null;
+        for (final User user : users.getUser()) {
+            if (dn.equalsIgnoreCase(user.getDn())) {
+                desiredUser = user;
+                break;
+            }
+        }
+
+        return desiredUser;
+    }
+
+    /**
+     * Locates all users that are part of the specified group.
+     *
+     * @param group
+     * @return
+     * @throws UnknownIdentityException
+     */
+    private Collection<User> getUserGroup(String group) throws UnknownIdentityException {
+        // ensure the DN was specified
+        if (group == null) {
+            throw new UnknownIdentityException("User group not specified.");
+        }
+
+        // get all users with this group
+        Collection<User> userGroup = null;
+        for (final User user : users.getUser()) {
+            if (group.equals(user.getGroup())) {
+                if (userGroup == null) {
+                    userGroup = new HashSet<>();
+                }
+                userGroup.add(user);
+            }
+        }
+
+        return userGroup;
+    }
+
+    /**
+     * Saves the users file.
+     *
+     * @throws Exception
+     */
+    private void save() throws Exception {
+        final Marshaller marshaller = JAXB_CONTEXT.createMarshaller();
+        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+
+        // save users to restore directory before primary directory
+        if (restoreUsersFile != null) {
+            marshaller.marshal(users, restoreUsersFile);
+        }
+
+        // save users to primary directory
+        marshaller.marshal(users, usersFile);
+    }
+
+    @AuthorityProviderContext
+    public void setNiFiProperties(NiFiProperties properties) {
+        this.properties = properties;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider
new file mode 100755
index 0000000..93d2941
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/resources/META-INF/services/org.apache.nifi.authorization.AuthorityProvider
@@ -0,0 +1,15 @@
+# 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.
+org.apache.nifi.authorization.FileAuthorizationProvider

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/xsd/users.xsd
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/xsd/users.xsd b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/xsd/users.xsd
new file mode 100644
index 0000000..4ee1e17
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/main/xsd/users.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <!-- role -->
+    <xs:complexType name="Role">
+        <xs:attribute name="name">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="ROLE_MONITOR"/>
+                    <xs:enumeration value="ROLE_PROVENANCE"/>
+                    <xs:enumeration value="ROLE_DFM"/>
+                    <xs:enumeration value="ROLE_ADMIN"/>
+                    <xs:enumeration value="ROLE_PROXY"/>
+                    <xs:enumeration value="ROLE_NIFI"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:complexType>
+
+    <!-- user -->
+    <xs:complexType name="User">
+        <xs:sequence>
+            <xs:element name="role" type="Role" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="dn">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:minLength value="1"/>
+                    <xs:pattern value=".*[^\s].*"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="group">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:minLength value="1"/>
+                    <xs:pattern value=".*[^\s].*"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:complexType>
+
+    <!-- users -->
+    <xs:element name="users">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="user" type="User" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java
new file mode 100644
index 0000000..3d0196d
--- /dev/null
+++ b/nar-bundles/framework-bundle/framework/file-authorization-provider/src/test/java/org/apache/nifi/authorization/FileAuthorizationProviderTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.nifi.authorization;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import org.apache.nifi.authorization.exception.ProviderCreationException;
+import org.apache.nifi.file.FileUtils;
+import org.apache.nifi.util.NiFiProperties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import static org.mockito.Mockito.*;
+import static org.junit.Assert.*;
+import org.junit.Ignore;
+import org.mockito.Mockito;
+
+@Ignore
+public class FileAuthorizationProviderTest {
+    
+    private FileAuthorizationProvider provider;
+    
+    private File primary;
+    
+    private File restore;
+    
+    private NiFiProperties mockProperties;
+    
+    private AuthorityProviderConfigurationContext mockConfigurationContext;
+    
+    @Before
+    public void setup() throws IOException {
+        
+        primary = new File("target/primary/users.txt");
+        restore = new File("target/restore/users.txt");
+        
+        System.out.println("absolute path: " + primary.getAbsolutePath());
+        
+        mockProperties = mock(NiFiProperties.class);
+        when(mockProperties.getRestoreDirectory()).thenReturn(restore.getParentFile());
+        
+        mockConfigurationContext = mock(AuthorityProviderConfigurationContext.class);
+        when(mockConfigurationContext.getProperty(Mockito.eq("Authorized Users File"))).thenReturn(primary.getPath());
+        
+        provider = new FileAuthorizationProvider();
+        provider.setNiFiProperties(mockProperties);
+        provider.initialize(null);
+    }     
+    
+    @After
+    public void cleanup() throws Exception {
+        deleteFile(primary);
+        deleteFile(restore);
+    }
+    
+    private boolean deleteFile(final File file) {
+        if(file.isDirectory()) {
+            FileUtils.deleteFilesInDir(file, null, null, true, true);
+        }
+        return FileUtils.deleteFile(file, null, 10);
+    }
+    
+    @Test
+    public void testPostContructionWhenRestoreDoesNotExist() throws Exception {
+        
+        byte[] primaryBytes = "<users/>".getBytes();
+        FileOutputStream fos = new FileOutputStream(primary);
+        fos.write(primaryBytes);
+        fos.close();
+        
+        provider.onConfigured(mockConfigurationContext);
+        assertEquals(primary.length(), restore.length());
+    }
+    
+    @Test
+    public void testPostContructionWhenPrimaryDoesNotExist() throws Exception {
+        
+        byte[] restoreBytes = "<users/>".getBytes();
+        FileOutputStream fos = new FileOutputStream(restore);
+        fos.write(restoreBytes);
+        fos.close();
+        
+        provider.onConfigured(mockConfigurationContext);
+        assertEquals(restore.length(), primary.length());
+        
+    }
+    
+    @Test(expected = ProviderCreationException.class)
+    public void testPostContructionWhenPrimaryDifferentThanRestore() throws Exception {
+        
+        byte[] primaryBytes = "<users></users>".getBytes();
+        FileOutputStream fos = new FileOutputStream(primary);
+        fos.write(primaryBytes);
+        fos.close();
+        
+        byte[] restoreBytes = "<users/>".getBytes();
+        fos = new FileOutputStream(restore);
+        fos.write(restoreBytes);
+        fos.close();
+        
+        provider.onConfigured(mockConfigurationContext);
+    }
+    
+    @Test
+    public void testPostContructionWhenPrimaryAndBackupDoNotExist() throws Exception {
+        
+        provider.onConfigured(mockConfigurationContext);
+        assertEquals(0, restore.length());
+        assertEquals(restore.length(), primary.length());
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/pom.xml b/nar-bundles/framework-bundle/framework/pom.xml
index 65fdaf1..f8ccdd0 100644
--- a/nar-bundles/framework-bundle/framework/pom.xml
+++ b/nar-bundles/framework-bundle/framework/pom.xml
@@ -35,6 +35,7 @@
         <module>cluster-protocol</module>
         <module>cluster-web</module>
         <module>cluster</module>
+        <module>file-authorization-provider</module>
         <module>cluster-authorization-provider</module>
         <module>user-actions</module>
         <module>administration</module>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/resources/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/resources/pom.xml b/nar-bundles/framework-bundle/framework/resources/pom.xml
index 9c984e7..ea25529 100644
--- a/nar-bundles/framework-bundle/framework/resources/pom.xml
+++ b/nar-bundles/framework-bundle/framework/resources/pom.xml
@@ -29,6 +29,9 @@
         <plugins>
             <plugin>
                 <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <attach>true</attach>
+                </configuration>
                 <executions>
                     <execution>
                         <id>make shared resource</id>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/runtime/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/runtime/pom.xml b/nar-bundles/framework-bundle/framework/runtime/pom.xml
index af4b404..e193729 100644
--- a/nar-bundles/framework-bundle/framework/runtime/pom.xml
+++ b/nar-bundles/framework-bundle/framework/runtime/pom.xml
@@ -29,6 +29,10 @@
             <artifactId>nifi-nar</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-properties</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>jul-to-slf4j</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/framework-bundle/framework/site-to-site/pom.xml
----------------------------------------------------------------------
diff --git a/nar-bundles/framework-bundle/framework/site-to-site/pom.xml b/nar-bundles/framework-bundle/framework/site-to-site/pom.xml
index ce18ec7..30cd325 100644
--- a/nar-bundles/framework-bundle/framework/site-to-site/pom.xml
+++ b/nar-bundles/framework-bundle/framework/site-to-site/pom.xml
@@ -43,6 +43,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-properties</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
             <artifactId>core-api</artifactId>
         </dependency>
         <dependency>
@@ -68,7 +72,6 @@
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
-            <version>4.3.6</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
@@ -77,7 +80,6 @@
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
-            <version>1.10.8</version>
             <scope>test</scope>
         </dependency>
     </dependencies>


[04/19] incubator-nifi git commit: NIFI-169 well it finally all builds. There is a classpath issue still to sort out which impacts startup

Posted by jo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java
new file mode 100644
index 0000000..2c85cd8
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/CacheServer.java
@@ -0,0 +1,26 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.io.IOException;
+
+public interface CacheServer {
+
+    void start() throws IOException;
+    void stop() throws IOException;
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java
new file mode 100644
index 0000000..0f962d0
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedCacheServer.java
@@ -0,0 +1,107 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.controller.AbstractControllerService;
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.controller.annotation.OnConfigured;
+import org.apache.nifi.processor.annotation.OnShutdown;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.ssl.SSLContextService;
+
+public abstract class DistributedCacheServer extends AbstractControllerService {
+    public static final String EVICTION_STRATEGY_LFU = "Least Frequently Used";
+    public static final String EVICTION_STRATEGY_LRU = "Least Recently Used";
+    public static final String EVICTION_STRATEGY_FIFO = "First In, First Out";
+
+    public static final PropertyDescriptor PORT = new PropertyDescriptor.Builder()
+            .name("Port")
+            .description("The port to listen on for incoming connections")
+            .required(true)
+            .addValidator(StandardValidators.PORT_VALIDATOR)
+            .defaultValue("4557")
+            .build();
+    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
+            .name("SSL Context Service")
+            .description(
+                    "If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure")
+            .required(false)
+            .addValidator(StandardValidators.createControllerServiceExistsValidator(SSLContextService.class))
+            .build();
+    public static final PropertyDescriptor MAX_CACHE_ENTRIES = new PropertyDescriptor.Builder()
+            .name("Maximum Cache Entries")
+            .description("The maximum number of cache entries that the cache can hold")
+            .required(true)
+            .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR)
+            .defaultValue("10000")
+            .build();
+    public static final PropertyDescriptor EVICTION_POLICY = new PropertyDescriptor.Builder()
+            .name("Eviction Strategy")
+            .description("Determines which strategy should be used to evict values from the cache to make room for new entries")
+            .required(true)
+            .allowableValues(EVICTION_STRATEGY_LFU, EVICTION_STRATEGY_LRU, EVICTION_STRATEGY_FIFO)
+            .defaultValue(EVICTION_STRATEGY_LFU)
+            .build();
+    public static final PropertyDescriptor PERSISTENCE_PATH = new PropertyDescriptor.Builder()
+            .name("Persistence Directory")
+            .description("If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only")
+            .required(false)
+            .addValidator(StandardValidators.createDirectoryExistsValidator(true, true))
+            .build();
+
+    private volatile CacheServer cacheServer;
+
+    @Override
+    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+        final List<PropertyDescriptor> properties = new ArrayList<>();
+        properties.add(PORT);
+        properties.add(MAX_CACHE_ENTRIES);
+        properties.add(EVICTION_POLICY);
+        properties.add(PERSISTENCE_PATH);
+        properties.add(new PropertyDescriptor.Builder().fromPropertyDescriptor(SSL_CONTEXT_SERVICE).allowableValues(
+                getControllerServiceLookup().getControllerServiceIdentifiers(SSLContextService.class)).build());
+        return properties;
+    }
+
+    @OnConfigured
+    public void startServer(final ConfigurationContext context) throws IOException {
+        if (cacheServer == null) {
+            cacheServer = createCacheServer(context);
+            cacheServer.start();
+        }
+    }
+
+    @OnShutdown
+    public void shutdownServer() throws IOException {
+        if (cacheServer != null) {
+            cacheServer.stop();
+        }
+        cacheServer = null;
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        shutdownServer();
+    }
+
+    protected abstract CacheServer createCacheServer(ConfigurationContext context);
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java
new file mode 100644
index 0000000..426573f
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/DistributedSetCacheServer.java
@@ -0,0 +1,68 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.io.File;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.ssl.SSLContextService;
+import org.apache.nifi.ssl.SSLContextService.ClientAuth;
+
+public class DistributedSetCacheServer extends DistributedCacheServer {
+
+    @Override
+    protected CacheServer createCacheServer(final ConfigurationContext context) {
+        final int port = context.getProperty(PORT).asInteger();
+        final String persistencePath = context.getProperty(PERSISTENCE_PATH).getValue();
+        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
+        final int maxSize = context.getProperty(MAX_CACHE_ENTRIES).asInteger();
+        final String evictionPolicyName = context.getProperty(EVICTION_POLICY).getValue();
+        
+        final SSLContext sslContext;
+        if ( sslContextService == null ) {
+            sslContext = null;
+        } else {
+            sslContext = sslContextService.createSSLContext(ClientAuth.REQUIRED);
+        }
+        
+        final EvictionPolicy evictionPolicy;
+        switch (evictionPolicyName) {
+            case EVICTION_STRATEGY_FIFO:
+                evictionPolicy = EvictionPolicy.FIFO;
+                break;
+            case EVICTION_STRATEGY_LFU:
+                evictionPolicy = EvictionPolicy.LFU;
+                break;
+            case EVICTION_STRATEGY_LRU:
+                evictionPolicy = EvictionPolicy.LRU;
+                break;
+            default:
+                throw new IllegalArgumentException("Illegal Eviction Policy: " + evictionPolicyName);
+        }
+        
+        try {
+            final File persistenceDir = persistencePath == null ? null : new File(persistencePath);
+            
+            return new SetCacheServer(getIdentifier(), sslContext, port, maxSize, evictionPolicy, persistenceDir);
+        } catch (final Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java
new file mode 100644
index 0000000..60bd2c1
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/EvictionPolicy.java
@@ -0,0 +1,73 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.util.Comparator;
+
+public enum EvictionPolicy {
+    LFU(new LFUComparator()),
+    LRU(new LRUComparator()),
+    FIFO(new FIFOComparator());
+    
+    private final Comparator<CacheRecord> comparator;
+    
+    private EvictionPolicy(final Comparator<CacheRecord> comparator) {
+        this.comparator = comparator;
+    }
+    
+    public Comparator<CacheRecord> getComparator() {
+        return comparator;
+    }
+    
+    public static class LFUComparator implements Comparator<CacheRecord> {
+        @Override
+        public int compare(final CacheRecord o1, final CacheRecord o2) {
+            if ( o1.equals(o2) ) {
+                return 0;
+            }
+            
+            final int hitCountComparison = Integer.compare(o1.getHitCount(), o2.getHitCount());
+            final int entryDateComparison = (hitCountComparison == 0) ? Long.compare(o1.getEntryDate(), o2.getEntryDate()) : hitCountComparison;
+            return (entryDateComparison == 0 ? Long.compare(o1.getId(), o2.getId()) : entryDateComparison);
+        }
+    }
+    
+    public static class LRUComparator implements Comparator<CacheRecord> {
+        @Override
+        public int compare(final CacheRecord o1, final CacheRecord o2) {
+            if ( o1.equals(o2) ) {
+                return 0;
+            }
+
+            final int lastHitDateComparison = Long.compare(o1.getLastHitDate(), o2.getLastHitDate());
+            return (lastHitDateComparison == 0 ? Long.compare(o1.getId(), o2.getId()) : lastHitDateComparison);
+        }
+    }
+    
+    public static class FIFOComparator implements Comparator<CacheRecord> {
+        @Override
+        public int compare(final CacheRecord o1, final CacheRecord o2) {
+            if ( o1.equals(o2) ) {
+                return 0;
+            }
+
+            final int entryDateComparison = Long.compare(o1.getEntryDate(), o2.getEntryDate());
+            return (entryDateComparison == 0 ? Long.compare(o1.getId(), o2.getId()) : entryDateComparison);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java
new file mode 100644
index 0000000..5d2c0f6
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/SetCacheServer.java
@@ -0,0 +1,104 @@
+/*
+ * 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.nifi.distributed.cache.server;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.distributed.cache.server.set.PersistentSetCache;
+import org.apache.nifi.distributed.cache.server.set.SetCache;
+import org.apache.nifi.distributed.cache.server.set.SetCacheResult;
+import org.apache.nifi.distributed.cache.server.set.SimpleSetCache;
+import org.apache.nifi.io.DataOutputStream;
+
+public class SetCacheServer extends AbstractCacheServer {
+
+    private final SetCache cache;
+
+    public SetCacheServer(final String identifier, final SSLContext sslContext, final int port, final int maxSize,
+            final EvictionPolicy evictionPolicy, final File persistencePath) throws IOException {
+        super(identifier, sslContext, port);
+
+        final SetCache simpleCache = new SimpleSetCache(identifier, maxSize, evictionPolicy);
+
+        if (persistencePath == null) {
+            this.cache = simpleCache;
+        } else {
+            final PersistentSetCache persistentCache = new PersistentSetCache(identifier, persistencePath, simpleCache);
+            persistentCache.restore();
+            this.cache = persistentCache;
+        }
+    }
+
+    @Override
+    protected boolean listen(final InputStream in, final OutputStream out, final int version) throws IOException {
+        final DataInputStream dis = new DataInputStream(in);
+        final DataOutputStream dos = new DataOutputStream(out);
+
+        final String action = dis.readUTF();
+        if (action.equals("close")) {
+            return false;
+        }
+
+        final int valueLength = dis.readInt();
+        final byte[] value = new byte[valueLength];
+        dis.readFully(value);
+        final ByteBuffer valueBuffer = ByteBuffer.wrap(value);
+
+        final SetCacheResult response;
+        switch (action) {
+        case "addIfAbsent":
+            response = cache.addIfAbsent(valueBuffer);
+            break;
+        case "contains":
+            response = cache.contains(valueBuffer);
+            break;
+        case "remove":
+            response = cache.remove(valueBuffer);
+            break;
+        default:
+            throw new IOException("IllegalRequest");
+        }
+
+        dos.writeBoolean(response.getResult());
+        dos.flush();
+
+        return true;
+    }
+
+    @Override
+    public void stop() throws IOException {
+        try {
+            super.stop();
+        } finally {
+            cache.shutdown();
+        }
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        if (!stopped)
+            stop();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java
new file mode 100644
index 0000000..920529d
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/DistributedMapCacheServer.java
@@ -0,0 +1,71 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.io.File;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.distributed.cache.server.CacheServer;
+import org.apache.nifi.distributed.cache.server.DistributedCacheServer;
+import org.apache.nifi.distributed.cache.server.EvictionPolicy;
+import org.apache.nifi.ssl.SSLContextService;
+import org.apache.nifi.ssl.SSLContextService.ClientAuth;
+
+public class DistributedMapCacheServer extends DistributedCacheServer {
+
+    @Override
+    protected CacheServer createCacheServer(final ConfigurationContext context) {
+        final int port = context.getProperty(PORT).asInteger();
+        final String persistencePath = context.getProperty(PERSISTENCE_PATH).getValue();
+        final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
+        final int maxSize = context.getProperty(MAX_CACHE_ENTRIES).asInteger();
+        final String evictionPolicyName = context.getProperty(EVICTION_POLICY).getValue();
+        
+        final SSLContext sslContext;
+        if ( sslContextService == null ) {
+            sslContext = null;
+        } else {
+            sslContext = sslContextService.createSSLContext(ClientAuth.REQUIRED);
+        }
+        
+        final EvictionPolicy evictionPolicy;
+        switch (evictionPolicyName) {
+            case EVICTION_STRATEGY_FIFO:
+                evictionPolicy = EvictionPolicy.FIFO;
+                break;
+            case EVICTION_STRATEGY_LFU:
+                evictionPolicy = EvictionPolicy.LFU;
+                break;
+            case EVICTION_STRATEGY_LRU:
+                evictionPolicy = EvictionPolicy.LRU;
+                break;
+            default:
+                throw new IllegalArgumentException("Illegal Eviction Policy: " + evictionPolicyName);
+        }
+        
+        try {
+            final File persistenceDir = persistencePath == null ? null : new File(persistencePath);
+            
+            return new MapCacheServer(getIdentifier(), sslContext, port, maxSize, evictionPolicy, persistenceDir);
+        } catch (final Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java
new file mode 100644
index 0000000..534cb0b
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCache.java
@@ -0,0 +1,29 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public interface MapCache {
+
+    MapPutResult putIfAbsent(ByteBuffer key, ByteBuffer value) throws IOException;
+    boolean containsKey(ByteBuffer key) throws IOException;
+    ByteBuffer get(ByteBuffer key) throws IOException;
+    ByteBuffer remove(ByteBuffer key) throws IOException;
+    void shutdown() throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java
new file mode 100644
index 0000000..b0ab0c4
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheRecord.java
@@ -0,0 +1,58 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.nio.ByteBuffer;
+
+import org.apache.nifi.distributed.cache.server.CacheRecord;
+
+public class MapCacheRecord extends CacheRecord {
+    private final ByteBuffer key;
+    private final ByteBuffer value;
+    
+    public MapCacheRecord(final ByteBuffer key, final ByteBuffer value) {
+        this.key = key;
+        this.value = value;
+    }
+    
+    public ByteBuffer getKey() {
+        return key;
+    }
+    
+    public ByteBuffer getValue() {
+        return value;
+    }
+    
+    @Override
+    public int hashCode() {
+        return 2938476 + key.hashCode() * value.hashCode();
+    }
+    
+    @Override
+    public boolean equals(final Object obj) {
+        if ( obj == this ) {
+            return true;
+        }
+        
+        if ( obj instanceof MapCacheRecord ) {
+            final MapCacheRecord that = ((MapCacheRecord) obj);
+            return key.equals(that.key) && value.equals(that.value);
+        }
+        
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java
new file mode 100644
index 0000000..3e8dd0e
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapCacheServer.java
@@ -0,0 +1,145 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.nifi.distributed.cache.server.AbstractCacheServer;
+import org.apache.nifi.distributed.cache.server.EvictionPolicy;
+import org.apache.nifi.io.DataOutputStream;
+
+public class MapCacheServer extends AbstractCacheServer {
+
+    private final MapCache cache;
+
+    public MapCacheServer(final String identifier, final SSLContext sslContext, final int port, final int maxSize,
+            final EvictionPolicy evictionPolicy, final File persistencePath) throws IOException {
+        super(identifier, sslContext, port);
+
+        final MapCache simpleCache = new SimpleMapCache(identifier, maxSize, evictionPolicy);
+
+        if (persistencePath == null) {
+            this.cache = simpleCache;
+        } else {
+            final PersistentMapCache persistentCache = new PersistentMapCache(identifier, persistencePath, simpleCache);
+            persistentCache.restore();
+            this.cache = persistentCache;
+        }
+    }
+
+    @Override
+    protected boolean listen(final InputStream in, final OutputStream out, final int version) throws IOException {
+        final DataInputStream dis = new DataInputStream(in);
+        final DataOutputStream dos = new DataOutputStream(out);
+        final String action = dis.readUTF();
+        try {
+            switch (action) {
+            case "close": {
+                return false;
+            }
+            case "putIfAbsent": {
+                final byte[] key = readValue(dis);
+                final byte[] value = readValue(dis);
+                final MapPutResult putResult = cache.putIfAbsent(ByteBuffer.wrap(key), ByteBuffer.wrap(value));
+                dos.writeBoolean(putResult.isSuccessful());
+                break;
+            }
+            case "containsKey": {
+                final byte[] key = readValue(dis);
+                final boolean contains = cache.containsKey(ByteBuffer.wrap(key));
+                dos.writeBoolean(contains);
+                break;
+            }
+            case "getAndPutIfAbsent": {
+                final byte[] key = readValue(dis);
+                final byte[] value = readValue(dis);
+
+                final MapPutResult putResult = cache.putIfAbsent(ByteBuffer.wrap(key), ByteBuffer.wrap(value));
+                if (putResult.isSuccessful()) {
+                    // Put was successful. There was no old value to get.
+                    dos.writeInt(0);
+                } else {
+                    // we didn't put. Write back the previous value
+                    final byte[] byteArray = putResult.getExistingValue().array();
+                    dos.writeInt(byteArray.length);
+                    dos.write(byteArray);
+                }
+
+                break;
+            }
+            case "get": {
+                final byte[] key = readValue(dis);
+                final ByteBuffer existingValue = cache.get(ByteBuffer.wrap(key));
+                if (existingValue == null) {
+                    // there was no existing value; we did a "put".
+                    dos.writeInt(0);
+                } else {
+                    // a value already existed. we did not update the map
+                    final byte[] byteArray = existingValue.array();
+                    dos.writeInt(byteArray.length);
+                    dos.write(byteArray);
+                }
+
+                break;
+            }
+            case "remove": {
+                final byte[] key = readValue(dis);
+                final boolean removed = cache.remove(ByteBuffer.wrap(key)) != null;
+                dos.writeBoolean(removed);
+                break;
+            }
+            default: {
+                throw new IOException("Illegal Request");
+            }
+            }
+        } finally {
+            dos.flush();
+        }
+
+        return true;
+    }
+
+    @Override
+    public void stop() throws IOException {
+        try {
+            super.stop();
+        } finally {
+            cache.shutdown();
+        }
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        if (!stopped)
+            stop();
+    }
+
+    private byte[] readValue(final DataInputStream dis) throws IOException {
+        final int numBytes = dis.readInt();
+        final byte[] buffer = new byte[numBytes];
+        dis.readFully(buffer);
+        return buffer;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java
new file mode 100644
index 0000000..29695eb
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/MapPutResult.java
@@ -0,0 +1,59 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.nio.ByteBuffer;
+
+public class MapPutResult {
+    private final boolean successful;
+    private final ByteBuffer key, value;
+    private final ByteBuffer existingValue;
+    private final ByteBuffer evictedKey, evictedValue;
+    
+    public MapPutResult(final boolean successful, final ByteBuffer key, final ByteBuffer value, final ByteBuffer existingValue, final ByteBuffer evictedKey, final ByteBuffer evictedValue) {
+        this.successful = successful;
+        this.key = key;
+        this.value = value;
+        this.existingValue = existingValue;
+        this.evictedKey = evictedKey;
+        this.evictedValue = evictedValue;
+    }
+
+    public boolean isSuccessful() {
+        return successful;
+    }
+
+    public ByteBuffer getKey() {
+        return key;
+    }
+
+    public ByteBuffer getValue() {
+        return value;
+    }
+    
+    public ByteBuffer getExistingValue() {
+        return existingValue;
+    }
+
+    public ByteBuffer getEvictedKey() {
+        return evictedKey;
+    }
+
+    public ByteBuffer getEvictedValue() {
+        return evictedValue;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java
new file mode 100644
index 0000000..77fb77d
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/PersistentMapCache.java
@@ -0,0 +1,210 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.wali.MinimalLockingWriteAheadLog;
+import org.wali.SerDe;
+import org.wali.UpdateType;
+import org.wali.WriteAheadRepository;
+
+public class PersistentMapCache implements MapCache {
+
+    private final MapCache wrapped;
+    private final WriteAheadRepository<MapWaliRecord> wali;
+    
+    private final AtomicLong modifications = new AtomicLong(0L);
+    
+    public PersistentMapCache(final String serviceIdentifier, final File persistencePath, final MapCache cacheToWrap) throws IOException {
+        wali = new MinimalLockingWriteAheadLog<>(persistencePath.toPath(), 1, new Serde(), null);
+        wrapped = cacheToWrap;
+    }
+
+    synchronized void restore() throws IOException {
+        final Collection<MapWaliRecord> recovered = wali.recoverRecords();
+        for ( final MapWaliRecord record : recovered ) {
+            if ( record.getUpdateType() == UpdateType.CREATE ) {
+                wrapped.putIfAbsent(record.getKey(), record.getValue());
+            }
+        }
+    }
+
+    @Override
+    public MapPutResult putIfAbsent(final ByteBuffer key, final ByteBuffer value) throws IOException {
+        final MapPutResult putResult = wrapped.putIfAbsent(key, value);
+        if ( putResult.isSuccessful() ) {
+            // The put was successful.
+            final MapWaliRecord record = new MapWaliRecord(UpdateType.CREATE, key, value);
+            final List<MapWaliRecord> records = new ArrayList<>();
+            records.add(record);
+
+            if ( putResult.getEvictedKey() != null ) {
+                records.add(new MapWaliRecord(UpdateType.DELETE, putResult.getEvictedKey(), putResult.getEvictedValue()));
+            }
+            
+            wali.update(Collections.singletonList(record), false);
+            
+            final long modCount = modifications.getAndIncrement();
+            if ( modCount > 0 && modCount % 100000 == 0 ) {
+                wali.checkpoint();
+            }
+        }
+        
+        return putResult;
+    }
+
+    @Override
+    public boolean containsKey(final ByteBuffer key) throws IOException {
+        return wrapped.containsKey(key);
+    }
+
+    @Override
+    public ByteBuffer get(final ByteBuffer key) throws IOException {
+        return wrapped.get(key);
+    }
+
+    @Override
+    public ByteBuffer remove(ByteBuffer key) throws IOException {
+        final ByteBuffer removeResult = wrapped.remove(key);
+        if ( removeResult != null ) {
+            final MapWaliRecord record = new MapWaliRecord(UpdateType.DELETE, key, removeResult);
+            final List<MapWaliRecord> records = new ArrayList<>(1);
+            records.add(record);
+            wali.update(records, false);
+            
+            final long modCount = modifications.getAndIncrement();
+            if ( modCount > 0 && modCount % 1000 == 0 ) {
+                wali.checkpoint();
+            }
+        }
+        return removeResult;
+    }
+
+
+    @Override
+    public void shutdown() throws IOException {
+        wali.shutdown();
+    }
+
+
+    private static class MapWaliRecord {
+        private final UpdateType updateType;
+        private final ByteBuffer key;
+        private final ByteBuffer value;
+        
+        public MapWaliRecord(final UpdateType updateType, final ByteBuffer key, final ByteBuffer value) {
+            this.updateType = updateType;
+            this.key = key;
+            this.value = value;
+        }
+        
+        public UpdateType getUpdateType() {
+            return updateType;
+        }
+        
+        public ByteBuffer getKey() {
+            return key;
+        }
+        
+        public ByteBuffer getValue() {
+            return value;
+        }
+    }
+    
+    private static class Serde implements SerDe<MapWaliRecord> {
+
+        @Override
+        public void serializeEdit(MapWaliRecord previousRecordState, MapWaliRecord newRecordState, java.io.DataOutputStream out) throws IOException {
+            final UpdateType updateType = newRecordState.getUpdateType();
+            if ( updateType == UpdateType.DELETE ) {
+                out.write(0);
+            } else {
+                out.write(1);
+            }
+            
+            final byte[] key = newRecordState.getKey().array();
+            final byte[] value = newRecordState.getValue().array();
+            
+            out.writeInt(key.length);
+            out.write(key);
+            out.writeInt(value.length);
+            out.write(value);
+        }
+
+        @Override
+        public void serializeRecord(MapWaliRecord record, java.io.DataOutputStream out) throws IOException {
+            serializeEdit(null, record, out);
+        }
+
+        @Override
+        public MapWaliRecord deserializeEdit(final DataInputStream in, final Map<Object, MapWaliRecord> currentRecordStates, final int version) throws IOException {
+            final int updateTypeValue = in.read();
+            if ( updateTypeValue < 0 ) {
+                throw new EOFException();
+            }
+
+            final UpdateType updateType = (updateTypeValue == 0 ? UpdateType.DELETE : UpdateType.CREATE);
+            
+            final int keySize = in.readInt();
+            final byte[] key = new byte[keySize];
+            in.readFully(key);
+
+            final int valueSize = in.readInt();
+            final byte[] value = new byte[valueSize];
+            in.readFully(value);
+
+            return new MapWaliRecord(updateType, ByteBuffer.wrap(key), ByteBuffer.wrap(value));
+        }
+
+        @Override
+        public MapWaliRecord deserializeRecord(DataInputStream in, int version) throws IOException {
+            return deserializeEdit(in, new HashMap<Object, MapWaliRecord>(), version);
+        }
+
+        @Override
+        public Object getRecordIdentifier(final MapWaliRecord record) {
+            return record.getKey();
+        }
+
+        @Override
+        public UpdateType getUpdateType(final MapWaliRecord record) {
+            return record.getUpdateType();
+        }
+
+        @Override
+        public String getLocation(final MapWaliRecord record) {
+            return null;
+        }
+
+        @Override
+        public int getVersion() {
+            return 1;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java
new file mode 100644
index 0000000..10139f1
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/map/SimpleMapCache.java
@@ -0,0 +1,165 @@
+/*
+ * 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.nifi.distributed.cache.server.map;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.apache.nifi.distributed.cache.server.EvictionPolicy;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SimpleMapCache implements MapCache {
+    private static final Logger logger = LoggerFactory.getLogger(SimpleMapCache.class);
+
+    private final Map<ByteBuffer, MapCacheRecord> cache = new HashMap<>();
+    private final SortedMap<MapCacheRecord, ByteBuffer> inverseCacheMap;
+    
+    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
+    private final Lock readLock = rwLock.readLock();
+    private final Lock writeLock = rwLock.writeLock();
+    
+    private final String serviceIdentifier;
+    
+    private final int maxSize;
+    
+    public SimpleMapCache(final String serviceIdentifier, final int maxSize, final EvictionPolicy evictionPolicy) {
+        // need to change to ConcurrentMap as this is modified when only the readLock is held
+        inverseCacheMap = new ConcurrentSkipListMap<>(evictionPolicy.getComparator());
+        this.serviceIdentifier = serviceIdentifier;
+        this.maxSize = maxSize;
+    }
+    
+    @Override
+    public String toString() {
+        return "SimpleSetCache[service id=" + serviceIdentifier + "]";
+    }
+
+    // don't need synchronized because this method is only called when the writeLock is held, and all 
+    // public methods obtain either the read or write lock
+    private MapCacheRecord evict() {
+        if ( cache.size() < maxSize ) {
+            return null;
+        }
+        
+        final MapCacheRecord recordToEvict = inverseCacheMap.firstKey();
+        final ByteBuffer valueToEvict = inverseCacheMap.remove(recordToEvict);
+        cache.remove(valueToEvict);
+        
+        if ( logger.isDebugEnabled() ) {
+            logger.debug("Evicting value {} from cache", new String(valueToEvict.array(), StandardCharsets.UTF_8));
+        }
+        
+        return recordToEvict;
+    }
+
+    @Override
+    public MapPutResult putIfAbsent(final ByteBuffer key, final ByteBuffer value) {
+        writeLock.lock();
+        try {
+            final MapCacheRecord record = cache.get(key);
+            if ( record == null ) {
+                // Record is null. We will add.
+                final MapCacheRecord evicted = evict();
+                final MapCacheRecord newRecord = new MapCacheRecord(key, value);
+                cache.put(key, newRecord);
+                inverseCacheMap.put(newRecord, key);
+                
+                if ( evicted == null ) {
+                    return new MapPutResult(true, key, value, null, null, null);
+                } else {
+                    return new MapPutResult(true, key, value, null, evicted.getKey(), evicted.getValue());
+                }
+            }
+            
+            // Record is not null. Increment hit count and return result indicating that record was not added.
+            inverseCacheMap.remove(record);
+            record.hit();
+            inverseCacheMap.put(record, key);
+            
+            return new MapPutResult(false, key, value, record.getValue(), null, null);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+    
+    @Override
+    public boolean containsKey(final ByteBuffer key) {
+        readLock.lock();
+        try {
+            final MapCacheRecord record = cache.get(key);
+            if ( record == null ) {
+                return false;
+            }
+            
+            inverseCacheMap.remove(record);
+            record.hit();
+            inverseCacheMap.put(record, key);
+            
+            return true;
+        } finally {
+            readLock.unlock();
+        }
+    }
+
+    @Override
+    public ByteBuffer get(final ByteBuffer key) {
+        readLock.lock();
+        try {
+            final MapCacheRecord record = cache.get(key);
+            if ( record == null ) {
+                return null;
+            }
+            
+            inverseCacheMap.remove(record);
+            record.hit();
+            inverseCacheMap.put(record, key);
+            
+            return record.getValue();
+        } finally {
+            readLock.unlock();
+        }
+    }
+
+    @Override
+    public ByteBuffer remove(ByteBuffer key) throws IOException {
+        writeLock.lock();
+        try {
+            final MapCacheRecord record = cache.remove(key);
+            if (record == null) {
+                return null;
+            }
+            inverseCacheMap.remove(record);
+            return record.getValue();
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    @Override
+    public void shutdown() throws IOException {
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java
new file mode 100644
index 0000000..4d75fc0
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/PersistentSetCache.java
@@ -0,0 +1,194 @@
+/*
+ * 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.nifi.distributed.cache.server.set;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.wali.MinimalLockingWriteAheadLog;
+import org.wali.SerDe;
+import org.wali.UpdateType;
+import org.wali.WriteAheadRepository;
+
+public class PersistentSetCache implements SetCache {
+
+    private final SetCache wrapped;
+    private final WriteAheadRepository<SetRecord> wali;
+    
+    private final AtomicLong modifications = new AtomicLong(0L);
+    
+    public PersistentSetCache(final String serviceIdentifier, final File persistencePath, final SetCache cacheToWrap) throws IOException {
+        wali = new MinimalLockingWriteAheadLog<>(persistencePath.toPath(), 1, new Serde(), null);
+        wrapped = cacheToWrap;
+    }
+    
+    public synchronized void restore() throws IOException {
+        final Collection<SetRecord> recovered = wali.recoverRecords();
+        for ( final SetRecord record : recovered ) {
+            if ( record.getUpdateType() == UpdateType.CREATE ) {
+                addIfAbsent(record.getBuffer());
+            }
+        }
+    }
+    
+    @Override
+    public synchronized SetCacheResult remove(final ByteBuffer value) throws IOException {
+        final SetCacheResult removeResult = wrapped.remove(value);
+        if ( removeResult.getResult() ) {
+            final SetRecord record = new SetRecord(UpdateType.DELETE, value);
+            final List<SetRecord> records = new ArrayList<>();
+            records.add(record);
+            wali.update(records, false);
+            
+            final long modCount = modifications.getAndIncrement();
+            if ( modCount > 0 && modCount % 1000 == 0 ) {
+                wali.checkpoint();
+            }
+        }
+
+        return removeResult;
+    }
+
+    @Override
+    public synchronized SetCacheResult addIfAbsent(final ByteBuffer value) throws IOException {
+        final SetCacheResult addResult = wrapped.addIfAbsent(value);
+        if ( addResult.getResult() ) {
+            final SetRecord record = new SetRecord(UpdateType.CREATE, value);
+            final List<SetRecord> records = new ArrayList<>();
+            records.add(record);
+            
+            final SetCacheRecord evictedRecord = addResult.getEvictedRecord();
+            if ( evictedRecord != null ) {
+                records.add(new SetRecord(UpdateType.DELETE, evictedRecord.getValue()));
+            }
+            
+            wali.update(records, false);
+            
+            final long modCount = modifications.getAndIncrement();
+            if ( modCount > 0 && modCount % 1000 == 0 ) {
+                wali.checkpoint();
+            }
+        }
+        
+        return addResult;
+    }
+
+    @Override
+    public synchronized SetCacheResult contains(final ByteBuffer value) throws IOException {
+        return wrapped.contains(value);
+    }
+    
+    @Override
+    public void shutdown() throws IOException {
+        wali.shutdown();
+    }
+    
+    private static class SetRecord {
+        private final UpdateType updateType;
+        private final ByteBuffer value;
+        
+        public SetRecord(final UpdateType updateType, final ByteBuffer value) {
+            this.updateType = updateType;
+            this.value = value;
+        }
+        
+        public UpdateType getUpdateType() {
+            return updateType;
+        }
+        
+        public ByteBuffer getBuffer() {
+            return value;
+        }
+        
+        public byte[] getData() {
+            return value.array();
+        }
+    }
+    
+    private static class Serde implements SerDe<SetRecord> {
+
+        @Override
+        public void serializeEdit(final SetRecord previousRecordState, final SetRecord newRecordState, final DataOutputStream out) throws IOException {
+            final UpdateType updateType = newRecordState.getUpdateType();
+            if ( updateType == UpdateType.DELETE ) {
+                out.write(0);
+            } else {
+                out.write(1);
+            }
+            
+            final byte[] data = newRecordState.getData();
+            out.writeInt(data.length);
+            out.write(newRecordState.getData());
+        }
+
+        @Override
+        public void serializeRecord(SetRecord record, DataOutputStream out) throws IOException {
+            serializeEdit(null, record, out);
+        }
+
+        @Override
+        public SetRecord deserializeEdit(final DataInputStream in, final Map<Object, SetRecord> currentRecordStates, final int version) throws IOException {
+            final int value = in.read();
+            if ( value < 0 ) {
+                throw new EOFException();
+            }
+
+            final UpdateType updateType = (value == 0 ? UpdateType.DELETE : UpdateType.CREATE);
+            
+            final int size = in.readInt();
+            final byte[] data = new byte[size];
+            in.readFully(data);
+            
+            return new SetRecord(updateType, ByteBuffer.wrap(data));
+        }
+
+        @Override
+        public SetRecord deserializeRecord(DataInputStream in, int version) throws IOException {
+            return deserializeEdit(in, new HashMap<Object, SetRecord>(), version);
+        }
+
+        @Override
+        public Object getRecordIdentifier(final SetRecord record) {
+            return record.getBuffer();
+        }
+
+        @Override
+        public UpdateType getUpdateType(final SetRecord record) {
+            return record.getUpdateType();
+        }
+
+        @Override
+        public String getLocation(final SetRecord record) {
+            return null;
+        }
+
+        @Override
+        public int getVersion() {
+            return 1;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java
new file mode 100644
index 0000000..bf6ae3e
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCache.java
@@ -0,0 +1,29 @@
+/*
+ * 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.nifi.distributed.cache.server.set;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public interface SetCache {
+
+    SetCacheResult remove(ByteBuffer value) throws IOException;
+    SetCacheResult addIfAbsent(ByteBuffer value) throws IOException;
+    SetCacheResult contains(ByteBuffer value) throws IOException;
+    void shutdown() throws IOException;
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.java
new file mode 100644
index 0000000..20b6fae
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheRecord.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 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.nifi.distributed.cache.server.set;
+
+import java.nio.ByteBuffer;
+
+import org.apache.nifi.distributed.cache.server.CacheRecord;
+
+public class SetCacheRecord extends CacheRecord {
+    private final ByteBuffer value;
+    
+    public SetCacheRecord(final ByteBuffer value) {
+        this.value = value;
+    }
+    
+    public ByteBuffer getValue() {
+        return value;
+    }
+    
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+    
+    @Override
+    public boolean equals(final Object obj) {
+        if ( this == obj ) {
+            return true;
+        }
+        
+        if (obj instanceof SetCacheRecord) {
+            return value.equals(((SetCacheRecord) obj).value);
+        }
+        return false;
+    }
+    
+    @Override
+    public String toString() {
+        return "SetCacheRecord[value=" + new String(value.array()) + ", hitCount=" + getHitCount() + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java
new file mode 100644
index 0000000..732c4f0
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SetCacheResult.java
@@ -0,0 +1,43 @@
+/*
+ * 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.nifi.distributed.cache.server.set;
+
+
+
+public class SetCacheResult {
+    private final boolean result;
+    private final SetCacheRecord stats;
+    private final SetCacheRecord evictedRecord;
+    
+    public SetCacheResult(final boolean result, final SetCacheRecord stats, final SetCacheRecord evictedRecord) {
+        this.result = result;
+        this.stats = stats;
+        this.evictedRecord = evictedRecord;
+    }
+    
+    public boolean getResult() {
+        return result;
+    }
+    
+    public SetCacheRecord getRecord() {
+        return stats;
+    }
+    
+    public SetCacheRecord getEvictedRecord() {
+        return evictedRecord;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java
new file mode 100644
index 0000000..77d6481
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/java/org/apache/nifi/distributed/cache/server/set/SimpleSetCache.java
@@ -0,0 +1,117 @@
+/*
+ * 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.nifi.distributed.cache.server.set;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.nifi.distributed.cache.server.EvictionPolicy;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SimpleSetCache implements SetCache {
+    private static final Logger logger = LoggerFactory.getLogger(SimpleSetCache.class);
+    
+    private final Map<ByteBuffer, SetCacheRecord> cache = new HashMap<>();
+    private final SortedMap<SetCacheRecord, ByteBuffer> inverseCacheMap;
+    
+    private final String serviceIdentifier;
+    
+    private final int maxSize;
+    
+    public SimpleSetCache(final String serviceIdentifier, final int maxSize, final EvictionPolicy evictionPolicy) {
+        inverseCacheMap = new TreeMap<>(evictionPolicy.getComparator());
+        this.serviceIdentifier = serviceIdentifier;
+        this.maxSize = maxSize;
+    }
+    
+    private synchronized SetCacheRecord evict() {
+        if ( cache.size() < maxSize ) {
+            return null;
+        }
+        
+        final SetCacheRecord recordToEvict = inverseCacheMap.firstKey();
+        final ByteBuffer valueToEvict = inverseCacheMap.remove(recordToEvict);
+        cache.remove(valueToEvict);
+        
+        if ( logger.isDebugEnabled() ) {
+            logger.debug("Evicting value {} from cache", new String(valueToEvict.array(), StandardCharsets.UTF_8));
+        }
+        
+        return recordToEvict;
+    }
+    
+    @Override
+    public synchronized SetCacheResult addIfAbsent(final ByteBuffer value) {
+        final SetCacheRecord record = cache.get(value);
+        if ( record == null ) {
+            final SetCacheRecord evicted = evict();
+            final SetCacheRecord newRecord = new SetCacheRecord(value);
+            cache.put(value, newRecord);
+            inverseCacheMap.put(newRecord, value);
+            return new SetCacheResult(true, newRecord, evicted);
+        } else {
+            // We have to remove the record and add it again in order to cause the Map to stay sorted
+            inverseCacheMap.remove(record);
+            record.hit();
+            inverseCacheMap.put(record, value);
+            
+            return new SetCacheResult(false, record, null);
+        }
+    }
+    
+    @Override
+    public synchronized SetCacheResult contains(final ByteBuffer value) {
+        final SetCacheRecord record = cache.get(value);
+        if ( record == null ) {
+            return new SetCacheResult(false, null, null);
+        } else {
+            // We have to remove the record and add it again in order to cause the Map to stay sorted
+            inverseCacheMap.remove(record);
+            record.hit();
+            inverseCacheMap.put(record, value);
+            
+            return new SetCacheResult(true, record, null);
+        }
+    }
+    
+    @Override
+    public synchronized SetCacheResult remove(final ByteBuffer value) {
+        final SetCacheRecord record = cache.remove(value);
+        if ( record == null ) {
+            return new SetCacheResult(false, null, null);
+        } else {
+            inverseCacheMap.remove(record);
+            return new SetCacheResult(true, record, null);
+        }
+    }
+    
+    @Override
+    public String toString() {
+        return "SimpleSetCache[service id=" + serviceIdentifier + "]";
+    }
+    
+    @Override
+    public void shutdown() throws IOException {
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
new file mode 100644
index 0000000..0509c7c
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
@@ -0,0 +1,16 @@
+# 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.
+org.apache.nifi.distributed.cache.server.DistributedSetCacheServer
+org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/19d4a150/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html
----------------------------------------------------------------------
diff --git a/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html
new file mode 100644
index 0000000..dca3aa1
--- /dev/null
+++ b/nar-bundles/standard-services/distributed-cache-services-bundle/distributed-cache-server/src/main/resources/docs/org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer/index.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="en">
+<!--
+  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.
+-->
+<head>
+<meta charset="utf-8" />
+<title>Distributed Map Cache Client Service</title>
+<link rel="stylesheet" href="../../css/component-usage.css" type="text/css" />
+</head>
+
+<body>
+	<h2>Description:</h2>
+
+	<p>A Controller Service that starts an embedded server and listens for connections from clients. The
+	server provides the ability to query the cache, add data to the cache, and remove data from the cache.</p>
+
+
+
+	<p>
+		<strong>Properties:</strong>
+	</p>
+	<p>In the list below, the names of required properties appear
+		in bold. Any other properties (not in bold) are considered optional.
+		If a property has a default value, it is indicated. If a property
+		supports the use of the NiFi Expression Language (or simply,
+		"expression language"), that is also indicated.</p>
+
+	<ul>
+		<li><strong>Port</strong>
+			<ul>
+				<li>The port to listen on for incoming connections</li>
+				<li>Default value: 4557</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li>SSL Context Service
+			<ul>
+				<li>If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure</li>
+				<li>Default value: no default</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li><strong>Maximum Cache Entries</strong>
+			<ul>
+				<li>The maximum number of cache entries that the cache can hold
+				<li>Default value: 10,000</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li><strong>Eviction Strategy</strong>
+			<ul>
+				<li>Determines which strategy should be used to evict values from the cache to make room for new entries. Valid values: 
+					<code>Least Frequently Used</code>, <code>Least Recently Used</code>, and <code>First In, First Out</code>
+				<li>Default value: Least Frequently Used</li>
+				<li>Supports expression language: false</li>
+			</ul></li>
+		<li>Persistence Directory
+			<ul>
+				<li>If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only</li>
+				<li>Default value: no default (in-memory)</li>
+				<li>Supports expression language: true - JVM and System Properties Only</li>
+			</ul></li>
+	</ul>
+
+
+	<i>See Also:</i>
+	<ul>
+		<li><a href="../org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService/index.html">Distributed Map Cache Client Service</a></li>
+		<li><a href="../org.apache.nifi.ssl.StandardSSLContextService/index.html">Standard SSL Context Service</a></li>
+	</ul>
+
+</body>
+</html>


[13/19] incubator-nifi git commit: Fixed classpath issue affecting startup

Posted by jo...@apache.org.
Fixed classpath issue affecting startup


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

Branch: refs/heads/develop
Commit: dd57a33500101756d0cf601e1d3d655e6a127033
Parents: 19d4a15
Author: joewitt <jo...@apache.org>
Authored: Mon Dec 15 05:52:40 2014 -0500
Committer: joewitt <jo...@apache.org>
Committed: Mon Dec 15 05:52:40 2014 -0500

----------------------------------------------------------------------
 misc/build-order.sh                             |  81 ---
 misc/pom.xml                                    | 100 ---
 misc/src/main/java/nifi/NarMojo.java            | 610 -------------------
 .../resources/META-INF/plexus/components.xml    |  52 --
 4 files changed, 843 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/dd57a335/misc/build-order.sh
----------------------------------------------------------------------
diff --git a/misc/build-order.sh b/misc/build-order.sh
deleted file mode 100755
index e8f8e5e..0000000
--- a/misc/build-order.sh
+++ /dev/null
@@ -1,81 +0,0 @@
-#MAVEN_FLAGS="-Dmaven.test.skip=true"
-MAVEN_FLAGS=""
-
-cd misc/nar-maven-plugin && \
-mvn $MAVEN_FLAGS install && \
-cd ../../commons/nifi-parent && \
-mvn $MAVEN_FLAGS install && \
-cd ../../nifi-bootstrap && \
-mvn $MAVEN_FLAGS install && \
-cd ../nifi-api && \
-mvn $MAVEN_FLAGS install && \
-cd ../commons/ && \
-cd	nifi-stream-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../wali && \
-mvn $MAVEN_FLAGS install && \
-cd	../flowfile-packager && \
-mvn $MAVEN_FLAGS install && \
-cd	../core-flowfile-attributes && \
-mvn $MAVEN_FLAGS install && \
-cd	../data-provenance-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../naive-search-ring-buffer && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-expression-language && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-file-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-logging-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-properties && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-security-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-socket-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../nifi-web-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../processor-utilities && \
-mvn $MAVEN_FLAGS install && \
-cd	../remote-communications-utils && \
-mvn $MAVEN_FLAGS install && \
-cd	../search-utils && \
-mvn $MAVEN_FLAGS install && \
-cd ../../extensions/file-authorization-provider && \
-mvn $MAVEN_FLAGS install && \
-cd ../../nifi-mock && \
-mvn $MAVEN_FLAGS install && \
-cd ../nar-bundles/ && \
-cd	nar-container-common && \
-mvn $MAVEN_FLAGS install && \
-cd	../jetty-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../standard-services-api-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../ssl-context-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../distributed-cache-services-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../standard-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../hadoop-libraries-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../hadoop-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../volatile-provenance-repository-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../persistent-provenance-repository-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../framework-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../execute-script-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../monitor-threshold-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd	../update-attribute-bundle && \
-mvn $MAVEN_FLAGS install && \
-cd ../../assemblies/nifi 
-mvn assembly:assembly

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/dd57a335/misc/pom.xml
----------------------------------------------------------------------
diff --git a/misc/pom.xml b/misc/pom.xml
deleted file mode 100644
index 5c7ca7f..0000000
--- a/misc/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.nifi</groupId>
-    <artifactId>nar-maven-plugin</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>maven-plugin</packaging>
-    <name>Apache NiFi NAR Plugin</name>
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-    <build>
-        <defaultGoal>install</defaultGoal>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.2</version>
-                <configuration>
-                    <source>1.7</source>
-                    <target>1.7</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>2.5</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.3</version>
-                <executions>
-                  <execution>
-                    <id>default-descriptor</id>
-                    <goals>
-                      <goal>descriptor</goal>
-                    </goals>
-                    <phase>process-classes</phase>
-                  </execution>
-                  <execution>
-                    <id>help-descriptor</id>
-                    <goals>
-                      <goal>helpmojo</goal>
-                    </goals>
-                    <phase>process-classes</phase>
-                  </execution>
-                </executions>
-              </plugin>
-        </plugins>
-    </build>    
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-api</artifactId>
-            <version>2.0.11</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-dependency-plugin</artifactId>
-            <version>2.9</version>
-            <type>maven-plugin</type>
-        </dependency>
-        <dependency>
-            <!-- No code from maven-jar-plugin is actually used; it's included
-            just to simplify the dependencies list.                     -->
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-jar-plugin</artifactId>
-            <version>2.5</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-tools</groupId>
-            <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.3</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-    <distributionManagement>
-        <repository>
-            <id>nifi-releases</id>
-            <url>${nifi.repo.url}</url>
-        </repository>
-        <snapshotRepository>
-            <id>nifi-snapshots</id>
-            <url>${nifi.snapshot.repo.url}</url>
-        </snapshotRepository>
-    </distributionManagement>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/dd57a335/misc/src/main/java/nifi/NarMojo.java
----------------------------------------------------------------------
diff --git a/misc/src/main/java/nifi/NarMojo.java b/misc/src/main/java/nifi/NarMojo.java
deleted file mode 100644
index 5196f73..0000000
--- a/misc/src/main/java/nifi/NarMojo.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * 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 nifi;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.apache.maven.archiver.MavenArchiveConfiguration;
-import org.apache.maven.archiver.MavenArchiver;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.installer.ArtifactInstaller;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.dependency.utils.DependencyStatusSets;
-import org.apache.maven.plugin.dependency.utils.DependencyUtil;
-import org.apache.maven.plugin.dependency.utils.filters.DestFileFilter;
-import org.apache.maven.plugin.dependency.utils.resolvers.ArtifactsResolver;
-import org.apache.maven.plugin.dependency.utils.resolvers.DefaultArtifactsResolver;
-import org.apache.maven.plugin.dependency.utils.translators.ArtifactTranslator;
-import org.apache.maven.plugin.dependency.utils.translators.ClassifierTypeTranslator;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
-import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
-import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
-import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
-import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
-import org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
-import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
-import org.codehaus.plexus.archiver.ArchiverException;
-import org.codehaus.plexus.archiver.jar.JarArchiver;
-import org.codehaus.plexus.archiver.jar.ManifestException;
-import org.codehaus.plexus.archiver.manager.ArchiverManager;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Packages the current project as an Apache NiFi Archive (NAR).
- *
- * The following code is derived from maven-dependencies-plugin and
- * maven-jar-plugin. The functionality of CopyDependenciesMojo and JarMojo was
- * simplified to the use case of NarMojo.
- *
- */
-@Mojo(name = "nar", defaultPhase = LifecyclePhase.PACKAGE, threadSafe = false, requiresDependencyResolution = ResolutionScope.RUNTIME)
-public class NarMojo extends AbstractMojo {
-
-    private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"};
-    private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
-
-    /**
-     * POM
-     *
-     */
-    @Parameter(defaultValue = "${project}", readonly = true, required = true)
-    protected MavenProject project;
-
-    @Parameter(defaultValue = "${session}", readonly = true, required = true)
-    protected MavenSession session;
-
-    /**
-     * List of files to include. Specified as fileset patterns.
-     */
-    @Parameter(property = "includes")
-    protected String[] includes;
-    /**
-     * List of files to exclude. Specified as fileset patterns.
-     */
-    @Parameter(property = "excludes")
-    protected String[] excludes;
-    /**
-     * Name of the generated NAR.
-     *
-     */
-    @Parameter(alias = "narName", property = "nar.finalName", defaultValue = "${project.build.finalName}", required = true)
-    protected String finalName;
-
-    /**
-     * The Jar archiver.
-     *
-     * \@\component role="org.codehaus.plexus.archiver.Archiver" roleHint="jar"
-     */
-    @Component(role = org.codehaus.plexus.archiver.Archiver.class, hint = "jar")
-    private JarArchiver jarArchiver;
-    /**
-     * The archive configuration to use.
-     *
-     * See <a
-     * href="http://maven.apache.org/shared/maven-archiver/index.html">the
-     * documentation for Maven Archiver</a>.
-     *
-     */
-    @Parameter(property = "archive")
-    protected final MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
-    /**
-     * Path to the default MANIFEST file to use. It will be used if
-     * <code>useDefaultManifestFile</code> is set to <code>true</code>.
-     *
-     */
-    @Parameter(property = "defaultManifestFiles", defaultValue = "${project.build.outputDirectory}/META-INF/MANIFEST.MF", readonly = true, required = true)
-    protected File defaultManifestFile;
-
-    /**
-     * Set this to <code>true</code> to enable the use of the
-     * <code>defaultManifestFile</code>.
-     *
-     * @since 2.2
-     */
-    @Parameter(property = "nar.useDefaultManifestFile", defaultValue = "false")
-    protected boolean useDefaultManifestFile;
-
-    @Component
-    protected MavenProjectHelper projectHelper;
-
-    /**
-     * Whether creating the archive should be forced.
-     *
-     */
-    @Parameter(property = "nar.forceCreation", defaultValue = "false")
-    protected boolean forceCreation;
-
-    /**
-     * Classifier to add to the artifact generated. If given, the artifact will
-     * be an attachment instead.
-     *
-     */
-    @Parameter(property = "classifier")
-    protected String classifier;
-
-    @Component
-    protected ArtifactInstaller installer;
-
-    @Component
-    protected ArtifactRepositoryFactory repositoryFactory;
-
-    /**
-     * This only applies if the classifier parameter is used.
-     *
-     */
-    @Parameter(property = "mdep.failOnMissingClassifierArtifact", defaultValue = "true", required = false)
-    protected boolean failOnMissingClassifierArtifact = true;
-
-    /**
-     * Comma Separated list of Types to include. Empty String indicates include
-     * everything (default).
-     *
-     */
-    @Parameter(property = "includeTypes", required = false)
-    protected String includeTypes;
-
-    /**
-     * Comma Separated list of Types to exclude. Empty String indicates don't
-     * exclude anything (default).
-     *
-     */
-    @Parameter(property = "excludeTypes", required = false)
-    protected String excludeTypes;
-
-    /**
-     * Scope to include. An Empty string indicates all scopes (default).
-     *
-     */
-    @Parameter(property = "includeScope", required = false)
-    protected String includeScope;
-
-    /**
-     * Scope to exclude. An Empty string indicates no scopes (default).
-     *
-     */
-    @Parameter(property = "excludeScope", required = false)
-    protected String excludeScope;
-
-    /**
-     * Comma Separated list of Classifiers to include. Empty String indicates
-     * include everything (default).
-     *
-     */
-    @Parameter(property = "includeClassifiers", required = false)
-    protected String includeClassifiers;
-
-    /**
-     * Comma Separated list of Classifiers to exclude. Empty String indicates
-     * don't exclude anything (default).
-     *
-     */
-    @Parameter(property = "excludeClassifiers", required = false)
-    protected String excludeClassifiers;
-
-    /**
-     * Specify classifier to look for. Example: sources
-     *
-     */
-    @Parameter(property = "classifier", required = false)
-    protected String copyDepClassifier;
-
-    /**
-     * Specify type to look for when constructing artifact based on classifier.
-     * Example: java-source,jar,war, nar
-     *
-     */
-    @Parameter(property = "type", required = false, defaultValue = "nar")
-    protected String type;
-
-    /**
-     * Comma separated list of Artifact names too exclude.
-     *
-     */
-    @Parameter(property = "excludeArtifacts", required = false)
-    protected String excludeArtifactIds;
-
-    /**
-     * Comma separated list of Artifact names to include.
-     *
-     */
-    @Parameter(property = "includeArtifacts", required = false)
-    protected String includeArtifactIds;
-
-    /**
-     * Comma separated list of GroupId Names to exclude.
-     *
-     */
-    @Parameter(property = "excludeArtifacts", required = false)
-    protected String excludeGroupIds;
-
-    /**
-     * Comma separated list of GroupIds to include.
-     *
-     */
-    @Parameter(property = "includeGroupIds", required = false)
-    protected String includeGroupIds;
-
-    /**
-     * Directory to store flag files
-     *
-     */
-    @Parameter(property = "markersDirectory", required = false, defaultValue = "${project.build.directory}/dependency-maven-plugin-markers")
-    protected File markersDirectory;
-
-    /**
-     * Overwrite release artifacts
-     *
-     */
-    @Parameter(property = "overWriteReleases", required = false)
-    protected boolean overWriteReleases;
-
-    /**
-     * Overwrite snapshot artifacts
-     *
-     */
-    @Parameter(property = "overWriteSnapshots", required = false)
-    protected boolean overWriteSnapshots;
-
-    /**
-     * Overwrite artifacts that don't exist or are older than the source.
-     *
-     */
-    @Parameter(property = "overWriteIfNewer", required = false, defaultValue = "true")
-    protected boolean overWriteIfNewer;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     */
-    @Component
-    protected ArtifactFactory factory;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     *
-     */
-    @Component
-    protected ArtifactResolver resolver;
-
-    /**
-     * Artifact collector, needed to resolve dependencies.
-     *
-     */
-    @Component(role = org.apache.maven.artifact.resolver.ArtifactCollector.class)
-    protected ArtifactCollector artifactCollector;
-
-    @Component(role = org.apache.maven.artifact.metadata.ArtifactMetadataSource.class)
-    protected ArtifactMetadataSource artifactMetadataSource;
-
-    /**
-     * Location of the local repository.
-     *
-     */
-    @Parameter(property = "localRepository", required = true, readonly = true)
-    protected ArtifactRepository local;
-
-    /**
-     * List of Remote Repositories used by the resolver
-     *
-     */
-    @Parameter(property = "project.remoteArtifactRepositories", required = true, readonly = true)
-    protected List remoteRepos;
-
-    /**
-     * To look up Archiver/UnArchiver implementations
-     *
-     */
-    @Component
-    protected ArchiverManager archiverManager;
-
-    /**
-     * Contains the full list of projects in the reactor.
-     *
-     */
-    @Parameter(property = "reactorProjects", required = true, readonly = true)
-    protected List reactorProjects;
-
-    /**
-     * If the plugin should be silent.
-     *
-     */
-    @Parameter(property = "silent", required = false, defaultValue = "false")
-    public boolean silent;
-
-    /**
-     * Output absolute filename for resolved artifacts
-     *
-     */
-    @Parameter(property = "outputAbsoluteArtifactFilename", defaultValue = "false", required = false)
-    protected boolean outputAbsoluteArtifactFilename;
-
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        copyDependencies();
-        makeNar();
-    }
-
-    private void copyDependencies() throws MojoExecutionException {
-        DependencyStatusSets dss = getDependencySets(this.failOnMissingClassifierArtifact);
-        Set artifacts = dss.getResolvedDependencies();
-
-        for (Object artifactObj : artifacts) {
-            copyArtifact((Artifact) artifactObj);
-        }
-
-        artifacts = dss.getSkippedDependencies();
-        for (Object artifactOjb : artifacts) {
-            Artifact artifact = (Artifact) artifactOjb;
-            getLog().info(artifact.getFile().getName() + " already exists in destination.");
-        }
-    }
-
-    protected void copyArtifact(Artifact artifact) throws MojoExecutionException {
-        String destFileName = DependencyUtil.getFormattedFileName(artifact, false);
-        final File destDir = DependencyUtil.getFormattedOutputDirectory(false, false, false, false, false, getDependenciesDirectory(), artifact);
-        final File destFile = new File(destDir, destFileName);
-        copyFile(artifact.getFile(), destFile);
-    }
-
-    protected Artifact getResolvedPomArtifact(Artifact artifact) {
-        Artifact pomArtifact = this.factory.createArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "", "pom");
-        // Resolve the pom artifact using repos
-        try {
-            this.resolver.resolve(pomArtifact, this.remoteRepos, this.local);
-        } catch (ArtifactResolutionException | ArtifactNotFoundException e) {
-            getLog().info(e.getMessage());
-        }
-        return pomArtifact;
-    }
-
-    protected ArtifactsFilter getMarkedArtifactFilter() {
-        return new DestFileFilter(this.overWriteReleases, this.overWriteSnapshots, this.overWriteIfNewer, false, false, false, false, false, getDependenciesDirectory());
-    }
-
-    protected DependencyStatusSets getDependencySets(boolean stopOnFailure) throws MojoExecutionException {
-        // add filters in well known order, least specific to most specific
-        FilterArtifacts filter = new FilterArtifacts();
-
-        filter.addFilter(new ProjectTransitivityFilter(project.getDependencyArtifacts(), false));
-        filter.addFilter(new ScopeFilter(this.includeScope, this.excludeScope));
-        filter.addFilter(new TypeFilter(this.includeTypes, this.excludeTypes));
-        filter.addFilter(new ClassifierFilter(this.includeClassifiers, this.excludeClassifiers));
-        filter.addFilter(new GroupIdFilter(this.includeGroupIds, this.excludeGroupIds));
-        filter.addFilter(new ArtifactIdFilter(this.includeArtifactIds, this.excludeArtifactIds));
-
-        // explicitly filter our nar dependencies
-        filter.addFilter(new TypeFilter("", "nar"));
-
-        // start with all artifacts.
-        Set artifacts = project.getArtifacts();
-
-        // perform filtering
-        try {
-            artifacts = filter.filter(artifacts);
-        } catch (ArtifactFilterException e) {
-            throw new MojoExecutionException(e.getMessage(), e);
-        }
-
-        // transform artifacts if classifier is set
-        final DependencyStatusSets status;
-        if (StringUtils.isNotEmpty(copyDepClassifier)) {
-            status = getClassifierTranslatedDependencies(artifacts, stopOnFailure);
-        } else {
-            status = filterMarkedDependencies(artifacts);
-        }
-
-        return status;
-    }
-
-    protected DependencyStatusSets getClassifierTranslatedDependencies(Set artifacts, boolean stopOnFailure) throws MojoExecutionException {
-        Set unResolvedArtifacts = new HashSet();
-        Set resolvedArtifacts = artifacts;
-        DependencyStatusSets status = new DependencyStatusSets();
-
-        // possibly translate artifacts into a new set of artifacts based on the
-        // classifier and type
-        // if this did something, we need to resolve the new artifacts
-        if (StringUtils.isNotEmpty(copyDepClassifier)) {
-            ArtifactTranslator translator = new ClassifierTypeTranslator(this.copyDepClassifier, this.type, this.factory);
-            artifacts = translator.translate(artifacts, getLog());
-
-            status = filterMarkedDependencies(artifacts);
-
-            // the unskipped artifacts are in the resolved set.
-            artifacts = status.getResolvedDependencies();
-
-            // resolve the rest of the artifacts
-            ArtifactsResolver artifactsResolver = new DefaultArtifactsResolver(this.resolver, this.local,
-                    this.remoteRepos, stopOnFailure);
-            resolvedArtifacts = artifactsResolver.resolve(artifacts, getLog());
-
-            // calculate the artifacts not resolved.
-            unResolvedArtifacts.addAll(artifacts);
-            unResolvedArtifacts.removeAll(resolvedArtifacts);
-        }
-
-        // return a bean of all 3 sets.
-        status.setResolvedDependencies(resolvedArtifacts);
-        status.setUnResolvedDependencies(unResolvedArtifacts);
-
-        return status;
-    }
-
-    protected DependencyStatusSets filterMarkedDependencies(Set artifacts) throws MojoExecutionException {
-        // remove files that have markers already
-        FilterArtifacts filter = new FilterArtifacts();
-        filter.clearFilters();
-        filter.addFilter(getMarkedArtifactFilter());
-
-        Set unMarkedArtifacts;
-        try {
-            unMarkedArtifacts = filter.filter(artifacts);
-        } catch (ArtifactFilterException e) {
-            throw new MojoExecutionException(e.getMessage(), e);
-        }
-
-        // calculate the skipped artifacts
-        Set skippedArtifacts = new HashSet();
-        skippedArtifacts.addAll(artifacts);
-        skippedArtifacts.removeAll(unMarkedArtifacts);
-
-        return new DependencyStatusSets(unMarkedArtifacts, null, skippedArtifacts);
-    }
-
-    protected void copyFile(File artifact, File destFile) throws MojoExecutionException {
-        try {
-            getLog().info("Copying " + (this.outputAbsoluteArtifactFilename ? artifact.getAbsolutePath() : artifact.getName()) + " to " + destFile);
-            FileUtils.copyFile(artifact, destFile);
-        } catch (Exception e) {
-            throw new MojoExecutionException("Error copying artifact from " + artifact + " to " + destFile, e);
-        }
-    }
-
-    private File getClassesDirectory() {
-        final File outputDirectory = new File(project.getBasedir(), "target");
-        return new File(outputDirectory, "classes");
-    }
-
-    private File getDependenciesDirectory() {
-        return new File(getClassesDirectory(), "META-INF/dependencies");
-    }
-
-    private void makeNar() throws MojoExecutionException {
-        File narFile = createArchive();
-
-        if (classifier != null) {
-            projectHelper.attachArtifact(project, "nar", classifier, narFile);
-        } else {
-            project.getArtifact().setFile(narFile);
-        }
-    }
-
-    public File createArchive() throws MojoExecutionException {
-        final File outputDirectory = new File(project.getBasedir(), "target");
-        File narFile = getNarFile(outputDirectory, finalName, classifier);
-        MavenArchiver archiver = new MavenArchiver();
-        archiver.setArchiver(jarArchiver);
-        archiver.setOutputFile(narFile);
-        archive.setForced(forceCreation);
-
-        try {
-            File contentDirectory = getClassesDirectory();
-            if (!contentDirectory.exists()) {
-                getLog().warn("NAR will be empty - no content was marked for inclusion!");
-            } else {
-                archiver.getArchiver().addDirectory(contentDirectory, getIncludes(), getExcludes());
-            }
-
-            File existingManifest = defaultManifestFile;
-            if (useDefaultManifestFile && existingManifest.exists() && archive.getManifestFile() == null) {
-                getLog().info("Adding existing MANIFEST to archive. Found under: " + existingManifest.getPath());
-                archive.setManifestFile(existingManifest);
-            }
-
-            // automatically add the artifact id to the manifest
-            archive.addManifestEntry("Nar-Id", project.getArtifactId());
-
-            // look for a nar dependency
-            String narDependency = getNarDependency();
-            if (narDependency != null) {
-                archive.addManifestEntry("Nar-Dependency-Id", narDependency);
-            }
-
-            archiver.createArchive(session, project, archive);
-            return narFile;
-        } catch (ArchiverException | MojoExecutionException | ManifestException | IOException | DependencyResolutionRequiredException e) {
-            throw new MojoExecutionException("Error assembling NAR", e);
-        }
-    }
-
-    private String[] getIncludes() {
-        if (includes != null && includes.length > 0) {
-            return includes;
-        }
-        return DEFAULT_INCLUDES;
-    }
-
-    private String[] getExcludes() {
-        if (excludes != null && excludes.length > 0) {
-            return excludes;
-        }
-        return DEFAULT_EXCLUDES;
-    }
-
-    protected File getNarFile(File basedir, String finalName, String classifier) {
-        if (classifier == null) {
-            classifier = "";
-        } else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) {
-            classifier = "-" + classifier;
-        }
-
-        return new File(basedir, finalName + classifier + ".nar");
-    }
-
-    private String getNarDependency() throws MojoExecutionException {
-        String narDependency = null;
-
-        // get nar dependencies
-        FilterArtifacts filter = new FilterArtifacts();
-        filter.addFilter(new TypeFilter("nar", ""));
-
-        // start with all artifacts.
-        Set artifacts = project.getArtifacts();
-
-        // perform filtering
-        try {
-            artifacts = filter.filter(artifacts);
-        } catch (ArtifactFilterException e) {
-            throw new MojoExecutionException(e.getMessage(), e);
-        }
-
-        // ensure there is a single nar dependency
-        if (artifacts.size() > 1) {
-            throw new MojoExecutionException("Each NAR represents a ClassLoader. A NAR dependency allows that NAR's ClassLoader to be "
-                    + "used as the parent of this NAR's ClassLoader. As a result, only a single NAR dependency is allowed.");
-        } else if (artifacts.size() == 1) {
-            final Artifact artifact = (Artifact) artifacts.iterator().next();
-            narDependency = artifact.getArtifactId();
-        }
-
-        return narDependency;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/dd57a335/misc/src/main/resources/META-INF/plexus/components.xml
----------------------------------------------------------------------
diff --git a/misc/src/main/resources/META-INF/plexus/components.xml b/misc/src/main/resources/META-INF/plexus/components.xml
deleted file mode 100644
index 0680d18..0000000
--- a/misc/src/main/resources/META-INF/plexus/components.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<component-set>
-    <components>
-        <component>
-            <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
-            <role-hint>nar</role-hint>
-            <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
-            <configuration>
-                <lifecycles>
-                    <lifecycle>
-                        <id>default</id>
-                        <phases>
-                            <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
-                            <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
-                            <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
-                            <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
-                            <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
-                            <package>org.apache.nifi:nar-maven-plugin:nar</package>
-                            <install>org.apache.maven.plugins:maven-install-plugin:install</install>
-                            <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
-                        </phases>
-                    </lifecycle>
-                </lifecycles>
-            </configuration>
-        </component>
-        <component>
-            <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
-            <role-hint>nar</role-hint>
-            <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
-            <configuration>
-                <type>nar</type>
-                <language>java</language>
-                <addedToClasspath>false</addedToClasspath>
-                <includesDependencies>true</includesDependencies>
-            </configuration>
-        </component>
-    </components>
-</component-set>