NIFI-2375 updated to latest Tika across codebase.  Fixed
 tests and updated L&N for Tika parsers.  Turned unstable grpc test to IT
 test. Updated deps due to Tika testing findings. This closes #2320


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

Branch: refs/heads/master
Commit: 7e61c6333cc04359a98bfe80c3f72a39fee135da
Parents: cdc1fac
Author: joewitt <[email protected]>
Authored: Wed Dec 6 03:05:20 2017 -0500
Committer: Matt Gilman <[email protected]>
Committed: Wed Dec 6 11:53:15 2017 -0500

----------------------------------------------------------------------
 nifi-assembly/LICENSE                           |  65 +++
 nifi-assembly/NOTICE                            | 104 ++++-
 .../nifi-web/nifi-web-content-viewer/pom.xml    |   2 +-
 .../nifi/processors/grpc/ITListenGRPC.java      | 401 +++++++++++++++++++
 .../nifi/processors/grpc/TestListenGRPC.java    | 401 -------------------
 .../src/main/resources/META-INF/LICENSE         | 127 +++++-
 .../src/main/resources/META-INF/NOTICE          | 131 +++++-
 .../nifi-media-processors/pom.xml               |  28 +-
 .../image/ExtractImageMetadataTest.java         |  14 +-
 .../media/TestExtractMediaMetadata.java         |  11 +-
 .../nifi/processors/slack/PutSlackTest.java     |   3 +-
 .../nifi-standard-processors/pom.xml            |   2 +-
 .../nifi/processors/standard/TestGetHTTP.java   |   2 +-
 .../nifi/processors/standard/TestPostHTTP.java  |   2 +-
 pom.xml                                         |  22 +-
 15 files changed, 868 insertions(+), 447 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-assembly/LICENSE
