You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ph...@apache.org on 2018/02/12 18:09:18 UTC

[27/27] nifi-minifi-cpp git commit: MINIFICPP-114 Consolidate JSON API use to RapidJSON

MINIFICPP-114 Consolidate JSON API use to RapidJSON

This closes #191.

Signed-off-by: Marc Parisi <ph...@apache.org>


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

Branch: refs/heads/master
Commit: fd280b5c4de8ce6d59d0fbcfb8f81d3d39279b4d
Parents: a17c7e1
Author: Caleb Johnson <me...@calebj.io>
Authored: Wed Nov 15 12:38:54 2017 +0000
Committer: Marc Parisi <ph...@apache.org>
Committed: Mon Feb 12 13:08:41 2018 -0500

----------------------------------------------------------------------
 CMakeLists.txt                                  |   17 +-
 LICENSE                                         |   36 +
 LibExample/CMakeLists.txt                       |    6 +-
 cmake/BuildTests.cmake                          |    4 +-
 extensions/bustache/CMakeLists.txt              |    2 +-
 extensions/expression-language/CMakeLists.txt   |    5 +-
 .../expression-language/noop/CMakeLists.txt     |    4 +-
 extensions/gps/CMakeLists.txt                   |    5 +-
 extensions/http-curl/CMakeLists.txt             |    4 +-
 extensions/http-curl/client/HTTPClient.cpp      |    6 +-
 extensions/http-curl/client/HTTPClient.h        |    2 +
 extensions/http-curl/protocols/RESTReceiver.cpp |   32 +-
 extensions/http-curl/protocols/RESTReceiver.h   |    2 -
 extensions/http-curl/protocols/RESTSender.cpp   |   36 +-
 extensions/http-curl/protocols/RESTSender.h     |    2 -
 extensions/http-curl/sitetosite/PeersEntity.h   |  113 +-
 extensions/http-curl/tests/HTTPHandlers.h       |    1 -
 extensions/libarchive/ArchiveMetadata.cpp       |  210 ++
 extensions/libarchive/ArchiveMetadata.h         |   97 +
 extensions/libarchive/CMakeLists.txt            |    5 +-
 extensions/libarchive/FocusArchiveEntry.cpp     |   78 +-
 extensions/libarchive/FocusArchiveEntry.h       |   23 +-
 extensions/libarchive/ManipulateArchive.cpp     |   38 +-
 extensions/libarchive/ManipulateArchive.h       |    2 +-
 extensions/libarchive/UnfocusArchiveEntry.cpp   |  100 +-
 extensions/libarchive/UnfocusArchiveEntry.h     |    4 +-
 extensions/librdkafka/CMakeLists.txt            |    5 +-
 extensions/mqtt/CMakeLists.txt                  |    3 +-
 extensions/pcap/CMakeLists.txt                  |    5 +-
 extensions/rocksdb-repos/CMakeLists.txt         |    3 +-
 extensions/script/CMakeLists.txt                |    5 +-
 extensions/tensorflow/CMakeLists.txt            |    5 +-
 extensions/usb-camera/CMakeLists.txt            |    5 +-
 libminifi/CMakeLists.txt                        |    6 +-
 libminifi/include/c2/protocols/RESTProtocol.h   |   14 +-
 libminifi/include/utils/ByteArrayCallback.h     |    2 -
 libminifi/include/utils/HTTPClient.h            |    4 +-
 libminifi/src/RemoteProcessorGroupPort.cpp      |   33 +-
 libminifi/src/c2/protocols/RESTProtocol.cpp     |  174 +-
 .../SiteToSiteProvenanceReportingTask.cpp       |  105 +-
 libminifi/test/unit/ProcessorTests.cpp          |    2 +-
 main/CMakeLists.txt                             |    8 +-
 thirdparty/jsoncpp/AUTHORS                      |    1 -
 thirdparty/jsoncpp/CMakeLists.txt               |  156 --
 thirdparty/jsoncpp/LICENSE                      |   55 -
 thirdparty/jsoncpp/NEWS.txt                     |  175 --
 thirdparty/jsoncpp/README.md                    |  225 --
 thirdparty/jsoncpp/SConstruct                   |  248 --
 thirdparty/jsoncpp/amalgamate.py                |  155 --
 thirdparty/jsoncpp/appveyor.yml                 |   35 -
 thirdparty/jsoncpp/dev.makefile                 |   35 -
 thirdparty/jsoncpp/doc/doxyfile.in              | 2301 ----------------
 thirdparty/jsoncpp/doc/footer.html              |    3 -
 thirdparty/jsoncpp/doc/header.html              |   24 -
 thirdparty/jsoncpp/doc/jsoncpp.dox              |  164 --
 thirdparty/jsoncpp/doc/readme.txt               |    1 -
 thirdparty/jsoncpp/doc/roadmap.dox              |    3 -
 thirdparty/jsoncpp/doc/web_doxyfile.in          | 2301 ----------------
 thirdparty/jsoncpp/doxybuild.py                 |  189 --
 thirdparty/jsoncpp/include/CMakeLists.txt       |    2 -
 thirdparty/jsoncpp/include/json/allocator.h     |   98 -
 thirdparty/jsoncpp/include/json/assertions.h    |   54 -
 thirdparty/jsoncpp/include/json/autolink.h      |   25 -
 thirdparty/jsoncpp/include/json/config.h        |  184 --
 thirdparty/jsoncpp/include/json/features.h      |   61 -
 thirdparty/jsoncpp/include/json/forwards.h      |   37 -
 thirdparty/jsoncpp/include/json/json.h          |   15 -
 thirdparty/jsoncpp/include/json/reader.h        |  408 ---
 thirdparty/jsoncpp/include/json/value.h         |  870 ------
 thirdparty/jsoncpp/include/json/version.h       |   20 -
 thirdparty/jsoncpp/include/json/writer.h        |  335 ---
 .../jsoncpp/makefiles/msvc2010/jsoncpp.sln      |   42 -
 .../jsoncpp/makefiles/msvc2010/jsontest.vcxproj |   96 -
 .../makefiles/msvc2010/jsontest.vcxproj.filters |   13 -
 .../jsoncpp/makefiles/msvc2010/lib_json.vcxproj |  143 -
 .../makefiles/msvc2010/lib_json.vcxproj.filters |   33 -
 .../makefiles/msvc2010/test_lib_json.vcxproj    |  109 -
 .../msvc2010/test_lib_json.vcxproj.filters      |   24 -
 thirdparty/jsoncpp/makefiles/vs71/jsoncpp.sln   |   46 -
 .../jsoncpp/makefiles/vs71/jsontest.vcproj      |  119 -
 .../jsoncpp/makefiles/vs71/lib_json.vcproj      |  205 --
 .../jsoncpp/makefiles/vs71/test_lib_json.vcproj |  130 -
 thirdparty/jsoncpp/makerelease.py               |  390 ---
 thirdparty/jsoncpp/pkg-config/jsoncpp.pc.in     |    9 -
 thirdparty/jsoncpp/scons-tools/globtool.py      |   58 -
 thirdparty/jsoncpp/scons-tools/srcdist.py       |  183 --
 thirdparty/jsoncpp/scons-tools/substinfile.py   |   85 -
 thirdparty/jsoncpp/scons-tools/targz.py         |   87 -
 thirdparty/jsoncpp/src/CMakeLists.txt           |    5 -
 .../jsoncpp/src/jsontestrunner/CMakeLists.txt   |   25 -
 thirdparty/jsoncpp/src/jsontestrunner/main.cpp  |  326 ---
 .../jsoncpp/src/jsontestrunner/sconscript       |    9 -
 thirdparty/jsoncpp/src/lib_json/CMakeLists.txt  |  113 -
 thirdparty/jsoncpp/src/lib_json/json_reader.cpp | 2036 --------------
 thirdparty/jsoncpp/src/lib_json/json_tool.h     |  117 -
 thirdparty/jsoncpp/src/lib_json/json_value.cpp  | 1617 -----------
 .../jsoncpp/src/lib_json/json_valueiterator.inl |  167 --
 thirdparty/jsoncpp/src/lib_json/json_writer.cpp | 1224 ---------
 thirdparty/jsoncpp/src/lib_json/sconscript      |    8 -
 thirdparty/jsoncpp/src/lib_json/version.h.in    |   20 -
 .../jsoncpp/src/test_lib_json/CMakeLists.txt    |   38 -
 .../jsoncpp/src/test_lib_json/jsontest.cpp      |  457 ----
 thirdparty/jsoncpp/src/test_lib_json/jsontest.h |  286 --
 thirdparty/jsoncpp/src/test_lib_json/main.cpp   | 2589 ------------------
 thirdparty/jsoncpp/src/test_lib_json/sconscript |   10 -
 thirdparty/jsoncpp/version                      |    1 -
 thirdparty/jsoncpp/version.in                   |    1 -
 thirdparty/rapidjson-1.1.0/.gitattributes       |   22 +
 thirdparty/rapidjson-1.1.0/.gitignore           |   25 +
 thirdparty/rapidjson-1.1.0/.gitmodules          |    3 +
 thirdparty/rapidjson-1.1.0/.travis.yml          |   98 +
 thirdparty/rapidjson-1.1.0/CHANGELOG.md         |  158 ++
 thirdparty/rapidjson-1.1.0/CMakeLists.txt       |  161 ++
 .../CMakeModules/FindGTestSrc.cmake             |   30 +
 thirdparty/rapidjson-1.1.0/RapidJSON.pc.in      |    7 +
 .../rapidjson-1.1.0/RapidJSONConfig.cmake.in    |    3 +
 .../RapidJSONConfigVersion.cmake.in             |   10 +
 thirdparty/rapidjson-1.1.0/appveyor.yml         |   41 +
 thirdparty/rapidjson-1.1.0/doc/CMakeLists.txt   |   25 +
 thirdparty/rapidjson-1.1.0/doc/Doxyfile.in      | 2369 ++++++++++++++++
 .../rapidjson-1.1.0/doc/Doxyfile.zh-cn.in       | 2369 ++++++++++++++++
 .../doc/diagram/architecture.dot                |   50 +
 .../doc/diagram/architecture.png                |  Bin 0 -> 16569 bytes
 .../doc/diagram/insituparsing.dot               |   65 +
 .../doc/diagram/insituparsing.png               |  Bin 0 -> 37281 bytes
 .../diagram/iterative-parser-states-diagram.dot |   62 +
 .../diagram/iterative-parser-states-diagram.png |  Bin 0 -> 92378 bytes
 thirdparty/rapidjson-1.1.0/doc/diagram/makefile |    8 +
 .../rapidjson-1.1.0/doc/diagram/move1.dot       |   47 +
 .../rapidjson-1.1.0/doc/diagram/move1.png       |  Bin 0 -> 16081 bytes
 .../rapidjson-1.1.0/doc/diagram/move2.dot       |   62 +
 .../rapidjson-1.1.0/doc/diagram/move2.png       |  Bin 0 -> 41517 bytes
 .../rapidjson-1.1.0/doc/diagram/move3.dot       |   60 +
 .../rapidjson-1.1.0/doc/diagram/move3.png       |  Bin 0 -> 36371 bytes
 .../doc/diagram/normalparsing.dot               |   56 +
 .../doc/diagram/normalparsing.png               |  Bin 0 -> 32887 bytes
 .../rapidjson-1.1.0/doc/diagram/simpledom.dot   |   54 +
 .../rapidjson-1.1.0/doc/diagram/simpledom.png   |  Bin 0 -> 43670 bytes
 .../rapidjson-1.1.0/doc/diagram/tutorial.dot    |   58 +
 .../rapidjson-1.1.0/doc/diagram/tutorial.png    |  Bin 0 -> 44634 bytes
 .../doc/diagram/utilityclass.dot                |   73 +
 .../doc/diagram/utilityclass.png                |  Bin 0 -> 99993 bytes
 thirdparty/rapidjson-1.1.0/doc/dom.md           |  280 ++
 thirdparty/rapidjson-1.1.0/doc/dom.zh-cn.md     |  284 ++
 thirdparty/rapidjson-1.1.0/doc/encoding.md      |  146 +
 .../rapidjson-1.1.0/doc/encoding.zh-cn.md       |  152 +
 thirdparty/rapidjson-1.1.0/doc/faq.md           |  289 ++
 thirdparty/rapidjson-1.1.0/doc/faq.zh-cn.md     |  290 ++
 thirdparty/rapidjson-1.1.0/doc/features.md      |  104 +
 .../rapidjson-1.1.0/doc/features.zh-cn.md       |  103 +
 thirdparty/rapidjson-1.1.0/doc/internals.md     |  365 +++
 .../rapidjson-1.1.0/doc/logo/rapidjson.png      |  Bin 0 -> 5259 bytes
 .../rapidjson-1.1.0/doc/logo/rapidjson.svg      |  119 +
 .../rapidjson-1.1.0/doc/misc/DoxygenLayout.xml  |  194 ++
 .../rapidjson-1.1.0/doc/misc/doxygenextra.css   |  274 ++
 thirdparty/rapidjson-1.1.0/doc/misc/footer.html |   11 +
 thirdparty/rapidjson-1.1.0/doc/misc/header.html |   24 +
 thirdparty/rapidjson-1.1.0/doc/npm.md           |   31 +
 thirdparty/rapidjson-1.1.0/doc/performance.md   |   26 +
 .../rapidjson-1.1.0/doc/performance.zh-cn.md    |   26 +
 thirdparty/rapidjson-1.1.0/doc/pointer.md       |  234 ++
 thirdparty/rapidjson-1.1.0/doc/pointer.zh-cn.md |  234 ++
 thirdparty/rapidjson-1.1.0/doc/sax.md           |  486 ++++
 thirdparty/rapidjson-1.1.0/doc/sax.zh-cn.md     |  487 ++++
 thirdparty/rapidjson-1.1.0/doc/schema.md        |  237 ++
 thirdparty/rapidjson-1.1.0/doc/schema.zh-cn.md  |  237 ++
 thirdparty/rapidjson-1.1.0/doc/stream.md        |  426 +++
 thirdparty/rapidjson-1.1.0/doc/stream.zh-cn.md  |  426 +++
 thirdparty/rapidjson-1.1.0/doc/tutorial.md      |  536 ++++
 .../rapidjson-1.1.0/doc/tutorial.zh-cn.md       |  534 ++++
 .../rapidjson-1.1.0/docker/debian/Dockerfile    |    8 +
 .../rapidjson-1.1.0/example/CMakeLists.txt      |   42 +
 .../example/capitalize/capitalize.cpp           |   67 +
 .../example/condense/condense.cpp               |   32 +
 .../example/filterkey/filterkey.cpp             |  135 +
 .../example/filterkeydom/filterkeydom.cpp       |  170 ++
 .../rapidjson-1.1.0/example/jsonx/jsonx.cpp     |  207 ++
 .../example/messagereader/messagereader.cpp     |  105 +
 .../example/parsebyparts/parsebyparts.cpp       |  173 ++
 .../rapidjson-1.1.0/example/pretty/pretty.cpp   |   30 +
 .../example/prettyauto/prettyauto.cpp           |   56 +
 .../example/schemavalidator/schemavalidator.cpp |   72 +
 .../example/serialize/serialize.cpp             |  173 ++
 .../example/simpledom/simpledom.cpp             |   29 +
 .../example/simplereader/simplereader.cpp       |   42 +
 .../example/simplewriter/simplewriter.cpp       |   36 +
 .../example/tutorial/tutorial.cpp               |  151 +
 .../include/rapidjson/allocators.h              |  271 ++
 .../include/rapidjson/document.h                | 2575 +++++++++++++++++
 .../include/rapidjson/encodedstream.h           |  299 ++
 .../include/rapidjson/encodings.h               |  716 +++++
 .../include/rapidjson/error/en.h                |   74 +
 .../include/rapidjson/error/error.h             |  155 ++
 .../include/rapidjson/filereadstream.h          |   99 +
 .../include/rapidjson/filewritestream.h         |  104 +
 .../rapidjson-1.1.0/include/rapidjson/fwd.h     |  151 +
 .../include/rapidjson/internal/biginteger.h     |  290 ++
 .../include/rapidjson/internal/diyfp.h          |  258 ++
 .../include/rapidjson/internal/dtoa.h           |  245 ++
 .../include/rapidjson/internal/ieee754.h        |   78 +
 .../include/rapidjson/internal/itoa.h           |  304 ++
 .../include/rapidjson/internal/meta.h           |  181 ++
 .../include/rapidjson/internal/pow10.h          |   55 +
 .../include/rapidjson/internal/regex.h          |  701 +++++
 .../include/rapidjson/internal/stack.h          |  230 ++
 .../include/rapidjson/internal/strfunc.h        |   55 +
 .../include/rapidjson/internal/strtod.h         |  269 ++
 .../include/rapidjson/internal/swap.h           |   46 +
 .../include/rapidjson/istreamwrapper.h          |  115 +
 .../include/rapidjson/memorybuffer.h            |   70 +
 .../include/rapidjson/memorystream.h            |   71 +
 .../include/rapidjson/msinttypes/inttypes.h     |  316 +++
 .../include/rapidjson/msinttypes/stdint.h       |  300 ++
 .../include/rapidjson/ostreamwrapper.h          |   81 +
 .../rapidjson-1.1.0/include/rapidjson/pointer.h | 1358 +++++++++
 .../include/rapidjson/prettywriter.h            |  255 ++
 .../include/rapidjson/rapidjson.h               |  615 +++++
 .../rapidjson-1.1.0/include/rapidjson/reader.h  | 1879 +++++++++++++
 .../rapidjson-1.1.0/include/rapidjson/schema.h  | 2006 ++++++++++++++
 .../rapidjson-1.1.0/include/rapidjson/stream.h  |  179 ++
 .../include/rapidjson/stringbuffer.h            |  117 +
 .../rapidjson-1.1.0/include/rapidjson/writer.h  |  610 +++++
 thirdparty/rapidjson-1.1.0/include_dirs.js      |    2 +
 thirdparty/rapidjson-1.1.0/library.json         |   12 +
 thirdparty/rapidjson-1.1.0/license.txt          |   57 +
 thirdparty/rapidjson-1.1.0/package.json         |   24 +
 thirdparty/rapidjson-1.1.0/rapidjson.autopkg    |   75 +
 thirdparty/rapidjson-1.1.0/readme.md            |  160 ++
 thirdparty/rapidjson-1.1.0/readme.zh-cn.md      |  152 +
 thirdparty/rapidjson-1.1.0/travis-doxygen.sh    |  122 +
 230 files changed, 30492 insertions(+), 19453 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 81fe21d..ad6036f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -95,22 +95,6 @@ file(GLOB SPD_SOURCES "thirdparty/spdlog-20170710/include/spdlog/*")
 
 include(ExternalProject)
 
