Tim Williams wrote:
First, great work on this.  I feel I was pretty tough - for good
reason - when the idea first presented itself.  I now feel like we've
got the basis for some concrete feedback.

I totally respect your "toughness" it makes one question ones own belief. That's the point of community development. It is a pleasure to have people like yourself (and the many others who discussed the original thought experiment).

Now that I'm able to get the vision, I'm wondering what the way ahead
is.  I realize we've had very little feedback from the rest of the
community but I'd like to hear your concept.  Is this codebase to seed
thought or to be a foundation?

To seed thought. If some of it can be reused then all well and good. However, I will not stand in the way of throwing it out and doing something better.

I ask for several reasons:

o) I think we've got a good situation where a Forrest Tuesday might be
in order to get everyone on the same page to provide feedback.

Probably a good idea, but not until the new year. We don't need to rush on this, we need to get 0.8 out and we need to give people time to look at the experimental stuff in whiteboard.

o) I wonder whether it's worth contributing to the rather obvious
holes that currently exist.

Depends on how much of the current code your gut tells you can be reused and if you want to work on experimental stuff that may get thrown out.

I'd be very happy to welcome contributions of any kind. If the community sees value in it then the code will survive.

o) I wonder whether you've got much invested in this particular
codebase and thus aren't willing to shift so much OR you're pliable?

Everything is open to discussion.

For example, I dont' particularly care for the implicit protocol
pipelining and would rather a more explicit approach/grammar.  I think
the need to make matching decisions on Servlet parameters is
essential.  Etc.

Actually, this is one of the key things that brings benefit to this work, IMHO. The idea is you drop in a document, make a request and out comes what you want. No need to worry about what path through the system is taken, all you need to do is make sure the input can be handled, and the output can be handled and that is it. In other words, no programming of pipelines is required the user need know nothing about them.

It does make debugging more difficult, but that's easily addressed by providing a facility that, given a document request, outputs what the processing pipeline would be. E.g. asking for helloWorld.xml.forrestPipeline would give an output something like:

<request uri="helloWorld.html">
 <sources>
   <source uri="helloWorld.xml" required="false" present="false"
           matchingpattern = "(.*)/(.*)\.xhtml2"/>
   <source uri="helloWorld.xhtml2" required="false" present="true"
           matchingpattern = "(.*)/(.*)\.xhtml2"/>
  </source>

  <inputPlugin id="xhtml2"/>

  <outputPlugin id="html"/>
</request>

I appreciate this seems really strange, but it is extremely powerful once you get the hang of it.

One other major advantage that I see in this approach is that the definition language is now the language of whatever container we are using. We can replace the container very easily as it's dependency only go as deep as a single class in core (and one in test).

I designed it this way in order to make Forrest2 as flexible as possible. For example, by rewriting that single class (org.apache.forrest.core.Controller) we can provide a version of Forrest that uses any other container and/or pipeline description language.

In other words, there is nothing stopping us having multiple controllers, one that uses my own style, one that uses an explicit pipeline language you define, another that uses XPipelines etc.

So, if you want to make a counter proposal which explicitly defines the pipelines, be my guest. Lets consider the advantages of each approach and then implement a third that is the killer offspring of the two.

Ross