[ 
https://issues.apache.org/jira/browse/WW-4749?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15988631#comment-15988631
 ] 

Lorenzo Bernacchioni edited comment on WW-4749 at 4/28/17 10:57 AM:
--------------------------------------------------------------------

Uhm.. the change from {{Boolean}} to {{boolean}} leads to

{code}
final boolean willUseBufferedWriter = isUseBufferedWriter() || 
template.getTemplateExceptionHandler() == 
TemplateExceptionHandler.RETHROW_HANDLER;
{code}

So we fall again in the issue of my scenario: if I'm adopting a 
{{TemplateExceptionHandler.RETHROW_HANDLER}} policy I can't prevent the use 
{{bufferedWriter}}, because the line above is always {{true}}.

The use of {{Boolean}} let you force the behaviour in both ways. Leave it as 
{{null}} to let the behaviour depend on the TemplateExceptionHandler policy.

{code}
private Boolean useBufferedWriter = null;
[...]
final boolean willUseBufferedWriter;
if (useBufferedWriter != null) {
    willUseBufferedWriter = useBufferedWriter;
} else {
    willUseBufferedWriter = template.getTemplateExceptionHandler() == 
TemplateExceptionHandler.RETHROW_HANDLER;
}
{code} 


was (Author: fustaki):
Uhm.. the change from {{Boolean}} to {{boolean}} leads to

{code}
final boolean willUseBufferedWriter = isUseBufferedWriter() || 
template.getTemplateExceptionHandler() == 
TemplateExceptionHandler.RETHROW_HANDLER;
{code}

So we fall again in the issue of my scenario: if I'm adopting a 
{{TemplateExceptionHandler.RETHROW_HANDLER}} policy I can't prevent the use 
{{bufferedWriter}}, because the line above is always {{true}}.

The use of {{Boolean}} let you force the behaviour in both ways. Leave it as 
{{null}} to let the behaviour depend on the TemplateExceptionHandler policy.

{code}
final boolean willUseBufferedWriter;
if (useBufferedWriter != null) {
    willUseBufferedWriter = useBufferedWriter;
} else {
    willUseBufferedWriter = template.getTemplateExceptionHandler() == 
TemplateExceptionHandler.RETHROW_HANDLER;
}
{code} 

> Buffer/Flush behaviour in FreemarkerResult
> ------------------------------------------
>
>                 Key: WW-4749
>                 URL: https://issues.apache.org/jira/browse/WW-4749
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Core Results
>    Affects Versions: 2.3.31, 2.5.1
>            Reporter: Lorenzo Bernacchioni
>            Assignee: Lukasz Lenart
>            Priority: Minor
>             Fix For: 2.5.next
>
>
> Scenario: the application use freemarker with a 
> {{TemplateExceptionHandler.RETHROW_HANDLER}} policy, but occasionally needs 
> to produce large XML (20~200Mb) and goes out of memory.
> In 
> [FreemarkerResult|http://grepcode.com/file/repo1.maven.org/maven2/org.apache.struts/struts2-core/2.5-BETA1/org/apache/struts2/views/freemarker/FreemarkerResult.java#191]
>  there are two possible behaviours (line 191):
>  * *Buffer-behaviour*: the whole template is processed and if everything is 
> OK it is flushed to the output, otherwise an exception is thrown and handled 
> at higher level before any output has been sent. This is intended to be used 
> when {{TemplateExceptionHandler.RETHROW_HANDLER}} is active
> * *Flush-behaviour*: template is processed and flushed according to 
> freemarker library policies, used with any other {{TemplateExceptionHandler}}
> Since {{TemplateExceptionHandler}} cannot be switched for a given request (it 
> is a global configuration embedded in {{FreemarkerManager}}) there is no way 
> to force a Flush-behaviour. (you can only force a Buffer-behaviour using 
> {{isWriteIfCompleted}})
> I implemented a more flexible solution that let you force the behaviour in 
> both ways:
> {code:title=FreemarkerResult.java|borderStyle=solid}
>     final boolean willUsebufferedWriter;
>     if (useBufferedWriter != null){
>         willUsebufferedWriter = useBufferedWriter;
>     }else{
>         willUsebufferedWriter = configuration.getTemplateExceptionHandler() 
> == TemplateExceptionHandler.RETHROW_HANDLER;
>     }
>                 
>     if (willUsebufferedWriter){
>     ...
>     }else{
>     ...
>     }       
> {code}
> where {{useBufferedWriter}} is a parameter that can be modified per request
> {code}
> <result type="freemarker">
>     <param name="location">big_feed.ftl</param>
>     <param name="contentType">text/xml</param>
>     <param name="useBufferedWriter">false</param>
> </result>
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to