-# Setup Jsoncpp as an external project
-set(JSONCPP_LIB_DIR "${CMAKE_CURRENT_BINARY_DIR}/jsoncpp")
-
-externalproject_add(jsoncpp_project
-        SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/jsoncpp
-        CMAKE_ARGS
-        "-G${CMAKE_GENERATOR}"
-        "-DCMAKE_INSTALL_LIBDIR=${JSONCPP_LIB_DIR}/lib"
-        "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
-        "-DCMAKE_INSTALL_PREFIX=${JSONCPP_LIB_DIR}"
-        )
-
-set(prefix "lib")
-set(suffix ".a")
-set(JSONCPP_LIB "${JSONCPP_LIB_DIR}/lib/${prefix}jsoncpp${suffix}")
-
 set(CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING OFF CACHE BOOL "Disable dynamic SSL library loading")
 set(CIVETWEB_ENABLE_CXX ON CACHE BOOL "Enable civet C++ library")
 SET(WITH_TOOLS OFF CACHE BOOL "Do not build RocksDB tools")
@@ -122,6 +106,7 @@ add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-20171024)
 
 include_directories(thirdparty/concurrentqueue)
 include_directories(thirdparty/yaml-cpp-yaml-cpp-20171024/include)
+include_directories(thirdparty/rapidjson-1.1.0/include)
 
 ## Expression language extensions
 option(DISABLE_EXPRESSION_LANGUAGE "Disables the scripting extensions." OFF)

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index 8cde4ea..cedd336 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1075,3 +1075,39 @@ 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.
+
+This product bundles RapidJSON:
+Tencent is pleased to support the open source community by making RapidJSON available. 
+ 
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.  All rights reserved.
+
+If you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License.
+If you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms.  Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license.
+A copy of the MIT License is included in this file.
+
+Other dependencies and licenses:
+
+Open Source Software Licensed Under the BSD License:
+--------------------------------------------------------------------
+
+The msinttypes r29 
+Copyright (c) 2006-2013 Alexander Chemeris 
+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  copyright holder 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 REGENTS 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 REGENTS AND 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.
+
+
+Terms of the MIT License:
+--------------------------------------------------------------------
+
+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.

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/LibExample/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/LibExample/CMakeLists.txt b/LibExample/CMakeLists.txt
index 4ba26bd..ddf1e20 100644
--- a/LibExample/CMakeLists.txt
+++ b/LibExample/CMakeLists.txt
@@ -23,7 +23,7 @@ IF(POLICY CMP0048)
   CMAKE_POLICY(SET CMP0048 OLD)
 ENDIF(POLICY CMP0048)
 
