Merge remote-tracking branch 'upstream/master' into filter

This commit is contained in:
Olivier Ligot
2012-09-05 14:08:41 +02:00
25 changed files with 709 additions and 101 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -1,8 +1,8 @@
note note
description: "A JSON converter" description: "A JSON converter"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: $" date: "$Date$"
revision: "$Revision: $" revision: "$Revision$"
file: "$HeadURL: $" file: "$HeadURL: $"
deferred class JSON_CONVERTER deferred class JSON_CONVERTER
@@ -19,7 +19,7 @@ feature -- Access
feature -- Conversion 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. -- Convert from JSON value.
-- Returns Void if unable to convert -- Returns Void if unable to convert
deferred deferred

View File

@@ -1,8 +1,8 @@
note note
description: "A JSON converter for HASH_TABLE [ANY, HASHABLE]" description: "A JSON converter for HASH_TABLE [ANY, HASHABLE]"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
file: "$HeadURL: $" file: "$HeadURL: $"
class JSON_HASH_TABLE_CONVERTER class JSON_HASH_TABLE_CONVERTER
@@ -26,7 +26,7 @@ feature -- Access
feature -- Conversion feature -- Conversion
from_json (j: attached like to_json): like object from_json (j: attached like to_json): like object
local local
keys: ARRAY [JSON_STRING] keys: ARRAY [JSON_STRING]
i: INTEGER i: INTEGER
@@ -41,7 +41,7 @@ feature -- Conversion
until until
i > keys.count i > keys.count
loop loop
h ?= json.object (keys [i], void) h ?= json.object (keys [i], Void)
check h /= Void end check h /= Void end
jv := j.item (keys [i]) jv := j.item (keys [i])
if jv /= Void then if jv /= Void then

View File

@@ -1,63 +1,30 @@
note note
description: "A JSON converter for LINKED_LIST [ANY]" description: "A JSON converter for LINKED_LIST [ANY]"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
file: "$HeadURL: $" file: "$HeadURL: $"
class JSON_LINKED_LIST_CONVERTER class JSON_LINKED_LIST_CONVERTER
inherit inherit
JSON_CONVERTER JSON_LIST_CONVERTER
redefine
object
end
create create
make make
feature {NONE} -- Initialization
make
do
create object.make
end
feature -- Access feature -- Access
object: LINKED_LIST [detachable ANY] object: LINKED_LIST [detachable ANY]
feature -- Conversion feature {NONE} -- Factory
from_json (j: like to_json): detachable like object new_object (nb: INTEGER): like object
local do
i: INTEGER create Result.make
do end
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
end -- class JSON_LINKED_LIST_CONVERTER end -- class JSON_LINKED_LIST_CONVERTER

View File

@@ -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

View File

@@ -1,8 +1,8 @@
note note
description: "Core factory class for creating JSON objects and corresponding Eiffel objects." description: "Core factory class for creating JSON objects and corresponding Eiffel objects."
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: $" date: "$Date$"
revision: "$Revision: $" revision: "$Revision$"
file: "$HeadURL: $" file: "$HeadURL: $"
class EJSON class EJSON
@@ -69,7 +69,7 @@ feature -- Access
elseif attached {STRING_8} an_object as s8 then elseif attached {STRING_8} an_object as s8 then
create {JSON_STRING} Result.make_json (s8) create {JSON_STRING} Result.make_json (s8)
elseif attached {STRING_32} an_object as s32 then 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 end
if Result = Void then if Result = Void then
@@ -253,9 +253,9 @@ feature {NONE} -- Implementation (Exceptions)
-- Exception message for failing to convert `a' to a JSON_VALUE. -- Exception message for failing to convert `a' to a JSON_VALUE.
do do
Result := exception_prefix + "Failed to convert Eiffel object to a JSON_VALUE" Result := exception_prefix + "Failed to convert Eiffel object to a JSON_VALUE"
if an_object /= Void then if an_object /= Void then
Result := ": " + an_object.generator Result := ": " + an_object.generator
end end
end end
feature {NONE} -- Implementation (JSON parser) feature {NONE} -- Implementation (JSON parser)

View File

