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/") diff --git a/doc/wiki/Home.md b/doc/wiki/Home.md index a7d253e0..4da5d7b7 100644 --- a/doc/wiki/Home.md +++ b/doc/wiki/Home.md @@ -1,16 +1,26 @@ -## Eiffel-Web-Framework ## +# Eiffel-Web-Framework # +## Location ## The official documentation/wiki is located at https://github.com/EiffelWebFramework/EWF/wiki , if you are visiting a "clone/fork", please always check the [[official wiki|https://github.com/EiffelWebFramework/EWF/wiki]]. - +## Organization ## - Mailing list: please visit and subscribe to the mailing list page [[http://groups.google.com/group/eiffel-web-framework]] ![logo](http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif) - Most of the topics are discussed on the mailing list (google group). - For time to time we have web meeting, and less frequently physical meetings that occurs usually during other Eiffel related events. -- See also - - You want to contribute or follow the progress/discussion, see the [[collaboration page| Community-collaboration]] +## Documentation ## +- to redo + +## Contributions ## +- You want to contribute or follow the progress/discussion, see the [[collaboration page| Community-collaboration]] +- Potential tasks/projects on EWF: [[Projects page| Projects]] + +## See also ## - [[list of tasks, and a potential roadmap| Tasks-Roadmap]] - [[General source structure of this project| Source-structure]] - EWSGI: [[Eiffel Web Server Gateway Interface| EWSGI]] - [[Overview of the server side architecture| Spec-Server-Architecture]] - This project is also a collection of [[Libraries]] related to the Web + +## Note ## + - This wiki needs to be updated, in the meantime, please have a look at the presentation: https://docs.google.com/presentation/pub?id=1GPFv6aHhTjFSLMnlAt-J4WeIHSGfHdB42dQxmOVOH8s&start=false&loop=false&delayms=3000 diff --git a/doc/wiki/Projects-new-suggestions.md b/doc/wiki/Projects-new-suggestions.md new file mode 100644 index 00000000..b7278fee --- /dev/null +++ b/doc/wiki/Projects-new-suggestions.md @@ -0,0 +1,14 @@ +Use this to suggest new projects, or request features. +The content of this page will be moved to the main [[Projects]] page for time to time. +For any entry, please use this template + +---- + +## Short title +* _Suggested by **your name**_": so that we know who suggested a feature. +* **Requirement**: ... if any, otherwise remove this line +* _Description_: ... a few lines to describe the project +* _References_: ... if any, otherwise remove this line + +---- + diff --git a/doc/wiki/Projects.md b/doc/wiki/Projects.md new file mode 100644 index 00000000..ad4f235f --- /dev/null +++ b/doc/wiki/Projects.md @@ -0,0 +1,231 @@ +This page lists potential projects on EWF, this is open for contribution. +If you are a student, don't hesitate to pick one, or even suggest a new project, or a project being a merge of several, in any case, you will get close support from EWF's team. + +---- +# Study/Analysis/Documentation + +## Evaluate EWF according to the following constraints ... +* _Suggested by **Javier**_ +* _Description_: According to http://www.amundsen.com/blog/archives/1130 , evaluate the current design of EWF to see if this match the different points. An other option would be to take the following REST implementation toolkit as a guide to evaluate EWF http://code.google.com/p/implementing-rest/wiki/RESTImplementationToolkit. + +## Road to Hypermedia API +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: +* _Description_: describe differents types of Web API, and how you can build them using EWF. Describing Pros and Cons. This should be on http://martinfowler.com/articles/richardsonMaturityModel.html + +## Build a video to demonstrate how an Hypermedia API works, and how to build it using EWF +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: produce a audio+video+slide that demonstrates how to build an hypermedia API using EWF. This could be based on upcoming "graphviz server" example, or an extension of existing RestBucksCRUD example, or any new example. + +---- +# Works related to EWF / framework / tools + +## Improve EWF +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Improve existing EWF source, this is a permanent task for EWF, and this can be code, documentation, tests, ... Among others , here is a list of needed effort: +** Improve encoding support +*∗ Better MIME handler +** _Support for configuration _ +** Ready to use logging facilities +** Smart handler for HEAD or similar +** Adding component to ease the caching functionalities +** Adding Session support +** URL rewriting ? +** Mass testing +** ... + +## Eiffel Web Nino +* _Suggested by **Javier & Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Currently Eiffel Web Nino, is a standalone httpd server written in Eiffel. It is great for development, or embedding httpd component in application. However there are room for improvement so that one can also use it as replacement for apache, iis, ... To reach this state, here are a list of task that should be achieved: +** Implement persistent connection +** Complete implementation of Eiffel Web Nino using pool of threads +** Complete migration of Eiffel Web Nino to SCOOP +** Improve Nino to become a real solution to host any web services/sites +** ... + +## New EWF connectors +* _Suggested by **Jocelyn & Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: EWF is relying on the notion of "connector" to achieve portability on various platform and underlying httpd server, currently EWF support any CGI or libFCGI system (i.e apache, IIS, ...), and provide a standalone version thanks to Eiffel Web Nino. The goal now, would be to support specific connector for: +** LightHTTP (http://www.lighttpd.net/) +** nginx (http://nginx.org/en/) + +## Concurrenty and EWF +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Check that EWF is compliant with concurrency (Eiffel Thread, and SCOOP), and provide an example using concurrency. + +## Design and build something like Ruby on Rails or Grails +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Using EWF, design and build the set of tools to provide a conventional MVC to create Web sites. This could be useful even if this is not the taste of everyone. + +## Provide a Websocket implementation +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Provide an implementation of websocket with EWF and eventually Eiffel Web Nino, then demonstrate it on a simple example. WebSocket is a web technology providing for bi-directional, full-duplex communications channels over a single TCP connection. +* See http://en.wikipedia.org/wiki/Websocket + +---- +# Usage of EWF + +## HAL browser +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Build a HAL browser to discover an API using HAL mediatype. The browser will be able to follow the links, and display the transmitted data. This could be a vision2 application inspired by http://haltalk.herokuapp.com/explorer/hal_browser.html#/. HAL stands for Hypertext Application Language see http://stateless.co/hal_specification.html. + +## Collection-JSON browser +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Build a Collection/JSON browser to discover an API using Collection/JSON mediatype. The browser will be able to follow the links, and display the transmitted data. This could be a vision2 application inspired by http://haltalk.herokuapp.com/explorer/hal_browser.html#/. Collection+JSON is a JSON-based read/write hypermedia-type, see http://www.amundsen.com/media-types/collection/ + +## Build a simple CMS with EWF +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Using EWF, Build a simple CMS (Content Management System) framework and then an example. It should provide common features such as: + - user management (register, login, lost password -> send email) + - page editing + - blog + - template / theme + - persistency / storage / ... + - extension at compilation time +* The result should be usable by any user to build his own CMS website, and extend it easily. + +## Build P2P connector +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Imagine you want to publish a website (or web service, API) running on your machine (behind firewall). One would need to initiate the connection via a public website, this is common for P2P software such as remote assistance (i.e: join.me, teamviewer, showmypc, ...) + +---- +# Libraries + +## Hypermedia API library to work with XHTML +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Use XHTML as a media type to for hypermedia API. See http://codeartisan.blogspot.com.ar/2012/07/using-html-as-media-type-for-your-api.html + +## Add support for Mediatype such as RSS, ATOM, ... +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: In addition to JSON, HAL, Collection+JSON, XHTML, application might want to support (read and write) standard media type such as RSS, ATOM, ... + +## Security: provide popular authentication mechanisms +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Any web service, web site, API need a reliable authentication mechanism, the could be on the server side or the client side to build mashup service (integrate with other web API such as google, flicker, ...). So far, EWF provides only basic HTTP Authorization, and application would need more solutions such as : + - OAuth: consumer and provider + - OpenID + - Google Connect + - Facebook Connect +* The goal is to provide component to consume other popular API/service, but also component for your own service so that other can consume it. + +## Security: provide popular authentication mechanisms +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Any web service, web site, API need a reliable authentication mechanism, the could be on the server side or the client side to build mashup service (integrate with other web API such as google, flicker, ...). So far, EWF provides only basic HTTP Authorization, and application would need more solutions such as : + - OAuth: consumer and provider + - OpenID + - Google Connect + - Facebook Connect +* The goal is to provide component to consume other popular API/service, but also component for your own service so that other can consume it. + +## Provide a SSO (Single Sign On) implementation (server, and clients) +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Design and build a Single Sign On implementation for Eiffel. That should include the authentication server, and at least one Eiffel client component (it would be convenient to also provide php, js, ...). In the same spirit, having Eiffel client for popular SSO server would be appreciated as well. +* _Reference_: + - http://en.wikipedia.org/wiki/Single_sign-on + - http://en.wikipedia.org/wiki/List_of_single_sign-on_implementations + +## library: Template engine +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Get inspired by any existing template engine, and build one for Eiffel, this should be easily usable within a web application. This could be inspired, or implementation of standard template engine, this way people can reuse existing content, or migrate easily their application to EWF. For inspiration, one can look at: + - http://www.smarty.net/ + - http://mustache.github.com/ + - http://en.wikipedia.org/wiki/Template_engine_(web) ... they are plenty of them, a comparison of the different engine would help. +* This is not specific to EWF, but it will be very useful in website context. + +## library: Wikitext, markdown parser and render engine +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Build component to support (read and write, and why not convert), lightweight markup language (see http://en.wikipedia.org/wiki/Lightweight_markup_language) such as wikitext, markdown, and other. The component should be able to read/scan, but also produce an HTML output. Focus first on wikitext, and markdown since they seems to be the most popular. +* Then , a nice addition would be to render those lightweight markup lang into Vision2 widget (not related to EWF, but could be useful to build (editor) desktop application) + +## library: Web component to build HTML5 widget +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Build set of Eiffel components to ease development of websites. First this should be based on HTML5. Idea for components: + - table widget (with sorting ...) + - suggestive typing widget + - tab ... + - WYSIWYG textarea widget (could reuse existing Javascript solution TinyMCE, CKEditor, OpenWysiwyg, ...) + - ... + +---- +# Clients + +## Libraries: Reusable Client Design based on J.Moore Presentation +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: TODO +* Generic client that can be customized (see design in slide 12) +* http://s3.amazonaws.com/cimlabs/Oredev-Hypermedia-APIs.pdf +* video http://vimeo.com/20781278 + +## Create a Client Cache based on Apache commons Client Cache. +* _Suggested by **Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: TODO +* http://hc.apache.org/httpcomponents-client-ga/httpclient-cache/index.html +* http://labs.xfinity.com/benchmarking-the-httpclient-caching-module + +## Add SSL support to Eiffel Net +* _Suggested by **Jocelyn**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Currently Eiffel Net does not provide any support to SSL (thus no HTTPS). For now Eiffel application often use the Eiffel cURL wrapper which provide SSL, but it would be more convenient to use directly Eiffel Net. Then find solution to add SSL support to EiffelNet, or to extend EiffelNet with an EiffelNet+OpenSSL solution, or other. + +## Build clients to consume popular RESTful APIs +* _Suggested by **Jocelyn & Javier**_ +* _Supervisor_: +* _Suitability_: TODO +* _Description_: Build Eiffel libraries to consume popular web APIs, such as: + - Google Discovery APIs + - Twitter + - Facebook + - Github + - Flickr + - ... etc +* This should reuse and improve the "http_client" provided by EWF. Eventually also write the EiffelNet implementation to be independant from cURL +* **Requirement**: OAuth client eiffel component + +---- +# Feel free to add new idea below this line +---- +Use the following page [[Projects new suggestions]] to suggest new project, or request a feature. \ No newline at end of file diff --git a/library/text/parser/uri_template/src/uri_template.e b/library/text/parser/uri_template/src/uri_template.e index 1a7587d5..b1bc3a4a 100644 --- a/library/text/parser/uri_template/src/uri_template.e +++ b/library/text/parser/uri_template/src/uri_template.e @@ -24,7 +24,7 @@ create {URI_TEMPLATE} make_from_uri_template convert - make ({READABLE_STRING_8}) + make ({READABLE_STRING_8, STRING_8}) feature {NONE} -- Initialization diff --git a/tools/ise_wizard/custom/ewf.dsc b/tools/ise_wizard/custom/ewf.dsc new file mode 100644 index 00000000..2524dfd6 --- /dev/null +++ b/tools/ise_wizard/custom/ewf.dsc @@ -0,0 +1,4 @@ +NAME="EWF: Eiffel Web Framework application, multi-platform, with EWF source code" +DESCRIPTION="Create a web server application based on the cross-platform library EWF. Using the original source code of EWF (i.e: not the one in $ISE_LIBRARY)" +LOCATION="ewf_custom" +PLATFORM="all" diff --git a/tools/ise_wizard/custom/resources/template.ecf b/tools/ise_wizard/custom/resources/template.ecf new file mode 100644 index 00000000..0fe0b5e3 --- /dev/null +++ b/tools/ise_wizard/custom/resources/template.ecf @@ -0,0 +1,21 @@ + + + + + + /EIFGENs$ + /CVS$ + /.svn$ + + + + + + + + + + + diff --git a/tools/ise_wizard/ewf.dsc b/tools/ise_wizard/ewf.dsc index 85b6a364..cf62696d 100644 --- a/tools/ise_wizard/ewf.dsc +++ b/tools/ise_wizard/ewf.dsc @@ -1,4 +1,4 @@ -NAME="Eiffel Web Framework application, multi-platform, with EWF" +NAME="EWF: Eiffel Web Framework application, multi-platform, with EWF" DESCRIPTION="Create a web server application based on the cross-platform library EWF." LOCATION="ewf" PLATFORM="all" diff --git a/tools/ise_wizard/ewf_ise_wizard-safe.ecf b/tools/ise_wizard/ewf_ise_wizard-safe.ecf index aede67cd..fa4c6cd1 100644 --- a/tools/ise_wizard/ewf_ise_wizard-safe.ecf +++ b/tools/ise_wizard/ewf_ise_wizard-safe.ecf @@ -1,6 +1,6 @@ - - + + /.git$ @@ -15,4 +15,7 @@ + + + diff --git a/tools/ise_wizard/install_wizard.bat b/tools/ise_wizard/install_ise_wizard.bat similarity index 69% rename from tools/ise_wizard/install_wizard.bat rename to tools/ise_wizard/install_ise_wizard.bat index 61c27d84..3aa39e7c 100644 --- a/tools/ise_wizard/install_wizard.bat +++ b/tools/ise_wizard/install_ise_wizard.bat @@ -2,10 +2,10 @@ setlocal rd /q/s tmp mkdir tmp -ecb -config ewf_ise_wizard-safe.ecf -finalize -c_compile -project_path tmp +ecb -config ewf_ise_wizard-safe.ecf -target wizard -finalize -c_compile -project_path tmp mkdir spec mkdir spec\%ISE_PLATFORM% -move tmp\EIFGENs\ewf_ise_wizard\F_code\ewf_ise_wizard.exe spec\%ISE_PLATFORM%\wizard.exe +move tmp\EIFGENs\wizard\F_code\wizard.exe spec\%ISE_PLATFORM%\wizard.exe rd /q/s tmp set WIZ_TARGET=%ISE_EIFFEL%\studio\wizards\new_projects\ewf diff --git a/tools/ise_wizard/install_ise_wizard_custom.bat b/tools/ise_wizard/install_ise_wizard_custom.bat new file mode 100644 index 00000000..f1b46778 --- /dev/null +++ b/tools/ise_wizard/install_ise_wizard_custom.bat @@ -0,0 +1,21 @@ +setlocal + +rd /q/s tmp +mkdir tmp +ecb -config ewf_ise_wizard-safe.ecf -target custom_wizard -finalize -c_compile -project_path tmp +mkdir custom +mkdir custom\spec +mkdir custom\spec\%ISE_PLATFORM% +move tmp\EIFGENs\custom_wizard\F_code\wizard.exe custom\spec\%ISE_PLATFORM%\wizard.exe +rd /q/s tmp + +set WIZ_TARGET=%ISE_EIFFEL%\studio\wizards\new_projects\ewf_custom +rd /q/s %WIZ_TARGET% +mkdir %WIZ_TARGET% +xcopy /I /E /Y %~dp0\pixmaps %WIZ_TARGET%\pixmaps +xcopy /I /E /Y %~dp0\resources %WIZ_TARGET%\resources +copy %~dp0\custom\resources\* %WIZ_TARGET%\resources +xcopy /I /E /Y %~dp0\custom\spec %WIZ_TARGET%\spec +copy %~dp0custom\ewf.dsc %WIZ_TARGET%\..\ewf_custom.dsc + +endlocal diff --git a/tools/ise_wizard/src/ewf_custom_wizard.e b/tools/ise_wizard/src/ewf_custom_wizard.e new file mode 100644 index 00000000..4141da07 --- /dev/null +++ b/tools/ise_wizard/src/ewf_custom_wizard.e @@ -0,0 +1,55 @@ +note + description : "Objects that ..." + author : "$Author$" + date : "$Date$" + revision : "$Revision$" + +class + EWF_CUSTOM_WIZARD + +inherit + EWF_WIZARD + redefine + get_information, + generate_project + end + +create + make + +feature -- Form + + get_information + do + if attached string_question ("Location of EWF source code (by default $EWF_DIR)?", Void, Void, False) as pn then + ewf_dir := pn.string + else + ewf_dir := "$EWF_DIR" + end + Precursor + end + +feature -- Generation + + generate_project (a_layout: WIZARD_LAYOUT) + do + if attached ewf_dir as d then + variables.force (d, "EWF_DIR") + Precursor (a_layout) + else + die (-1) + end + end + +feature -- Access + + ewf_dir: detachable READABLE_STRING_8 + +feature -- Change + +feature {NONE} -- Implementation + +invariant +-- invariant_clause: True + +end diff --git a/tools/ise_wizard/src/ewf_wizard.e b/tools/ise_wizard/src/ewf_wizard.e index 0967bd66..9d6f08a6 100644 --- a/tools/ise_wizard/src/ewf_wizard.e +++ b/tools/ise_wizard/src/ewf_wizard.e @@ -25,8 +25,6 @@ feature {NONE} -- Initialization end end -feature -- Status - feature -- Access project_directory_name: detachable READABLE_STRING_8 @@ -65,7 +63,7 @@ feature -- Form projet_name := "ewf" end - if boolean_question ("Do you want to use router (Y|n) ? ", <<["y", True], ["Y", True]>>, "Y") then + if boolean_question ("Do you want to use WSF_ROUTER (Y|n) ? ", <<["y", True], ["Y", True]>>, "Y") then use_router := True router_type := "uri-template" else @@ -121,6 +119,13 @@ feature -- Form tfn.add_extension ("ecf") copy_resource_template ("template.ecf", tfn.string) + create tfn.make_from_string (dn.string) + + tfn.set_file_name ("ewf") + tfn.add_extension ("ini") + copy_resource_template ("ewf.ini", tfn.string) + + create res.make (tfn.string, d.name) create dn.make_from_string (pdn) @@ -131,20 +136,15 @@ feature -- Form d.recursive_create_dir end create tfn.make_from_string (dn.string) - tfn.set_file_name ("ewb_application") + tfn.set_file_name ("ewf_application") tfn.add_extension ("e") if attached router_type as rt then check rt.same_string ("uri-template") end - copy_resource_template ("ewb_application-"+ rt +".e", tfn.string) + copy_resource_template ("ewf_application-"+ rt +".e", tfn.string) else - copy_resource_template ("ewb_application.e", tfn.string) + copy_resource_template ("ewf_application.e", tfn.string) end - create tfn.make_from_string (dn.string) - - tfn.set_file_name ("ewf") - tfn.add_extension ("ini") - copy_resource_template ("ewf.ini", tfn.string) send_response (res) end