-include_directories(../libminifi/include  ../libminifi/include/c2  ../libminifi/include/c2/protocols/  ../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../libminifi/include/core/yaml  ../libminifi/include/core  ../thirdparty/spdlog-20170710/include ../thirdparty/concurrentqueue ../thirdparty/yaml-cpp-yaml-cpp-20171024/include ../thirdparty/civetweb-1.9.1/include ../thirdparty/jsoncpp/include  ../thirdparty/)
+include_directories(../libminifi/include  ../libminifi/include/c2  ../libminifi/include/c2/protocols/  ../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../libminifi/include/core/yaml  ../libminifi/include/core  ../thirdparty/spdlog-20170710/include ../thirdparty/concurrentqueue ../thirdparty/yaml-cpp-yaml-cpp-20171024/include ../thirdparty/civetweb-1.9.1/include ../thirdparty/)
 
 include(CheckCXXCompilerFlag)
 CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
@@ -38,7 +38,7 @@ endif()
 
 add_executable(transmit_flow transmit_flow.c)
 
-# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl, jsoncpp and rocksdb
+# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl and rocksdb
 target_link_libraries(transmit_flow capi core-minifi minifi)
 
 if (APPLE)
@@ -50,7 +50,7 @@ endif ()
 
 add_executable(generate_flow generate_flow.c)
 
-# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl, jsoncpp and rocksdb
+# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl and rocksdb
 target_link_libraries(generate_flow capi core-minifi minifi)
 
 if (APPLE)

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/cmake/BuildTests.cmake
----------------------------------------------------------------------
diff --git a/cmake/BuildTests.cmake b/cmake/BuildTests.cmake
index 4269898..8bb83e7 100644
--- a/cmake/BuildTests.cmake
+++ b/cmake/BuildTests.cmake
@@ -38,8 +38,6 @@ function(createTests testName)
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/catch")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/spdlog-20170710/include")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp-yaml-cpp-0.5.3/include")
-    target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/jsoncpp/include")
-
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/libarchive-3.3.2/libarchive")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/include")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/")
@@ -59,7 +57,7 @@ function(createTests testName)
         target_include_directories(${testName} BEFORE PRIVATE "${Boost_INCLUDE_DIRS}")
     endif()
     target_link_libraries(${testName} ${SPD_LIB} ${TEST_BASE_LIB})
-    target_link_libraries(${testName} ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} core-minifi yaml-cpp ${JSON_CPP_LIB})
+    target_link_libraries(${testName} ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} core-minifi yaml-cpp)
     if (APPLE)
 		target_link_libraries (${testName} -Wl,-all_load minifi)
 	else ()

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/bustache/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/bustache/CMakeLists.txt b/extensions/bustache/CMakeLists.txt
index abdfb4d..b8cb0ce 100644
--- a/extensions/bustache/CMakeLists.txt
+++ b/extensions/bustache/CMakeLists.txt
@@ -22,7 +22,7 @@ cmake_minimum_required(VERSION 2.6)
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../../thirdparty/civetweb-1.9.1/include ../../thirdparty/jsoncpp/include  ../../thirdparty/) 
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../../thirdparty/civetweb-1.9.1/include ../../thirdparty/) 
 
 find_package(Boost COMPONENTS system filesystem iostreams REQUIRED)
 include_directories(${Boost_INCLUDE_DIRS})

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/expression-language/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/expression-language/CMakeLists.txt b/extensions/expression-language/CMakeLists.txt
index 4053e87..53c87e6 100644
--- a/extensions/expression-language/CMakeLists.txt
+++ b/extensions/expression-language/CMakeLists.txt
@@ -38,7 +38,7 @@ flex_target(
 
 add_flex_bison_dependency(el-scanner el-parser)
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/jsoncpp/include  ../../thirdparty/)
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
 include_directories(impl)
 
 file(GLOB SOURCES  "*.cpp")
@@ -53,8 +53,7 @@ if(CMAKE_THREAD_LIBS_INIT)
 endif()
 
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-expression-language-extensions ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-expression-language-extensions jsoncpp_project)
+target_link_libraries(minifi-expression-language-extensions ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-expression-language-extensions ${CMAKE_DL_LIBS})

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/expression-language/noop/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/expression-language/noop/CMakeLists.txt b/extensions/expression-language/noop/CMakeLists.txt
index 9df9f97..abf5e64 100644
--- a/extensions/expression-language/noop/CMakeLists.txt
+++ b/extensions/expression-language/noop/CMakeLists.txt
@@ -19,5 +19,5 @@
 
 message(STATUS "Expression language is disabled; using NoOp implementation")
 file(GLOB SOURCES "*.cpp")
-include_directories(../../../libminifi/include  ../../../libminifi/include/core  ../../../thirdparty/spdlog-20170710/include ../../../thirdparty/concurrentqueue ../../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../../thirdparty/jsoncpp/include  ../../../thirdparty/)
-add_library(minifi-expression-language-extensions STATIC ${SOURCES})
\ No newline at end of file
+include_directories(../../../libminifi/include  ../../../libminifi/include/core  ../../../thirdparty/spdlog-20170710/include ../../../thirdparty/concurrentqueue ../../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../../thirdparty/)
+add_library(minifi-expression-language-extensions STATIC ${SOURCES})

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/gps/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/gps/CMakeLists.txt b/extensions/gps/CMakeLists.txt
index 0329dd3..6b28d05 100644
--- a/extensions/gps/CMakeLists.txt
+++ b/extensions/gps/CMakeLists.txt
@@ -23,7 +23,7 @@ cmake_minimum_required(VERSION 2.6)
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/jsoncpp/include  ../../thirdparty/) 
+include_directories(../../libminifi/include  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/) 
 
 find_package(LibGPS REQUIRED)
 
