From e9db668692569d5f2921d0c2440bd1afe8ba7dd1 Mon Sep 17 00:00:00 2001
From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de>
Date: Mon, 23 Feb 2015 23:26:09 +0100
Subject: [PATCH] C++: legacy-mode IUs working

Sniffer: only display quotes for string-type payload values
Injector: using unicode() and catching errors
---
 ipaacalib/cpp/include/ipaaca/ipaaca-ius.h |  8 +++++--
 ipaacalib/cpp/src/ipaaca-internal.cc      |  1 +
 ipaacalib/cpp/src/ipaaca-ius.cc           | 12 ++++++++--
 ipaacalib/cpp/src/ipaaca-json.cc          | 28 ++++++++++++++++++++++-
 ipaacatools/scripts/ipaaca-iu-injector    |  5 +++-
 ipaacatools/scripts/ipaaca-iu-sniffer     |  9 +++++---
 6 files changed, 54 insertions(+), 9 deletions(-)

diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
index eecdcfe..5affdde 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
@@ -127,7 +127,9 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
 		IPAACA_HEADER_EXPORT inline ~IU() {
 			//IPAACA_IMPLEMENT_ME
 		}
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="JSON" );
+		[[deprecated("Please use the new argument order: category, payload_type, read_only")]]
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode, bool read_only=false, const std::string& payload_type="JSON" );
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, const std::string& payload_type="JSON", bool read_only=false);
 		IPAACA_HEADER_EXPORT inline Payload& payload() _IPAACA_OVERRIDE_ { return _payload; }
 		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const _IPAACA_OVERRIDE_ { return _payload; }
 		IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_;
@@ -156,7 +158,9 @@ IPAACA_HEADER_EXPORT class Message: public IU {//{{{
 		IPAACA_HEADER_EXPORT inline ~Message() {
 			//IPAACA_IMPLEMENT_ME
 		}
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="JSON" );
+		[[deprecated("Please use the new argument order: category, payload_type")]]
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode, bool read_only=true, const std::string& payload_type="JSON" );
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, const std::string& payload_type="JSON");
 	protected:
 		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
