You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by bq...@apache.org on 2017/04/11 15:44:08 UTC
[15/26] nifi-minifi-cpp git commit: MINIFI-227: Provenance report
MINIFI-227: Provenance report
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/1e1823ab
Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/1e1823ab
Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/1e1823ab
Branch: refs/heads/MINIFI-227
Commit: 1e1823ab583e0d19dec7a8e36d3aba1fbe5f806e
Parents: a8de196
Author: Bin Qiu <be...@gmail.com>
Authored: Fri Mar 31 16:04:56 2017 -0700
Committer: Bin Qiu <be...@gmail.com>
Committed: Fri Mar 31 18:04:20 2017 -0700
----------------------------------------------------------------------
CMakeLists.txt | 4 +-
libminifi/CMakeLists.txt | 1 +
libminifi/include/Site2SiteClientProtocol.h | 4 +
libminifi/include/core/FlowConfiguration.h | 1 +
libminifi/include/provenance/Provenance.h | 1 +
.../include/provenance/ProvenanceRepository.h | 28 +
.../include/provenance/ProvenanceTaskReport.h | 88 +
libminifi/src/Site2SiteClientProtocol.cpp | 125 +-
libminifi/src/core/FlowConfiguration.cpp | 4 +
libminifi/src/provenance/Provenance.cpp | 5 +
.../src/provenance/ProvenanceRepository.cpp | 1 +
.../src/provenance/ProvenanceTaskReport.cpp | 221 ++
main/CMakeLists.txt | 6 +-
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/devtools/__init__.py | 6 +
thirdparty/jsoncpp/devtools/agent_vmw7.json | 33 +
thirdparty/jsoncpp/devtools/agent_vmxp.json | 26 +
thirdparty/jsoncpp/devtools/antglob.py | 205 ++
thirdparty/jsoncpp/devtools/batchbuild.py | 278 ++
thirdparty/jsoncpp/devtools/fixeol.py | 70 +
thirdparty/jsoncpp/devtools/licenseupdater.py | 94 +
thirdparty/jsoncpp/devtools/tarball.py | 52 +
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/test/cleantests.py | 16 +
.../jsoncpp/test/data/fail_test_array_01.json | 1 +
.../test/data/fail_test_stack_limit.json | 1 +
.../jsoncpp/test/data/test_array_01.expected | 1 +
thirdparty/jsoncpp/test/data/test_array_01.json | 1 +
.../jsoncpp/test/data/test_array_02.expected | 2 +
thirdparty/jsoncpp/test/data/test_array_02.json | 1 +
.../jsoncpp/test/data/test_array_03.expected | 6 +
thirdparty/jsoncpp/test/data/test_array_03.json | 1 +
.../jsoncpp/test/data/test_array_04.expected | 5 +
thirdparty/jsoncpp/test/data/test_array_04.json | 1 +
.../jsoncpp/test/data/test_array_05.expected | 100 +
thirdparty/jsoncpp/test/data/test_array_05.json | 1 +
.../jsoncpp/test/data/test_array_06.expected | 5 +
thirdparty/jsoncpp/test/data/test_array_06.json | 4 +
.../jsoncpp/test/data/test_array_07.expected | 2122 ++++++++++++++
thirdparty/jsoncpp/test/data/test_array_07.json | 2 +
.../jsoncpp/test/data/test_basic_01.expected | 1 +
thirdparty/jsoncpp/test/data/test_basic_01.json | 1 +
.../jsoncpp/test/data/test_basic_02.expected | 1 +
thirdparty/jsoncpp/test/data/test_basic_02.json | 1 +
.../jsoncpp/test/data/test_basic_03.expected | 3 +
thirdparty/jsoncpp/test/data/test_basic_03.json | 3 +
.../jsoncpp/test/data/test_basic_04.expected | 2 +
thirdparty/jsoncpp/test/data/test_basic_04.json | 2 +
.../jsoncpp/test/data/test_basic_05.expected | 2 +
thirdparty/jsoncpp/test/data/test_basic_05.json | 2 +
.../jsoncpp/test/data/test_basic_06.expected | 2 +
thirdparty/jsoncpp/test/data/test_basic_06.json | 2 +
.../jsoncpp/test/data/test_basic_07.expected | 2 +
thirdparty/jsoncpp/test/data/test_basic_07.json | 2 +
.../jsoncpp/test/data/test_basic_08.expected | 3 +
thirdparty/jsoncpp/test/data/test_basic_08.json | 3 +
.../jsoncpp/test/data/test_basic_09.expected | 4 +
thirdparty/jsoncpp/test/data/test_basic_09.json | 4 +
.../jsoncpp/test/data/test_comment_00.expected | 4 +
.../jsoncpp/test/data/test_comment_00.json | 5 +
.../jsoncpp/test/data/test_comment_01.expected | 10 +
.../jsoncpp/test/data/test_comment_01.json | 10 +
.../jsoncpp/test/data/test_comment_02.expected | 23 +
.../jsoncpp/test/data/test_comment_02.json | 26 +
.../jsoncpp/test/data/test_complex_01.expected | 20 +
.../jsoncpp/test/data/test_complex_01.json | 17 +
.../jsoncpp/test/data/test_integer_01.expected | 2 +
.../jsoncpp/test/data/test_integer_01.json | 2 +
.../jsoncpp/test/data/test_integer_02.expected | 2 +
.../jsoncpp/test/data/test_integer_02.json | 2 +
.../jsoncpp/test/data/test_integer_03.expected | 2 +
.../jsoncpp/test/data/test_integer_03.json | 2 +
.../jsoncpp/test/data/test_integer_04.expected | 3 +
.../jsoncpp/test/data/test_integer_04.json | 3 +
.../jsoncpp/test/data/test_integer_05.expected | 2 +
.../jsoncpp/test/data/test_integer_05.json | 2 +
.../test/data/test_integer_06_64bits.expected | 1 +
.../test/data/test_integer_06_64bits.json | 2 +
.../test/data/test_integer_07_64bits.expected | 1 +
.../test/data/test_integer_07_64bits.json | 2 +
.../test/data/test_integer_08_64bits.expected | 1 +
.../test/data/test_integer_08_64bits.json | 2 +
.../jsoncpp/test/data/test_large_01.expected | 2122 ++++++++++++++
thirdparty/jsoncpp/test/data/test_large_01.json | 2 +
.../jsoncpp/test/data/test_object_01.expected | 1 +
.../jsoncpp/test/data/test_object_01.json | 1 +
.../jsoncpp/test/data/test_object_02.expected | 2 +
.../jsoncpp/test/data/test_object_02.json | 1 +
.../jsoncpp/test/data/test_object_03.expected | 4 +
.../jsoncpp/test/data/test_object_03.json | 5 +
.../jsoncpp/test/data/test_object_04.expected | 2 +
.../jsoncpp/test/data/test_object_04.json | 3 +
.../test/data/test_preserve_comment_01.expected | 11 +
.../test/data/test_preserve_comment_01.json | 14 +
.../jsoncpp/test/data/test_real_01.expected | 3 +
thirdparty/jsoncpp/test/data/test_real_01.json | 3 +
.../jsoncpp/test/data/test_real_02.expected | 3 +
thirdparty/jsoncpp/test/data/test_real_02.json | 3 +
.../jsoncpp/test/data/test_real_03.expected | 3 +
thirdparty/jsoncpp/test/data/test_real_03.json | 3 +
.../jsoncpp/test/data/test_real_04.expected | 3 +
thirdparty/jsoncpp/test/data/test_real_04.json | 3 +
.../jsoncpp/test/data/test_real_05.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_05.json | 3 +
.../jsoncpp/test/data/test_real_06.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_06.json | 3 +
.../jsoncpp/test/data/test_real_07.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_07.json | 3 +
.../jsoncpp/test/data/test_real_08.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_08.json | 4 +
.../jsoncpp/test/data/test_real_09.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_09.json | 4 +
.../jsoncpp/test/data/test_real_10.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_10.json | 4 +
.../jsoncpp/test/data/test_real_11.expected | 4 +
thirdparty/jsoncpp/test/data/test_real_11.json | 4 +
.../jsoncpp/test/data/test_real_12.expected | 2 +
thirdparty/jsoncpp/test/data/test_real_12.json | 2 +
.../jsoncpp/test/data/test_string_01.expected | 1 +
.../jsoncpp/test/data/test_string_01.json | 1 +
.../jsoncpp/test/data/test_string_02.expected | 1 +
.../jsoncpp/test/data/test_string_02.json | 1 +
.../jsoncpp/test/data/test_string_03.expected | 1 +
.../jsoncpp/test/data/test_string_03.json | 1 +
.../jsoncpp/test/data/test_string_04.expected | 2 +
.../jsoncpp/test/data/test_string_04.json | 2 +
.../jsoncpp/test/data/test_string_05.expected | 2 +
.../jsoncpp/test/data/test_string_05.json | 2 +
.../test/data/test_string_unicode_01.expected | 1 +
.../test/data/test_string_unicode_01.json | 1 +
.../test/data/test_string_unicode_02.expected | 1 +
.../test/data/test_string_unicode_02.json | 1 +
.../test/data/test_string_unicode_03.expected | 1 +
.../test/data/test_string_unicode_03.json | 1 +
.../test/data/test_string_unicode_04.expected | 1 +
.../test/data/test_string_unicode_04.json | 1 +
.../test/data/test_string_unicode_05.expected | 2 +
.../test/data/test_string_unicode_05.json | 1 +
thirdparty/jsoncpp/test/generate_expected.py | 17 +
thirdparty/jsoncpp/test/jsonchecker/fail1.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail10.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail11.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail12.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail13.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail14.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail15.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail16.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail17.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail18.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail19.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail2.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail20.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail21.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail22.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail23.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail24.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail25.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail26.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail27.json | 2 +
thirdparty/jsoncpp/test/jsonchecker/fail28.json | 2 +
thirdparty/jsoncpp/test/jsonchecker/fail29.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail3.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail30.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail31.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail32.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail33.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail4.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail5.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail6.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail7.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail8.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/fail9.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/pass1.json | 58 +
thirdparty/jsoncpp/test/jsonchecker/pass2.json | 1 +
thirdparty/jsoncpp/test/jsonchecker/pass3.json | 6 +
thirdparty/jsoncpp/test/jsonchecker/readme.txt | 3 +
thirdparty/jsoncpp/test/pyjsontestrunner.py | 71 +
thirdparty/jsoncpp/test/runjsontests.py | 174 ++
thirdparty/jsoncpp/test/rununittests.py | 84 +
thirdparty/jsoncpp/travis.sh | 31 +
thirdparty/jsoncpp/version | 1 +
thirdparty/jsoncpp/version.in | 1 +
243 files changed, 25447 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5d7875e..00ba999 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -81,6 +81,7 @@ find_package(UUID REQUIRED)
file(GLOB SPD_SOURCES "include/spdlog/*")
add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-0.5.3)
+add_subdirectory(thirdparty/jsoncpp)
set(CIVETWEB_ENABLE_CXX ON CACHE BOOL "Enable civet C++ library")
add_subdirectory(thirdparty/civetweb-1.9.1)
add_subdirectory(libminifi)
@@ -125,6 +126,7 @@ enable_testing(test)
add_executable(tests ${LIBMINIFI_TEST_SOURCES} ${SPD_SOURCES})
target_include_directories(tests PRIVATE BEFORE "thirdparty/catch")
target_include_directories(tests PRIVATE BEFORE "thirdparty/yaml-cpp-yaml-cpp-0.5.3/include")
+ target_include_directories(tests PRIVATE BEFORE "thirdparty/jsoncpp/include")
target_include_directories(tests PRIVATE BEFORE ${LEVELDB_INCLUDE_DIRS})
target_include_directories(tests PRIVATE BEFORE "include")
target_include_directories(tests PRIVATE BEFORE "libminifi/include/")
@@ -134,7 +136,7 @@ enable_testing(test)
target_include_directories(tests PRIVATE BEFORE "libminifi/include/utils")
target_include_directories(tests PRIVATE BEFORE "libminifi/include/processors")
target_include_directories(tests PRIVATE BEFORE "libminifi/include/provenance")
- target_link_libraries(tests ${CMAKE_THREAD_LIBS_INIT} ${UUID_LIBRARIES} ${LEVELDB_LIBRARIES} ${OPENSSL_LIBRARIES} minifi yaml-cpp c-library civetweb-cpp)
+ target_link_libraries(tests ${CMAKE_THREAD_LIBS_INIT} ${UUID_LIBRARIES} ${LEVELDB_LIBRARIES} ${OPENSSL_LIBRARIES} minifi yaml-cpp c-library civetweb-cpp jsoncpp_lib_static)
add_test(NAME LibMinifiTests COMMAND tests)
# Create a custom build target called "docker" that will invoke DockerBuild.sh and create the NiFi-MiNiFi-CPP Docker image
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/libminifi/CMakeLists.txt b/libminifi/CMakeLists.txt
index 4c71cc1..5419667 100644
--- a/libminifi/CMakeLists.txt
+++ b/libminifi/CMakeLists.txt
@@ -58,6 +58,7 @@ endif()
include_directories(../include)
include_directories(../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include)
include_directories(../thirdparty/civetweb-1.9.1/include)
+include_directories(../thirdparty/jsoncpp/include)
include_directories(include)
file(GLOB SOURCES "src/core/logging/*.cpp" "src/io/*.cpp" "src/io/tls/*.cpp" "src/core/*.cpp" "src/core/repository/*.cpp" "src/core/yaml/*.cpp" "src/provenance/*.cpp" "src/processors/*.cpp" "src/*.cpp")
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/include/Site2SiteClientProtocol.h
----------------------------------------------------------------------
diff --git a/libminifi/include/Site2SiteClientProtocol.h b/libminifi/include/Site2SiteClientProtocol.h
index 6120e3e..5082b07 100644
--- a/libminifi/include/Site2SiteClientProtocol.h
+++ b/libminifi/include/Site2SiteClientProtocol.h
@@ -520,6 +520,7 @@ class Site2SiteClientProtocol {
// Return false when any error occurs
bool send(std::string transactionID, DataPacket *packet,
std::shared_ptr<FlowFileRecord> flowFile,
+ uint8_t *payload, int length,
core::ProcessSession *session);
// Confirm the data that was sent or received by comparing CRC32's of the data sent and the data received.
bool confirm(std::string transactionID);
@@ -537,6 +538,9 @@ class Site2SiteClientProtocol {
void transferFlowFiles(
core::ProcessContext *context,
core::ProcessSession *session);
+ //! Transfer payload for the process session
+ void transferBytes(core::ProcessContext *context, core::ProcessSession *session, uint8_t *payload, int length,
+ std::map<std::string, std::string> attributes);
// deleteTransaction
void deleteTransaction(std::string transactionID);
// Nest Callback Class for write stream
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/include/core/FlowConfiguration.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/FlowConfiguration.h b/libminifi/include/core/FlowConfiguration.h
index c7eedd2..65bfe79 100644
--- a/libminifi/include/core/FlowConfiguration.h
+++ b/libminifi/include/core/FlowConfiguration.h
@@ -22,6 +22,7 @@
#include "Connection.h"
#include "RemoteProcessorGroupPort.h"
#include "provenance/Provenance.h"
+#include "provenance/ProvenanceTaskReport.h"
#include "processors/GetFile.h"
#include "processors/PutFile.h"
#include "processors/TailFile.h"
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/include/provenance/Provenance.h
----------------------------------------------------------------------
diff --git a/libminifi/include/provenance/Provenance.h b/libminifi/include/provenance/Provenance.h
index 3d5d19e..474e0c7 100644
--- a/libminifi/include/provenance/Provenance.h
+++ b/libminifi/include/provenance/Provenance.h
@@ -156,6 +156,7 @@ class ProvenanceEventRecord :
*/
REPLAY
};
+ static const char *ProvenanceEventTypeStr[REPLAY+1];
public:
// Constructor
/*!
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/include/provenance/ProvenanceRepository.h
----------------------------------------------------------------------
diff --git a/libminifi/include/provenance/ProvenanceRepository.h b/libminifi/include/provenance/ProvenanceRepository.h
index 8dc152f..a436ecb 100644
--- a/libminifi/include/provenance/ProvenanceRepository.h
+++ b/libminifi/include/provenance/ProvenanceRepository.h
@@ -149,6 +149,34 @@ class ProvenanceRepository : public core::Repository,
void removeEvent(ProvenanceEventRecord *event) {
Delete(event->getEventId());
}
+ //! get record
+ void getProvenanceRecord(std::vector<std::shared_ptr<ProvenanceEventRecord>> &records, int maxSize)
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ leveldb::Iterator* it = db_->NewIterator(
+ leveldb::ReadOptions());
+ for (it->SeekToFirst(); it->Valid(); it->Next()) {
+ std::shared_ptr<ProvenanceEventRecord> eventRead (new ProvenanceEventRecord());
+ std::string key = it->key().ToString();
+ if (records.size() >= maxSize)
+ break;
+ if (eventRead->DeSerialize((uint8_t *) it->value().data(),
+ (int) it->value().size()))
+ {
+ records.push_back(eventRead);
+ }
+ }
+ delete it;
+ }
+ //! purge record
+ void purgeProvenanceRecord(std::vector<std::shared_ptr<ProvenanceEventRecord>> &records)
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ for (auto record : records)
+ {
+ Delete(record->getEventId());
+ }
+ }
// destroy
void destroy() {
if (db_) {
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/include/provenance/ProvenanceTaskReport.h
----------------------------------------------------------------------
diff --git a/libminifi/include/provenance/ProvenanceTaskReport.h b/libminifi/include/provenance/ProvenanceTaskReport.h
new file mode 100644
index 0000000..38edeeb
--- /dev/null
+++ b/libminifi/include/provenance/ProvenanceTaskReport.h
@@ -0,0 +1,88 @@
+/**
+ * @file ProvenanceTaskReport.h
+ * ProvenanceTaskReport 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 __PROVENANCE_TASK_REPORT_H__
+#define __PROVENANCE_TASK_REPORT_H__
+
+#include <mutex>
+#include <memory>
+#include <stack>
+#include "FlowFileRecord.h"
+#include "core/Processor.h"
+#include "core/ProcessSession.h"
+#include "Site2SiteClientProtocol.h"
+
+namespace org {
+namespace apache {
+namespace nifi {
+namespace minifi {
+namespace provenance {
+
+//! ProvenanceTaskReport Class
+class ProvenanceTaskReport: public core::Processor {
+public:
+ //! Constructor
+ /*!
+ * Create a new processor
+ */
+ ProvenanceTaskReport(std::string name, uuid_t uuid = NULL) :
+ core::Processor(name, uuid) {
+ logger_ = logging::Logger::getLogger();
+ uuid_copy(protocol_uuid_,uuid);
+ this->setTriggerWhenEmpty(true);
+ }
+ //! Destructor
+ virtual ~ProvenanceTaskReport() {
+
+ }
+ //! Processor Name
+ static const std::string ProcessorName;
+ //! Supported Properties
+ static core::Property hostName;
+ static core::Property port;
+ static core::Property batchSize;
+ //! Supported Relationships
+ static core::Relationship relation;
+public:
+ //! OnTrigger method, implemented by NiFi ProvenanceTaskReport
+ virtual void onTrigger(core::ProcessContext *context, core::ProcessSession *session);
+ //! Initialize, over write by NiFi ProvenanceTaskReport
+ virtual void initialize(void);
+
+protected:
+
+private:
+ std::unique_ptr<Site2SiteClientProtocol> getNextProtocol();
+ void returnProtocol(std::unique_ptr<Site2SiteClientProtocol> protocol);
+ std::stack<std::unique_ptr<Site2SiteClientProtocol>> available_protocols_;
+ std::mutex protocol_mutex_;
+ uuid_t protocol_uuid_;
+ //! Logger
+ std::shared_ptr<logging::Logger> logger_;
+};
+
+// Provenance Task Report
+
+} /* namespace provenance */
+} /* namespace minifi */
+} /* namespace nifi */
+} /* namespace apache */
+} /* namespace org */
+
+#endif
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/src/Site2SiteClientProtocol.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/Site2SiteClientProtocol.cpp b/libminifi/src/Site2SiteClientProtocol.cpp
index e0265bb..ced52f1 100644
--- a/libminifi/src/Site2SiteClientProtocol.cpp
+++ b/libminifi/src/Site2SiteClientProtocol.cpp
@@ -682,6 +682,7 @@ bool Site2SiteClientProtocol::receive(std::string transactionID,
bool Site2SiteClientProtocol::send(
std::string transactionID, DataPacket *packet, std::shared_ptr<FlowFileRecord> flowFile,
+ uint8_t *payload, int length,
core::ProcessSession *session) {
int ret;
Transaction *transaction = NULL;
@@ -748,18 +749,34 @@ bool Site2SiteClientProtocol::send(
itAttribute->second.c_str());
}
- uint64_t len = flowFile->getSize();
- ret = transaction->getStream().write(len);
- if (ret != 8) {
- return false;
- }
-
- if (flowFile->getSize()) {
- Site2SiteClientProtocol::ReadCallback callback(packet);
- session->read(flowFile, &callback);
- if (flowFile->getSize() != packet->_size) {
- return false;
- }
+ uint64_t len = 0;
+ if (flowFile) {
+ len = flowFile->getSize() ;
+ ret = transaction->getStream().write(len);
+ if (ret != 8) {
+ return false;
+ }
+ if (flowFile->getSize()) {
+ Site2SiteClientProtocol::ReadCallback callback(packet);
+ session->read(flowFile, &callback);
+ if (flowFile->getSize() != packet->_size) {
+ return false;
+ }
+ }
+ }
+ else if (payload != NULL){
+ len = length;
+
+ ret = transaction->getStream().write(len);
+ if (ret != 8) {
+ return false;
+ }
+
+ ret = transaction->getStream().writeData(payload, len);
+ if (ret != len) {
+ return false;
+ }
+ packet->_size += len;
}
transaction->_transfers++;
@@ -1183,7 +1200,7 @@ void Site2SiteClientProtocol::transferFlowFiles(
uint64_t startTime = getTimeMillis();
DataPacket packet(this, transaction, flow->getAttributes());
- if (!send(transactionID, &packet, flow, session)) {
+ if (!send(transactionID, &packet, flow, NULL, 0, session)) {
throw Exception(SITE2SITE_EXCEPTION, "Send Failed");
return;
}
@@ -1240,6 +1257,88 @@ void Site2SiteClientProtocol::transferFlowFiles(
return;
}
+void Site2SiteClientProtocol::transferBytes(core::ProcessContext *context, core::ProcessSession *session, uint8_t *payload, int length,
+ std::map<std::string, std::string> attributes)
+{
+ Transaction *transaction = NULL;
+
+ if (payload == NULL)
+ return;
+
+ if (_peerState != READY)
+ {
+ bootstrap();
+ }
+
+ if (_peerState != READY)
+ {
+ context->yield();
+ tearDown();
+ throw Exception(SITE2SITE_EXCEPTION, "Can not establish handshake with peer");
+ return;
+ }
+
+ // Create the transaction
+ std::string transactionID;
+ transaction = createTransaction(transactionID, SEND);
+
+ if (transaction == NULL)
+ {
+ context->yield();
+ tearDown();
+ throw Exception(SITE2SITE_EXCEPTION, "Can not create transaction");
+ return;
+ }
+
+ try
+ {
+ DataPacket packet(this, transaction, attributes);
+
+ if (!send(transactionID, &packet, nullptr, payload, length, session))
+ {
+ throw Exception(SITE2SITE_EXCEPTION, "Send Failed");
+ return;
+ }
+ logger_->log_info("Site2Site transaction %s send bytes length %d",
+ transactionID.c_str(), length);
+
+ if (!confirm(transactionID))
+ {
+ throw Exception(SITE2SITE_EXCEPTION, "Confirm Failed");
+ return;
+ }
+ if (!complete(transactionID))
+ {
+ throw Exception(SITE2SITE_EXCEPTION, "Complete Failed");
+ return;
+ }
+ logger_->log_info("Site2Site transaction %s successfully send flow record %d, content bytes %d",
+ transactionID.c_str(), transaction->_transfers, transaction->_bytes);
+ }
+ catch (std::exception &exception)
+ {
+ if (transaction)
+ deleteTransaction(transactionID);
+ context->yield();
+ tearDown();
+ logger_->log_debug("Caught Exception %s", exception.what());
+ throw;
+ }
+ catch (...)
+ {
+ if (transaction)
+ deleteTransaction(transactionID);
+ context->yield();
+ tearDown();
+ logger_->log_debug("Caught Exception during Site2SiteClientProtocol::transferBytes");
+ throw;
+ }
+
+ deleteTransaction(transactionID);
+
+ return;
+}
+
} /* namespace minifi */
} /* namespace nifi */
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/src/core/FlowConfiguration.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/core/FlowConfiguration.cpp b/libminifi/src/core/FlowConfiguration.cpp
index c6472cc..89b3976 100644
--- a/libminifi/src/core/FlowConfiguration.cpp
+++ b/libminifi/src/core/FlowConfiguration.cpp
@@ -75,6 +75,10 @@ std::shared_ptr<core::Processor> FlowConfiguration::createProcessor(
== org::apache::nifi::minifi::processors::AppendHostInfo::ProcessorName) {
processor = std::make_shared<
org::apache::nifi::minifi::processors::AppendHostInfo>(name, uuid);
+ } else if (name
+ == org::apache::nifi::minifi::provenance::ProvenanceTaskReport::ProcessorName) {
+ processor = std::make_shared<
+ org::apache::nifi::minifi::provenance::ProvenanceTaskReport>(name, uuid);
} else {
logger_->log_error("No Processor defined for %s", name.c_str());
return nullptr;
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/src/provenance/Provenance.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/provenance/Provenance.cpp b/libminifi/src/provenance/Provenance.cpp
index 289f026..9fc727d 100644
--- a/libminifi/src/provenance/Provenance.cpp
+++ b/libminifi/src/provenance/Provenance.cpp
@@ -32,6 +32,11 @@ namespace nifi {
namespace minifi {
namespace provenance {
+const char *ProvenanceEventRecord::ProvenanceEventTypeStr[REPLAY+1] =
+{ "CREATE", "RECEIVE", "FETCH", "SEND", "DOWNLOAD", "DROP", "EXPIRE", "FORK",
+ "JOIN", "CLONE", "CONTENT_MODIFIED", "ATTRIBUTES_MODIFIED", "ROUTE",
+ "ADDINFO", "REPLAY"};
+
// DeSerialize
bool ProvenanceEventRecord::DeSerialize(
const std::shared_ptr<core::Repository> &repo, std::string key) {
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/src/provenance/ProvenanceRepository.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/provenance/ProvenanceRepository.cpp b/libminifi/src/provenance/ProvenanceRepository.cpp
index 6fe332b..c4a41e0 100644
--- a/libminifi/src/provenance/ProvenanceRepository.cpp
+++ b/libminifi/src/provenance/ProvenanceRepository.cpp
@@ -36,6 +36,7 @@ void ProvenanceRepository::run() {
uint64_t curTime = getTimeMillis();
uint64_t size = repoSize();
if (size >= purgeThreshold) {
+ // std::lock_guard<std::mutex> lock(mutex_);
std::vector<std::string> purgeList;
leveldb::Iterator* it = db_->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/libminifi/src/provenance/ProvenanceTaskReport.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/provenance/ProvenanceTaskReport.cpp b/libminifi/src/provenance/ProvenanceTaskReport.cpp
new file mode 100644
index 0000000..d4995a0
--- /dev/null
+++ b/libminifi/src/provenance/ProvenanceTaskReport.cpp
@@ -0,0 +1,221 @@
+/**
+ * @file ProvenanceTaskReport.cpp
+ * ProvenanceTaskReport class implementation
+ *
+ * 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 <vector>
+#include <queue>
+#include <map>
+#include <set>
+#include <sys/time.h>
+#include <time.h>
+#include <sstream>
+#include <string.h>
+#include <iostream>
+
+#include "provenance/ProvenanceTaskReport.h"
+#include "../include/io/StreamFactory.h"
+#include "io/ClientSocket.h"
+#include "utils/TimeUtil.h"
+#include "core/ProcessContext.h"
+#include "core/ProcessSession.h"
+#include "provenance/Provenance.h"
+#include "FlowController.h"
+
+#include "json/json.h"
+#include "json/writer.h"
+
+namespace org {
+namespace apache {
+namespace nifi {
+namespace minifi {
+namespace provenance{
+
+const std::string ProvenanceTaskReport::ProcessorName("ProvenanceTaskReport");
+core::Property ProvenanceTaskReport::hostName("Host Name", "Remote Host Name.", "localhost");
+core::Property ProvenanceTaskReport::port("Port", "Remote Port", "9999");
+core::Property ProvenanceTaskReport::batchSize("Batch Size", "Specifies how many records to send in a single batch, at most.", "100");
+core::Relationship ProvenanceTaskReport::relation;
+
+void ProvenanceTaskReport::initialize()
+{
+ //! Set the supported properties
+ std::set<core::Property> properties;
+ properties.insert(hostName);
+ properties.insert(port);
+ properties.insert(batchSize);
+ setSupportedProperties(properties);
+ //! Set the supported relationships
+ std::set<core::Relationship> relationships;
+ relationships.insert(relation);
+ setSupportedRelationships(relationships);
+}
+
+std::unique_ptr<Site2SiteClientProtocol> ProvenanceTaskReport::getNextProtocol()
+{
+ std::lock_guard<std::mutex> protocol_lock_(protocol_mutex_);
+ if (available_protocols_.empty())
+ return nullptr;
+ std::unique_ptr<Site2SiteClientProtocol> return_pointer = std::move(available_protocols_.top());
+ available_protocols_.pop();
+ return std::move(return_pointer);
+}
+
+void ProvenanceTaskReport::returnProtocol(
+ std::unique_ptr<Site2SiteClientProtocol> return_protocol)
+{
+ std::lock_guard<std::mutex> protocol_lock_(protocol_mutex_);
+ available_protocols_.push(std::move(return_protocol));
+}
+
+void ProvenanceTaskReport::onTrigger(core::ProcessContext *context, core::ProcessSession *session)
+{
+ std::string value;
+ int64_t lvalue;
+
+ std::unique_ptr<Site2SiteClientProtocol> protocol_ = getNextProtocol();
+
+ if (protocol_ == nullptr)
+ {
+ protocol_ = std::unique_ptr<Site2SiteClientProtocol>(
+ new Site2SiteClientProtocol(0));
+ protocol_->setPortId(protocol_uuid_);
+
+ std::string host = "";
+ uint16_t sport = 0;
+
+ if (context->getProperty(hostName.getName(), value)) {
+ host = value;
+ }
+ if (context->getProperty(port.getName(), value)
+ && core::Property::StringToInt(value, lvalue)) {
+ sport = (uint16_t) lvalue;
+ }
+ std::unique_ptr<org::apache::nifi::minifi::io::DataStream> str =
+ std::unique_ptr<org::apache::nifi::minifi::io::DataStream>(
+ org::apache::nifi::minifi::io::StreamFactory::getInstance()
+ ->createSocket(host, sport));
+
+ std::unique_ptr<Site2SitePeer> peer_ = std::unique_ptr<Site2SitePeer>(
+ new Site2SitePeer(std::move(str), host, sport));
+
+ protocol_->setPeer(std::move(peer_));
+ }
+
+ if (!protocol_->bootstrap())
+ {
+ // bootstrap the client protocol if needeed
+ context->yield();
+ std::shared_ptr<Processor> processor = std::static_pointer_cast<Processor>(
+ context->getProcessorNode().getProcessor());
+ logger_->log_error("Site2Site bootstrap failed yield period %d peer ",
+ processor->getYieldPeriodMsec());
+ return;
+ }
+
+ int batch = 100;
+
+ if (context->getProperty(batchSize.getName(), value) && core::Property::StringToInt(value, lvalue))
+ {
+ batch = (int) lvalue;
+ }
+
+ std::vector<std::shared_ptr<ProvenanceEventRecord>> records;
+ std::shared_ptr<ProvenanceRepository> repo = std::static_pointer_cast<ProvenanceRepository> (context->getProvenanceRepository());
+
+ repo->getProvenanceRecord(records, batch);
+
+ if (records.size() <= 0)
+ {
+ returnProtocol(std::move(protocol_));
+ return;
+ }
+
+ Json::Value array;
+ for (auto record : records)
+ {
+ Json::Value recordJson;
+ Json::Value updatedAttributesJson;
+ Json::Value parentUuidJson;
+ Json::Value childUuidJson;
+ recordJson["eventId"] = record->getEventId().c_str();
+ recordJson["eventType"] = ProvenanceEventRecord::ProvenanceEventTypeStr[record->getEventType()];
+ recordJson["timestampMillis"] = record->getEventTime();
+ recordJson["durationMillis"] = record->getEventDuration();
+ recordJson["lineageStart"] = record->getlineageStartDate();
+ recordJson["details"] = record->getDetails().c_str();
+ recordJson["componentId"] = record->getComponentId().c_str();
+ recordJson["componentType"] = record->getComponentType().c_str();
+ recordJson["entityId"] = record->getFlowFileUuid().c_str();
+ recordJson["entityType"] = "org.apache.nifi.flowfile.FlowFile";
+ recordJson["entitySize"] = record->getFileSize();
+ recordJson["entityOffset"] = record->getFileOffset();
+
+ for (auto attr : record->getAttributes())
+ {
+ updatedAttributesJson[attr.first] = attr.second;
+ }
+ recordJson["updatedAttributes"] = updatedAttributesJson;
+
+ for (auto parentUUID : record->getParentUuids())
+ {
+ parentUuidJson.append(parentUUID.c_str());
+ }
+ recordJson["parentIds"] = parentUuidJson;
+
+ for (auto childUUID : record->getChildrenUuids())
+ {
+ childUuidJson.append(childUUID.c_str());
+ }
+ recordJson["childIds"] = childUuidJson;
+ recordJson["transitUri"] = record->getTransitUri().c_str();
+ recordJson["remoteIdentifier"] = record->getSourceSystemFlowFileIdentifier().c_str();
+ recordJson["alternateIdentifier"] = record->getAlternateIdentifierUri().c_str();
+ recordJson["application"] = "MiNiFi Flow";
+ array.append(recordJson);
+ }
+
+ Json::StyledWriter writer;
+ std::string jsonStr = writer.write(array);
+ uint8_t *payload = (uint8_t *) jsonStr.c_str();
+ int length = jsonStr.length();
+
+ try
+ {
+ std::map<std::string, std::string> attributes;
+ protocol_->transferBytes(context, session, payload, length, attributes);
+ }
+ catch (...)
+ {
+ // if transfer bytes failed, return instead of purge the provenance records
+ returnProtocol(std::move(protocol_));
+ return;
+ }
+
+ // we transfer the record, purge the record from DB
+ repo->purgeProvenanceRecord(records);
+
+ returnProtocol(std::move(protocol_));
+
+ return;
+}
+
+} /* namespace provenance */
+} /* namespace minifi */
+} /* namespace nifi */
+} /* namespace apache */
+} /* namespace org */
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/main/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
index f7bd6e3..baf4254 100644
--- a/main/CMakeLists.txt
+++ b/main/CMakeLists.txt
@@ -23,7 +23,7 @@ IF(POLICY CMP0048)
CMAKE_POLICY(SET CMP0048 OLD)
ENDIF(POLICY CMP0048)
-include_directories(../include ../libminifi/include ../libminifi/include/core/yaml ../libminifi/include/core ../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../thirdparty/civetweb-1.9.1/include ../thirdparty/leveldb-1.18/include ../thirdparty/)
+include_directories(../include ../libminifi/include ../libminifi/include/core/yaml ../libminifi/include/core ../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ../thirdparty/civetweb-1.9.1/include ../thirdparty/jsoncpp/include ../thirdparty/leveldb-1.18/include ../thirdparty/)
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
@@ -43,8 +43,8 @@ find_package(UUID REQUIRED)
find_package(OpenSSL REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
-# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl, and leveldb
-target_link_libraries(minifiexe minifi yaml-cpp c-library civetweb-cpp ${UUID_LIBRARIES} ${LEVELDB_LIBRARIES} ${OPENSSL_LIBRARIES})
+# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl, jsoncpp and leveldb
+target_link_libraries(minifiexe minifi yaml-cpp c-library civetweb-cpp jsoncpp_lib_static ${UUID_LIBRARIES} ${LEVELDB_LIBRARIES} ${OPENSSL_LIBRARIES})
set_target_properties(minifiexe
PROPERTIES OUTPUT_NAME minifi)
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/AUTHORS
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/AUTHORS b/thirdparty/jsoncpp/AUTHORS
new file mode 100644
index 0000000..c0fbbee
--- /dev/null
+++ b/thirdparty/jsoncpp/AUTHORS
@@ -0,0 +1 @@
+Baptiste Lepilleur <bl...@users.sourceforge.net>
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/CMakeLists.txt b/thirdparty/jsoncpp/CMakeLists.txt
new file mode 100644
index 0000000..a6c0884
--- /dev/null
+++ b/thirdparty/jsoncpp/CMakeLists.txt
@@ -0,0 +1,156 @@
+# vim: et ts=4 sts=4 sw=4 tw=0
+
+CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
+PROJECT(jsoncpp)
+ENABLE_TESTING()
+
+OPTION(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" OFF)
+OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" OFF)
+OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
+OPTION(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C and ISO C++" ON)
+OPTION(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
+OPTION(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
+OPTION(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
+OPTION(BUILD_STATIC_LIBS "Build jsoncpp_lib static library." ON)
+
+# Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
+IF(NOT WIN32)
+ IF(NOT CMAKE_BUILD_TYPE)
+ SET(CMAKE_BUILD_TYPE Release CACHE STRING
+ "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
+ FORCE)
+ ENDIF()
+ENDIF()
+
+# Enable runtime search path support for dynamic libraries on OSX
+IF(APPLE)
+ SET(CMAKE_MACOSX_RPATH 1)
+ENDIF()
+
+# Adhere to GNU filesystem layout conventions
+INCLUDE(GNUInstallDirs)
+
+SET(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the library name for a debug build")
+
+# Set variable named ${VAR_NAME} to value ${VALUE}
+FUNCTION(set_using_dynamic_name VAR_NAME VALUE)
+ SET( "${VAR_NAME}" "${VALUE}" PARENT_SCOPE)
+ENDFUNCTION()
+
+# Extract major, minor, patch from version text
+# Parse a version string "X.Y.Z" and outputs
+# version parts in ${OUPUT_PREFIX}_MAJOR, _MINOR, _PATCH.
+# If parse succeeds then ${OUPUT_PREFIX}_FOUND is TRUE.
+MACRO(jsoncpp_parse_version VERSION_TEXT OUPUT_PREFIX)
+ SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?")
+ IF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
+ STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${VERSION_TEXT})
+ LIST(GET VERSION_PARTS 0 ${OUPUT_PREFIX}_MAJOR)
+ LIST(GET VERSION_PARTS 1 ${OUPUT_PREFIX}_MINOR)
+ LIST(GET VERSION_PARTS 2 ${OUPUT_PREFIX}_PATCH)
+ set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" TRUE )
+ ELSE( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
+ set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" FALSE )
+ ENDIF()
+ENDMACRO()
+
+# Read out version from "version" file
+#FILE(STRINGS "version" JSONCPP_VERSION)
+#SET( JSONCPP_VERSION_MAJOR X )
+#SET( JSONCPP_VERSION_MINOR Y )
+#SET( JSONCPP_VERSION_PATCH Z )
+SET( JSONCPP_VERSION 1.8.0 )
+jsoncpp_parse_version( ${JSONCPP_VERSION} JSONCPP_VERSION )
+#IF(NOT JSONCPP_VERSION_FOUND)
+# MESSAGE(FATAL_ERROR "Failed to parse version string properly. Expect X.Y.Z")
+#ENDIF(NOT JSONCPP_VERSION_FOUND)
+SET( JSONCPP_SOVERSION 11 )
+SET( JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" )
+
+MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
+# File version.h is only regenerated on CMake configure step
+CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
+ "${PROJECT_SOURCE_DIR}/include/json/version.h"
+ NEWLINE_STYLE UNIX )
+CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/version.in"
+ "${PROJECT_SOURCE_DIR}/version"
+ NEWLINE_STYLE UNIX )
+
+MACRO(UseCompilationWarningAsError)
+ IF(MSVC)
+ # Only enabled in debug because some old versions of VS STL generate
+ # warnings when compiled in release configuration.
+ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /WX ")
+ ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
+ IF(JSONCPP_WITH_STRICT_ISO)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors")
+ ENDIF()
+ ENDIF()
+ENDMACRO()
+
+# Include our configuration header
+INCLUDE_DIRECTORIES( ${jsoncpp_SOURCE_DIR}/include )
+
+IF(MSVC)
+ # Only enabled in debug because some old versions of VS STL generate
+ # unreachable code warning when compiled in release configuration.
+ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 ")
+ENDIF()
+
+# Require C++11 support, prefer ISO C++ over GNU variants,
+# as relying solely on ISO C++ is more portable.
+SET(CMAKE_CXX_STANDARD 11)
+SET(CMAKE_CXX_STANDARD_REQUIRED ON)
+SET(CMAKE_CXX_EXTENSIONS OFF)
+
+IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ # using regular Clang or AppleClang
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Werror=conversion -Werror=sign-compare")
+ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ # using GCC
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Wextra")
+ # not yet ready for -Wsign-conversion
+
+ IF(JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=conversion -pedantic")
+ ENDIF()
+ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
+ #�using Intel compiler
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Wextra -Werror=conversion")
+
+ IF(JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
+ ENDIF()
+ENDIF()
+
+FIND_PROGRAM(CCACHE_FOUND ccache)
+IF(CCACHE_FOUND)
+ SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+ SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
+ENDIF(CCACHE_FOUND)
+
+IF(JSONCPP_WITH_WARNING_AS_ERROR)
+ UseCompilationWarningAsError()
+ENDIF()
+
+IF(JSONCPP_WITH_PKGCONFIG_SUPPORT)
+ CONFIGURE_FILE(
+ "pkg-config/jsoncpp.pc.in"
+ "pkg-config/jsoncpp.pc"
+ @ONLY)
+ INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkg-config/jsoncpp.pc"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+ENDIF()
+
+IF(JSONCPP_WITH_CMAKE_PACKAGE)
+ INSTALL(EXPORT jsoncpp
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp
+ FILE jsoncppConfig.cmake)
+ENDIF()
+
+# Build the different applications
+ADD_SUBDIRECTORY( src )
+
+#install the includes
+ADD_SUBDIRECTORY( include )
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/LICENSE
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/LICENSE b/thirdparty/jsoncpp/LICENSE
new file mode 100644
index 0000000..ca2bfe1
--- /dev/null
+++ b/thirdparty/jsoncpp/LICENSE
@@ -0,0 +1,55 @@
+The JsonCpp library's source code, including accompanying documentation,
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all
+jurisdictions which recognize such a disclaimer. In such jurisdictions,
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this
+software may choose to accept it either as 1) Public Domain, 2) under the
+conditions of the MIT License (see below), or 3) under the terms of dual
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+ http://en.wikipedia.org/wiki/MIT_License
+
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+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.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/NEWS.txt
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/NEWS.txt b/thirdparty/jsoncpp/NEWS.txt
new file mode 100644
index 0000000..5733fcd
--- /dev/null
+++ b/thirdparty/jsoncpp/NEWS.txt
@@ -0,0 +1,175 @@
+New in SVN
+----------
+
+ * Updated the type system's behavior, in order to better support backwards
+ compatibility with code that was written before 64-bit integer support was
+ introduced. Here's how it works now:
+
+ * isInt, isInt64, isUInt, and isUInt64 return true if and only if the
+ value can be exactly represented as that type. In particular, a value
+ constructed with a double like 17.0 will now return true for all of
+ these methods.
+
+ * isDouble and isFloat now return true for all numeric values, since all
+ numeric values can be converted to a double or float without
+ truncation. Note however that the conversion may not be exact -- for
+ example, doubles cannot exactly represent all integers above 2^53 + 1.
+
+ * isBool, isNull, isString, isArray, and isObject now return true if and
+ only if the value is of that type.
+
+ * isConvertibleTo(fooValue) indicates that it is safe to call asFoo.
+ (For each type foo, isFoo always implies isConvertibleTo(fooValue).)
+ asFoo returns an approximate or exact representation as appropriate.
+ For example, a double value may be truncated when asInt is called.
+
+ * For backwards compatibility with old code, isConvertibleTo(intValue)
+ may return false even if type() == intValue. This is because the value
+ may have been constructed with a 64-bit integer larger than maxInt,
+ and calling asInt() would cause an exception. If you're writing new
+ code, use isInt64 to find out whether the value is exactly
+ representable using an Int64, or asDouble() combined with minInt64 and
+ maxInt64 to figure out whether it is approximately representable.
+
+* Value
+ - Patch #10: BOOST_FOREACH compatibility. Made Json::iterator more
+ standard compliant, added missing iterator_category and value_type
+ typedefs (contribued by Robert A. Iannucci).
+
+* Compilation
+
+ - New CMake based build system. Based in part on contribution from
+ Igor Okulist and Damien Buhl (Patch #14).
+
+ - New header json/version.h now contains version number macros
+ (JSONCPP_VERSION_MAJOR, JSONCPP_VERSION_MINOR, JSONCPP_VERSION_PATCH
+ and JSONCPP_VERSION_HEXA).
+
+ - Patch #11: added missing JSON_API on some classes causing link issues
+ when building as a dynamic library on Windows
+ (contributed by Francis Bolduc).
+
+ - Visual Studio DLL: suppressed warning "C4251: <data member>: <type>
+ needs to have dll-interface to be used by..." via pragma push/pop
+ in json-cpp headers.
+
+ - Added Travis CI intregration: https://travis-ci.org/blep/jsoncpp-mirror
+
+* Bug fixes
+ - Patch #15: Copy constructor does not initialize allocated_ for stringValue
+ (contributed by rmongia).
+
+ - Patch #16: Missing field copy in Json::Value::iterator causing infinite
+ loop when using experimental internal map (#define JSON_VALUE_USE_INTERNAL_MAP)
+ (contributed by Ming-Lin Kao).
+
+
+ New in JsonCpp 0.6.0:
+ ---------------------
+
+* Compilation
+
+ - LD_LIBRARY_PATH and LIBRARY_PATH environment variables are now
+ propagated to the build environment as this is required for some
+ compiler installation.
+
+ - Added support for Microsoft Visual Studio 2008 (bug #2930462):
+ The platform "msvc90" has been added.
+
+ Notes: you need to setup the environment by running vcvars32.bat
+ (e.g. MSVC 2008 command prompt in start menu) before running scons.
+
+ - Added support for amalgamated source and header generation (a la sqlite).
+ Refer to README.md section "Generating amalgamated source and header"
+ for detail.
+
+* Value
+
+ - Removed experimental ValueAllocator, it caused static
+ initialization/destruction order issues (bug #2934500).
+ The DefaultValueAllocator has been inlined in code.
+
+ - Added support for 64 bits integer:
+
+ Types Json::Int64 and Json::UInt64 have been added. They are aliased
+ to 64 bits integers on system that support them (based on __int64 on
+ Microsoft Visual Studio platform, and long long on other platforms).
+
+ Types Json::LargestInt and Json::LargestUInt have been added. They are
+ aliased to the largest integer type supported:
+ either Json::Int/Json::UInt or Json::Int64/Json::UInt64 respectively.
+
+ Json::Value::asInt() and Json::Value::asUInt() still returns plain
+ "int" based types, but asserts if an attempt is made to retrieve
+ a 64 bits value that can not represented as the return type.
+
+ Json::Value::asInt64() and Json::Value::asUInt64() have been added
+ to obtain the 64 bits integer value.
+
+ Json::Value::asLargestInt() and Json::Value::asLargestUInt() returns
+ the integer as a LargestInt/LargestUInt respectively. Those functions
+ functions are typically used when implementing writer.
+
+ The reader attempts to read number as 64 bits integer, and fall back
+ to reading a double if the number is not in the range of 64 bits
+ integer.
+
+ Warning: Json::Value::asInt() and Json::Value::asUInt() now returns
+ long long. This changes break code that was passing the return value
+ to *printf() function.
+
+ Support for 64 bits integer can be disabled by defining the macro
+ JSON_NO_INT64 (uncomment it in json/config.h for example), though
+ it should have no impact on existing usage.
+
+ - The type Json::ArrayIndex is used for indexes of a JSON value array. It
+ is an unsigned int (typically 32 bits).
+
+ - Array index can be passed as int to operator[], allowing use of literal:
+ Json::Value array;
+ array.append( 1234 );
+ int value = array[0].asInt(); // did not compile previously
+
+ - Added float Json::Value::asFloat() to obtain a floating point value as a
+ float (avoid lost of precision warning caused by used of asDouble()
+ to initialize a float).
+
+* Reader
+
+ - Renamed Reader::getFormatedErrorMessages() to getFormattedErrorMessages.
+ Bug #3023708 (Formatted has 2 't'). The old member function is deprecated
+ but still present for backward compatibility.
+
+* Tests
+
+ - Added test to ensure that the escape sequence "\/" is corrected handled
+ by the parser.
+
+* Bug fixes
+
+ - Bug #3139677: JSON [1 2 3] was incorrectly parsed as [1, 3]. Error is now
+ correctly detected.
+
+ - Bug #3139678: stack buffer overflow when parsing a double with a
+ length of 32 characters.
+
+ - Fixed Value::operator <= implementation (had the semantic of operator >=).
+ Found when adding unit tests for comparison operators.
+
+ - Value::compare() is now const and has an actual implementation with
+ unit tests.
+
+ - Bug #2407932: strpbrk() can fail for NULL pointer.
+
+ - Bug #3306345: Fixed minor typo in Path::resolve().
+
+ - Bug #3314841/#3306896: errors in amalgamate.py
+
+ - Fixed some Coverity warnings and line-endings.
+
+* License
+
+ - See file LICENSE for details. Basically JsonCpp is now licensed under
+ MIT license, or public domain if desired and recognized in your jurisdiction.
+ Thanks to Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) who
+ helped figuring out the solution to the public domain issue.
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/README.md
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/README.md b/thirdparty/jsoncpp/README.md
new file mode 100644
index 0000000..038ccd2
--- /dev/null
+++ b/thirdparty/jsoncpp/README.md
@@ -0,0 +1,225 @@
+# JsonCpp
+
+[JSON][json-org] is a lightweight data-interchange format. It can represent
+numbers, strings, ordered sequences of values, and collections of name/value
+pairs.
+
+[json-org]: http://json.org/
+
+JsonCpp is a C++ library that allows manipulating JSON values, including
+serialization and deserialization to and from strings. It can also preserve
+existing comment in unserialization/serialization steps, making it a convenient
+format to store user input files.
+
+
+## Documentation
+
+[JsonCpp documentation][JsonCpp-documentation] is generated using [Doxygen][].
+
+[JsonCpp-documentation]: http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
+[Doxygen]: http://www.doxygen.org
+
+
+## A note on backward-compatibility
+
+* `1.y.z` is built with C++11.
+* `0.y.z` can be used with older compilers.
+* Major versions maintain binary-compatibility.
+
+
+## Using JsonCpp in your project
+
+The recommended approach to integrating JsonCpp in your project is to include
+the [amalgamated source](#generating-amalgamated-source-and-header) (a single
+`.cpp` file and two `.h` files) in your project, and compile and build as you
+would any other source file. This ensures consistency of compilation flags and
+ABI compatibility, issues which arise when building shared or static
+libraries. See the next section for instructions.
+
+The `include/` should be added to your compiler include path. JsonCpp headers
+should be included as follow:
+
+ #include <json/json.h>
+
+If JsonCpp was built as a dynamic library on Windows, then your project needs to define the macro `JSON_DLL`.
+
+### Generating amalgamated source and header
+
+JsonCpp is provided with a script to generate a single header and a single
+source file to ease inclusion into an existing project. The amalgamated source
+can be generated at any time by running the following command from the
+top-directory (this requires Python 2.6):
+
+ python amalgamate.py
+
+It is possible to specify header name. See the `-h` option for detail.
+
+By default, the following files are generated:
+
+* `dist/jsoncpp.cpp`: source file that needs to be added to your project.
+* `dist/json/json.h`: corresponding header file for use in your project. It is
+ equivalent to including `json/json.h` in non-amalgamated source. This header
+ only depends on standard headers.
+* `dist/json/json-forwards.h`: header that provides forward declaration of all
+ JsonCpp types.
+
+The amalgamated sources are generated by concatenating JsonCpp source in the
+correct order and defining the macro `JSON_IS_AMALGAMATION` to prevent inclusion of other headers.
+
+
+## Contributing to JsonCpp
+
+### Building and testing with CMake
+
+[CMake][] is a C++ Makefiles/Solution generator. It is usually available on most Linux system as package. On Ubuntu:
+
+ sudo apt-get install cmake
+
+[CMake]: http://www.cmake.org
+
+Note that Python is also required to run the JSON reader/writer tests. If
+missing, the build will skip running those tests.
+
+When running CMake, a few parameters are required:
+
+* A build directory where the makefiles/solution are generated. It is also used
+ to store objects, libraries and executables files.
+* The generator to use: makefiles or Visual Studio solution? What version or
+ Visual Studio, 32 or 64 bits solution?
+
+Steps for generating solution/makefiles using `cmake-gui`:
+
+* Make "source code" point to the source directory.
+* Make "where to build the binary" point to the directory to use for the build.
+* Click on the "Grouped" check box.
+* Review JsonCpp build options (tick `BUILD_SHARED_LIBS` to build as a
+ dynamic library).
+* Click the configure button at the bottom, then the generate button.
+* The generated solution/makefiles can be found in the binary directory.
+
+Alternatively, from the command-line on Unix in the source directory:
+
+ mkdir -p build/debug
+ cd build/debug
+ cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
+ make
+
+For a good pkg-config file, add:
+
+ -DCMAKE_INSTALL_INCLUDEDIR=include/jsoncpp
+
+Running `cmake -h` will display the list of available generators (passed using
+the `-G` option).
+
+By default CMake hides compilation commands. This can be modified by specifying
+`-DCMAKE_VERBOSE_MAKEFILE=true` when generating makefiles.
+
+### Building and testing with SCons
+
+**Note:** The SCons-based build system is deprecated. Please use CMake (see the
+section above).
+
+JsonCpp can use [Scons][] as a build system. Note that SCons requires Python to
+be installed.
+
+[SCons]: http://www.scons.org/
+
+Invoke SCons as follows:
+
+ scons platform=$PLATFORM [TARGET]
+
+where `$PLATFORM` may be one of:
+
+* `suncc`: Sun C++ (Solaris)
+* `vacpp`: Visual Age C++ (AIX)
+* `mingw`
+* `msvc6`: Microsoft Visual Studio 6 service pack 5-6
+* `msvc70`: Microsoft Visual Studio 2002
+* `msvc71`: Microsoft Visual Studio 2003
+* `msvc80`: Microsoft Visual Studio 2005
+* `msvc90`: Microsoft Visual Studio 2008
+* `linux-gcc`: Gnu C++ (linux, also reported to work for Mac OS X)
+
+If you are building with Microsoft Visual Studio 2008, you need to set up the
+environment by running `vcvars32.bat` (e.g. MSVC 2008 command prompt) before
+running SCons.
+
+### Running the tests manually
+
+You need to run tests manually only if you are troubleshooting an issue.
+
+In the instructions below, replace `path/to/jsontest` with the path of the
+`jsontest` executable that was compiled on your platform.
+
+ cd test
+ # This will run the Reader/Writer tests
+ python runjsontests.py path/to/jsontest
+
+ # This will run the Reader/Writer tests, using JSONChecker test suite
+ # (http://www.json.org/JSON_checker/).
+ # Notes: not all tests pass: JsonCpp is too lenient (for example,
+ # it allows an integer to start with '0'). The goal is to improve
+ # strict mode parsing to get all tests to pass.
+ python runjsontests.py --with-json-checker path/to/jsontest
+
+ # This will run the unit tests (mostly Value)
+ python rununittests.py path/to/test_lib_json
+
+ # You can run the tests using valgrind:
+ python rununittests.py --valgrind path/to/test_lib_json
+
+### Running the tests using SCons
+
+Note that tests can be run using SCons using the `check` target:
+
+ scons platform=$PLATFORM check
+
+### Building the documentation
+
+Run the Python script `doxybuild.py` from the top directory:
+
+ python doxybuild.py --doxygen=$(which doxygen) --open --with-dot
+
+See `doxybuild.py --help` for options.
+
+### Adding a reader/writer test
+
+To add a test, you need to create two files in test/data:
+
+* a `TESTNAME.json` file, that contains the input document in JSON format.
+* a `TESTNAME.expected` file, that contains a flatened representation of the
+ input document.
+
+The `TESTNAME.expected` file format is as follows:
+
+* Each line represents a JSON element of the element tree represented by the
+ input document.
+* Each line has two parts: the path to access the element separated from the
+ element value by `=`. Array and object values are always empty (i.e.
+ represented by either `[]` or `{}`).
+* Element path `.` represents the root element, and is used to separate object
+ members. `[N]` is used to specify the value of an array element at index `N`.
+
+See the examples `test_complex_01.json` and `test_complex_01.expected` to better understand element paths.
+
+### Understanding reader/writer test output
+
+When a test is run, output files are generated beside the input test files. Below is a short description of the content of each file:
+
+* `test_complex_01.json`: input JSON document.
+* `test_complex_01.expected`: flattened JSON element tree used to check if
+ parsing was corrected.
+* `test_complex_01.actual`: flattened JSON element tree produced by `jsontest`
+ from reading `test_complex_01.json`.
+* `test_complex_01.rewrite`: JSON document written by `jsontest` using the
+ `Json::Value` parsed from `test_complex_01.json` and serialized using
+ `Json::StyledWritter`.
+* `test_complex_01.actual-rewrite`: flattened JSON element tree produced by
+ `jsontest` from reading `test_complex_01.rewrite`.
+* `test_complex_01.process-output`: `jsontest` output, typically useful for
+ understanding parsing errors.
+
+## License
+
+See the `LICENSE` file for details. In summary, JsonCpp is licensed under the
+MIT license, or public domain if desired and recognized in your jurisdiction.
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/SConstruct
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/SConstruct b/thirdparty/jsoncpp/SConstruct
new file mode 100644
index 0000000..f3a73f7
--- /dev/null
+++ b/thirdparty/jsoncpp/SConstruct
@@ -0,0 +1,248 @@
+"""
+Notes:
+- shared library support is buggy: it assumes that a static and dynamic library can be build from the same object files. This is not true on many platforms. For this reason it is only enabled on linux-gcc at the current time.
+
+To add a platform:
+- add its name in options allowed_values below
+- add tool initialization for this platform. Search for "if platform == 'suncc'" as an example.
+"""
+
+import os
+import os.path
+import sys
+
+JSONCPP_VERSION = open(File('#version').abspath,'rt').read().strip()
+DIST_DIR = '#dist'
+
+options = Variables()
+options.Add( EnumVariable('platform',
+ 'Platform (compiler/stl) used to build the project',
+ 'msvc71',
+ allowed_values='suncc vacpp mingw msvc6 msvc7 msvc71 msvc80 msvc90 linux-gcc'.split(),
+ ignorecase=2) )
+
+try:
+ platform = ARGUMENTS['platform']
+ if platform == 'linux-gcc':
+ CXX = 'g++' # not quite right, but env is not yet available.
+ import commands
+ version = commands.getoutput('%s -dumpversion' %CXX)
+ platform = 'linux-gcc-%s' %version
+ print "Using platform '%s'" %platform
+ LD_LIBRARY_PATH = os.environ.get('LD_LIBRARY_PATH', '')
+ LD_LIBRARY_PATH = "%s:libs/%s" %(LD_LIBRARY_PATH, platform)
+ os.environ['LD_LIBRARY_PATH'] = LD_LIBRARY_PATH
+ print "LD_LIBRARY_PATH =", LD_LIBRARY_PATH
+except KeyError:
+ print 'You must specify a "platform"'
+ sys.exit(2)
+
+print "Building using PLATFORM =", platform
+
+rootbuild_dir = Dir('#buildscons')
+build_dir = os.path.join( '#buildscons', platform )
+bin_dir = os.path.join( '#bin', platform )
+lib_dir = os.path.join( '#libs', platform )
+sconsign_dir_path = Dir(build_dir).abspath
+sconsign_path = os.path.join( sconsign_dir_path, '.sconsign.dbm' )
+
+# Ensure build directory exist (SConsignFile fail otherwise!)
+if not os.path.exists( sconsign_dir_path ):
+ os.makedirs( sconsign_dir_path )
+
+# Store all dependencies signature in a database
+SConsignFile( sconsign_path )
+
+def make_environ_vars():
+ """Returns a dictionnary with environment variable to use when compiling."""
+ # PATH is required to find the compiler
+ # TEMP is required for at least mingw
+ # LD_LIBRARY_PATH & co is required on some system for the compiler
+ vars = {}
+ for name in ('PATH', 'TEMP', 'TMP', 'LD_LIBRARY_PATH', 'LIBRARY_PATH'):
+ if name in os.environ:
+ vars[name] = os.environ[name]
+ return vars
+
+
+env = Environment( ENV = make_environ_vars(),
+ toolpath = ['scons-tools'],
+ tools=[] ) #, tools=['default'] )
+
+if platform == 'suncc':
+ env.Tool( 'sunc++' )
+ env.Tool( 'sunlink' )
+ env.Tool( 'sunar' )
+ env.Append( CCFLAGS = ['-mt'] )
+elif platform == 'vacpp':
+ env.Tool( 'default' )
+ env.Tool( 'aixcc' )
+ env['CXX'] = 'xlC_r' #scons does not pick-up the correct one !
+ # using xlC_r ensure multi-threading is enabled:
+ # http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.vacpp7a.doc/compiler/ref/cuselect.htm
+ env.Append( CCFLAGS = '-qrtti=all',
+ LINKFLAGS='-bh:5' ) # -bh:5 remove duplicate symbol warning
+elif platform == 'msvc6':
+ env['MSVS_VERSION']='6.0'
+ for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
+ env.Tool( tool )
+ env['CXXFLAGS']='-GR -GX /nologo /MT'
+elif platform == 'msvc70':
+ env['MSVS_VERSION']='7.0'
+ for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
+ env.Tool( tool )
+ env['CXXFLAGS']='-GR -GX /nologo /MT'
+elif platform == 'msvc71':
+ env['MSVS_VERSION']='7.1'
+ for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
+ env.Tool( tool )
+ env['CXXFLAGS']='-GR -GX /nologo /MT'
+elif platform == 'msvc80':
+ env['MSVS_VERSION']='8.0'
+ for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
+ env.Tool( tool )
+ env['CXXFLAGS']='-GR -EHsc /nologo /MT'
+elif platform == 'msvc90':
+ env['MSVS_VERSION']='9.0'
+ # Scons 1.2 fails to detect the correct location of the platform SDK.
+ # So we propagate those from the environment. This requires that the
+ # user run vcvars32.bat before compiling.
+ if 'INCLUDE' in os.environ:
+ env['ENV']['INCLUDE'] = os.environ['INCLUDE']
+ if 'LIB' in os.environ:
+ env['ENV']['LIB'] = os.environ['LIB']
+ for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
+ env.Tool( tool )
+ env['CXXFLAGS']='-GR -EHsc /nologo /MT'
+elif platform == 'mingw':
+ env.Tool( 'mingw' )
+ env.Append( CPPDEFINES=[ "WIN32", "NDEBUG", "_MT" ] )
+elif platform.startswith('linux-gcc'):
+ env.Tool( 'default' )
+ env.Append( LIBS = ['pthread'], CCFLAGS = os.environ.get("CXXFLAGS", "-Wall"), LINKFLAGS=os.environ.get("LDFLAGS", "") )
+ env['SHARED_LIB_ENABLED'] = True
+else:
+ print "UNSUPPORTED PLATFORM."
+ env.Exit(1)
+
+env.Tool('targz')
+env.Tool('srcdist')
+env.Tool('globtool')
+
+env.Append( CPPPATH = ['#include'],
+ LIBPATH = lib_dir )
+short_platform = platform
+if short_platform.startswith('msvc'):
+ short_platform = short_platform[2:]
+# Notes: on Windows you need to rebuild the source for each variant
+# Build script does not support that yet so we only build static libraries.
+# This also fails on AIX because both dynamic and static library ends with
+# extension .a.
+env['SHARED_LIB_ENABLED'] = env.get('SHARED_LIB_ENABLED', False)
+env['LIB_PLATFORM'] = short_platform
+env['LIB_LINK_TYPE'] = 'lib' # static
+env['LIB_CRUNTIME'] = 'mt'
+env['LIB_NAME_SUFFIX'] = '${LIB_PLATFORM}_${LIB_LINK_TYPE}${LIB_CRUNTIME}' # must match autolink naming convention
+env['JSONCPP_VERSION'] = JSONCPP_VERSION
+env['BUILD_DIR'] = env.Dir(build_dir)
+env['ROOTBUILD_DIR'] = env.Dir(rootbuild_dir)
+env['DIST_DIR'] = DIST_DIR
+if 'TarGz' in env['BUILDERS']:
+ class SrcDistAdder:
+ def __init__( self, env ):
+ self.env = env
+ def __call__( self, *args, **kw ):
+ apply( self.env.SrcDist, (self.env['SRCDIST_TARGET'],) + args, kw )
+ env['SRCDIST_BUILDER'] = env.TarGz
+else: # If tarfile module is missing
+ class SrcDistAdder:
+ def __init__( self, env ):
+ pass
+ def __call__( self, *args, **kw ):
+ pass
+env['SRCDIST_ADD'] = SrcDistAdder( env )
+env['SRCDIST_TARGET'] = os.path.join( DIST_DIR, 'jsoncpp-src-%s.tar.gz' % env['JSONCPP_VERSION'] )
+
+env_testing = env.Clone( )
+env_testing.Append( LIBS = ['json_${LIB_NAME_SUFFIX}'] )
+
+def buildJSONExample( env, target_sources, target_name ):
+ env = env.Clone()
+ env.Append( CPPPATH = ['#'] )
+ exe = env.Program( target=target_name,
+ source=target_sources )
+ env['SRCDIST_ADD']( source=[target_sources] )
+ global bin_dir
+ return env.Install( bin_dir, exe )
+
+def buildJSONTests( env, target_sources, target_name ):
+ jsontests_node = buildJSONExample( env, target_sources, target_name )
+ check_alias_target = env.Alias( 'check', jsontests_node, RunJSONTests( jsontests_node, jsontests_node ) )
+ env.AlwaysBuild( check_alias_target )
+
+def buildUnitTests( env, target_sources, target_name ):
+ jsontests_node = buildJSONExample( env, target_sources, target_name )
+ check_alias_target = env.Alias( 'check', jsontests_node,
+ RunUnitTests( jsontests_node, jsontests_node ) )
+ env.AlwaysBuild( check_alias_target )
+
+def buildLibrary( env, target_sources, target_name ):
+ static_lib = env.StaticLibrary( target=target_name + '_${LIB_NAME_SUFFIX}',
+ source=target_sources )
+ global lib_dir
+ env.Install( lib_dir, static_lib )
+ if env['SHARED_LIB_ENABLED']:
+ shared_lib = env.SharedLibrary( target=target_name + '_${LIB_NAME_SUFFIX}',
+ source=target_sources )
+ env.Install( lib_dir, shared_lib )
+ env['SRCDIST_ADD']( source=[target_sources] )
+
+Export( 'env env_testing buildJSONExample buildLibrary buildJSONTests buildUnitTests' )
+
+def buildProjectInDirectory( target_directory ):
+ global build_dir
+ target_build_dir = os.path.join( build_dir, target_directory )
+ target = os.path.join( target_directory, 'sconscript' )
+ SConscript( target, build_dir=target_build_dir, duplicate=0 )
+ env['SRCDIST_ADD']( source=[target] )
+
+
+def runJSONTests_action( target, source = None, env = None ):
+ # Add test scripts to python path
+ jsontest_path = Dir( '#test' ).abspath
+ sys.path.insert( 0, jsontest_path )
+ data_path = os.path.join( jsontest_path, 'data' )
+ import runjsontests
+ return runjsontests.runAllTests( os.path.abspath(source[0].path), data_path )
+
+def runJSONTests_string( target, source = None, env = None ):
+ return 'RunJSONTests("%s")' % source[0]
+
+import SCons.Action
+ActionFactory = SCons.Action.ActionFactory
+RunJSONTests = ActionFactory(runJSONTests_action, runJSONTests_string )
+
+def runUnitTests_action( target, source = None, env = None ):
+ # Add test scripts to python path
+ jsontest_path = Dir( '#test' ).abspath
+ sys.path.insert( 0, jsontest_path )
+ import rununittests
+ return rununittests.runAllTests( os.path.abspath(source[0].path) )
+
+def runUnitTests_string( target, source = None, env = None ):
+ return 'RunUnitTests("%s")' % source[0]
+
+RunUnitTests = ActionFactory(runUnitTests_action, runUnitTests_string )
+
+env.Alias( 'check' )
+
+srcdist_cmd = env['SRCDIST_ADD']( source = """
+ AUTHORS README.md SConstruct
+ """.split() )
+env.Alias( 'src-dist', srcdist_cmd )
+
+buildProjectInDirectory( 'src/jsontestrunner' )
+buildProjectInDirectory( 'src/lib_json' )
+buildProjectInDirectory( 'src/test_lib_json' )
+#print env.Dump()
+
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/amalgamate.py
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/amalgamate.py b/thirdparty/jsoncpp/amalgamate.py
new file mode 100644
index 0000000..9cb2d08
--- /dev/null
+++ b/thirdparty/jsoncpp/amalgamate.py
@@ -0,0 +1,155 @@
+"""Amalgate json-cpp library sources into a single source and header file.
+
+Works with python2.6+ and python3.4+.
+
+Example of invocation (must be invoked from json-cpp top directory):
+python amalgate.py
+"""
+import os
+import os.path
+import sys
+
+class AmalgamationFile:
+ def __init__(self, top_dir):
+ self.top_dir = top_dir
+ self.blocks = []
+
+ def add_text(self, text):
+ if not text.endswith("\n"):
+ text += "\n"
+ self.blocks.append(text)
+
+ def add_file(self, relative_input_path, wrap_in_comment=False):
+ def add_marker(prefix):
+ self.add_text("")
+ self.add_text("// " + "/"*70)
+ self.add_text("// %s of content of file: %s" % (prefix, relative_input_path.replace("\\","/")))
+ self.add_text("// " + "/"*70)
+ self.add_text("")
+ add_marker("Beginning")
+ f = open(os.path.join(self.top_dir, relative_input_path), "rt")
+ content = f.read()
+ if wrap_in_comment:
+ content = "/*\n" + content + "\n*/"
+ self.add_text(content)
+ f.close()
+ add_marker("End")
+ self.add_text("\n\n\n\n")
+
+ def get_value(self):
+ return "".join(self.blocks).replace("\r\n","\n")
+
+ def write_to(self, output_path):
+ output_dir = os.path.dirname(output_path)
+ if output_dir and not os.path.isdir(output_dir):
+ os.makedirs(output_dir)
+ f = open(output_path, "wb")
+ f.write(str.encode(self.get_value(), 'UTF-8'))
+ f.close()
+
+def amalgamate_source(source_top_dir=None,
+ target_source_path=None,
+ header_include_path=None):
+ """Produces amalgated source.
+ Parameters:
+ source_top_dir: top-directory
+ target_source_path: output .cpp path
+ header_include_path: generated header path relative to target_source_path.
+ """
+ print("Amalgating header...")
+ header = AmalgamationFile(source_top_dir)
+ header.add_text("/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).")
+ header.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
+ header.add_file("LICENSE", wrap_in_comment=True)
+ header.add_text("#ifndef JSON_AMALGATED_H_INCLUDED")
+ header.add_text("# define JSON_AMALGATED_H_INCLUDED")
+ header.add_text("/// If defined, indicates that the source file is amalgated")
+ header.add_text("/// to prevent private header inclusion.")
+ header.add_text("#define JSON_IS_AMALGAMATION")
+ header.add_file("include/json/version.h")
+ #header.add_file("include/json/allocator.h") # Not available here.
+ header.add_file("include/json/config.h")
+ header.add_file("include/json/forwards.h")
+ header.add_file("include/json/features.h")
+ header.add_file("include/json/value.h")
+ header.add_file("include/json/reader.h")
+ header.add_file("include/json/writer.h")
+ header.add_file("include/json/assertions.h")
+ header.add_text("#endif //ifndef JSON_AMALGATED_H_INCLUDED")
+
+ target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path)
+ print("Writing amalgated header to %r" % target_header_path)
+ header.write_to(target_header_path)
+
+ base, ext = os.path.splitext(header_include_path)
+ forward_header_include_path = base + "-forwards" + ext
+ print("Amalgating forward header...")
+ header = AmalgamationFile(source_top_dir)
+ header.add_text("/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/).")
+ header.add_text('/// It is intended to be used with #include "%s"' % forward_header_include_path)
+ header.add_text("/// This header provides forward declaration for all JsonCpp types.")
+ header.add_file("LICENSE", wrap_in_comment=True)
+ header.add_text("#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
+ header.add_text("# define JSON_FORWARD_AMALGATED_H_INCLUDED")
+ header.add_text("/// If defined, indicates that the source file is amalgated")
+ header.add_text("/// to prevent private header inclusion.")
+ header.add_text("#define JSON_IS_AMALGAMATION")
+ header.add_file("include/json/config.h")
+ header.add_file("include/json/forwards.h")
+ header.add_text("#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
+
+ target_forward_header_path = os.path.join(os.path.dirname(target_source_path),
+ forward_header_include_path)
+ print("Writing amalgated forward header to %r" % target_forward_header_path)
+ header.write_to(target_forward_header_path)
+
+ print("Amalgating source...")
+ source = AmalgamationFile(source_top_dir)
+ source.add_text("/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/).")
+ source.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
+ source.add_file("LICENSE", wrap_in_comment=True)
+ source.add_text("")
+ source.add_text('#include "%s"' % header_include_path)
+ source.add_text("""
+#ifndef JSON_IS_AMALGAMATION
+#error "Compile with -I PATH_TO_JSON_DIRECTORY"
+#endif
+""")
+ source.add_text("")
+ lib_json = "src/lib_json"
+ source.add_file(os.path.join(lib_json, "json_tool.h"))
+ source.add_file(os.path.join(lib_json, "json_reader.cpp"))
+ source.add_file(os.path.join(lib_json, "json_valueiterator.inl"))
+ source.add_file(os.path.join(lib_json, "json_value.cpp"))
+ source.add_file(os.path.join(lib_json, "json_writer.cpp"))
+
+ print("Writing amalgated source to %r" % target_source_path)
+ source.write_to(target_source_path)
+
+def main():
+ usage = """%prog [options]
+Generate a single amalgated source and header file from the sources.
+"""
+ from optparse import OptionParser
+ parser = OptionParser(usage=usage)
+ parser.allow_interspersed_args = False
+ parser.add_option("-s", "--source", dest="target_source_path", action="store", default="dist/jsoncpp.cpp",
+ help="""Output .cpp source path. [Default: %default]""")
+ parser.add_option("-i", "--include", dest="header_include_path", action="store", default="json/json.h",
+ help="""Header include path. Used to include the header from the amalgated source file. [Default: %default]""")
+ parser.add_option("-t", "--top-dir", dest="top_dir", action="store", default=os.getcwd(),
+ help="""Source top-directory. [Default: %default]""")
+ parser.enable_interspersed_args()
+ options, args = parser.parse_args()
+
+ msg = amalgamate_source(source_top_dir=options.top_dir,
+ target_source_path=options.target_source_path,
+ header_include_path=options.header_include_path)
+ if msg:
+ sys.stderr.write(msg + "\n")
+ sys.exit(1)
+ else:
+ print("Source succesfully amalagated")
+
+if __name__ == "__main__":
+ main()
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/appveyor.yml
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/appveyor.yml b/thirdparty/jsoncpp/appveyor.yml
new file mode 100644
index 0000000..f4966a3
--- /dev/null
+++ b/thirdparty/jsoncpp/appveyor.yml
@@ -0,0 +1,35 @@
+# This is a comment.
+
+version: build.{build}
+
+os: Windows Server 2012 R2
+
+clone_folder: c:\projects\jsoncpp
+
+platform:
+ - Win32
+ - x64
+
+configuration:
+ - Debug
+ - Release
+
+# scripts to run before build
+before_build:
+ - echo "Running cmake..."
+ - cd c:\projects\jsoncpp
+ - cmake --version
+ - set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH%
+ - if %PLATFORM% == Win32 cmake .
+ - if %PLATFORM% == x64 cmake -G "Visual Studio 12 2013 Win64" .
+
+build:
+ project: jsoncpp.sln # path to Visual Studio solution or project
+
+deploy:
+ provider: GitHub
+ auth_token:
+ secure: K2Tp1q8pIZ7rs0Ot24ZMWuwr12Ev6Tc6QkhMjGQxoQG3ng1pXtgPasiJ45IDXGdg
+ on:
+ branch: master
+ appveyor_repo_tag: true
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/dev.makefile
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/dev.makefile b/thirdparty/jsoncpp/dev.makefile
new file mode 100644
index 0000000..d288b16
--- /dev/null
+++ b/thirdparty/jsoncpp/dev.makefile
@@ -0,0 +1,35 @@
+# This is only for jsoncpp developers/contributors.
+# We use this to sign releases, generate documentation, etc.
+VER?=$(shell cat version)
+
+default:
+ @echo "VER=${VER}"
+sign: jsoncpp-${VER}.tar.gz
+ gpg --armor --detach-sign $<
+ gpg --verify $<.asc
+ # Then upload .asc to the release.
+jsoncpp-%.tar.gz:
+ curl https://github.com/open-source-parsers/jsoncpp/archive/$*.tar.gz -o $@
+dox:
+ python doxybuild.py --doxygen=$$(which doxygen) --in doc/web_doxyfile.in
+ rsync -va --delete dist/doxygen/jsoncpp-api-html-${VER}/ ../jsoncpp-docs/doxygen/
+ # Then 'git add -A' and 'git push' in jsoncpp-docs.
+build:
+ mkdir -p build/debug
+ cd build/debug; cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_SHARED_LIBS=ON -G "Unix Makefiles" ../..
+ make -C build/debug
+
+# Currently, this depends on include/json/version.h generated
+# by cmake.
+test-amalgamate:
+ python2.7 amalgamate.py
+ python3.4 amalgamate.py
+ cd dist; gcc -I. -c jsoncpp.cpp
+
+valgrind:
+ valgrind --error-exitcode=42 --leak-check=full ./build/debug/src/test_lib_json/jsoncpp_test
+
+clean:
+ \rm -rf *.gz *.asc dist/
+
+.PHONY: build
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1e1823ab/thirdparty/jsoncpp/devtools/__init__.py
----------------------------------------------------------------------
diff --git a/thirdparty/jsoncpp/devtools/__init__.py b/thirdparty/jsoncpp/devtools/__init__.py
new file mode 100644
index 0000000..d18a521
--- /dev/null
+++ b/thirdparty/jsoncpp/devtools/__init__.py
@@ -0,0 +1,6 @@
+# Copyright 2010 Baptiste Lepilleur
+# Distributed under MIT license, or public domain if desired and
+# recognized in your jurisdiction.
+# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+# module