@@ -1,14 +1,14 @@
note note
description: "[ description: "[
Shared factory class for creating JSON objects. Maps JSON Shared factory class for creating JSON objects. Maps JSON
objects to ELKS HASH_TABLEs and JSON arrays to ELKS objects to ELKS HASH_TABLEs and JSON arrays to ELKS
LINKED_LISTs. Use non-conforming inheritance from this LINKED_LISTs. Use non-conforming inheritance from this
class to ensure that your classes share the same class to ensure that your classes share the same
JSON_FACTORY instance. JSON_FACTORY instance.
]" ]"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: $" date: "$Date$"
revision: "$Revision: $" revision: "$Revision: 89185 $"
file: "$HeadURL: $" file: "$HeadURL: $"
class SHARED_EJSON class SHARED_EJSON
@@ -17,14 +17,20 @@ feature
json: EJSON json: EJSON
-- A shared EJSON instance with default converters for -- 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 local
jalc: JSON_ARRAYED_LIST_CONVERTER
jllc: JSON_LINKED_LIST_CONVERTER jllc: JSON_LINKED_LIST_CONVERTER
jhtc: JSON_HASH_TABLE_CONVERTER jhtc: JSON_HASH_TABLE_CONVERTER
once once
create Result create Result
create jalc.make
Result.add_converter (jalc)
create jllc.make create jllc.make
Result.add_converter (jllc) Result.add_converter (jllc)
create jhtc.make create jhtc.make
Result.add_converter (jhtc) Result.add_converter (jhtc)
end end

View File

@@ -1,9 +1,8 @@
note note
description: "A JSON converter for AUTHOR" description: "A JSON converter for AUTHOR"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: 2010-03-08 20:46:59 -0300 (Mon, 08 Mar 2010) $" date: "$Date$"
revision: "$Revision: 82 $" revision: "$Revision$"
file: "$HeadURL: https://svn.origo.ethz.ch/ejson/branches/POC-converters-factory/test/json_author_converter.e $"
class JSON_AUTHOR_CONVERTER class JSON_AUTHOR_CONVERTER

View File

@@ -1,9 +1,8 @@
note note
description: "A JSON converter for BOOK_COLLECTION" description: "A JSON converter for BOOK_COLLECTION"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: 2010-03-08 20:46:59 -0300 (Mon, 08 Mar 2010) $" date: "$Date$"
revision: "$Revision: 82 $" revision: "$Revision$"
file: "$HeadURL: https://svn.origo.ethz.ch/ejson/branches/POC-converters-factory/test/json_book_collection_converter.e $"
class JSON_BOOK_COLLECTION_CONVERTER class JSON_BOOK_COLLECTION_CONVERTER

View File

@@ -1,9 +1,8 @@
note note
description: "A JSON converter for BOOK" description: "A JSON converter for BOOK"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: 2010-03-08 20:46:59 -0300 (Mon, 08 Mar 2010) $" date: "$Date$"
revision: "$Revision: 82 $" revision: "$Revision$"
file: "$HeadURL: https://svn.origo.ethz.ch/ejson/branches/POC-converters-factory/test/json_book_converter.e $"
class JSON_BOOK_CONVERTER class JSON_BOOK_CONVERTER

View File

@@ -632,7 +632,7 @@ feature -- Test
jrep := "%"foo\\bar%"" jrep := "%"foo\\bar%""
create parser.make_parser (jrep) create parser.make_parser (jrep)
if attached {JSON_STRING} parser.parse as jstring then 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 end
create js.make_json_from_string_32 ({STRING_32}"%/20320/%/22909/") create js.make_json_from_string_32 ({STRING_32}"%/20320/%/22909/")

View File

@@ -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]]. 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) - 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). - 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. - For time to time we have web meeting, and less frequently physical meetings that occurs usually during other Eiffel related events.
- See also ## Documentation ##
- You want to contribute or follow the progress/discussion, see the [[collaboration page| Community-collaboration]] - 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]] - [[list of tasks, and a potential roadmap| Tasks-Roadmap]]
- [[General source structure of this project| Source-structure]] - [[General source structure of this project| Source-structure]]
- EWSGI: [[Eiffel Web Server Gateway Interface| EWSGI]] - EWSGI: [[Eiffel Web Server Gateway Interface| EWSGI]]
- [[Overview of the server side architecture| Spec-Server-Architecture]] - [[Overview of the server side architecture| Spec-Server-Architecture]]
- This project is also a collection of [[Libraries]] related to the Web - 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

View File

@@ -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
----

231
doc/wiki/Projects.md Normal file
View File

@@ -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.

View File

