diff --git a/contrib/library/text/parser/json/library/extras/visitor/json_pretty_string_visitor.e b/contrib/library/text/parser/json/library/extras/visitor/json_pretty_string_visitor.e new file mode 100644 index 00000000..98b17c81 --- /dev/null +++ b/contrib/library/text/parser/json/library/extras/visitor/json_pretty_string_visitor.e @@ -0,0 +1,175 @@ +note + description: "JSON_PRETTY_STRING_VISITOR Generates the JSON-String for a JSON_VALUE" + revision: "0.1" + +class + JSON_PRETTY_STRING_VISITOR + +inherit + JSON_VISITOR + +create + make, + make_custom + +feature -- Initialization + + make (a_output: like output) + -- Create a new instance + do + make_custom (a_output, 1, 1) + end + + make_custom (a_output: like output; a_object_count_inlining, a_array_count_inlining: INTEGER) + -- Create a new instance + do + output := a_output + create indentation.make_empty + indentation_step := "%T" + + object_count_inlining := a_object_count_inlining + array_count_inlining := a_array_count_inlining + end + +feature -- Access + + output: STRING_32 + -- JSON representation + + indentation: like output + + indentation_step: like indentation + + line_number: INTEGER + + indent + do + indentation.append (indentation_step) + end + + exdent + do + indentation.remove_tail (indentation_step.count) + end + + new_line + do + output.append ("%N") + output.append (indentation) + line_number := line_number + 1 + end + + object_count_inlining: INTEGER + array_count_inlining: INTEGER + +feature -- Visitor Pattern + + visit_json_array (a_json_array: JSON_ARRAY) + -- Visit `a_json_array'. + local + value: JSON_VALUE + l_json_array: ARRAYED_LIST [JSON_VALUE] + l_line: like line_number + l_multiple_lines: BOOLEAN + do + l_json_array := a_json_array.array_representation + l_multiple_lines := l_json_array.count >= array_count_inlining or across l_json_array as p some attached {JSON_OBJECT} p.item or attached {JSON_ARRAY} p.item end + output.append ("[") + l_line := line_number + indent + from + l_json_array.start + until + l_json_array.off + loop + if + line_number > l_line or + l_multiple_lines + then + new_line + end + value := l_json_array.item + value.accept (Current) + l_json_array.forth + if not l_json_array.after then + output.append (", ") + end + end + exdent + if + line_number > l_line or + l_json_array.count >= array_count_inlining + then + new_line + end + output.append ("]") + end + + visit_json_boolean (a_json_boolean: JSON_BOOLEAN) + -- Visit `a_json_boolean'. + do + output.append (a_json_boolean.item.out) + end + + visit_json_null (a_json_null: JSON_NULL) + -- Visit `a_json_null'. + do + output.append ("null") + end + + visit_json_number (a_json_number: JSON_NUMBER) + -- Visit `a_json_number'. + do + output.append (a_json_number.item) + end + + visit_json_object (a_json_object: JSON_OBJECT) + -- Visit `a_json_object'. + local + l_pairs: HASH_TABLE [JSON_VALUE, JSON_STRING] + l_line: like line_number + l_multiple_lines: BOOLEAN + do + l_pairs := a_json_object.map_representation + l_multiple_lines := l_pairs.count >= object_count_inlining or across l_pairs as p some attached {JSON_OBJECT} p.item or attached {JSON_ARRAY} p.item end + output.append ("{") + l_line := line_number + indent + from + l_pairs.start + until + l_pairs.off + loop + if + line_number > l_line or + l_multiple_lines + then + new_line + end + l_pairs.key_for_iteration.accept (Current) + output.append (": ") + l_pairs.item_for_iteration.accept (Current) + l_pairs.forth + if not l_pairs.after then + output.append (", ") + end + end + exdent + if + line_number > l_line or + l_pairs.count >= object_count_inlining + then + new_line + end + output.append ("}") + end + + visit_json_string (a_json_string: JSON_STRING) + -- Visit `a_json_string'. + do + output.append ("%"") + output.append (a_json_string.item) + output.append ("%"") + end + +end diff --git a/contrib/library/text/parser/json/library/gobo/shared_gobo_ejson.e b/contrib/library/text/parser/json/library/gobo/shared_gobo_ejson.e index ccc33432..9fbe9b57 100644 --- a/contrib/library/text/parser/json/library/gobo/shared_gobo_ejson.e +++ b/contrib/library/text/parser/json/library/gobo/shared_gobo_ejson.e @@ -29,4 +29,4 @@ feature Result.add_converter (jhtc) end -end -- class SHARED_GOBO_EJSON \ No newline at end of file +end -- class SHARED_GOBO_EJSON diff --git a/contrib/library/text/parser/json/library/kernel/converters/json_arrayed_list_converter.e b/contrib/library/text/parser/json/library/kernel/converters/json_arrayed_list_converter.e new file mode 100644 index 00000000..da089f7b --- /dev/null +++ b/contrib/library/text/parser/json/library/kernel/converters/json_arrayed_list_converter.e @@ -0,0 +1,30 @@ +note + description: "A JSON converter for ARRAYED_LIST [ANY]" + author: "Paul Cohen" + date: "$Date$" + revision: "$Revision$" + file: "$HeadURL: $" + +class JSON_ARRAYED_LIST_CONVERTER + +inherit + JSON_LIST_CONVERTER + redefine + object + end + +create + make + +feature -- Access + + object: ARRAYED_LIST [detachable ANY] + +feature {NONE} -- Factory + + new_object (nb: INTEGER): like object + do + create Result.make (nb) + end + +end -- class JSON_ARRAYED_LIST_CONVERTER diff --git a/contrib/library/text/parser/json/library/kernel/converters/json_converter.e b/contrib/library/text/parser/json/library/kernel/converters/json_converter.e index bae2bd9c..796ef4eb 100644 --- a/contrib/library/text/parser/json/library/kernel/converters/json_converter.e +++ b/contrib/library/text/parser/json/library/kernel/converters/json_converter.e @@ -1,8 +1,8 @@ note description: "A JSON converter" author: "Paul Cohen" - date: "$Date: $" - revision: "$Revision: $" + date: "$Date$" + revision: "$Revision$" file: "$HeadURL: $" deferred class JSON_CONVERTER @@ -19,7 +19,7 @@ feature -- Access feature -- Conversion - from_json (j: attached like to_json): detachable like object + from_json (j: attached like to_json): detachable like object -- Convert from JSON value. -- Returns Void if unable to convert deferred diff --git a/contrib/library/text/parser/json/library/kernel/converters/json_hash_table_converter.e b/contrib/library/text/parser/json/library/kernel/converters/json_hash_table_converter.e index 8ce5260e..7971e1c2 100644 --- a/contrib/library/text/parser/json/library/kernel/converters/json_hash_table_converter.e +++ b/contrib/library/text/parser/json/library/kernel/converters/json_hash_table_converter.e @@ -1,8 +1,8 @@ note description: "A JSON converter for HASH_TABLE [ANY, HASHABLE]" author: "Paul Cohen" - date: "$Date$" - revision: "$Revision$" + date: "$Date$" + revision: "$Revision$" file: "$HeadURL: $" class JSON_HASH_TABLE_CONVERTER @@ -26,7 +26,7 @@ feature -- Access feature -- Conversion - from_json (j: attached like to_json): like object + from_json (j: attached like to_json): like object local keys: ARRAY [JSON_STRING] i: INTEGER @@ -41,7 +41,7 @@ feature -- Conversion until i > keys.count loop - h ?= json.object (keys [i], void) + h ?= json.object (keys [i], Void) check h /= Void end jv := j.item (keys [i]) if jv /= Void then diff --git a/contrib/library/text/parser/json/library/kernel/converters/json_linked_list_converter.e b/contrib/library/text/parser/json/library/kernel/converters/json_linked_list_converter.e index bcc41e49..42a1c2c4 100644 --- a/contrib/library/text/parser/json/library/kernel/converters/json_linked_list_converter.e +++ b/contrib/library/text/parser/json/library/kernel/converters/json_linked_list_converter.e @@ -1,63 +1,30 @@ note - description: "A JSON converter for LINKED_LIST [ANY]" - author: "Paul Cohen" - date: "$Date$" - revision: "$Revision$" - file: "$HeadURL: $" + description: "A JSON converter for LINKED_LIST [ANY]" + author: "Paul Cohen" + date: "$Date$" + revision: "$Revision$" + file: "$HeadURL: $" class JSON_LINKED_LIST_CONVERTER inherit - JSON_CONVERTER + JSON_LIST_CONVERTER + redefine + object + end create make -feature {NONE} -- Initialization - - make - do - create object.make - end - feature -- Access object: LINKED_LIST [detachable ANY] -feature -- Conversion +feature {NONE} -- Factory - from_json (j: like to_json): detachable like object - local - i: INTEGER - do - create Result.make - from - i := 1 - until - i > j.count - loop - Result.extend (json.object (j [i], Void)) - i := i + 1 - end - end - - to_json (o: like object): JSON_ARRAY - local - c: ITERATION_CURSOR [detachable ANY] - do - create Result.make_array - from - c := o.new_cursor - until - c.after - loop - if attached json.value (c.item) as v then - Result.add (v) - else - check attached_value: False end - end - c.forth - end - end + new_object (nb: INTEGER): like object + do + create Result.make + end end -- class JSON_LINKED_LIST_CONVERTER diff --git a/contrib/library/text/parser/json/library/kernel/converters/json_list_converter.e b/contrib/library/text/parser/json/library/kernel/converters/json_list_converter.e new file mode 100644 index 00000000..75e0f848 --- /dev/null +++ b/contrib/library/text/parser/json/library/kernel/converters/json_list_converter.e @@ -0,0 +1,74 @@ +note + description: "A JSON converter for LIST [ANY]" + author: "Paul Cohen" + date: "$Date$" + revision: "$Revision$" + file: "$HeadURL: $" + +deferred class JSON_LIST_CONVERTER + +inherit + JSON_CONVERTER + +feature {NONE} -- Initialization + + make + do + object := new_object (0) + end + +feature -- Access + + object: LIST [detachable ANY] + +feature {NONE} -- Factory + + new_object (nb: INTEGER): like object + deferred + ensure + Result /= Void + end + +feature -- Conversion + + from_json (j: attached like to_json): detachable like object + local + i: INTEGER + do + Result := new_object (j.count) + from + i := 1 + until + i > j.count + loop + Result.extend (json.object (j [i], Void)) + i := i + 1 + end + end + + to_json (o: like object): detachable JSON_ARRAY + local + c: ITERATION_CURSOR [detachable ANY] + jv: detachable JSON_VALUE + failed: BOOLEAN + do + create Result.make_array + from + c := o.new_cursor + until + c.after + loop + jv := json.value (c.item) + if jv /= Void then + Result.add (jv) + else + failed := True + end + c.forth + end + if failed then + Result := Void + end + end + +end -- class JSON_ARRAYED_LIST_CONVERTER diff --git a/contrib/library/text/parser/json/library/kernel/ejson.e b/contrib/library/text/parser/json/library/kernel/ejson.e index de9058d5..b9931aa9 100644 --- a/contrib/library/text/parser/json/library/kernel/ejson.e +++ b/contrib/library/text/parser/json/library/kernel/ejson.e @@ -1,8 +1,8 @@ note description: "Core factory class for creating JSON objects and corresponding Eiffel objects." author: "Paul Cohen" - date: "$Date: $" - revision: "$Revision: $" + date: "$Date$" + revision: "$Revision$" file: "$HeadURL: $" class EJSON @@ -69,7 +69,7 @@ feature -- Access elseif attached {STRING_8} an_object as s8 then create {JSON_STRING} Result.make_json (s8) elseif attached {STRING_32} an_object as s32 then - create {JSON_STRING} Result.make_json (s32.as_string_8) -- FIXME: need correct convertion/encoding here ... + create {JSON_STRING} Result.make_json_from_string_32 (s32) end if Result = Void then @@ -253,9 +253,9 @@ feature {NONE} -- Implementation (Exceptions) -- Exception message for failing to convert `a' to a JSON_VALUE. do Result := exception_prefix + "Failed to convert Eiffel object to a JSON_VALUE" - if an_object /= Void then - Result := ": " + an_object.generator - end + if an_object /= Void then + Result := ": " + an_object.generator + end end feature {NONE} -- Implementation (JSON parser) diff --git a/contrib/library/text/parser/json/library/kernel/shared_ejson.e b/contrib/library/text/parser/json/library/kernel/shared_ejson.e index d08a6766..421b83a4 100644 --- a/contrib/library/text/parser/json/library/kernel/shared_ejson.e +++ b/contrib/library/text/parser/json/library/kernel/shared_ejson.e @@ -1,14 +1,14 @@ note description: "[ - Shared factory class for creating JSON objects. Maps JSON - objects to ELKS HASH_TABLEs and JSON arrays to ELKS - LINKED_LISTs. Use non-conforming inheritance from this - class to ensure that your classes share the same - JSON_FACTORY instance. + Shared factory class for creating JSON objects. Maps JSON + objects to ELKS HASH_TABLEs and JSON arrays to ELKS + LINKED_LISTs. Use non-conforming inheritance from this + class to ensure that your classes share the same + JSON_FACTORY instance. ]" author: "Paul Cohen" - date: "$Date: $" - revision: "$Revision: $" + date: "$Date$" + revision: "$Revision: 89185 $" file: "$HeadURL: $" class SHARED_EJSON @@ -17,16 +17,22 @@ feature json: EJSON -- A shared EJSON instance with default converters for - -- DS_LINKED_LIST [ANY] and DS_HASH_TABLE [ANY, HASHABLE] + --LINKED_LIST [ANY] and HASH_TABLE [ANY, HASHABLE] local + jalc: JSON_ARRAYED_LIST_CONVERTER jllc: JSON_LINKED_LIST_CONVERTER jhtc: JSON_HASH_TABLE_CONVERTER once create Result + + create jalc.make + Result.add_converter (jalc) + create jllc.make Result.add_converter (jllc) + create jhtc.make Result.add_converter (jhtc) end -end -- class SHARED_EJSON \ No newline at end of file +end -- class SHARED_EJSON diff --git a/contrib/library/text/parser/json/test/autotest/test_suite/json_author_converter.e b/contrib/library/text/parser/json/test/autotest/test_suite/json_author_converter.e index ec734045..c8f9e6d0 100644 --- a/contrib/library/text/parser/json/test/autotest/test_suite/json_author_converter.e +++ b/contrib/library/text/parser/json/test/autotest/test_suite/json_author_converter.e @@ -1,9 +1,8 @@ note description: "A JSON converter for AUTHOR" author: "Paul Cohen" - date: "$Date: 2010-03-08 20:46:59 -0300 (Mon, 08 Mar 2010) $" - revision: "$Revision: 82 $" - file: "$HeadURL: https://svn.origo.ethz.ch/ejson/branches/POC-converters-factory/test/json_author_converter.e $" + date: "$Date$" + revision: "$Revision$" class JSON_AUTHOR_CONVERTER diff --git a/contrib/library/text/parser/json/test/autotest/test_suite/json_book_collection_converter.e b/contrib/library/text/parser/json/test/autotest/test_suite/json_book_collection_converter.e index 06b33cd0..1c569ce3 100644 --- a/contrib/library/text/parser/json/test/autotest/test_suite/json_book_collection_converter.e +++ b/contrib/library/text/parser/json/test/autotest/test_suite/json_book_collection_converter.e @@ -1,9 +1,8 @@ note description: "A JSON converter for BOOK_COLLECTION" author: "Paul Cohen" - date: "$Date: 2010-03-08 20:46:59 -0300 (Mon, 08 Mar 2010) $" - revision: "$Revision: 82 $" - file: "$HeadURL: https://svn.origo.ethz.ch/ejson/branches/POC-converters-factory/test/json_book_collection_converter.e $" + date: "$Date$" + revision: "$Revision$" class JSON_BOOK_COLLECTION_CONVERTER diff --git a/contrib/library/text/parser/json/test/autotest/test_suite/json_book_converter.e b/contrib/library/text/parser/json/test/autotest/test_suite/json_book_converter.e index e355149f..de31f79e 100644 --- a/contrib/library/text/parser/json/test/autotest/test_suite/json_book_converter.e +++ b/contrib/library/text/parser/json/test/autotest/test_suite/json_book_converter.e @@ -1,9 +1,8 @@ note description: "A JSON converter for BOOK" author: "Paul Cohen" - date: "$Date: 2010-03-08 20:46:59 -0300 (Mon, 08 Mar 2010) $" - revision: "$Revision: 82 $" - file: "$HeadURL: https://svn.origo.ethz.ch/ejson/branches/POC-converters-factory/test/json_book_converter.e $" + date: "$Date$" + revision: "$Revision$" class JSON_BOOK_CONVERTER diff --git a/contrib/library/text/parser/json/test/autotest/test_suite/test_json_core.e b/contrib/library/text/parser/json/test/autotest/test_suite/test_json_core.e index d2faa7e1..ad8326b9 100644 --- a/contrib/library/text/parser/json/test/autotest/test_suite/test_json_core.e +++ b/contrib/library/text/parser/json/test/autotest/test_suite/test_json_core.e @@ -632,7 +632,7 @@ feature -- Test jrep := "%"foo\\bar%"" create parser.make_parser (jrep) if attached {JSON_STRING} parser.parse as jstring then - assert ("unescaped string %"foo\\bar%" to %"foo\bar%"", jstring.unescaped_string_8.same_string ("foo\bar")) + assert ("unescaped string %"foo\\bar%" to %"foo\bar%"", jstring.unescaped_string.same_string ("foo\bar")) end create js.make_json_from_string_32 ({STRING_32}"%/20320/%/22909/")