[ 
https://issues.apache.org/jira/browse/LABS-192?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12654678#action_12654678
 ] 

Simone Gianni commented on LABS-192:
------------------------------------

A common case where having them separated makes things more complex than they 
should be is when a do-method should delegate to other do-methods OR 
handle-methods.

For example, I could have a doLoginBox method, that reads as follows :

public HtmlProducer doLoginBox() {
  if (sessionUser == null) {
    return handleLoginForm().do_default();
  } else {
    return doHelloUser();
  }
}

The do_default() call is used to resolve the login form (supposing it is a 
SmartForm, so a handler) to an HtmlProducer.

Having SmartForm be an HtmlProducer itself (as any other handler), would 
simplify this code, and could even bring to :

public HtmlProducer doLoginBox() {
  if (sessionUser == null) {
    return new SmartForm(new LoginRequest(), ...);
  } else {
    return doHelloUser();
  }
}

Anyway this second solution, while legal, would bring to a blur between 
do-methods and handle-methods, making one of the two useless.

While this is not bad at all, still some kind of problems arise, cause handlers 
will generate URLs to them (why use handlers otherwise?), and these urls will 
be resolved re-calling the do method and "hoping" it will return the same 
handler again. From a certain POV, this is nothing new : right now it is 
already possible to place an "if" in a handle method, causing the same problem, 
and anyway such problems will arise in every web application and a web 
developer is aware of how it works.

Another problem could be the tendency of the developer to declare all methods 
returning a HtmlProducer, making it impossible to use calls from outside (like 
in Templates or in links using cglib), or introducing dangerous casts. So the 
rule of thumb should be "declare the method as returning the highest possible 
class in the hierarchy", which is far beyond the complexity we would like to 
achieve. Right now, instead, the rules are "declare a do-method returning a 
Producer, declare a handle-method returning the kind of handler it is going to 
return", which makes it far simpler, but requires spurious handle methods here 
and there.

Another common use case is the opposite of the one before : a method that 
usually returns a certain handler, but occasionally should return something 
else, like a page saying that you are not allowed to see this part of the site. 
In this case, no hierarchy will ever help, cause we need the method to return 
the handler class and still return from inside the method a producer.

This case is only resolvable with a specific exception, containing a producer, 
thrown inside the method instead of returning the expected handler, but while 
this exception can easily be caught during the programmatic resolve of a URI, 
it cannot be resolved easily during external calls from a Template. In fact, 
even placing an aspect to capture it, it will fail because the JVM will check 
for proper casts. This mean that, to properly handle this situation and give 
all this flexibility, all calls from outside (not from a do or handle method) 
must be mocked with cglib and then executed in an environment able to catch the 
exception and act properly. This is not a problem cause calls for links would 
have been handled this way anyway, and calls for templates should be handled 
this way for performance reasons (for the ifNeeded and byDefault).



> WEB: Merge handler and producers in a single hierarchy
> ------------------------------------------------------
>
>                 Key: LABS-192
>                 URL: https://issues.apache.org/jira/browse/LABS-192
>             Project: Labs
>          Issue Type: Improvement
>          Components: Magma
>    Affects Versions: Current
>            Reporter: Simone Gianni
>            Assignee: Simone Gianni
>             Fix For: Future
>
>
> Having them separated makes a lot of stuff complex, and duplicates a lot of 
> code since both have very similar parameters (like the creating handler, the 
> base and complete path etc..).
> The system could consider the handler a kind of producer which is further 
> resolvable to obtain yet another producer, until the resulting producer is 
> not resolvable anymore.
> So, the common interface could contain a single method "resolve", which will 
> ultimately return a non resolvable producer, either the same producer that 
> has been called or null if the request is not resolvable.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to