You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Don Brown (JIRA)" <ji...@apache.org> on 2008/04/19 15:37:05 UTC

[jira] Resolved: (WW-2551) premature close of stream in XLSTResult

     [ https://issues.apache.org/struts/browse/WW-2551?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Don Brown resolved WW-2551.
---------------------------

       Resolution: Fixed
    Fix Version/s: 2.1.2
         Assignee: Don Brown

Fixed, thanks for the detailed solution

> premature close of stream in XLSTResult
> ---------------------------------------
>
>                 Key: WW-2551
>                 URL: https://issues.apache.org/struts/browse/WW-2551
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Core Actions
>    Affects Versions: 2.0.11
>         Environment: Struts-2.0.11
>            Reporter: Martin Gainty
>            Assignee: Don Brown
>            Priority: Critical
>             Fix For: 2.1.2
>
>
> //2 streams are created from same Response
> //when the stream is closed the writer for the second becomes non-operational..
>    public void execute(ActionInvocation invocation) throws Exception {
>         long startTime = System.currentTimeMillis();
>         String location = getStylesheetLocation();
>         if (parse) {
>             ValueStack stack = ActionContext.getContext().getValueStack();
>             location = TextParseUtil.translateVariables(location, stack);
>         }
>         try {
>             HttpServletResponse response = ServletActionContext.getResponse();
> /************************HERE is a PrintWriter object that can return character data to the client*************************/
>             Writer writer = response.getWriter();
>             // Create a transformer for the stylesheet.
>             Templates templates = null;
>             Transformer transformer;
>             if (location != null) {
>                 templates = getTemplates(location);
>                 transformer = templates.newTransformer();
>             } else
>                 transformer = TransformerFactory.newInstance().newTransformer();
>             transformer.setURIResolver(getURIResolver());
>             String mimeType;
>             if (templates == null)
>                 mimeType = "text/xml"; // no stylesheet, raw xml
>             else
>                 mimeType = templates.getOutputProperties().getProperty(OutputKeys.MEDIA_TYPE);
>             if (mimeType == null) {
>                 // guess (this is a servlet, so text/html might be the best guess)
>                 mimeType = "text/html";
>             }
>             response.setContentType(mimeType);
>             Object result = invocation.getAction();
>             if (exposedValue != null) {
>                 ValueStack stack = invocation.getStack();
>                 result = stack.findValue(exposedValue);
>             }
>             Source xmlSource = getDOMSourceForStack(result);
>             // Transform the source XML to System.out.
> /*************************Why a second writer ..whats wrong with writer???********************************/
>             PrintWriter out = response.getWriter();
>             LOG.debug("xmlSource = " + xmlSource);
>             transformer.transform(xmlSource, new StreamResult(out));
> /*************************TROUBLE here closing The character-output stream of this PrintWriter. **************/
>             out.close(); // ...and flush...
>             if (LOG.isDebugEnabled()) {
>                 LOG.debug("Time:" + (System.currentTimeMillis() - startTime) + "ms");
>             }
> /************Whats this flush doing here the character output-stream is already closed!************/
>             writer.flush();

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.