@@ -43,8 +43,7 @@ endif()
 
 # Include UUID
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-gps ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB} ${LIBGPS_LIBRARIES})
-add_dependencies(minifi-gps jsoncpp_project)
+target_link_libraries(minifi-gps ${LIBMINIFI} ${UUID_LIBRARIES} ${LIBGPS_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-gps ${CMAKE_DL_LIBS} )

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/http-curl/CMakeLists.txt b/extensions/http-curl/CMakeLists.txt
index dfa4259..d5e966a 100644
--- a/extensions/http-curl/CMakeLists.txt
+++ b/extensions/http-curl/CMakeLists.txt
@@ -22,7 +22,7 @@ find_package(CURL REQUIRED)
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT} ../../thirdparty/jsoncpp/include  ../../thirdparty/)
+include_directories(../../libminifi/include  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
 include_directories(protocols client processors sitetosite)
 
 file(GLOB SOURCES  "*.cpp" "protocols/*.cpp" "client/*.cpp" "processors/*.cpp" "sitetosite/*.cpp")
@@ -69,4 +69,4 @@ else ()
 endif ()
 
 SET (HTTP-CURL minifi-http-curl PARENT_SCOPE)
-register_extension(minifi-http-curl)
\ No newline at end of file
+register_extension(minifi-http-curl)

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/client/HTTPClient.cpp
----------------------------------------------------------------------
diff --git a/extensions/http-curl/client/HTTPClient.cpp b/extensions/http-curl/client/HTTPClient.cpp
index a8643d5..5ea9e95 100644
--- a/extensions/http-curl/client/HTTPClient.cpp
+++ b/extensions/http-curl/client/HTTPClient.cpp
@@ -136,7 +136,7 @@ void HTTPClient::setDisablePeerVerification() {
   curl_easy_setopt(http_session_, CURLOPT_SSL_VERIFYPEER, 0L);
 }
 
-void HTTPClient::setDisableHostVerification(){
+void HTTPClient::setDisableHostVerification() {
   logger_->log_debug("Disabling host verification");
   curl_easy_setopt(http_session_, CURLOPT_SSL_VERIFYHOST, 0L);
 }
@@ -192,6 +192,10 @@ void HTTPClient::setPostFields(std::string input) {
   curl_easy_setopt(http_session_, CURLOPT_POSTFIELDS, input.c_str());
 }
 
+void HTTPClient::setPostSize(size_t size) {
+  curl_easy_setopt(http_session_, CURLOPT_POSTFIELDSIZE, size);
+}
+
 void HTTPClient::setHeaders(struct curl_slist *list) {
   headers_ = list;
 }

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/client/HTTPClient.h
----------------------------------------------------------------------
diff --git a/extensions/http-curl/client/HTTPClient.h b/extensions/http-curl/client/HTTPClient.h
index 8f61ad3..e5545c3 100644
--- a/extensions/http-curl/client/HTTPClient.h
+++ b/extensions/http-curl/client/HTTPClient.h
@@ -166,6 +166,8 @@ class HTTPClient : public BaseHTTPClient, public core::Connectable {
     return true;
   }
 
+  void setPostSize(size_t size);
+
  protected:
 
   inline bool matches(const std::string &value, const std::string &sregex) override;

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/protocols/RESTReceiver.cpp
----------------------------------------------------------------------
diff --git a/extensions/http-curl/protocols/RESTReceiver.cpp b/extensions/http-curl/protocols/RESTReceiver.cpp
index ac9d229..fe4092c 100644
--- a/extensions/http-curl/protocols/RESTReceiver.cpp
+++ b/extensions/http-curl/protocols/RESTReceiver.cpp
@@ -64,38 +64,8 @@ void RESTReceiver::initialize(const std::shared_ptr<core::controller::Controller
   }
 }
 int16_t RESTReceiver::heartbeat(const C2Payload &payload) {
-  std::string operation_request_str = getOperation(payload);
-  std::string outputConfig;
-  Json::Value json_payload;
-  json_payload["operation"] = operation_request_str;
-  if (payload.getIdentifier().length() > 0) {
-    json_payload["operationid"] = payload.getIdentifier();
-  }
-  const std::vector<C2ContentResponse> &content = payload.getContent();
-
-  for (const auto &payload_content : content) {
-    Json::Value payload_content_values;
-    bool use_sub_option = true;
-    if (payload_content.op == payload.getOperation()) {
-      for (auto content : payload_content.operation_arguments) {
-        if (payload_content.operation_arguments.size() == 1 && payload_content.name == content.first) {
-          json_payload[payload_content.name] = content.second;
-          use_sub_option = false;
-        } else {
-          payload_content_values[content.first] = content.second;
-        }
-      }
-    }
-    if (use_sub_option)
-      json_payload[payload_content.name] = payload_content_values;
-  }
-
-  for (const auto &nested_payload : payload.getNestedPayloads()) {
-    json_payload[nested_payload.getLabel()] = serializeJsonPayload(json_payload, nested_payload);
-  }
+  std::string outputConfig = serializeJsonRootPayload(payload);
 
-  Json::StyledWriter writer;
-  outputConfig = writer.write(json_payload);
   if (handler != nullptr) {
     logger_->log_debug("Setting %s", outputConfig);
     handler->setResponse(outputConfig);

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/protocols/RESTReceiver.h
----------------------------------------------------------------------
diff --git a/extensions/http-curl/protocols/RESTReceiver.h b/extensions/http-curl/protocols/RESTReceiver.h
index e19932c..de97eae 100644
--- a/extensions/http-curl/protocols/RESTReceiver.h
+++ b/extensions/http-curl/protocols/RESTReceiver.h
@@ -18,8 +18,6 @@
 #ifndef LIBMINIFI_INCLUDE_C2_RESTRCVR_H_
 #define LIBMINIFI_INCLUDE_C2_RESTRCVR_H_
 
-#include "json/json.h"
-#include "json/writer.h"
 #include <string>
 #include <mutex>
 #include "core/Resource.h"

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/protocols/RESTSender.cpp
----------------------------------------------------------------------
diff --git a/extensions/http-curl/protocols/RESTSender.cpp b/extensions/http-curl/protocols/RESTSender.cpp
index 5f81005..a98ba03 100644
--- a/extensions/http-curl/protocols/RESTSender.cpp
+++ b/extensions/http-curl/protocols/RESTSender.cpp
@@ -45,40 +45,12 @@ void RESTSender::initialize(const std::shared_ptr<core::controller::ControllerSe
   }
   logger_->log_debug("Submitting to %s", rest_uri_);
 }
+
 C2Payload RESTSender::consumePayload(const std::string &url, const C2Payload &payload, Direction direction, bool async) {
-  std::string operation_request_str = getOperation(payload);
   std::string outputConfig;
-  if (direction == Direction::TRANSMIT) {
-    Json::Value json_payload;
-    json_payload["operation"] = operation_request_str;
-    if (payload.getIdentifier().length() > 0) {
-      json_payload["operationid"] = payload.getIdentifier();
-    }
-    const std::vector<C2ContentResponse> &content = payload.getContent();
-
-    for (const auto &payload_content : content) {
-      Json::Value payload_content_values;
-      bool use_sub_option = true;
-      if (payload_content.op == payload.getOperation()) {
-        for (auto content : payload_content.operation_arguments) {
-          if (payload_content.operation_arguments.size() == 1 && payload_content.name == content.first) {
-            json_payload[payload_content.name] = content.second;
-            use_sub_option = false;
-          } else {
-            payload_content_values[content.first] = content.second;
-          }
-        }
-      }
-      if (use_sub_option)
-        json_payload[payload_content.name] = payload_content_values;
-    }
-
-    for (const auto &nested_payload : payload.getNestedPayloads()) {
-      json_payload[nested_payload.getLabel()] = serializeJsonPayload(json_payload, nested_payload);
-    }
 
-    Json::StyledWriter writer;
-    outputConfig = writer.write(json_payload);
+  if (direction == Direction::TRANSMIT) {
+    outputConfig = serializeJsonRootPayload(payload);
   }
 
   return sendPayload(url, direction, payload, outputConfig);
@@ -111,11 +83,13 @@ const C2Payload RESTSender::sendPayload(const std::string url, const Direction d
     callback->pos = 0;
     client.set_request_method("POST");
     client.setUploadCallback(callback.get());
+    client.setPostSize(outputConfig.size());
   } else {
     // we do not need to set the uplaod callback
     // since we are not uploading anything on a get
     client.set_request_method("GET");
   }
+  client.appendHeader("Accept: application/json");
   client.setContentType("application/json");
   bool isOkay = client.submit();
   int64_t respCode = client.getResponseCode();

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/protocols/RESTSender.h
----------------------------------------------------------------------
diff --git a/extensions/http-curl/protocols/RESTSender.h b/extensions/http-curl/protocols/RESTSender.h
index 450799c..bc9102b 100644
--- a/extensions/http-curl/protocols/RESTSender.h
+++ b/extensions/http-curl/protocols/RESTSender.h
@@ -18,8 +18,6 @@
 #ifndef LIBMINIFI_INCLUDE_C2_RESTSENDER_H_
 #define LIBMINIFI_INCLUDE_C2_RESTSENDER_H_
 
-#include "json/json.h"
-#include "json/writer.h"
 #include <string>
 #include <mutex>
 

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/sitetosite/PeersEntity.h
----------------------------------------------------------------------
diff --git a/extensions/http-curl/sitetosite/PeersEntity.h b/extensions/http-curl/sitetosite/PeersEntity.h
index 54be488..62cf20a 100644
--- a/extensions/http-curl/sitetosite/PeersEntity.h
+++ b/extensions/http-curl/sitetosite/PeersEntity.h
@@ -18,9 +18,15 @@
 #ifndef EXTENSIONS_HTTP_CURL_SITETOSITE_PEERSENTITY_H_
 #define EXTENSIONS_HTTP_CURL_SITETOSITE_PEERSENTITY_H_
 
-#include "json/json.h"
+#include <string>
+#include <exception>
+
+#include "rapidjson/document.h"
+#include "rapidjson/error/en.h"
+
 #include "sitetosite/Peer.h"
 #include "utils/StringUtils.h"
+#include "Exception.h"
 
 namespace org {
 namespace apache {
@@ -35,63 +41,74 @@ class PeersEntity {
  public:
 
   static bool parse(const std::shared_ptr<logging::Logger> &logger, const std::string &entity, uuid_t id, std::vector<PeerStatus> &peer_statuses) {
-
-    Json::Reader reader;
-    Json::Value root;
     try {
-      if (reader.parse(entity, root)) {
-        if (root.isMember("peers") && root["peers"].size() > 0) {
-          for (const auto &peer : root["peers"]) {
+      rapidjson::Document root;
+      rapidjson::ParseResult ok = root.Parse(entity.c_str());
 
-            std::string hostname;
-            int port = 0, flowFileCount = 0;
-            bool secure = false;
+      if (!ok) {
+          std::stringstream ss;
+          ss << "Failed to parse archive lens stack from JSON string with reason: "
+             << rapidjson::GetParseError_En(ok.Code())
+             << " at offset " << ok.Offset();
+          std::string exception_msg = ss.str();
+  
+          throw Exception(ExceptionType::GENERAL_EXCEPTION, exception_msg.c_str());
+      }
 
-            if (peer.isMember("hostname") && peer.isMember("port")) {
-              hostname = peer["hostname"].asString();
-              port = peer["port"].asInt();
-            }
-            if (peer.isMember("secure")) {
-              // do not assume that secure parses incorrectly that we can continue without security
-              try {
-                secure = peer["secure"].asBool();
-              } catch (...) {
-                logger->log_debug("Could not properly parse secure, so we're going to try it as a string");
-                std::string secureStr = peer["secure"].asString();
-                if (utils::StringUtils::equalsIgnoreCase(secureStr,"true"))
-                  secure = true;
-                else if (utils::StringUtils::equalsIgnoreCase(secureStr,"false"))
-                  secure = false;
-                else{
-                    logger->log_error("could not parse secure string %s",secureStr);
-                    throw std::exception();
-                }
+      if (root.HasMember("peers") && root["peers"].IsArray() && root["peers"].Size() > 0) {
+        for (const auto &peer : root["peers"].GetArray()) {
+          std::string hostname;
+          int port = 0, flowFileCount = 0;
+          bool secure = false;
 
+          if (peer.HasMember("hostname") && peer["hostname"].IsString() &&
+              peer.HasMember("port") && peer["port"].IsNumber()) {
+            hostname = peer["hostname"].GetString();
+            port = peer["port"].GetInt();
+          }
+
+          if (peer.HasMember("secure")) {
+            if (peer["secure"].IsBool()) {
+              secure = peer["secure"].GetBool();
+            } else if (peer["secure"].IsString()) {
+              std::string secureStr = peer["secure"].GetString();
+
+              if (utils::StringUtils::equalsIgnoreCase(secureStr, "true")) {
+                secure = true;
+              } else if (utils::StringUtils::equalsIgnoreCase(secureStr, "false")) {
+                secure = false;
+              } else {
+                  logger->log_error("could not parse secure string %s", secureStr);
+                  throw std::exception();
               }
+            } else {
+              logger->log_warn("Invalid value type for secure, assuming false (rapidjson type id %i)",
+                               peer["secure"].GetType());
             }
-            if (peer.isMember("flowFileCount")) {
-              // we can assume that if flowFileCount cannot parse as an integer that we CAN continue.
-              try {
-                flowFileCount = peer["flowFileCount"].asInt();
-              } catch (...) {
-                logger->log_debug("Could not properly parse flowFileCount, so we're going to continue without it");
-              }
-            }
-            // host name and port are required.
-            if (!IsNullOrEmpty(hostname) && port > 0) {
-              sitetosite::PeerStatus status(std::make_shared<sitetosite::Peer>(id, hostname, port, secure), flowFileCount, true);
-              peer_statuses.push_back(std::move(status));
+          }
+
+          if (peer.HasMember("flowFileCount")) {
+            if (peer["flowFileCount"].IsNumber()) {
+              flowFileCount = peer["flowFileCount"].GetInt64();
             } else {
-              logger->log_debug("hostname empty or port is zero. hostname: %s, port: %d", hostname, port);
+              logger->log_debug("Could not parse flowFileCount, so we're going to continue without it");
             }
           }
-        } else {
-          logger->log_debug("Peers is either not a member or is empty. String to analyze: %s", entity);
+
+          // host name and port are required.
+          if (!IsNullOrEmpty(hostname) && port > 0) {
+            sitetosite::PeerStatus status(std::make_shared<sitetosite::Peer>(id, hostname, port, secure), flowFileCount, true);
+            peer_statuses.push_back(std::move(status));
+          } else {
+            logger->log_debug("hostname empty or port is zero. hostname: %s, port: %d", hostname, port);
+          }
         }
+      } else {
+        logger->log_debug("Peers is either not a member or is empty. String to analyze: %s", entity);
       }
       return true;
-    } catch (Json::RuntimeError &er) {
-      logger->log_debug("JSON runtime error occurred. Message: %s", er.what());
+    } catch (Exception &exception) {
+      logger->log_debug("Caught Exception %s", exception.what());
       return false;
     } catch (...) {
       logger->log_debug("General exception occurred");
@@ -99,9 +116,7 @@ class PeersEntity {
     }
 
   }
-
-}
-;
+};
 
 } /* namespace sitetosite */
 } /* namespace minifi */

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/http-curl/tests/HTTPHandlers.h
----------------------------------------------------------------------
diff --git a/extensions/http-curl/tests/HTTPHandlers.h b/extensions/http-curl/tests/HTTPHandlers.h
index 714090a..58bdd3a 100644
--- a/extensions/http-curl/tests/HTTPHandlers.h
+++ b/extensions/http-curl/tests/HTTPHandlers.h
@@ -251,7 +251,6 @@ class FlowFileResponder : public CivetHandler {
       }
       auto ret = mg_write(conn, serializer.getBuffer(), total);
     } else {
-      std::cout << "Nothing to transfer feed" << std::endl;
       mg_printf(conn, "HTTP/1.1 200 OK\r\nConnection: "
                 "close\r\nContent-Length: 0\r\n");
       mg_printf(conn, "Content-Type: text/plain\r\n\r\n");

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/ArchiveMetadata.cpp
----------------------------------------------------------------------
diff --git a/extensions/libarchive/ArchiveMetadata.cpp b/extensions/libarchive/ArchiveMetadata.cpp
new file mode 100644
index 0000000..0544b22
--- /dev/null
+++ b/extensions/libarchive/ArchiveMetadata.cpp
@@ -0,0 +1,210 @@
+/**
+ * @file ArchiveMetadata.cpp
+ * ArchiveMetadata class definition
+ *
+ * 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.
+ */
+
+#include "ArchiveMetadata.h"
+
+#include <archive.h>
+#include <archive_entry.h>
+
+#include <list>
+#include <string>
+#include <algorithm>
+#include <iostream>
+
+#include "utils/file/FileManager.h"
+#include "Exception.h"
+
+using org::apache::nifi::minifi::Exception;
+using org::apache::nifi::minifi::ExceptionType;
+
+rapidjson::Value ArchiveEntryMetadata::toJson(rapidjson::Document::AllocatorType &alloc) const {
+    rapidjson::Value entryVal(rapidjson::kObjectType);
+
+    rapidjson::Value entryNameVal;
+    entryNameVal.SetString(entryName.c_str(), entryName.length());
+    entryVal.AddMember("entry_name", entryNameVal, alloc);
+
+    entryVal.AddMember("entry_type", entryType, alloc);
+    entryVal.AddMember("entry_perm", entryPerm, alloc);
+    entryVal.AddMember("entry_size", entrySize, alloc);
+    entryVal.AddMember("entry_uid", entryUID, alloc);
+    entryVal.AddMember("entry_gid", entryGID, alloc);
+    entryVal.AddMember("entry_mtime", entryMTime, alloc);
+    entryVal.AddMember("entry_mtime_nsec", entryMTimeNsec, alloc);
+
+    if (entryType == AE_IFREG) {
+        rapidjson::Value stashKeyVal;
+        stashKeyVal.SetString(stashKey.c_str(), stashKey.length());
+        entryVal.AddMember("stash_key", stashKeyVal, alloc);
+    }
+
+    return entryVal;
+}
+
+void ArchiveEntryMetadata::loadJson(const rapidjson::Value& entryVal) {
+    entryName.assign(entryVal["entry_name"].GetString());
+    entryType = entryVal["entry_type"].GetUint64();
+    entryPerm = entryVal["entry_perm"].GetUint64();
+    entrySize = entryVal["entry_size"].GetUint64();
+    entryUID = entryVal["entry_uid"].GetUint64();
+    entryGID = entryVal["entry_gid"].GetUint64();
+    entryMTime = entryVal["entry_mtime"].GetUint64();
+    entryMTimeNsec = entryVal["entry_mtime_nsec"].GetInt64();
+
+    if (entryType == AE_IFREG)
+        stashKey.assign(entryVal["stash_key"].GetString());
+}
+
+ArchiveEntryMetadata ArchiveEntryMetadata::fromJson(const rapidjson::Value& entryVal) {
+    ArchiveEntryMetadata aem;
+    aem.loadJson(entryVal);
+    return aem;
+}
+
+ArchiveEntryIterator ArchiveMetadata::find(const std::string& name) {
+    auto targetTest = [&](const ArchiveEntryMetadata& entry) -> bool {
+        return entry.entryName == name;
+    };
+
+    return std::find_if(entryMetadata.begin(),
+                        entryMetadata.end(),
+                        targetTest);
+}
+
+ArchiveEntryIterator ArchiveMetadata::eraseEntry(ArchiveEntryIterator position) {
+    return entryMetadata.erase(position);
+}
+
+ArchiveEntryIterator ArchiveMetadata::insertEntry(
+    ArchiveEntryIterator position, const ArchiveEntryMetadata& entry) {
+    return entryMetadata.insert(position, entry);
+}
+
+rapidjson::Value ArchiveMetadata::toJson(rapidjson::Document::AllocatorType &alloc) const {
+    rapidjson::Value structVal(rapidjson::kArrayType);
+
+    for (const auto &entry : entryMetadata) {
+        structVal.PushBack(entry.toJson(alloc), alloc);
+    }
+
+    rapidjson::Value lensVal(rapidjson::kObjectType);
+
+    rapidjson::Value archiveFormatNameVal;
+    archiveFormatNameVal.SetString(archiveFormatName.c_str(), archiveFormatName.length());
+    lensVal.AddMember("archive_format_name", archiveFormatNameVal, alloc);
+
+    lensVal.AddMember("archive_format", archiveFormat, alloc);
+    lensVal.AddMember("archive_structure", structVal, alloc);
+
+    if (!archiveName.empty()) {
+        rapidjson::Value archiveNameVal;
+        archiveNameVal.SetString(archiveName.c_str(), archiveName.length());
+        lensVal.AddMember("archive_name", archiveNameVal, alloc);
+    }
+
+   rapidjson::Value focusedEntryVal;
+    focusedEntryVal.SetString(focusedEntry.c_str(), focusedEntry.length());
+    lensVal.AddMember("focused_entry", focusedEntryVal, alloc);
+
+    return lensVal;
+}
+
+ArchiveMetadata ArchiveMetadata::fromJson(const rapidjson::Value& metadataDoc) {
+    ArchiveMetadata am;
+    am.loadJson(metadataDoc);
+    return am;
+}
+
+void ArchiveMetadata::loadJson(const rapidjson::Value& metadataDoc) {
+    rapidjson::Value::ConstMemberIterator itr = metadataDoc.FindMember("archive_name");
+    if (itr != metadataDoc.MemberEnd())
+        archiveName.assign(itr->value.GetString());
+
+    archiveFormatName.assign(metadataDoc["archive_format_name"].GetString());
+    archiveFormat = metadataDoc["archive_format"].GetUint64();
+
+    focusedEntry = metadataDoc["focused_entry"].GetString();
+  
+    for (const auto &entryVal : metadataDoc["archive_structure"].GetArray()) {
+        entryMetadata.push_back(ArchiveEntryMetadata::fromJson(entryVal));
+    }
+}
+
+void ArchiveMetadata::seedTempPaths(fileutils::FileManager *file_man, bool keep = false) {
+    for (auto& entry : entryMetadata)
+        entry.tmpFileName.assign(file_man->unique_file("/tmp/", keep));
+}
+
+ArchiveStack ArchiveStack::fromJson(const rapidjson::Value& input) {
+    ArchiveStack as;
+    as.loadJson(input);
+    return as;
+}
+
+ArchiveStack ArchiveStack::fromJsonString(const std::string& input) {
+    ArchiveStack as;
+    as.loadJsonString(input);
+    return as;
+}
+
+void ArchiveStack::loadJson(const rapidjson::Value& lensStack) {
+    for (const auto& metadata : lensStack.GetArray()) {
+        stack_.push_back(ArchiveMetadata::fromJson(metadata));
+    }
+}
+
+void ArchiveStack::loadJsonString(const std::string& input) {
+    rapidjson::Document lensStack;
+    rapidjson::ParseResult ok = lensStack.Parse(input.c_str());
+
+    if (!ok) {
+        std::stringstream ss;
+        ss << "Failed to parse archive lens stack from JSON string with reason: "
+           << rapidjson::GetParseError_En(ok.Code())
+           << " at offset " << ok.Offset();
+        std::string exception_msg = ss.str();
+
+        throw Exception(ExceptionType::GENERAL_EXCEPTION, exception_msg.c_str());
+    }
+
+    loadJson(lensStack);
+}
+
+rapidjson::Document ArchiveStack::toJson() const {
+    rapidjson::Document lensStack(rapidjson::kArrayType);
+    rapidjson::Document::AllocatorType &alloc = lensStack.GetAllocator();
+
+    for (const auto& metadata : stack_) {
+        lensStack.PushBack(metadata.toJson(alloc), alloc);
+    }
+
+    return lensStack;
+}
+
+std::string ArchiveStack::toJsonString() const {
+    rapidjson::Document d = toJson();
+
+    rapidjson::StringBuffer buffer;
+    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
+    d.Accept(writer);
+    
+    std::string jsonString = buffer.GetString();
+    return jsonString;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/ArchiveMetadata.h
----------------------------------------------------------------------
diff --git a/extensions/libarchive/ArchiveMetadata.h b/extensions/libarchive/ArchiveMetadata.h
new file mode 100644
index 0000000..b444309
--- /dev/null
+++ b/extensions/libarchive/ArchiveMetadata.h
@@ -0,0 +1,97 @@
+/**
+ * @file ArchiveMetadata.h
+ * ArchiveMetadata class declaration
+ *
+ * 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.
+ */
+#ifndef EXTENSIONS_LIBARCHIVE_ARCHIVEMETADATA_H_
+#define EXTENSIONS_LIBARCHIVE_ARCHIVEMETADATA_H_
+
+#include "rapidjson/document.h"
+#include "rapidjson/writer.h"
+#include "rapidjson/stringbuffer.h"
+#include "rapidjson/error/en.h"
+
+#include <list>
+#include <vector>
+#include <string>
+#include <algorithm>
+
+#include "core/Core.h"
+#include "utils/file/FileManager.h"
+
+class ArchiveEntryMetadata {
+public:
+    std::string entryName;
+    mode_t entryType;
+    mode_t entryPerm;
+    uid_t entryUID;
+    gid_t entryGID;
+    uint64_t entryMTime;
+    uint64_t entryMTimeNsec;
+    uint64_t entrySize;
+
+    std::string tmpFileName;
+    std::string stashKey;
+
+    inline rapidjson::Value toJson(rapidjson::Document::AllocatorType &alloc) const;
+    static inline ArchiveEntryMetadata fromJson(const rapidjson::Value&);
+
+private:
+    inline void loadJson(const rapidjson::Value&);
+};
+
+using ArchiveEntryIterator = typename std::list<ArchiveEntryMetadata>::iterator;
+
+class ArchiveMetadata {
+public:
+    std::string archiveName;
+    std::string archiveFormatName;
+    int archiveFormat;
+    std::list<ArchiveEntryMetadata> entryMetadata;
+
+    std::string focusedEntry;
+
+    ArchiveEntryIterator find(const std::string& name);
+    ArchiveEntryIterator eraseEntry(ArchiveEntryIterator position);
+    ArchiveEntryIterator insertEntry(ArchiveEntryIterator it, const ArchiveEntryMetadata& entry);
+
+    void seedTempPaths(fileutils::FileManager* file_man, bool keep);
+
+    rapidjson::Value toJson(rapidjson::Document::AllocatorType &alloc) const;
+    static ArchiveMetadata fromJson(const rapidjson::Value&);
+
+private:
+    void loadJson(const rapidjson::Value&);
+};
+
+class ArchiveStack {
+public:
+    static ArchiveStack fromJsonString(const std::string& input);
+    static ArchiveStack fromJson(const rapidjson::Value& input);
+    void push(const ArchiveMetadata& metadata) { stack_.push_back(metadata); }
+    ArchiveMetadata pop() { auto x = top(); stack_.pop_back(); return x; }
+    ArchiveMetadata top() const { return stack_.back(); }
+    void loadJson(const rapidjson::Value& input);
+    void loadJsonString(const std::string& input);
+    std::string toJsonString() const;
+    rapidjson::Document toJson() const;
+
+private:
+    std::vector<ArchiveMetadata> stack_;
+};
+
+#endif  // EXTENSIONS_LIBARCHIVE_ARCHIVEMETADATA_H_

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/libarchive/CMakeLists.txt b/extensions/libarchive/CMakeLists.txt
index 1ed8c5b..4316049 100644
--- a/extensions/libarchive/CMakeLists.txt
+++ b/extensions/libarchive/CMakeLists.txt
@@ -20,7 +20,7 @@
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../../thirdparty/jsoncpp/include  ../../thirdparty/) 
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../../thirdparty/) 
 
 find_package(LibArchive)
 	
@@ -40,8 +40,7 @@ endif()
 
 # Include UUID
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-archive-extensions ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-archive-extensions jsoncpp_project)
+target_link_libraries(minifi-archive-extensions ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-archive-extensions ${CMAKE_DL_LIBS} )

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/FocusArchiveEntry.cpp
----------------------------------------------------------------------
diff --git a/extensions/libarchive/FocusArchiveEntry.cpp b/extensions/libarchive/FocusArchiveEntry.cpp
index 36b252c..5172dc6 100644
--- a/extensions/libarchive/FocusArchiveEntry.cpp
+++ b/extensions/libarchive/FocusArchiveEntry.cpp
@@ -33,9 +33,7 @@
 
 #include "core/ProcessContext.h"
 #include "core/ProcessSession.h"
-
-#include "json/json.h"
-#include "json/writer.h"
+#include "Exception.h"
 
 namespace org {
 namespace apache {
@@ -76,17 +74,17 @@ void FocusArchiveEntry::onTrigger(core::ProcessContext *context, core::ProcessSe
 
   fileutils::FileManager file_man;
 
-  std::string targetEntry;
-  context->getProperty(Path.getName(), targetEntry);
-
   // Extract archive contents
   ArchiveMetadata archiveMetadata;
-  archiveMetadata.focusedEntry = targetEntry;
+  context->getProperty(Path.getName(), archiveMetadata.focusedEntry);
+  flowFile->getAttribute("filename", archiveMetadata.archiveName);
+
   ReadCallback cb(this, &file_man, &archiveMetadata);
   session->read(flowFile, &cb);
 
   // For each extracted entry, import & stash to key
   std::string targetEntryStashKey;
+  std::string targetEntry;
 
   for (auto &entryMetadata : archiveMetadata.entryMetadata) {
     if (entryMetadata.entryType == AE_IFREG) {
@@ -99,7 +97,7 @@ void FocusArchiveEntry::onTrigger(core::ProcessContext *context, core::ProcessSe
       logger_->log_debug("FocusArchiveEntry generated stash key %s for entry %s", stashKey, entryMetadata.entryName);
       entryMetadata.stashKey.assign(stashKey);
 
-      if (entryMetadata.entryName == targetEntry) {
+      if (entryMetadata.entryName == archiveMetadata.focusedEntry) {
         targetEntryStashKey = entryMetadata.stashKey;
       }
 
@@ -112,77 +110,45 @@ void FocusArchiveEntry::onTrigger(core::ProcessContext *context, core::ProcessSe
   if (targetEntryStashKey != "") {
     session->restore(targetEntryStashKey, flowFile);
   } else {
-    logger_->log_warn("FocusArchiveEntry failed to locate target entry: %s", targetEntry);
+    logger_->log_warn("FocusArchiveEntry failed to locate target entry: %s",
+                      archiveMetadata.focusedEntry.c_str());
   }
 
   // Set new/updated lens stack to attribute
   {
-    Json::Value lensStack;
-    Json::Reader reader;
+    ArchiveStack archiveStack;
 
     std::string existingLensStack;
 
     if (flowFile->getAttribute("lens.archive.stack", existingLensStack)) {
       logger_->log_info("FocusArchiveEntry loading existing lens context");
-      if (!reader.parse(existingLensStack, lensStack)) {
-        logger_->log_error("FocusArchiveEntry JSON parse error: %s", reader.getFormattedErrorMessages());
+      try {
+        archiveStack.loadJsonString(existingLensStack);
+      } catch (Exception &exception) {
+        logger_->log_debug(exception.what());
         context->yield();
         return;
       }
-    } else {
-      lensStack = Json::Value(Json::arrayValue);
-    }
-
-    Json::Value structVal(Json::arrayValue);
-
-    for (const auto &entryMetadata : archiveMetadata.entryMetadata) {
-      Json::Value entryVal(Json::objectValue);
-      entryVal["entry_name"] = Json::Value(entryMetadata.entryName);
-      entryVal["entry_type"] = Json::Value(entryMetadata.entryType);
-      entryVal["entry_perm"] = Json::Value(entryMetadata.entryPerm);
-      entryVal["entry_size"] = Json::Value(entryMetadata.entrySize);
-      entryVal["entry_uid"] = Json::Value(entryMetadata.entryUID);
-      entryVal["entry_gid"] = Json::Value(entryMetadata.entryGID);
-      entryVal["entry_mtime"] = Json::Value(entryMetadata.entryMTime);
-      entryVal["entry_mtime_nsec"] = Json::Value(entryMetadata.entryMTimeNsec);
-
-      if (entryMetadata.entryType == AE_IFREG) {
-        entryVal["stash_key"] = Json::Value(entryMetadata.stashKey);
-      }
-
-      structVal.append(entryVal);
     }
 
-    std::string archivenameStr;
-    Json::Value archiveName { Json::nullValue };
-
-    if (flowFile->getAttribute("filename", archivenameStr)) {
-      archiveName = Json::Value(archivenameStr);
-    }
-
-    Json::Value lensVal(Json::objectValue);
-    lensVal["archive_format_name"] = Json::Value(archiveMetadata.archiveFormatName);
-    lensVal["archive_name"] = archiveName;
-    lensVal["focused_entry"] = Json::Value(archiveMetadata.focusedEntry);
-    lensVal["archive_format"] = Json::Value(archiveMetadata.archiveFormat);
-    lensVal["archive_structure"] = structVal;
-    lensStack.append(lensVal);
-
-    Json::FastWriter writer;
-    std::string stackStr = writer.write(lensStack);
+    archiveStack.push(archiveMetadata);
+    //logger_->log_debug(archiveMetadata.toJsonString());
 
+    std::string stackStr = archiveStack.toJsonString();
+  
     if (!flowFile->updateAttribute("lens.archive.stack", stackStr)) {
       flowFile->addAttribute("lens.archive.stack", stackStr);
     }
+
   }
 
   // Update filename attribute to that of focused entry
-  std::size_t found = targetEntry.find_last_of("/\\");
-  std::string path = targetEntry.substr(0, found);
-  std::string name = targetEntry.substr(found + 1);
+  std::size_t found = archiveMetadata.focusedEntry.find_last_of("/\\");
+  std::string path = archiveMetadata.focusedEntry.substr(0, found);
+  std::string name = archiveMetadata.focusedEntry.substr(found + 1);
   set_or_update_attr(flowFile, "filename", name);
   set_or_update_attr(flowFile, "path", path);
-  set_or_update_attr(flowFile, "absolute.path", targetEntry);
+  set_or_update_attr(flowFile, "absolute.path", archiveMetadata.focusedEntry);
 
   // Transfer to the relationship
   session->transfer(flowFile, Success);

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/FocusArchiveEntry.h
----------------------------------------------------------------------
diff --git a/extensions/libarchive/FocusArchiveEntry.h b/extensions/libarchive/FocusArchiveEntry.h
index 55b44cc..174526c 100644
--- a/extensions/libarchive/FocusArchiveEntry.h
+++ b/extensions/libarchive/FocusArchiveEntry.h
@@ -26,6 +26,7 @@
 
 #include <archive.h>
 
+#include "ArchiveMetadata.h"
 #include "FlowFileRecord.h"
 #include "core/Processor.h"
 #include "core/ProcessSession.h"
@@ -69,29 +70,9 @@ class FocusArchiveEntry : public core::Processor {
   //! Initialize, over write by NiFi FocusArchiveEntry
   virtual void initialize(void);
 
-  typedef struct {
-    std::string entryName;
-    std::string tmpFileName;
-    std::string stashKey;
-    mode_t entryType;
-    mode_t entryPerm;
-    uid_t entryUID;
-    gid_t entryGID;
-    uint64_t entryMTime;
-    uint64_t entryMTimeNsec;
-    uint64_t entrySize;
-  } ArchiveEntryMetadata;
-
-  typedef struct {
-    std::string archiveFormatName;
-    int archiveFormat;
-    std::string focusedEntry;
-    std::list<ArchiveEntryMetadata> entryMetadata;
-  } ArchiveMetadata;
-
   class ReadCallback : public InputStreamCallback {
    public:
-    explicit ReadCallback(core::Processor*,fileutils::FileManager *file_man , ArchiveMetadata *archiveMetadata);
+    explicit ReadCallback(core::Processor*, fileutils::FileManager *file_man, ArchiveMetadata *archiveMetadata);
     ~ReadCallback();
     virtual int64_t process(std::shared_ptr<io::BaseStream> stream);
     bool isRunning() {return proc_->isRunning();}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/ManipulateArchive.cpp
----------------------------------------------------------------------
diff --git a/extensions/libarchive/ManipulateArchive.cpp b/extensions/libarchive/ManipulateArchive.cpp
index c5c979f..ac95c19 100644
--- a/extensions/libarchive/ManipulateArchive.cpp
+++ b/extensions/libarchive/ManipulateArchive.cpp
@@ -24,7 +24,6 @@
 #include <string>
 #include <set>
 #include <list>
-#include <algorithm>
 
 #include <archive.h>
 #include <archive_entry.h>
@@ -86,7 +85,6 @@ void ManipulateArchive::onSchedule(core::ProcessContext *context, core::ProcessS
         logger_->log_error("Invalid operation %s for ManipulateArchive.", operation_);
         invalid = true;
     }
-        
 
     context->getProperty(Target.getName(), targetEntry_);
     context->getProperty(Destination.getName(), destination_);
@@ -123,7 +121,7 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
         return;
     }
 
-    FocusArchiveEntry::ArchiveMetadata archiveMetadata;
+    ArchiveMetadata archiveMetadata;
     fileutils::FileManager file_man;
 
     FocusArchiveEntry::ReadCallback readCallback(this, &file_man, &archiveMetadata);
@@ -131,7 +129,7 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
 
     auto entries_end = archiveMetadata.entryMetadata.end();
 
-    auto target_position = scanArchiveEntries(archiveMetadata, targetEntry_);
+    auto target_position = archiveMetadata.find(targetEntry_);
 
     if (target_position == entries_end && operation_ != OPERATION_TOUCH) {
         logger_->log_warn("ManipulateArchive could not find entry %s to %s!",
@@ -144,7 +142,7 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
     }
 
     if (!destination_.empty()) {
-        auto dest_position = scanArchiveEntries(archiveMetadata, destination_);
+        auto dest_position = archiveMetadata.find(destination_);
         if (dest_position != entries_end) {
             logger_->log_warn("ManipulateArchive cannot perform %s to existing destination_ %s!",
                               operation_, destination_);
@@ -153,14 +151,12 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
         }
     }
 
-    std::list<FocusArchiveEntry::ArchiveEntryMetadata>::iterator position;
+    auto position = entries_end;
 
     // Small speedup for when neither before or after are provided or needed
-    if ((before_.empty() && after_.empty()) || operation_ == OPERATION_REMOVE) {
-        position = entries_end;
-    } else {
+    if ((!before_.empty() || !after_.empty()) && operation_ != OPERATION_REMOVE) {
         std::string positionEntry = after_.empty() ? before_ : after_;
-        position = scanArchiveEntries(archiveMetadata, positionEntry);
+        position = archiveMetadata.find(positionEntry);
 
         if (position == entries_end)
             logger_->log_warn("ManipulateArchive could not find entry %s to "
@@ -179,9 +175,9 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
 
     if (operation_ == OPERATION_REMOVE) {
         std::remove((*target_position).tmpFileName.c_str());
-        target_position = archiveMetadata.entryMetadata.erase(target_position);
+        target_position = archiveMetadata.eraseEntry(target_position);
     } else if (operation_ == OPERATION_COPY) {
-        FocusArchiveEntry::ArchiveEntryMetadata copy = *target_position;
+        ArchiveEntryMetadata copy = *target_position;
 
         // Copy tmp file
         const auto origTmpFileName = copy.tmpFileName;
@@ -194,12 +190,12 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
 
         archiveMetadata.entryMetadata.insert(position, copy);
     } else if (operation_ == OPERATION_MOVE) {
-        FocusArchiveEntry::ArchiveEntryMetadata moveEntry = *target_position;
-        target_position = archiveMetadata.entryMetadata.erase(target_position);
+        ArchiveEntryMetadata moveEntry = *target_position;
+        target_position = archiveMetadata.eraseEntry(target_position);
         moveEntry.entryName = destination_;
         archiveMetadata.entryMetadata.insert(position, moveEntry);
     } else if (operation_ == OPERATION_TOUCH) {
-        FocusArchiveEntry::ArchiveEntryMetadata touchEntry;
+        ArchiveEntryMetadata touchEntry;
         touchEntry.entryName = destination_;
         touchEntry.entryType = AE_IFREG;
         touchEntry.entrySize = 0;
@@ -218,18 +214,6 @@ void ManipulateArchive::onTrigger(core::ProcessContext *context, core::ProcessSe
     session->transfer(flowFile, Success);
 }
 
-std::list<FocusArchiveEntry::ArchiveEntryMetadata>::iterator ManipulateArchive::scanArchiveEntries(
-        FocusArchiveEntry::ArchiveMetadata& archiveMetadata,
-        const std::string& target) {
-    auto targetTest = [&](const FocusArchiveEntry::ArchiveEntryMetadata& entry) -> bool {
-        return entry.entryName == target;
-    };
-
-    return std::find_if(archiveMetadata.entryMetadata.begin(),
-                        archiveMetadata.entryMetadata.end(),
-                        targetTest);
-}
-
 } /* namespace processors */
 } /* namespace minifi */
 } /* namespace nifi */

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/ManipulateArchive.h
----------------------------------------------------------------------
diff --git a/extensions/libarchive/ManipulateArchive.h b/extensions/libarchive/ManipulateArchive.h
index 455044c..6daca01 100644
--- a/extensions/libarchive/ManipulateArchive.h
+++ b/extensions/libarchive/ManipulateArchive.h
@@ -24,6 +24,7 @@
 #include <string>
 
 #include "FlowFileRecord.h"
+#include "ArchiveMetadata.h"
 #include "core/Processor.h"
 #include "core/ProcessSession.h"
 
@@ -83,7 +84,6 @@ private:
 	//! Logger
 	std::shared_ptr<Logger> logger_;
 	std::string before_, after_, operation_, destination_, targetEntry_;
-	std::list<FocusArchiveEntry::ArchiveEntryMetadata>::iterator scanArchiveEntries(FocusArchiveEntry::ArchiveMetadata&, const std::string&);
 };
 
 REGISTER_RESOURCE(ManipulateArchive);

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/UnfocusArchiveEntry.cpp
----------------------------------------------------------------------
diff --git a/extensions/libarchive/UnfocusArchiveEntry.cpp b/extensions/libarchive/UnfocusArchiveEntry.cpp
index e904946..64ffdeb 100644
--- a/extensions/libarchive/UnfocusArchiveEntry.cpp
+++ b/extensions/libarchive/UnfocusArchiveEntry.cpp
@@ -28,10 +28,9 @@
 
 #include <archive.h>
 #include <archive_entry.h>
-#include "utils/file/FileManager.h"
+
 #include "core/ProcessContext.h"
 #include "core/ProcessSession.h"
-#include "json/json.h"
 
 namespace org {
 namespace apache {
@@ -67,55 +66,41 @@ void UnfocusArchiveEntry::onTrigger(core::ProcessContext *context, core::Process
   }
 
   fileutils::FileManager file_man;
-
-  // Get lens stack from attribute
   ArchiveMetadata lensArchiveMetadata;
 
-  Json::Value lensStack;
-  Json::Reader reader;
-
-  std::string existingLensStack;
-
-  if (flowFile->getAttribute("lens.archive.stack", existingLensStack)) {
-    logger_->log_info("UnfocusArchiveEntry loading existing lens context");
-
-    // TODO(calebj) handle any exceptions that might arise from working with JSON data
-    if (!reader.parse(existingLensStack, lensStack)) {
-      logger_->log_error("UnfocusArchiveEntry JSON parse error: %s", reader.getFormattedErrorMessages());
-      context->yield();
-      return;
+  // Get lens stack from attribute
+  {
+    ArchiveStack archiveStack;
+    {
+      std::string existingLensStack;
+    
+      if (flowFile->getAttribute("lens.archive.stack", existingLensStack)) {
+        logger_->log_info("FocusArchiveEntry loading existing lens context");
+
+        try {
+          archiveStack.loadJsonString(existingLensStack);
+        } catch (Exception &exception) {
+          logger_->log_debug(exception.what());
+          context->yield();
+          return;
+        }
+      } else {
+        logger_->log_error("UnfocusArchiveEntry lens metadata not found");
+        context->yield();
+        return;
+      }
     }
 
-  } else {
-    logger_->log_error("UnfocusArchiveEntry lens metadata not found");
-    context->yield();
-    return;
-  }
+    lensArchiveMetadata = archiveStack.pop();
+    lensArchiveMetadata.seedTempPaths(&file_man, false);
 
-  Json::Value metadataDoc = lensStack[lensStack.size() - 1];
-  lensStack.resize(lensStack.size() - 1);
-
-  lensArchiveMetadata.archiveFormatName.assign(metadataDoc["archive_format_name"].asString());
-  lensArchiveMetadata.archiveFormat = metadataDoc["archive_format"].asUInt64();
-  lensArchiveMetadata.focusedEntry = metadataDoc["focused_entry"].asString();
-
-  for (auto itr = metadataDoc["archive_structure"].begin(); itr != metadataDoc["archive_structure"].end(); ++itr) {
-    const auto &entryVal = *itr;
-    ArchiveEntryMetadata metadata;
-    metadata.tmpFileName = file_man.unique_file("/tmp/", true);
-    metadata.entryName.assign(entryVal["entry_name"].asString());
-    metadata.entryType = entryVal["entry_type"].asUInt64();
-    metadata.entryPerm = entryVal["entry_perm"].asUInt64();
-    metadata.entrySize = entryVal["entry_size"].asUInt64();
-    metadata.entryUID = entryVal["entry_uid"].asUInt64();
-    metadata.entryGID = entryVal["entry_gid"].asUInt64();
-    metadata.entryMTime = entryVal["entry_mtime"].asUInt64();
-    metadata.entryMTimeNsec = entryVal["entry_mtime_nsec"].asInt64();
-
-    if (metadata.entryType == AE_IFREG)
-      metadata.stashKey.assign(entryVal["stash_key"].asString());
-
-    lensArchiveMetadata.entryMetadata.push_back(metadata);
+    {
+      std::string stackStr = archiveStack.toJsonString();
+    
+      if (!flowFile->updateAttribute("lens.archive.stack", stackStr)) {
+        flowFile->addAttribute("lens.archive.stack", stackStr);
+      }
+    }
   }
 
   // Export focused entry to tmp file
@@ -146,27 +131,12 @@ void UnfocusArchiveEntry::onTrigger(core::ProcessContext *context, core::Process
     session->exportContent(entry.tmpFileName, flowFile, false);
   }
 
-  // Create archive by restoring each entry in the archive from tmp files
-  WriteCallback cb(&lensArchiveMetadata);
-  session->write(flowFile, &cb);
-
-  // Set new/updated lens stack to attribute (already 'popped' with resize())
-  Json::FastWriter writer;
-  std::string stackStr = writer.write(lensStack);
-
-  if (!flowFile->updateAttribute("lens.archive.stack", stackStr)) {
-    flowFile->addAttribute("lens.archive.stack", stackStr);
-  }
-
-  // Update filename to that of original archive
-  Json::Value archiveName = metadataDoc.get("archive_name", Json::Value(Json::nullValue));
-
-  if (archiveName.isNull()) {
+  if (lensArchiveMetadata.archiveName.empty()) {
     flowFile->removeAttribute("filename");
     flowFile->removeAttribute("path");
     flowFile->removeAttribute("absolute.path");
   } else {
-    std::string abs_path = archiveName.asString();
+    std::string abs_path = lensArchiveMetadata.archiveName;
     std::size_t found = abs_path.find_last_of("/\\");
     std::string path = abs_path.substr(0, found);
     std::string name = abs_path.substr(found + 1);
@@ -175,6 +145,10 @@ void UnfocusArchiveEntry::onTrigger(core::ProcessContext *context, core::Process
     set_or_update_attr(flowFile, "absolute.path", abs_path);
   }
 
+  // Create archive by restoring each entry in the archive from tmp files
+  WriteCallback cb(&lensArchiveMetadata);
+  session->write(flowFile, &cb);
+
   // Transfer to the relationship
   session->transfer(flowFile, Success);
 }

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/libarchive/UnfocusArchiveEntry.h
----------------------------------------------------------------------
diff --git a/extensions/libarchive/UnfocusArchiveEntry.h b/extensions/libarchive/UnfocusArchiveEntry.h
index 5fb29c5..cc39b37 100644
--- a/extensions/libarchive/UnfocusArchiveEntry.h
+++ b/extensions/libarchive/UnfocusArchiveEntry.h
@@ -27,6 +27,7 @@
 
 #include "FocusArchiveEntry.h"
 #include "FlowFileRecord.h"
+#include "ArchiveMetadata.h"
 #include "core/Processor.h"
 #include "core/ProcessSession.h"
 #include "core/Core.h"
@@ -68,9 +69,6 @@ class UnfocusArchiveEntry : public core::Processor {
   //! Initialize, over write by NiFi UnfocusArchiveEntry
   virtual void initialize(void);
 
-  typedef FocusArchiveEntry::ArchiveEntryMetadata ArchiveEntryMetadata;
-  typedef FocusArchiveEntry::ArchiveMetadata ArchiveMetadata;
-
   //! Write callback for reconstituting lensed archive into flow file content
   class WriteCallback : public OutputStreamCallback {
    public:

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/librdkafka/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/librdkafka/CMakeLists.txt b/extensions/librdkafka/CMakeLists.txt
index 1a5b0f4..d37cf67 100644
--- a/extensions/librdkafka/CMakeLists.txt
+++ b/extensions/librdkafka/CMakeLists.txt
@@ -20,7 +20,7 @@
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/jsoncpp/include  ../../thirdparty/)
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
 
 include_directories(../../thirdparty/librdkafka-0.11.1/src ./../thirdparty/librdkafka-0.11.1/src-cpp)
 
@@ -38,8 +38,7 @@ endif()
 
 # Include UUID
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-rdkafka-extensions ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-rdkafka-extensions jsoncpp_project)
+target_link_libraries(minifi-rdkafka-extensions ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-rdkafka-extensions ${CMAKE_DL_LIBS} )

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/mqtt/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/mqtt/CMakeLists.txt b/extensions/mqtt/CMakeLists.txt
index 7e186ba..d248524 100644
--- a/extensions/mqtt/CMakeLists.txt
+++ b/extensions/mqtt/CMakeLists.txt
@@ -20,7 +20,7 @@
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/jsoncpp/include  ../../thirdparty/)
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
 
 include_directories(../../thirdparty/paho.mqtt.c/src)
 
@@ -39,7 +39,6 @@ endif()
 # Include UUID
 find_package(UUID REQUIRED)
 target_link_libraries(minifi-mqtt-extensions ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-mqtt-extensions jsoncpp_project)
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-mqtt-extensions ${CMAKE_DL_LIBS} )

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/pcap/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/pcap/CMakeLists.txt b/extensions/pcap/CMakeLists.txt
index 69d9c8f..c6dc980 100644
--- a/extensions/pcap/CMakeLists.txt
+++ b/extensions/pcap/CMakeLists.txt
@@ -22,7 +22,7 @@ find_package(PCAP REQUIRED)
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include ../../libminifi/include/c2  ../../libminifi/include/c2/protocols/  ../../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/jsoncpp/include  ../../thirdparty/)
+include_directories(../../libminifi/include ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
 include_directories(/usr/include/netinet)
 
 set(PCAPPLUSPLUS_TP_BASE_DIR "${CMAKE_SOURCE_DIR}/thirdparty/pcap++/")
@@ -80,8 +80,7 @@ endif ()
 
 # Include UUID
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-pcap ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-pcap jsoncpp_project)
+target_link_libraries(minifi-pcap ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-pcap ${CMAKE_DL_LIBS} )

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/rocksdb-repos/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/rocksdb-repos/CMakeLists.txt b/extensions/rocksdb-repos/CMakeLists.txt
index 5d459e5..6deb067 100644
--- a/extensions/rocksdb-repos/CMakeLists.txt
+++ b/extensions/rocksdb-repos/CMakeLists.txt
@@ -48,8 +48,7 @@ endif()
 
 # Include UUID
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-rocksdb-repos ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-rocksdb-repos jsoncpp_project)
+target_link_libraries(minifi-rocksdb-repos ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-rocksdb-repos ${CMAKE_DL_LIBS} )

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/script/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/script/CMakeLists.txt b/extensions/script/CMakeLists.txt
index 927d974..86e41dd 100644
--- a/extensions/script/CMakeLists.txt
+++ b/extensions/script/CMakeLists.txt
@@ -37,7 +37,7 @@ endif()
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../../thirdparty/jsoncpp/include  ../../thirdparty/) 
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../../thirdparty/) 
 
 file(GLOB SOURCES  "*.cpp")
 
@@ -51,8 +51,7 @@ if(CMAKE_THREAD_LIBS_INIT)
 endif()
 
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-script-extensions ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-script-extensions jsoncpp_project)
+target_link_libraries(minifi-script-extensions ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-script-extensions ${CMAKE_DL_LIBS})

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/extensions/tensorflow/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/tensorflow/CMakeLists.txt b/extensions/tensorflow/CMakeLists.txt
index a8ba8fb..0efc93d 100644
--- a/extensions/tensorflow/CMakeLists.txt
+++ b/extensions/tensorflow/CMakeLists.txt
@@ -27,7 +27,7 @@ find_package(TensorFlow REQUIRED)
 
 message("-- Found TensorFlow: ${TENSORFLOW_INCLUDE_DIRS}")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/jsoncpp/include  ../../thirdparty/) 
+include_directories(../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/) 
 
 include_directories(${TENSORFLOW_INCLUDE_DIRS})
 
@@ -43,8 +43,7 @@ if(CMAKE_THREAD_LIBS_INIT)
 endif()
 
 find_package(UUID REQUIRED)
-target_link_libraries(minifi-tensorflow-extensions ${LIBMINIFI} ${UUID_LIBRARIES} ${JSONCPP_LIB})
-add_dependencies(minifi-tensorflow-extensions jsoncpp_project)
+target_link_libraries(minifi-tensorflow-extensions ${LIBMINIFI} ${UUID_LIBRARIES})
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 target_link_libraries(minifi-tensorflow-extensions ${CMAKE_DL_LIBS})