----------------------------------------------------------------------
diff --git a/nifi-assembly/LICENSE b/nifi-assembly/LICENSE
index 1512d2c..bd5321a 100644
--- a/nifi-assembly/LICENSE
+++ b/nifi-assembly/LICENSE
@@ -1981,3 +1981,68 @@ available under an MIT style license.
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This project bundles 'CDM / NetCDF Java Library' which is available
+under an "MIT Style" License. 
(http://www.unidata.ucar.edu/software/netcdf-java/)
+    
+    Copyright 1993-2010 University Corporation for Atmospheric Research/Unidata
+    
+    Portions of this software were developed by the Unidata Program at the 
University 
+    Corporation for Atmospheric Research.
+    
+    Access and use of this software shall impose the following obligations and 
understandings 
+    on the user. The user is granted the right, without any fee or cost, to 
use, copy, modify, 
+    alter, enhance and distribute this software, and any derivative works 
thereof, and its 
+    supporting documentation for any purpose whatsoever, provided that this 
entire notice 
+    appears in all copies of the software, derivative works and supporting 
documentation. Further, 
+    UCAR requests that the user credit UCAR/Unidata in any publications that 
result from the use 
+    of this software or in any product that includes this software, although 
this is not an obligation. 
+    The names UCAR and/or Unidata, however, may not be used in any advertising 
or publicity to endorse 
+    or promote any products or commercial entity unless specific written 
permission is obtained from 
+    UCAR/Unidata. The user also understands that UCAR/Unidata is not obligated 
to provide the user with 
+    any support, consulting, training or assistance of any kind with regard to 
the use, operation and 
+    performance of this software nor to provide the user with any updates, 
revisions, new versions or 
+    "bug fixes."
+    
+    THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR 
IMPLIED WARRANTIES, INCLUDING, 
+    BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
FOR A PARTICULAR PURPOSE 
+    ARE DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, 
INDIRECT OR CONSEQUENTIAL 
+    DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 
PROFITS, WHETHER IN AN ACTION 
+    OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
CONNECTION WITH THE ACCESS, 
+    USE OR PERFORMANCE OF THIS SOFTWARE.
+
+This product bundles GeoAPI - Java interfaces for OGC/ISO standards
+http://www.geoapi.org
+
+  Copyright (C) 2003-2011 Open Geospatial Consortium, Inc.
+  All Rights Reserved. http://www.opengeospatial.org/ogc/legal
+
+  This OGC work (including software, documents, or other related items) is 
being
+  provided by the copyright holders under the following license. By obtaining,
+  using and/or copying this work, you (the licensee) agree that you have read,
+  understood, and will comply with the following terms and conditions:
+
+  Permission to use, copy, and modify this software and its documentation, with
+  or without modification, for any purpose and without fee or royalty is hereby
+  granted, provided that you include the following on ALL copies of the 
software
+  and documentation or portions thereof, including modifications, that you 
make:
+
+     1. The full text of this NOTICE in a location viewable to users of the
+        redistributed or derivative work.
+     2. Notice of any changes or modifications to the OGC files, including the
+        date changes were made. (We recommend you provide URIs to the location
+        from which the code is derived.)
+
+  THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS 
MAKE
+  NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED
+  TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR 
THAT
+  THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
+  PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+  COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+  CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR 
DOCUMENTATION.
+
+  The name and trademarks of copyright holders may NOT be used in advertising 
or
+  publicity pertaining to the software without specific, written prior 
permission.
+  Title to copyright in this software and any associated documentation will at 
all
+  times remain with copyright holders.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-assembly/NOTICE
----------------------------------------------------------------------
diff --git a/nifi-assembly/NOTICE b/nifi-assembly/NOTICE
index 5ee6673..c2784a8 100644
--- a/nifi-assembly/NOTICE
+++ b/nifi-assembly/NOTICE
@@ -198,6 +198,21 @@ The following binary components are provided under the 
Apache Software License v
        Based on source code originally developed in the PaDaF project.
        Copyright (c) 2010 Atos Worldline SAS
 
+    (ASLv2) Apache FontBox
+      The following NOTICE information applies:
+        Apache FontBox
+        Copyright 2008-2017 The Apache Software Foundation
+
+    (ASLv2) Apache SIS
+      The following NOTICE information applies:
+        Apache SIS
+        Copyright 2010-2017 The Apache Software Foundation
+
+    (ASLv2) Apache JempBox
+      The following NOTICE information applies:
+        Apache JempBox
+        Copyright 2008-2017 The Apache Software Foundation
+
     (ASLv2) Apache XMLBeans
       The following NOTICE information applies:
         Portions of this software were originally based on the following:
@@ -256,7 +271,13 @@ The following binary components are provided under the 
Apache Software License v
         JCommander Copyright Notices
         Copyright 2010 Cedric Beust [email protected]
 
-  (ASLv2) Apache Commons Lang
+    (ASLv2) Rome
+      The following NOTICE information applies:
+        Rome Copyright Notices
+        Copyright 2004 Sun Microsystems, Inc.
+        Copyright 2011 The ROME Team
+  
+    (ASLv2) Apache Commons Lang
     The following NOTICE information applies:
       Apache Commons Lang
       Copyright 2001-2017 The Apache Software Foundation
@@ -535,6 +556,11 @@ The following binary components are provided under the 
Apache Software License v
       Apache Commons Daemon
       Copyright 1999-2013 The Apache Software Foundation
 
+  (ASLv2) Apache Commons Exec
+    The following NOTICE information applies:
+      Apache Commons Exec
+      Copyright 2005-2016 The Apache Software Foundation
+
   (ASLv2) Apache Commons EL
     The following NOTICE information applies:
       Apache Commons EL
@@ -572,6 +598,28 @@ The following binary components are provided under the 
Apache Software License v
       The following NOTICE information applies:
         Apache POI
         Copyright 2012 The Apache Software Foundation.
+        
+        This product contains parts that were originally based on software 
from BEA.
+        Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead 
link),
+        which was acquired by Oracle Corporation in 2008.
+        <http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
+        <https://en.wikipedia.org/wiki/BEA_Systems>
+        
+        This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
+        World Wide Web Consortium (Massachusetts Institute of Technology, 
European
+        Research Consortium for Informatics and Mathematics, Keio University)
+
+        This product contains the Piccolo XML Parser for Java
+        (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.
+
+        This product contains the chunks_parse_cmds.tbl file from the vsdump 
program.
+        Copyright (C) 2006-2007 Valek Filippov ([email protected])
+
+        This product contains parts of the eID Applet project 
+        <http://eid-applet.googlecode.com> and 
<https://github.com/e-Contract/eid-applet>.
+        Copyright (c) 2009-2014
+        FedICT (federal ICT department of Belgium), e-Contract.be BVBA 
(https://www.e-contract.be),
+        Bart Hanssens from FedICT
 
   (ASLv2) Yammer Metrics
     The following NOTICE information applies:
@@ -587,6 +635,11 @@ The following binary components are provided under the 
Apache Software License v
           Expert Group and released to the public domain, as explained at
           http://creativecommons.org/publicdomain/zero/1.0/
 
+  (ASLv2) Apache CXF
+    The following NOTICE information applies:
+      Apache CXF
+      Copyright 2008-2017 The Apache Software Foundation
+
   (ASLv2) Apache Lucene
     The following NOTICE information applies:
       Apache Lucene
@@ -883,6 +936,30 @@ The following binary components are provided under the 
Apache Software License v
       GeoIP2 Java API
       This software is Copyright (c) 2013 by MaxMind, Inc.
 
+    (ASLv2) Apache XMLBeans
+      The following NOTICE information applies:
+        Portions of this software were originally based on the following:
+        - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.
+
+        Aside from contributions to the Apache XMLBeans project, this
+        software also includes:
+
+        - one or more source files from the Apache Xerces-J and Apache Axis
+        products, Copyright (c) 1999-2003 Apache Software Foundation
+
+        - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
+        Consortium (Massachusetts Institute of Technology, European Research
+        Consortium for Informatics and Mathematics, Keio University)
+
+        - resolver.jar from Apache Xml Commons project,
+        Copyright (c) 2001-2003 Apache Software Foundation
+
+        - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
+        Copyright 2002 Yuval Oren under the terms of the Apache Software 
License 2.0
+
+        - JSR-173 Streaming API for XML from 
http://sourceforge.net/projects/xmlpullparser/,
+        Copyright 2005 BEA under the terms of the Apache Software License 2.0
+
   (ASLv2) Woodstox Core ASL
     The following NOTICE information applies:
       This product currently only contains code developed by authors
@@ -915,6 +992,16 @@ The following binary components are provided under the 
Apache Software License v
         Apache Commons Pool
         Copyright 1999-2009 The Apache Software Foundation.
 
+    (ASLv2) Objenesis
+      The following NOTICE information applies:
+        Objenesis
+        Copyright 2006-2013 Joe Walnes, Henri Tremblay, Leonardo Mesquita
+
+   (ASLv2) Apache Maven
+      The following NOTICE information applies:
+        Apache Maven
+        Copyright 2003-2017 The Apache Software Foundation.
+
     (ASLv2) Apache Derby
       The following NOTICE information applies:
         Apache Derby
@@ -1037,7 +1124,7 @@ The following binary components are provided under the 
Apache Software License v
 
       Copyright 2010-2012 RethinkDB
 
-(ASLv2) Carrotsearch HPPC
+    (ASLv2) Carrotsearch HPPC
       The following NOTICE information applies:
       HPPC borrowed code, ideas or both from:
 
@@ -1055,9 +1142,12 @@ The following binary components are provided under the 
Apache Software License v
 
     (ASLv2) subethasmtp
        The following NOTICE information applies:
-
        Copyright (C) 2006-2007 SubEthaMail.org
 
+    (ASLv2) Apache OpenNLP Tools
+      Apache OpenNLP Tools
+      Copyright 2015 The Apache Software Foundation
+
     (ASLv2) Apache Commons Email
        The following NOTICE information applies:
        Apache Commons Email
@@ -1164,6 +1254,10 @@ The following binary components are provided under the 
Apache Software License v
          * LOCATION_IN_GRPC:
     * netty/third_party/netty
 
+  (ASLv2) Ehcache 2.x
+    The following NOTICE information applies:
+      Copyright 2003-2010 Terracotta, Inc.
+
   (ASLv2) The Netty Project
       The following NOTICE information applies:
 
@@ -1458,6 +1552,10 @@ The following binary components are provided under the 
Apache Software License v
 
         * Brian Langel
 
+    (ASLv2) Boilerpipe
+      The following NOTICE information applies:
+          Copyright (c) 2009-2011 Christian Kohlschütter
+
 ************************
 Common Development and Distribution License 1.1
 ************************

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/pom.xml
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/pom.xml
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/pom.xml
index 8b76774..de5eda0 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/pom.xml
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/pom.xml
@@ -78,7 +78,7 @@
         <dependency>
             <groupId>org.apache.tika</groupId>
             <artifactId>tika-core</artifactId>
-            <version>1.14</version>
+            <version>1.16</version>
         </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/ITListenGRPC.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/ITListenGRPC.java
 
b/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/ITListenGRPC.java
new file mode 100644
index 0000000..28a73b9
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/ITListenGRPC.java
@@ -0,0 +1,401 @@
+/*
+ * 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.processors.grpc;
+
+import com.google.common.collect.Sets;
+import com.google.protobuf.ByteString;
+
+import org.apache.nifi.flowfile.attributes.CoreAttributes;
+import org.apache.nifi.processor.ProcessContext;
+import org.apache.nifi.processor.ProcessSessionFactory;
+import org.apache.nifi.reporting.InitializationException;
+import org.apache.nifi.ssl.SSLContextService;
+import org.apache.nifi.ssl.StandardSSLContextService;
+import org.apache.nifi.util.MockFlowFile;
+import org.apache.nifi.util.TestRunner;
+import org.apache.nifi.util.TestRunners;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import io.grpc.ManagedChannel;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.core.StringContains.containsString;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class ITListenGRPC {
+    private static final String HOST = "localhost";
+    private static final String CERT_DN = "CN=localhost, OU=Apache NiFi, 
O=Apache, L=Santa Monica, ST=CA, C=US";
+    private static final String SOURCE_SYSTEM_UUID = "FAKE_UUID";
+
+    private static Map<String, String> getTruststoreProperties() {
+        final Map<String, String> props = new HashMap<>();
+        props.put(StandardSSLContextService.TRUSTSTORE.getName(), 
"src/test/resources/localhost-ts.jks");
+        props.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), 
"localtest");
+        props.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
+        return props;
+    }
+
+    private static Map<String, String> getKeystoreProperties() {
+        final Map<String, String> properties = new HashMap<>();
+        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");
+        return properties;
+    }
+
+    private static void useSSLContextService(final TestRunner controller, 
final Map<String, String> sslProperties) {
+        final SSLContextService service = new StandardSSLContextService();
+        try {
+            controller.addControllerService("ssl-service", service, 
sslProperties);
+            controller.enableControllerService(service);
+        } catch (InitializationException ex) {
+            ex.printStackTrace();
+            Assert.fail("Could not create SSL Context Service");
+        }
+
+        controller.setProperty(InvokeGRPC.PROP_SSL_CONTEXT_SERVICE, 
"ssl-service");
+    }
+
+    @Test
+    public void testSuccessfulRoundTrip() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
+        final int randPort = TestGRPCClient.randomPort();
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+
+        final ProcessContext processContext = runner.getProcessContext();
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .putAttributes(CoreAttributes.UUID.key(), 
SOURCE_SYSTEM_UUID)
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
+            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
+
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
+            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
+            assertThat(successFiles.size(), equalTo(1));
+            final MockFlowFile mockFlowFile = successFiles.get(0);
+            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(FlowFileIngestServiceInterceptor.DEFAULT_FOUND_SUBJECT));
+
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+
+    @Test
+    public void testOutOfSpaceRoundTrip() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
+        final int randPort = TestGRPCClient.randomPort();
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+
+        final ProcessContext processContext = spy(runner.getProcessContext());
+        // force the context to return that space isn't available, prompting 
an error message to be returned.
+        
when(processContext.getAvailableRelationships()).thenReturn(Sets.newHashSet());
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.ERROR));
+            assertThat(reply.getBody(), containsString("but no space 
available; Indicating Service Unavailable"));
+
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 0);
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+
+    @Test(expected = io.grpc.StatusRuntimeException.class)
+    public void testExceedMaxMessageSize() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
+        final int randPort = TestGRPCClient.randomPort();
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+        // set max message size to 1 byte to force exception to be thrown.
+        runner.setProperty(ListenGRPC.PROP_MAX_MESSAGE_SIZE, "1B");
+
+        final ProcessContext processContext = runner.getProcessContext();
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .putAttributes(CoreAttributes.UUID.key(), 
SOURCE_SYSTEM_UUID)
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            // this should throw a runtime exception
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
+            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
+
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
+            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
+            assertThat(successFiles.size(), equalTo(1));
+            final MockFlowFile mockFlowFile = successFiles.get(0);
+            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(FlowFileIngestServiceInterceptor.DEFAULT_FOUND_SUBJECT));
+
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+
+    @Test
+    public void testSecureTwoWaySSL() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
+        final int randPort = TestGRPCClient.randomPort();
+        final Map<String, String> sslProperties = getKeystoreProperties();
+        sslProperties.putAll(getTruststoreProperties());
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
+        useSSLContextService(runner, sslProperties);
+
+        final ProcessContext processContext = runner.getProcessContext();
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
+            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
+
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
+            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
+            assertThat(successFiles.size(), equalTo(1));
+            final MockFlowFile mockFlowFile = successFiles.get(0);
+            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(CERT_DN));
+
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+
+    @Test
+    public void testSecureOneWaySSL() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, 
InterruptedException {
+        final int randPort = TestGRPCClient.randomPort();
+        final Map<String, String> sslProperties = getTruststoreProperties();
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
+        useSSLContextService(runner, getKeystoreProperties());
+
+        final ProcessContext processContext = runner.getProcessContext();
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
+            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
+
+            // known race condition spot: grpc reply vs flowfile transfer
+            Thread.sleep(10);
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
+            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
+            assertThat(successFiles.size(), equalTo(1));
+            final MockFlowFile mockFlowFile = successFiles.get(0);
+            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(FlowFileIngestServiceInterceptor.DEFAULT_FOUND_SUBJECT));
+
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+
+    @Test(expected = io.grpc.StatusRuntimeException.class)
+    public void testSecureTwoWaySSLFailAuthorizedDNCheck() throws 
UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, 
KeyStoreException, IOException {
+        final int randPort = TestGRPCClient.randomPort();
+        final Map<String, String> sslProperties = getKeystoreProperties();
+        sslProperties.putAll(getTruststoreProperties());
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
+        runner.setProperty(ListenGRPC.PROP_AUTHORIZED_DN_PATTERN, "CN=FAKE.*");
+        useSSLContextService(runner, sslProperties);
+
+        final ProcessContext processContext = runner.getProcessContext();
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
+            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
+
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
+            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
+            assertThat(successFiles.size(), equalTo(1));
+            final MockFlowFile mockFlowFile = successFiles.get(0);
+            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(CERT_DN));
+
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+
+    @Test
+    public void testSecureTwoWaySSLPassAuthorizedDNCheck() throws 
UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, 
KeyStoreException, IOException {
+        final int randPort = TestGRPCClient.randomPort();
+        final Map<String, String> sslProperties = getKeystoreProperties();
+        sslProperties.putAll(getTruststoreProperties());
+        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
+        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
+
+        final ListenGRPC listenGRPC = new ListenGRPC();
+        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
+        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
+        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
+        runner.setProperty(ListenGRPC.PROP_AUTHORIZED_DN_PATTERN, 
"CN=localhost.*");
+        useSSLContextService(runner, sslProperties);
+
+        final ProcessContext processContext = runner.getProcessContext();
+        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
+
+        try {
+            // start the server. The order of the following statements 
shouldn't matter, because the
+            // startServer() method waits for a processSessionFactory to be 
available to it.
+            listenGRPC.startServer(processContext);
+            listenGRPC.onTrigger(processContext, processSessionFactory);
+
+
+            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
+                    .putAttributes("FOO", "BAR")
+                    .setContent(ByteString.copyFrom("content".getBytes()))
+                    .build();
+            final FlowFileReply reply = stub.send(ingestFile);
+            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
+            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
+
+            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
+            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
+            assertThat(successFiles.size(), equalTo(1));
+            final MockFlowFile mockFlowFile = successFiles.get(0);
+            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
+            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(CERT_DN));
+
+        } finally {
+            // stop the server
+            listenGRPC.stopServer(processContext);
+            channel.shutdown();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/TestListenGRPC.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/TestListenGRPC.java
 
b/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/TestListenGRPC.java
deleted file mode 100644
index a717f43..0000000
--- 
a/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/src/test/java/org/apache/nifi/processors/grpc/TestListenGRPC.java
+++ /dev/null
@@ -1,401 +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.processors.grpc;
-
-import com.google.common.collect.Sets;
-import com.google.protobuf.ByteString;
-
-import org.apache.nifi.flowfile.attributes.CoreAttributes;
-import org.apache.nifi.processor.ProcessContext;
-import org.apache.nifi.processor.ProcessSessionFactory;
-import org.apache.nifi.reporting.InitializationException;
-import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.ssl.StandardSSLContextService;
-import org.apache.nifi.util.MockFlowFile;
-import org.apache.nifi.util.TestRunner;
-import org.apache.nifi.util.TestRunners;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import io.grpc.ManagedChannel;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.core.StringContains.containsString;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-public class TestListenGRPC {
-    private static final String HOST = "localhost";
-    private static final String CERT_DN = "CN=localhost, OU=Apache NiFi, 
O=Apache, L=Santa Monica, ST=CA, C=US";
-    private static final String SOURCE_SYSTEM_UUID = "FAKE_UUID";
-
-    private static Map<String, String> getTruststoreProperties() {
-        final Map<String, String> props = new HashMap<>();
-        props.put(StandardSSLContextService.TRUSTSTORE.getName(), 
"src/test/resources/localhost-ts.jks");
-        props.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), 
"localtest");
-        props.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-        return props;
-    }
-
-    private static Map<String, String> getKeystoreProperties() {
-        final Map<String, String> properties = new HashMap<>();
-        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");
-        return properties;
-    }
-
-    private static void useSSLContextService(final TestRunner controller, 
final Map<String, String> sslProperties) {
-        final SSLContextService service = new StandardSSLContextService();
-        try {
-            controller.addControllerService("ssl-service", service, 
sslProperties);
-            controller.enableControllerService(service);
-        } catch (InitializationException ex) {
-            ex.printStackTrace();
-            Assert.fail("Could not create SSL Context Service");
-        }
-
-        controller.setProperty(InvokeGRPC.PROP_SSL_CONTEXT_SERVICE, 
"ssl-service");
-    }
-
-    @Test
-    public void testSuccessfulRoundTrip() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
-        final int randPort = TestGRPCClient.randomPort();
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-
-        final ProcessContext processContext = runner.getProcessContext();
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .putAttributes(CoreAttributes.UUID.key(), 
SOURCE_SYSTEM_UUID)
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
-            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
-
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
-            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
-            assertThat(successFiles.size(), equalTo(1));
-            final MockFlowFile mockFlowFile = successFiles.get(0);
-            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(FlowFileIngestServiceInterceptor.DEFAULT_FOUND_SUBJECT));
-
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-
-    @Test
-    public void testOutOfSpaceRoundTrip() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
-        final int randPort = TestGRPCClient.randomPort();
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-
-        final ProcessContext processContext = spy(runner.getProcessContext());
-        // force the context to return that space isn't available, prompting 
an error message to be returned.
-        
when(processContext.getAvailableRelationships()).thenReturn(Sets.newHashSet());
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.ERROR));
-            assertThat(reply.getBody(), containsString("but no space 
available; Indicating Service Unavailable"));
-
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 0);
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-
-    @Test(expected = io.grpc.StatusRuntimeException.class)
-    public void testExceedMaxMessageSize() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
-        final int randPort = TestGRPCClient.randomPort();
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-        // set max message size to 1 byte to force exception to be thrown.
-        runner.setProperty(ListenGRPC.PROP_MAX_MESSAGE_SIZE, "1B");
-
-        final ProcessContext processContext = runner.getProcessContext();
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .putAttributes(CoreAttributes.UUID.key(), 
SOURCE_SYSTEM_UUID)
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            // this should throw a runtime exception
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
-            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
-
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
-            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
-            assertThat(successFiles.size(), equalTo(1));
-            final MockFlowFile mockFlowFile = successFiles.get(0);
-            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(FlowFileIngestServiceInterceptor.DEFAULT_FOUND_SUBJECT));
-
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-
-    @Test
-    public void testSecureTwoWaySSL() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
-        final int randPort = TestGRPCClient.randomPort();
-        final Map<String, String> sslProperties = getKeystoreProperties();
-        sslProperties.putAll(getTruststoreProperties());
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
-        useSSLContextService(runner, sslProperties);
-
-        final ProcessContext processContext = runner.getProcessContext();
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
-            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
-
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
-            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
-            assertThat(successFiles.size(), equalTo(1));
-            final MockFlowFile mockFlowFile = successFiles.get(0);
-            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(CERT_DN));
-
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-
-    @Test
-    public void testSecureOneWaySSL() throws UnrecoverableKeyException, 
CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, 
InterruptedException {
-        final int randPort = TestGRPCClient.randomPort();
-        final Map<String, String> sslProperties = getTruststoreProperties();
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
-        useSSLContextService(runner, getKeystoreProperties());
-
-        final ProcessContext processContext = runner.getProcessContext();
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
-            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
-
-            // known race condition spot: grpc reply vs flowfile transfer
-            Thread.sleep(10);
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
-            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
-            assertThat(successFiles.size(), equalTo(1));
-            final MockFlowFile mockFlowFile = successFiles.get(0);
-            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(FlowFileIngestServiceInterceptor.DEFAULT_FOUND_SUBJECT));
-
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-
-    @Test(expected = io.grpc.StatusRuntimeException.class)
-    public void testSecureTwoWaySSLFailAuthorizedDNCheck() throws 
UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, 
KeyStoreException, IOException {
-        final int randPort = TestGRPCClient.randomPort();
-        final Map<String, String> sslProperties = getKeystoreProperties();
-        sslProperties.putAll(getTruststoreProperties());
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
-        runner.setProperty(ListenGRPC.PROP_AUTHORIZED_DN_PATTERN, "CN=FAKE.*");
-        useSSLContextService(runner, sslProperties);
-
-        final ProcessContext processContext = runner.getProcessContext();
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
-            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
-
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
-            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
-            assertThat(successFiles.size(), equalTo(1));
-            final MockFlowFile mockFlowFile = successFiles.get(0);
-            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(CERT_DN));
-
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-
-    @Test
-    public void testSecureTwoWaySSLPassAuthorizedDNCheck() throws 
UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, 
KeyStoreException, IOException {
-        final int randPort = TestGRPCClient.randomPort();
-        final Map<String, String> sslProperties = getKeystoreProperties();
-        sslProperties.putAll(getTruststoreProperties());
-        final ManagedChannel channel = TestGRPCClient.buildChannel(HOST, 
randPort, sslProperties);
-        final FlowFileServiceGrpc.FlowFileServiceBlockingStub stub = 
FlowFileServiceGrpc.newBlockingStub(channel);
-
-        final ListenGRPC listenGRPC = new ListenGRPC();
-        final TestRunner runner = TestRunners.newTestRunner(listenGRPC);
-        runner.setProperty(ListenGRPC.PROP_SERVICE_PORT, 
String.valueOf(randPort));
-        runner.setProperty(ListenGRPC.PROP_USE_SECURE, "true");
-        runner.setProperty(ListenGRPC.PROP_AUTHORIZED_DN_PATTERN, 
"CN=localhost.*");
-        useSSLContextService(runner, sslProperties);
-
-        final ProcessContext processContext = runner.getProcessContext();
-        final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
-
-        try {
-            // start the server. The order of the following statements 
shouldn't matter, because the
-            // startServer() method waits for a processSessionFactory to be 
available to it.
-            listenGRPC.startServer(processContext);
-            listenGRPC.onTrigger(processContext, processSessionFactory);
-
-
-            final FlowFileRequest ingestFile = FlowFileRequest.newBuilder()
-                    .putAttributes("FOO", "BAR")
-                    .setContent(ByteString.copyFrom("content".getBytes()))
-                    .build();
-            final FlowFileReply reply = stub.send(ingestFile);
-            assertThat(reply.getResponseCode(), 
equalTo(FlowFileReply.ResponseCode.SUCCESS));
-            assertThat(reply.getBody(), equalTo("FlowFile successfully 
received."));
-
-            runner.assertTransferCount(ListenGRPC.REL_SUCCESS, 1);
-            final List<MockFlowFile> successFiles = 
runner.getFlowFilesForRelationship(ListenGRPC.REL_SUCCESS);
-            assertThat(successFiles.size(), equalTo(1));
-            final MockFlowFile mockFlowFile = successFiles.get(0);
-            assertThat(mockFlowFile.getAttribute("FOO"), equalTo("BAR"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_HOST), 
equalTo("127.0.0.1"));
-            assertThat(mockFlowFile.getAttribute(ListenGRPC.REMOTE_USER_DN), 
equalTo(CERT_DN));
-
-        } finally {
-            // stop the server
-            listenGRPC.stopServer(processContext);
-            channel.shutdown();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/LICENSE
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/LICENSE
 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/LICENSE
index 4366857..5dee640 100644
--- 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/LICENSE
+++ 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/LICENSE
@@ -579,4 +579,129 @@ under a "Simplified BSD license".
     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
LIABILITY,
     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This project bundles 'CDM and Grib / NetCDF Java Library' which is available
+under an "MIT Style" License. 
(http://www.unidata.ucar.edu/software/netcdf-java/)
+    
+    Copyright 1993-2010 University Corporation for Atmospheric Research/Unidata
+    
+    Portions of this software were developed by the Unidata Program at the 
University 
+    Corporation for Atmospheric Research.
+    
+    Access and use of this software shall impose the following obligations and 
understandings 
+    on the user. The user is granted the right, without any fee or cost, to 
use, copy, modify, 
+    alter, enhance and distribute this software, and any derivative works 
thereof, and its 
+    supporting documentation for any purpose whatsoever, provided that this 
entire notice 
+    appears in all copies of the software, derivative works and supporting 
documentation. Further, 
+    UCAR requests that the user credit UCAR/Unidata in any publications that 
result from the use 
+    of this software or in any product that includes this software, although 
this is not an obligation. 
+    The names UCAR and/or Unidata, however, may not be used in any advertising 
or publicity to endorse 
+    or promote any products or commercial entity unless specific written 
permission is obtained from 
+    UCAR/Unidata. The user also understands that UCAR/Unidata is not obligated 
to provide the user with 
+    any support, consulting, training or assistance of any kind with regard to 
the use, operation and 
+    performance of this software nor to provide the user with any updates, 
revisions, new versions or 
+    "bug fixes."
+    
+    THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR 
IMPLIED WARRANTIES, INCLUDING, 
+    BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
FOR A PARTICULAR PURPOSE 
+    ARE DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, 
INDIRECT OR CONSEQUENTIAL 
+    DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 
PROFITS, WHETHER IN AN ACTION 
+    OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
CONNECTION WITH THE ACCESS, 
+    USE OR PERFORMANCE OF THIS SOFTWARE.
+
+This project bundles 'CurvesAPI' which is available under a BSD license.
+
+    Copyright (c) 2005, Graph Builder
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+
+    -Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+
+    -Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+    -Neither the name of Graph Builder nor the names of its contributors may be
+    used to endorse or promote products derived from this software without
+    specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
LIABILITY,
+    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
USE
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This product bundles GeoAPI - Java interfaces for OGC/ISO standards
+http://www.geoapi.org
+
+  Copyright (C) 2003-2011 Open Geospatial Consortium, Inc.
+  All Rights Reserved. http://www.opengeospatial.org/ogc/legal
+
+  This OGC work (including software, documents, or other related items) is 
being
+  provided by the copyright holders under the following license. By obtaining,
+  using and/or copying this work, you (the licensee) agree that you have read,
+  understood, and will comply with the following terms and conditions:
+
+  Permission to use, copy, and modify this software and its documentation, with
+  or without modification, for any purpose and without fee or royalty is hereby
+  granted, provided that you include the following on ALL copies of the 
software
+  and documentation or portions thereof, including modifications, that you 
make:
+
+     1. The full text of this NOTICE in a location viewable to users of the
+        redistributed or derivative work.
+     2. Notice of any changes or modifications to the OGC files, including the
+        date changes were made. (We recommend you provide URIs to the location
+        from which the code is derived.)
+
+  THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS 
MAKE
+  NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED
+  TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR 
THAT
+  THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
+  PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+  COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+  CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR 
DOCUMENTATION.
+
+  The name and trademarks of copyright holders may NOT be used in advertising 
or
+  publicity pertaining to the software without specific, written prior 
permission.
+  Title to copyright in this software and any associated documentation will at 
all
+  times remain with copyright holders.
+
+  The binary distribution of this product bundles 'Slf4j' which is available 
under
+  an MIT license.
+
+    Copyright (c) 2004-2013 QOS.ch
+     All rights reserved.
+
+     Permission is hereby granted, free  of charge, to any person obtaining
+     a  copy  of this  software  and  associated  documentation files  (the
+     "Software"), to  deal in  the Software without  restriction, including
+     without limitation  the rights to  use, copy, modify,  merge, publish,
+     distribute,  sublicense, and/or sell  copies of  the Software,  and to
+     permit persons to whom the Software  is furnished to do so, subject to
+     the following conditions:
+ 
+     The  above  copyright  notice  and  this permission  notice  shall  be
+     included in all copies or substantial portions of the Software.
+ 
+     THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+     EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+     MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+     LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+     OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+     WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+The binary distribution of this project bundles 'stax2-api' which is "licensed 
+under standard BSD license, which is compatible with all Free and Open 
Software (OSS) licenses."
+https://github.com/FasterXML/stax2-api/blob/stax2-api-3.1.4/README.md

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/NOTICE
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/NOTICE
 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/NOTICE
index f5eb74e..b1d98b3 100644
--- 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/NOTICE
+++ 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-nar/src/main/resources/META-INF/NOTICE
@@ -15,6 +15,55 @@ The following binary components are provided under the 
Apache Software License v
         Metadata-Extractor
         Copyright 2002-2015 Drew Noakes
 
+    (ASLv2) Objenesis
+      The following NOTICE information applies:
+        Objenesis
+        Copyright 2006-2013 Joe Walnes, Henri Tremblay, Leonardo Mesquita
+
+    (ASLv2) Apache PDFBox
+      The following NOTICE information applies:
+       Apache PDFBox
+       Copyright 2014 The Apache Software Foundation
+
+       Based on source code originally developed in the PDFBox, JempBox and
+       FontBox projects.
+       Copyright (c) 2002-2007, www.pdfbox.org
+       Copyright (c) 2006-2007, www.jempbox.org
+
+       Based on source code originally developed in the PaDaF project.
+       Copyright (c) 2010 Atos Worldline SAS
+
+    (ASLv2) Apache OpenNLP Tools
+      Apache OpenNLP Tools
+      Copyright 2015 The Apache Software Foundation
+
+  (ASLv2) Apache POI
+      The following NOTICE information applies:
+        Apache POI
+        Copyright 2012 The Apache Software Foundation.
+        
+        This product contains parts that were originally based on software 
from BEA.
+        Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead 
link),
+        which was acquired by Oracle Corporation in 2008.
+        <http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
+        <https://en.wikipedia.org/wiki/BEA_Systems>
+        
+        This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
+        World Wide Web Consortium (Massachusetts Institute of Technology, 
European
+        Research Consortium for Informatics and Mathematics, Keio University)
+
+        This product contains the Piccolo XML Parser for Java
+        (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.
+
+        This product contains the chunks_parse_cmds.tbl file from the vsdump 
program.
+        Copyright (C) 2006-2007 Valek Filippov ([email protected])
+
+        This product contains parts of the eID Applet project 
+        <http://eid-applet.googlecode.com> and 
<https://github.com/e-Contract/eid-applet>.
+        Copyright (c) 2009-2014
+        FedICT (federal ICT department of Belgium), e-Contract.be BVBA 
(https://www.e-contract.be),
+        Bart Hanssens from FedICT
+
     (ASLv2) Apache Tika
       Apache Tika
       Copyright 2015 The Apache Software Foundation
@@ -44,6 +93,15 @@ The following binary components are provided under the 
Apache Software License v
         Apache Commons IO
         Copyright 2002-2016 The Apache Software Foundation
 
+    (ASLv2) Apache CXF
+      The following NOTICE information applies:
+        Apache CXF
+        Copyright 2008-2017 The Apache Software Foundation
+
+    (ASLv2) Ehcache 2.x
+      The following NOTICE information applies:
+        Copyright 2003-2010 Terracotta, Inc.
+
     (ASLV2) Apache Commons Compress
       The following NOTICE information applies:
         Apache Commons Compress
@@ -72,6 +130,11 @@ The following binary components are provided under the 
Apache Software License v
         Original source copyright:
         Copyright (c) 2008 Alexander Beider & Stephen P. Morse.
 
+    (ASLv2) Apache Commons Collections
+      The following NOTICE information applies:
+        Apache Commons Collections
+        Copyright 2001-2013 The Apache Software Foundation
+
     (ASLv2) Apache Commons Logging
       The following NOTICE information applies:
         Apache Commons Logging
@@ -82,6 +145,25 @@ The following binary components are provided under the 
Apache Software License v
         Apache Commons VFS
         Copyright 2002-2010 The Apache Software Foundation
 
+    (ASLv2) Apache Commons Exec
+      The following NOTICE information applies:
+        Apache Commons Exec
+        Copyright 2005-2016 The Apache Software Foundation
+
+    (ASLv2) Google GSON
+      The following NOTICE information applies:
+        Copyright 2008 Google Inc.
+    
+    (ASLv2) Guava
+      The following NOTICE information applies:
+        Guava
+        Copyright 2015 The Guava Authors
+
+    (ASLv2) Apache FontBox
+      The following NOTICE information applies:
+        Apache FontBox
+        Copyright 2008-2017 The Apache Software Foundation
+
     (ASLv2) Apache Commons CSV
       The following NOTICE information applies:
         Apache Commons CSV
@@ -147,6 +229,14 @@ The following binary components are provided under the 
Apache Software License v
         This project contains annotations derived from JCIP-ANNOTATIONS
         Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
 
+    (ASLv2) Woodstox Core ASL
+      The following NOTICE information applies:
+        This product currently only contains code developed by authors
+        of specific components, as identified by the source code files.
+
+        Since product implements StAX API, it has dependencies to StAX API
+        classes.
+
     (ASLv2) Vorbis Java
       The following NOTICE information applies:
         Ogg and Vorbis Tools for Java
@@ -159,6 +249,26 @@ The following binary components are provided under the 
Apache Software License v
       The following NOTICE information applies:
         This product includes software developed by
         Joda.org (http://www.joda.org/).
+    
+    (ASLv2) Android JSON library
+      The following NOTICE information applies:
+        Copyright (C) 2010 The Android Open Source Project
+
+    (ASLv2) Apache JempBox
+      The following NOTICE information applies:
+        Apache JempBox
+        Copyright 2008-2017 The Apache Software Foundation
+
+    (ASLv2) Apache SIS
+      The following NOTICE information applies:
+        Apache SIS
+        Copyright 2010-2017 The Apache Software Foundation
+
+    (ASLv2) Rome
+      The following NOTICE information applies:
+        Rome Copyright Notices
+        Copyright 2004 Sun Microsystems, Inc.
+        Copyright 2011 The ROME Team
 
     (ASLv2) Quartz
       The following NOTICE information applies:
@@ -186,6 +296,15 @@ The following binary components are provided under the 
Apache Software License v
         JCommander Copyright Notices
         Copyright 2010 Cedric Beust [email protected]
 
+    (ASLv2) Boilerpipe
+      The following NOTICE information applies:
+          Copyright (c) 2009-2011 Christian Kohlschütter
+
+   (ASLv2) Apache Maven
+      The following NOTICE information applies:
+        Apache Maven
+        Copyright 2003-2017 The Apache Software Foundation.
+
 ************************
 Eclipse Public License 1.0
 ************************
@@ -198,7 +317,7 @@ Public Domain
 
 The following binary components are provided to the 'Public Domain'.  See 
project link for details.
 
-    (Public Domain) XZ for Java (org.tukaani:xz:jar:1.5 - 
http://tukaani.org/xz/java.html
+    (Public Domain) XZ for Java (org.tukaani:xz:jar:1.6 - 
http://tukaani.org/xz/java.html
 
 *****************
 Mozilla Public License v1.1
@@ -215,3 +334,13 @@ Common Development and Distribution License 1.0
 The following binary components are provided under the Common Development and 
Distribution License 1.0.  See project link for details.
 
     (CDDL 1.0) JHighlight (org.codelibs:jhighlight:1.0.2 - 
https://github.com/codelibs/jhighlight)
+
+************************
+Common Development and Distribution License 1.1
+************************
+
+The following binary components are provided under the Common Development and 
Distribution License 1.1. See project link for details.
+
+    (CDDL 1.1) (GPL2 w/ CPE) javax.annotation API 
(javax.annotation:javax.annotation-api:jar:1.2 - 
http://jcp.org/en/jsr/detail?id=250)
+    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api 
(javax.ws.rs:javax.ws.rs-api:jar:2.0.1 - http://jax-rs-spec.java.net)
+

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/pom.xml
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/pom.xml 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/pom.xml
index e668f56..7bb8b58 100644
--- a/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/pom.xml
@@ -42,23 +42,29 @@
         <dependency>
             <groupId>com.drewnoakes</groupId>
             <artifactId>metadata-extractor</artifactId>
-            <version>2.8.0</version>
-        </dependency>
-        <!-- Would like a newer version of tika-core and tika-parsers but 
newer 
-        tika-parser versions have cat-X json lib and other libraries that need 
to
-        have their license validated such as geoapis. --> 
-        <dependency>
-            <groupId>org.apache.tika</groupId>
-            <artifactId>tika-core</artifactId>
-            <version>1.8</version>
+            <version>2.11.0</version>
         </dependency>
         <dependency>
             <groupId>org.apache.tika</groupId>
             <artifactId>tika-parsers</artifactId>
-            <version>1.8</version>
+            <version>1.16</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-core</artifactId>
+                </exclusion>
+                <!--This must be excluded because it appears to have an 
invalid ASF unfriendly license.
+                This might cause weird behavior in usage of Tika Parsers - not 
sure.  Have emailed the
+                Tika community 
+                
https://lists.apache.org/thread.html/283e34e24db9382512b58bc24bc000efeffabba5e3475bc72e624967@%3Cuser.tika.apache.org%3E
+                -->
+                <exclusion>
+                    <groupId>javax.measure</groupId>
+                    <artifactId>jsr-275</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/image/ExtractImageMetadataTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/image/ExtractImageMetadataTest.java
 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/image/ExtractImageMetadataTest.java
index 49268fb..ee45f76 100644
--- 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/image/ExtractImageMetadataTest.java
+++ 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/image/ExtractImageMetadataTest.java
@@ -34,10 +34,11 @@ import static org.junit.Assert.assertNull;
 
 
 public class ExtractImageMetadataTest {
-    private static String BMP_HEADER = "BMP Header.";
-    private static String JPEG_HEADER = "JPEG.";
-    private static String GIF_HEADER = "GIF Header.";
-    private static String PNG_HEADER = "PNG-";
+    private final static String BMP_HEADER = "BMP Header.";
+    private final static String JPEG_HEADER = "JPEG.";
+    private final static String GIF_HEADER = "GIF Header.";
+    private final static String GIF_CONTROL = "GIF Control.";
+    private final static String PNG_HEADER = "PNG-";
 
     private TestRunner testRunner;
 
@@ -79,7 +80,7 @@ public class ExtractImageMetadataTest {
         assertEquals("12", attributes.get(GIF_HEADER + "Image Height"));
         assertEquals("true", attributes.get(GIF_HEADER + "Has Global Color 
Table"));
         assertEquals("32", attributes.get(GIF_HEADER + "Color Table Size"));
-        assertEquals("8", attributes.get(GIF_HEADER + "Transparent Color 
Index"));
+        assertEquals("8", attributes.get(GIF_CONTROL + "Transparent Color 
Index"));
         assertEquals("89a", attributes.get(GIF_HEADER + "GIF Format Version"));
         assertEquals("5", attributes.get(GIF_HEADER + "Bits per Pixel"));
         assertEquals("false", attributes.get(GIF_HEADER + "Is Color Table 
Sorted"));
@@ -92,7 +93,7 @@ public class ExtractImageMetadataTest {
 
         assertEquals("8", attributes.get(PNG_HEADER + "IHDR.Image Width"));
         assertEquals("12", attributes.get(PNG_HEADER + "IHDR.Image Height"));
-        assertEquals("0.45455", attributes.get(PNG_HEADER + "gAMA.Image 
Gamma"));
+        assertEquals("0.455", attributes.get(PNG_HEADER + "gAMA.Image Gamma"));
         assertEquals("Deflate", attributes.get(PNG_HEADER + "IHDR.Compression 
Type"));
         assertEquals("No Interlace", attributes.get(PNG_HEADER + 
"IHDR.Interlace Method"));
         assertEquals("Perceptual", attributes.get(PNG_HEADER + "sRGB.sRGB 
Rendering Intent"));
@@ -123,7 +124,6 @@ public class ExtractImageMetadataTest {
 
         assertEquals("10", attributes.get(BMP_HEADER+"Image Width"));
         assertEquals("10", attributes.get(BMP_HEADER+"Image Height"));
-        assertEquals("4", attributes.get(BMP_HEADER+"Bits Per Pixel"));
         assertEquals("1", attributes.get(BMP_HEADER+"Planes"));
         assertEquals("40", attributes.get(BMP_HEADER+"Header Size"));
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/media/TestExtractMediaMetadata.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/media/TestExtractMediaMetadata.java
 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/media/TestExtractMediaMetadata.java
index 98bd985..e540705 100644
--- 
a/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/media/TestExtractMediaMetadata.java
+++ 
b/nifi-nar-bundles/nifi-media-bundle/nifi-media-processors/src/test/java/org/apache/nifi/processors/media/TestExtractMediaMetadata.java
@@ -323,7 +323,7 @@ public class TestExtractMediaMetadata {
         flowFile0.assertAttributeExists("filename");
         flowFile0.assertAttributeEquals("filename", "16color-10x10.bmp");
         flowFile0.assertAttributeExists("bmp.Content-Type");
-        flowFile0.assertAttributeEquals("bmp.Content-Type", "image/x-ms-bmp");
+        flowFile0.assertAttributeEquals("bmp.Content-Type", "image/bmp");
         flowFile0.assertAttributeExists("bmp.X-Parsed-By");
         
assertTrue(flowFile0.getAttribute("bmp.X-Parsed-By").contains("org.apache.tika.parser.DefaultParser"));
         // 
assertTrue(flowFile0.getAttribute("bmp.X-Parsed-By").contains("org.apache.tika.parser.image.ImageParser"));
@@ -349,11 +349,8 @@ public class TestExtractMediaMetadata {
         MockFlowFile flowFile0 = successFiles.get(0);
         flowFile0.assertAttributeExists("filename");
         flowFile0.assertAttributeEquals("filename", "simple.jpg");
-        flowFile0.assertAttributeExists("jpg.Content-Type");
-        flowFile0.assertAttributeEquals("jpg.Content-Type", "image/jpeg");
-        flowFile0.assertAttributeExists("jpg.X-Parsed-By");
-        
assertTrue(flowFile0.getAttribute("jpg.X-Parsed-By").contains("org.apache.tika.parser.DefaultParser"));
-        // 
assertTrue(flowFile0.getAttribute("jpg.X-Parsed-By").contains("org.apache.tika.parser.jpeg.JpegParser"));
+        flowFile0.assertAttributeExists("jpg.tiff:Model");
+        flowFile0.assertAttributeEquals("jpg.tiff:Model", "Canon PowerShot 
S330");
     }
 
     @Test
@@ -374,7 +371,7 @@ public class TestExtractMediaMetadata {
         flowFile0.assertAttributeExists("filename");
         flowFile0.assertAttributeEquals("filename", "testWAV.wav");
         flowFile0.assertAttributeExists("wav.Content-Type");
-        
assertTrue(flowFile0.getAttribute("wav.Content-Type").startsWith("audio/x-wav"));
+        
assertTrue(flowFile0.getAttribute("wav.Content-Type").startsWith("audio/vnd.wave"));
         flowFile0.assertAttributeExists("wav.X-Parsed-By");
         
assertTrue(flowFile0.getAttribute("wav.X-Parsed-By").contains("org.apache.tika.parser.DefaultParser"));
         
assertTrue(flowFile0.getAttribute("wav.X-Parsed-By").contains("org.apache.tika.parser.audio.AudioParser"));

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/test/java/org/apache/nifi/processors/slack/PutSlackTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/test/java/org/apache/nifi/processors/slack/PutSlackTest.java
 
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/test/java/org/apache/nifi/processors/slack/PutSlackTest.java
index f1c0aec..1d7308b 100644
--- 
a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/test/java/org/apache/nifi/processors/slack/PutSlackTest.java
+++ 
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/test/java/org/apache/nifi/processors/slack/PutSlackTest.java
@@ -47,12 +47,13 @@ public class PutSlackTest {
         // set up web service
         ServletHandler handler = new ServletHandler();
         handler.addServletWithMapping(CaptureServlet.class, "/*");
-        servlet = (CaptureServlet) handler.getServlets()[0].getServlet();
 
         // create the service
         server = new TestServer();
         server.addHandler(handler);
         server.startServer();
+
+        servlet = (CaptureServlet) handler.getServlets()[0].getServlet();
     }
 
     @Test(expected = AssertionError.class)

http://git-wip-us.apache.org/repos/asf/nifi/blob/7e61c633/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
index c0afa35..b2aec91 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
@@ -172,7 +172,7 @@
         <dependency>
             <groupId>org.apache.tika</groupId>
             <artifactId>tika-core</artifactId>
-            <version>1.14</version>
+            <version>1.16</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>

Reply via email to