Direct response in Turbine 2.3 can be done as described below:

The class below handles requests for the file favicon.ico and returns the
file of that name in the default skin directory. It can easily be adapted to
handle returning of any binary file as a direct response, depending on the
request.  We use a version of this class for returning different favicon.ico
files depending on which server name is requested as we host several domains
on the same servlet.

You need to replace the VelocityOnlyLayout by placing your
CustomVelocityOnlyLayout (extends Layout) in the modules\layouts\ directory
of your servlet. Copy the content of the VelocityOnlyLayout and replace the
last line in the doBuild() method as follows:

        // remove this:
          data.getOut().print(TurbineVelocity.handleRequest(context, prefix
+ templateName));

        // replace with this:
        if (!data.isOutSet()) {
            data.getOut().print(TurbineVelocity.handleRequest(context,
prefix + templateName));
        } else {
            log.debug("doBuild(): data.declareDirectResponse() has been
called, not doing anything");
        }

This is to avoid the layout attempting to return a response after the direct
response has been set.

Good luck!

/Martin
 

Martin Lidgard
Arkatay Consulting

________________________________

Arkatay Consulting
Magle Stora Kyrkogata 6
SE 223 50 Lund
Sweden  
Cell: +46 739 373815
Fax: +46 46 157716
Mail: [EMAIL PROTECTED]
Web: www.arkatay.com    




<begin class Default.java>

package com.arkatay.tibet.modules.screens.test;

import org.apache.turbine.TurbineConstants;
import org.apache.turbine.Turbine;
import org.apache.turbine.modules.screens.VelocitySecureScreen;
import org.apache.turbine.util.RunData;
import org.apache.turbine.services.mimetype.MimeTypeService;
import org.apache.turbine.services.TurbineServices;
import org.apache.turbine.services.servlet.TurbineServlet;
import org.apache.velocity.context.Context;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * Screen class for return files as direct responses 
 * <p>
 * The <code>isAuthorized()</code> method should be overridden to implement
security checks
 * @author  <a href="mailto:[EMAIL PROTECTED]">Martin Lidgard</a>
 */
public abstract class Default extends VelocitySecureScreen {


    /**
     * This method should be overridden to implement security checks
     * @param   data        the RunData object for the request
     * @return
     */
    protected boolean isAuthorized(RunData data) {
        return true;
    }


    /**
     * If the request is in the form
<tt>http://www.mysite.com/favicon.ico</tt>,
     * a direct response is returned with an appropriate favicon.ico file.
     * <p>
     * If successful, status code <tt>OK</tt> (200) is returned in the http
header, 
     * otherwise <tt>NOT_FOUND</tt> (404) is returned.
     * @param   data        the RunData object for the request
     * @param   context     the context to return to the screen template
     */
    public void doBuildTemplate(RunData data, Context context) {
        String errorPageTemplate =
Turbine.getConfiguration().getString(TurbineConstants.TEMPLATE_ERROR_KEY);
        String errorPageScreen =
Turbine.getConfiguration().getString(TurbineConstants.SCREEN_ERROR_KEY);

        HttpServletRequest request = data.getRequest();
        String url = request.getRequestURL().toString();
        int reqInfoLen = request.getScheme().length() + "://".length() +
request.getServerName().length();
        int requestPathStartPos = url.substring(reqInfoLen).indexOf("/") +
reqInfoLen + 1;
        String requestPath = url.substring(requestPathStartPos);

        if (requestPath.startsWith("favicon.ico")) {
            String fileName = "favicon.ico";
            // fix path using default skin
            String relPath = "/resources/ui/skins/images/" + fileName;
            try {
                boolean success = returnDirectResponseFile(fileName,
relPath, data);
                if (success) {
                    return;
                } else {
                    // continue processing to error screen,
                    // the file could not be written to the response output
stream
                }
            } catch (IOException e) {
                e.printStackTrace();
                log.error("doBuildTemplate(): failed writing direct response
file " + relPath);
                // continue processing to error screen
            }
        }


        // we were not able to determine any redirect page from the request,
redirect to error screen
        try {
            data.setStatusCode(HttpServletResponse.SC_NOT_FOUND);
            data.getResponse().setStatus(HttpServletResponse.SC_NOT_FOUND);
            doRedirect(data, errorPageScreen , errorPageTemplate);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("doBuildTemplate(): failed redirecting to screen " +
errorPageScreen + ", template " + errorPageTemplate + ", and requestPath " +
requestPath);
        }
    }


    /**
     * Returns a direct response with the given file for downloading
     * @param   fileName                the fileName of the file to return
     * @param   relPath                 the relative path including the
fileName of the file to return
     * @param   data                    the RunData object with the
HtttServletResponse to return the file with
     * @return                          whether the writing to response
output stream was successful or not
     * @throws  FileNotFoundException   failed creating FileInputStream for
file <var>filePath</var>
     * @throws  IOException             failed opening OutputStream for file
<var>filePath</var>
     * @throws  IOException             failed writing to OutputStream for
file <var>filePath</var>
     * @throws  IOException             failed closing InputStream and
OutputStream for file <var>filePath</var>
     */
    public boolean returnDirectResponseFile(String fileName, String relPath,
RunData data) throws FileNotFoundException, IOException {
        MimeTypeService mimeService = (MimeTypeService)
TurbineServices.getInstance().getService(MimeTypeService.SERVICE_NAME);

        // get the full path to the input file to indicate what file is to
be downloaded
        String filePath = TurbineServlet.getRealPath(relPath);

        // open the file for reading
        FileInputStream input = new FileInputStream(filePath); 

        // check the size of the file in bytes
        int fileLen = input.available();

        // if the file was successfully read, initiate response procedure
        if (fileLen > 0) {
            data.declareDirectResponse();
            HttpServletResponse response = data.getResponse();

            // set layout and screen classes and template to avoid getting
warnings from velocity.
            // the layouts and screens are never rendered as
VelocityOnlyLayout
            // notices that data.isOutSet() is set to true
            this.setLayout(data, "DirectResponse");
            data.setLayout("DirectResponse");
            data.setLayoutTemplate("DirectResponse.vm");
            data.setScreenTemplate("DirectResponse.vm");
            data.getTemplateInfo().setLayoutTemplate("DirectResponse.vm");


            int readCount;
            byte fileBuffer[] = new byte[fileLen];

            // Setting content type and headers
            // tell the browser what the file name is so that the "save as"
dialog does the
            // right thing (use the file name only, not the full path to the
file!)
            response.setHeader("Content-Disposition", "inline; filename=" +
fileName);

            //response.setHeader("Content-Disposition", "attachment;filename
= " + aFileName);
            response.setContentType(mimeService.getContentType(fileName));
            response.setContentLength(fileBuffer.length);
            data.setStatusCode(HttpServletResponse.SC_OK);
            response.setStatus(HttpServletResponse.SC_OK);

            // open the response stream
            ServletOutputStream output = response.getOutputStream();

            // copy the file content to the response stream
            // copy the file content from the input stream to the output
stream
            while ((readCount = input.read(fileBuffer)) != -1) {
                output.write(fileBuffer, 0, readCount);
            }

            // close everything
            output.flush();
            output.close();
            input.close();
            log.debug("returnDirectReponseFile(): finished writing reponse
file");
            return true;

        } else {

            // file was empty
            log.error("returnDirectReponseFile(): failed writing response
file, there was nothing to read");
            return false;
        }
    }
}


<end class Default.java>



-----Ursprungligt meddelande-----
Från: Henning P. Schmiedehausen [mailto:[EMAIL PROTECTED] 
Skickat: den 19 januari 2005 16:11
Till: turbine-user@jakarta.apache.org
Ämne: Re: RawScreen Problem

"Jeffrey D. Brekke" <[EMAIL PROTECTED]> writes:

>Point taken, thanks.  Maybe it is something else, but back when we ran 
>into the problem (sep/oct), we noticed that RawScreen didn't work at 
>all in 2.3 unless the presence of the Default.class page was around.  
>There is a DefaultPage class but something is requiring a Default.class 
>in the pages package, which I believe was the pre-2.3 situation.

RawScreen works fine without a Default.class page in 2.3.1 and probably also
in 2.3. I do have an example (sorry, I know I've already promised this once;
if you are willing to cope with an unpolished version, I can simply send you
a tarball) to show how to do this.

>I was going to get around to writing up a test for RawScreen to show 
>this but never did.  At the time there were no tests of the RawScreen 
>classes in the tree, I haven't looked lately though.  I may be able to 
>try to get it setup today again...

It would be great to get a test for this.

        Regards
                Henning



>Courcoux Peter, Slough wrote:
>> But be careful about this... Turbine can throw this exception when 
>> some seemingly unrelated issue occurs, such as a service not starting 
>> properly. I have seen this when the TurbinePull service has failed.
>> 
>> Regards,
>> 
>> Peter
>> 
>> -----Original Message-----
>> From: Jeffrey D. Brekke [mailto:[EMAIL PROTECTED]
>> Sent: 19 January 2005 14:07
>> To: Turbine Users List
>> Subject: Re: RawScreen Problem
>> 
>> If you're getting an exception about not finding the Default page 
>> class, (we were) you could try to create one.  This worked for us:
>> 
>> ----
>> 
>> package [YOUR PACKAGE].modules.pages;
>> 
>> import org.apache.turbine.modules.pages.DefaultPage;
>> 
>> public class Default extends DefaultPage {}
>> 
>> ----
>> 
>> Nagendra Singh wrote:
>> 
>>>  
>>>Hi !!
>>>   I am not able to use rawscreen api in turbine 2.3. It shows class 
>>>not
>> 
>> found exception. I am waiting for the solution.
>> 
>>>
>>>
>>>Nagendra Kumar Singh
>>>Software Engineer
>>>EE/ACES, IIT Kanpur
>>>PH- +91-512-2597841
>> 
>> 
>> 


>--
>=====================================================================
>Jeffrey D. Brekke                                   [EMAIL PROTECTED]
>Wisconsin,  USA                                     [EMAIL PROTECTED]
>                                                     [EMAIL PROTECTED]
>                                                     [EMAIL PROTECTED]


>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]

-- 
Dipl.-Inf. (Univ.) Henning P. Schmiedehausen          INTERMETA GmbH
[EMAIL PROTECTED]        +49 9131 50 654 0   http://www.intermeta.de/

RedHat Certified Engineer -- Jakarta Turbine Development  -- hero for hire
   Linux, Java, perl, Solaris -- Consulting, Training, Development

What is more important to you...
   [ ] Product Security
or [ ] Quality of Sales and Marketing Support
              -- actual question from a Microsoft customer survey

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to