On 09.05.2008 09:41, Peter Hunsberger wrote:

I think this is rather hard to do. The place where we instantiate the
BufferedOutputStreams (both java.io and o.a.c.util) is
AbstractEnvironment.getOutputStream(int bufferSize). So in order to pass a
second buffer size argument to the BufferedOutputStream constructor we need
to have it available there. One option would be to add it to
getOutputStream() - which is an interface change and not really nice.

I haven't looked at the code here, but couldn't you just introduce a
second getOutputStream( int bufferSize ) method where the current
interface method continues with the current default logic if it is
used?

getOutputStream() actually already takes an int parameter, the flush buffer size. Whether to add another getOutputStream() method or modify the existing one there is not really a difference IMO. Environment is a kind of internal interface (or SPI how it used to be called lately, isn't it?). This means there should be only very few implementations besides the one we provide if at all (Forrest, Lenya, CLI environment?). And in Cocoon we would change all usages of the single-parameterized method to the one with 2 parameters. So whoever provides such an Environment implementation has to adapt his implementation in a meaningful way anyway (empty implementation returning null, throwing NotSupportedException, whatever would not work). So it's the same effort for them whether to add a new method or changing existing one on the interface.

IMO the decision should be made purely from a design perspective. Should a configuration parameter passed around as method parameter though it is static through the whole lifecycle of the Environment instance? In a perfect world I'd say no :) Which leaves the question how to inject the parameter. One place is on instantiation (e.g. CocoonServlet.getEnvironment(..) in 2.1, RequestProcessor.getEnvironment(..) in 2.2) which leaves us with the web.xml init parameter (or analogical alternatives for other environments) as described.

Another option I found is to setup the environment (i.e. injecting the parameter) while setting up the pipeline. AbstractProcessingPipeline is the place where we have access to the current flush buffer size parameter and call getOutputStream(..) on the environment. It has a method setupPipeline(Environment). Why not injecting the parameter(s) here? Due to its lifecycle changing the property of the environment should not cause any problem since it's a one-time usage object, no threading problems or something like that.

I'm just curious what the original reason was to pass the parameter along rather than injecting it? Maybe there is a flaw in my thoughts :) Whoever knows the code, are my statements correct and what do you think about the approach injecting the parameters rather than passing them along? Second, if it is a valid approach which way to go?

1) Don't provide a separate configuration option for initial buffer size.
2) Pass both parameters to getOutputStream(..).
3) Leave the current flush buffer size as parameter to getOutputStream(..) but inject the other one
a) from web.xml.
b) from pipeline configuration.
4) Inject both buffer sizes, eventually reactivating/reintroducing getOutputStream() without any parameter and deprecating the other one.

Many questions, yet another one: What do you think? :)

Joerg

Reply via email to