diff --git a/ipaacalib/cpp/src/ipaaca-internal.cc b/ipaacalib/cpp/src/ipaaca-internal.cc
index d317850..6000baa 100644
--- a/ipaacalib/cpp/src/ipaaca-internal.cc
+++ b/ipaacalib/cpp/src/ipaaca-internal.cc
@@ -173,6 +173,7 @@ IPAACA_EXPORT std::string IUConverter::serialize(const AnnotatedData& data, std:
 		item->set_key(kv.first);
 		//item->set_value( kv.second->to_json_string_representation() );
 		//item->set_type("JSON");
+		IPAACA_DEBUG("Payload type: " << obj->_payload_type)
 		if (obj->_payload_type=="JSON") {
 			item->set_value( kv.second->to_json_string_representation() );
 			item->set_type("JSON");
diff --git a/ipaacalib/cpp/src/ipaaca-ius.cc b/ipaacalib/cpp/src/ipaaca-ius.cc
index fa28b85..9e9acf2 100644
--- a/ipaacalib/cpp/src/ipaaca-ius.cc
+++ b/ipaacalib/cpp/src/ipaaca-ius.cc
@@ -43,7 +43,11 @@ using namespace rsb::patterns;
 // IU//{{{
 IPAACA_EXPORT IU::ptr IU::create(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type)
 {
-	IU::ptr iu = IU::ptr(new IU(category, access_mode, read_only, payload_type)); /* params */ //));
+	return IU::create(category, payload_type, read_only);
+}
+IPAACA_EXPORT IU::ptr IU::create(const std::string& category, const std::string& payload_type, bool read_only)
+{
+	IU::ptr iu = IU::ptr(new IU(category, IU_ACCESS_PUSH, read_only, payload_type)); /* params */ //));
 	iu->_payload.initialize(iu);
 	return iu;
 }
@@ -134,7 +138,11 @@ IPAACA_EXPORT void IU::_internal_commit(const std::string& writer_name)
 // Message//{{{
 Message::ptr Message::create(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type)
 {
-	Message::ptr iu = Message::ptr(new Message(category, access_mode, read_only, payload_type)); /* params */ //));
+	return Message::create(category, payload_type);
+}
+Message::ptr Message::create(const std::string& category, const std::string& payload_type)
+{
+	Message::ptr iu = Message::ptr(new Message(category, IU_ACCESS_MESSAGE, true, payload_type)); /* params */ //));
 	iu->_payload.initialize(iu);
 	return iu;
 }
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index de82246..8ceec93 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -177,6 +177,31 @@ int fakeiu_main(int argc, char** argv)
 }
 
 
+int legacy_iu_main(int argc, char** argv)
+{
+	// produce and fill a new and a legacy IU with identical contents
+	
+	ipaaca::OutputBuffer::ptr ob = ipaaca::OutputBuffer::create("jsonTestSenderLegacy");
+	ob->register_handler([](ipaaca::IUInterface::ptr iu, ipaaca::IUEventType event_type, bool local) {
+		std::cout << "Received remote update, new payload: " << iu->payload() << std::endl;
+	});
+	std::cout << "--- Create IUs with category jsonTest" << std::endl;
+	ipaaca::IU::ptr iu1 = ipaaca::IU::create("jsonTest", "JSON");
+	ipaaca::IU::ptr iu2 = ipaaca::IU::create("jsonTest", "STR");
+	std::map<std::string, long> newmap = { {"fifty", 50}, {"ninety-nine", 99} };
+	std::cout << "--- Set map" << std::endl;
+	iu1->payload()["map"] = newmap;
+	iu1->payload()["array"] = std::vector<std::string>{"aaa", "bbb", "ccc"};
+	iu2->payload()["map"] = newmap;
+	iu2->payload()["array"] = std::vector<std::string>{"aaa", "bbb", "ccc"};
+	std::cout << "--- Publishing IUs with this payload:" << std::endl;
+	std::cout << iu1->payload() << std::endl;
+	ob->add(iu1);
+	ob->add(iu2);
+	std::cout << "--- Waiting for changes for 5s " << std::endl;
+	sleep(5);
+	return 0;
+}
 
 int iu_main(int argc, char** argv)
 {
@@ -229,6 +254,7 @@ int iu_main(int argc, char** argv)
 
 int main(int argc, char** argv)
 {
-	return fakeiu_main(argc, argv);
+	return legacy_iu_main(argc, argv);
+	//return fakeiu_main(argc, argv);
 	//return iu_main(argc, argv);
 }
diff --git a/ipaacatools/scripts/ipaaca-iu-injector b/ipaacatools/scripts/ipaaca-iu-injector
index 1159400..b785969 100755
--- a/ipaacatools/scripts/ipaaca-iu-injector
+++ b/ipaacatools/scripts/ipaaca-iu-injector
@@ -43,7 +43,10 @@ import ipaaca
 
 
 def iu_update_handler(iu, event_type, local):
-	print(event_type + ': ' + str(iu))
+	try:
+		print(event_type + ': ' + unicode(iu))
+	except:
+		print(u"An error occurred printing an IU for an event of type "+event_type)
 
 
 parser = ipaaca.IpaacaArgumentParser(description='Ipaaca IU Injector -- Sent ipaaca messages or IUs from the command line')
diff --git a/ipaacatools/scripts/ipaaca-iu-sniffer b/ipaacatools/scripts/ipaaca-iu-sniffer
index 3a98cee..ac244b6 100755
--- a/ipaacatools/scripts/ipaaca-iu-sniffer
+++ b/ipaacatools/scripts/ipaaca-iu-sniffer
@@ -61,10 +61,13 @@ def highlight_if_color(s, c='1'):
 def pretty_printed_dict(d):
 	s='{\n'
 	for k, v in d.items():
-		v = str(v)
+		if isinstance(v, unicode) or isinstance(v, str):
+			v = "'"+unicode(v)+"'"
+		else:
+			v = unicode(v)
 		v2 = v if len(v) <= arguments.max_size else v[:arguments.max_size] + '<excess length omitted>'
 		v2.replace('\\','\\\\').replace('\n', highlight_if_color('\\n'))
-		s += "\t '%s': '%s',\n" % (highlight_if_color(unicode(k),'1'), unicode(v2))
+		s += "\t '%s': %s,\n" % (highlight_if_color(unicode(k),'1'), unicode(v2))
 	s+='}'
 	return s
 
@@ -163,4 +166,4 @@ if __name__ == '__main__':
 		os._exit(0)
 	else:
 		sys.exit(0)
-	
\ No newline at end of file
+	
-- 
GitLab