@@ -24,7 +24,7 @@ create {URI_TEMPLATE}
make_from_uri_template make_from_uri_template
convert convert
make ({READABLE_STRING_8}) make ({READABLE_STRING_8, STRING_8})
feature {NONE} -- Initialization feature {NONE} -- Initialization

View File

@@ -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"

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="${WIZ:TARGET_NAME}" uuid="${WIZ:UUID}">
<target name="${WIZ:TARGET_NAME}">
<root class="EWF_APPLICATION" feature="make_and_launch"/>
<file_rule>
<exclude>/EIFGENs$</exclude>
<exclude>/CVS$</exclude>
<exclude>/.svn$</exclude>
</file_rule>
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
</option>
<setting name="concurrency" value="${WIZ:CONCURRENCY}"/>
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
<library name="default_${WIZ:EWF_CONNECTOR}" location="${WIZ:EWF_DIR}/library/server/wsf/default/${WIZ:EWF_CONNECTOR}-safe.ecf"/>
<library name="encoder" location="${WIZ:EWF_DIR}/library/text/encoder/encoder-safe.ecf" readonly="false"/>
<library name="wsf" location="${WIZ:EWF_DIR}/library/server/wsf/wsf-safe.ecf" readonly="false"/>
<library name="http" location="${WIZ:EWF_DIR}/library/network/protocol/http/http-safe.ecf" readonly="false"/>
<cluster name="src" location=".\src\" recursive="true"/>
</target>
</system>

View File

@@ -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." DESCRIPTION="Create a web server application based on the cross-platform library EWF."
LOCATION="ewf" LOCATION="ewf"
PLATFORM="all" PLATFORM="all"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="ewf_ise_wizard" uuid="F881A707-745E-4C6D-90D1-F820EE3B1470"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="wizard" uuid="F881A707-745E-4C6D-90D1-F820EE3B1470">
<target name="ewf_ise_wizard"> <target name="wizard">
<root class="EWF_WIZARD" feature="make"/> <root class="EWF_WIZARD" feature="make"/>
<file_rule> <file_rule>
<exclude>/.git$</exclude> <exclude>/.git$</exclude>
@@ -15,4 +15,7 @@
<library name="vision2" location="$ISE_LIBRARY\library\vision2\vision2-safe.ecf"/> <library name="vision2" location="$ISE_LIBRARY\library\vision2\vision2-safe.ecf"/>
<cluster name="src" location=".\src\" recursive="true"/> <cluster name="src" location=".\src\" recursive="true"/>
</target> </target>
<target name="custom_wizard" extends="wizard">
<root class="EWF_CUSTOM_WIZARD" feature="make"/>
</target>
</system> </system>

View File

@@ -2,10 +2,10 @@ setlocal
rd /q/s tmp rd /q/s tmp
mkdir 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
mkdir spec\%ISE_PLATFORM% 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 rd /q/s tmp
set WIZ_TARGET=%ISE_EIFFEL%\studio\wizards\new_projects\ewf set WIZ_TARGET=%ISE_EIFFEL%\studio\wizards\new_projects\ewf

View File

@@ -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

View File

@@ -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

View File

@@ -25,8 +25,6 @@ feature {NONE} -- Initialization
end end
end end
feature -- Status
feature -- Access feature -- Access
project_directory_name: detachable READABLE_STRING_8 project_directory_name: detachable READABLE_STRING_8
@@ -65,7 +63,7 @@ feature -- Form
projet_name := "ewf" projet_name := "ewf"
end 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 use_router := True
router_type := "uri-template" router_type := "uri-template"
else else
@@ -121,6 +119,13 @@ feature -- Form
tfn.add_extension ("ecf") tfn.add_extension ("ecf")
copy_resource_template ("template.ecf", tfn.string) 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 res.make (tfn.string, d.name)
create dn.make_from_string (pdn) create dn.make_from_string (pdn)
@@ -131,20 +136,15 @@ feature -- Form
d.recursive_create_dir d.recursive_create_dir
end end
create tfn.make_from_string (dn.string) create tfn.make_from_string (dn.string)
tfn.set_file_name ("ewb_application") tfn.set_file_name ("ewf_application")
tfn.add_extension ("e") tfn.add_extension ("e")
if attached router_type as rt then if attached router_type as rt then
check rt.same_string ("uri-template") end 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 else
copy_resource_template ("ewb_application.e", tfn.string) copy_resource_template ("ewf_application.e", tfn.string)
end 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) send_response (res)
end end