On 21/feb/2011, at 10.56, Simone Tripodi wrote:

> Hi all,
> I'd tend agree with Reinhard if the CloseShield functionality is not
> simple (and I mean very simple, almost silly) to replicate into our
> module.
> I'm sure the CloseShield in the IO takes care of more general
> PrintStream use cases rather then just the sysout, so I'm worried that
> the proposed patch is not enough...

For the sake of clarity: I've proposed that naive patch mainly because I think 
that Log*Transformers are there to be used only for dev purpose, where 
System.out or FileOutpuStream are the only viable candidates.

Anyway, I've taken a quick look to 
http://s.apache.org/commons-io-close-shield-outputstream and its parent class 
http://bit.ly/h7AolY: it seems to me that it would be quite easy to embed these 
two classes in order to have a CloseShield functionality in cocoon3-sax.

If you think that it could be useful to have such functionality there (also for 
usage by other classes than just Log*Transformers), please let me know.

Cheers.

> 2011/2/18 Francesco Chicchiriccò <francesco.chicchiri...@tirasa.net>:
>> On 18/feb/2011, at 20.28, Reinhard Pötz wrote:
>> 
>>> I had to comment the usage of the Log*Transformers in the sample sitemap 
>>> because they break the integration tests (run it.sh or it.bat from C3's 
>>> root directory). The problem is that the logfile is written to the file 
>>> system which doesn't work in a multi-module build (<map:parameter 
>>> name="logfile" value="target/logasxml.log" /> -> there is no target 
>>> directory at the base directory).
>>> 
>>> IMO the best idea would be changing the transformer configurations to use 
>>> System.out but the current implementations close the output stream in their 
>>> finish methods. That's of course useful for FileOutputStreams but mustn't 
>>> happen for System.out.
>>> 
>>> IMO the best solution would be wrapping the usage of System.out with 
>>> Commons IO's CloseShieldOutputStream 
>>> (http://s.apache.org/commons-io-close-shield-outputstream). However, this 
>>> would introduce a dependency of cocoon-sax on commons-io which should be 
>>> avoided for a minor use case like this.
>>> 
>>> I see two possible solutions:
>>> 
>>> a) move the Log*Transformers to cocoon-optional and wrap the usage
>>>   of System.out with the CloseShieldOutputStream
>>> 
>>> b) implement the CloseShield functionality ourselves and leave them
>>>   where they are.
>>> 
>>> I would prefer option a) because it's the simpler solution and leads to 
>>> less code.
>>> 
>>> WDYT?
>> 
>> What if we choose a third option, like changing
>> 
>>                this.outputStream.close();
>> 
>> to
>> 
>>                if (System.out.equals(this.outputStream)) {
>>                    this.outputStream.flush();
>>                } else {
>>                    this.outputStream.close();
>>                }
>> 
>> in the finish() body, for both transformers?
>> 
>> I made these simple modifications (in the attached patch) and, at least on 
>> my machine, the integration tests are running successfully.
>> 
>> Let me know if this solution is acceptable, thanks.
>> 
>> Regards.

Reply via email to