Issue Details (XML | Word | Printable)

Key: WW-3195
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Jasper Rosenberg
Votes: 0
Watchers: 2
Operations

If you were logged in you would be able to see more operations.
Struts 2

When FreemarkerResult isn't writing directly to Response, s.action tag is broken

Created: 17/Jul/09 07:02 PM   Updated: 27/Oct/09 05:04 PM
Return to search
Component/s: None
Affects Version/s: 2.1.8
Fix Version/s: 2.2.0

Issue Links:
Duplicate
 
Reference
 

Flags: Patch


 Description  « Hide
In https://issues.apache.org/struts/browse/WW-1808, the FreemarkerResult was improved to support not writing to the response until it had completed processing.

Unfortunately, if you are using an s.action tag, then that means the s.action output ends up before the main template output rather than inline.

One way to fix this (which I did locally) is to add a thread local that keeps track of the "parent" writer such that if there is one present the child writes to that at the end rather than the response's writer.

Something like:

    /** Thread local for the current writer. */
    private static final ThreadLocal<CharArrayWriter> WRITER_THREAD_LOCAL
        = new ThreadLocal<CharArrayWriter>();

...
   // Inside the case where we are writing upon completion

            CharArrayWriter parentCharArrayWriter = WRITER_THREAD_LOCAL.get();
            try {
                // Process the template with the normal writer since it was available
                // But delay writing in case exception
                CharArrayWriter charArrayWriter = new CharArrayWriter(1024);
                
                if (parentCharArrayWriter == null) {
                    WRITER_THREAD_LOCAL.set(charArrayWriter);
                }
                
                template.process(model, charArrayWriter);

                charArrayWriter.flush();

                // Only the template that created the writer can actually write
                // to the response. This is necessary to support the s.action tag.
                if (parentCharArrayWriter == null) {
                    charArrayWriter.writeTo(writer); // Write to the response writer
                } else {
                    // Copying to parent enmass so don't get partially rendered s.actions
                    charArrayWriter.writeTo(parentCharArrayWriter);
                }
            } finally {
                if (parentCharArrayWriter == null) {
                    WRITER_THREAD_LOCAL.remove();
                }
            }




 All   Comments   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Jasper Rosenberg made changes - 17/Jul/09 07:02 PM
Field Original Value New Value
Link This issue is related to WW-1808 [ WW-1808 ]
Musachy Barroso made changes - 12/Aug/09 10:15 PM
Fix Version/s 2.1.8 [ 21920 ]
Fix Version/s 2.1.9 [ 21930 ]
Wes Wannemacher made changes - 22/Sep/09 06:40 PM
Affects Version/s 2.1.7 [ 21907 ]
Affects Version/s 2.1.8 [ 21920 ]
Musachy Barroso made changes - 26/Oct/09 10:57 PM
Link This issue is duplicated by WW-3301 [ WW-3301 ]
Musachy Barroso made changes - 26/Oct/09 10:58 PM
Fix Version/s 2.1.9 [ 21930 ]
Fix Version/s 2.2.0 [ 21960 ]
Musachy Barroso made changes - 27/Oct/09 05:04 PM
Resolution Fixed [ 1 ]
Status Open [ 1 ] Resolved [ 5 ]