Thanks Mathieu,

FYI: You were lucky that your attached patches passed, it's not usually.

In general better to reference patches in some place. An existing Jira, like 
OFBIZ-4274 or OFBIZ-10438 here, fits here

Jacques


Le 03/07/2018 à 18:05, Mathieu Lirzin a écrit :
Hello,

Following revert of rev 1834917, I want to “properly” propose adding a
‘method’ attribute to ‘request-map’ elements.

I am currently working on adding REST based Web APIs to OFBiz [1].  In
order to do that, it is important for the HTTP controller to handle
various HTTP methods differently, meaning allowing a different request
handler to be called depending on the method of the HTTP request.
Syntactically I am proposing the following:

    <request-map uri="examples" method="get">
       <security https="true" auth="true"/>
       <event type="java" path="ExamplesHandlers" invoke="getExamples"/>
       <response name="success" type="view" value="..."/>
       <response name="error" type="view" value="..."/>
    </request-map>

    <request-map uri="examples" method="post">
       <security https="true" auth="true"/>
       <event type="java" path="ExamplesHandlers" invoke="postExamples"/>
       <response name="success" type="view" value="..."/>
       <response name="error" type="view" value="..."/>
    </request-map>

Here ‘method’ is an optional attribute which defaults to "all" and/or
"".  Currently the patch supports both but I would be in favour of
handling only one for the sake of simplicity.  The semantic of that
default is that it mimics the current behavior, meaning it handles every
methods.

Attached you will find a serie of 3 patches (meant to be applied in
order) implementing the described change:

- The first one handles the parsing of the XML (the change in the xsd
   file has not been reverted).

- The second is a simple refactoring to agglomerate the read of the XML
   file in one place.  This is done to ease the implementation and tests
   in the third patch.

- The third patch implements the segregation of ‘request-map’ elements
   based on the actual request method.  In order to associate a request
   to an event handler we now need to dispatch both on the URI and on the
   method.  To achieve that, I have decided to keep using the URI as a
   key but associate it to a List of ‘request-map’ (one for each method)
   instead of a single one.  In term of implementation a ‘MultivaluedMap’
   has been used.  The list of candidates for a particular URI is then
   filtered to keep only the best matching one.  The ‘request-map’ Map
   concrete type was a MapContext which is a stack of Maps (to handle
   includes), The ‘MultivaluedMapContext’ implementation is an adaptation
   of MapContext to MultivaluedMaps.  Since
   ‘ControllerConfig::getRequestMapMap’ is used at multiple places I have
   kept it temporarily and replaced its code with an adapter to the new
   ‘ControllerConfig::getRequestMapMultiMap’ method.



Comments, questions and/or reviews welcome.

[1] https://issues.apache.org/jira/browse/OFBIZ-4274


Reply via email to