001: /*
002: * This file is part of PFIXCORE.
003: *
004: * PFIXCORE is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU Lesser General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * PFIXCORE is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public License
015: * along with PFIXCORE; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: */
019:
020: package de.schlund.pfixcore.workflow.app;
021:
022: import java.io.InputStream;
023: import java.io.OutputStream;
024: import java.util.Properties;
025:
026: import javax.servlet.http.HttpServletResponse;
027:
028: import de.schlund.pfixcore.workflow.ContextResourceManager;
029: import de.schlund.pfixcore.workflow.DirectOutputState;
030: import de.schlund.pfixxml.PfixServletRequest;
031: import de.schlund.pfixxml.XMLException;
032: import de.schlund.pfixxml.resources.FileResource;
033: import de.schlund.pfixxml.resources.ResourceUtil;
034:
035: /**
036: * FileDownloadDOState.java
037: *
038: * This State serves as a sample {@link DirectOutputState}. It let's the user
039: * download a static file from the filesystem. The property pagerequest.PAGENAME.downloadfile
040: * gives the filename of the file to be downloaded, the property pagerequest.PAGENAME.downloadmimetype
041: * gives the contenttype that should be set in the Outputstream.
042: *
043: * Created: Wed Oct 10 09:50:19 2001
044: *
045: * @author <a href="mailto:jtl@schlund.de">Jens Lautenbacher</a>
046: */
047: public class FileDownloadDOState implements DirectOutputState {
048: private final static String PROP_FILENAME = "downloadfile";
049: private final static String PROP_MIMETYPE = "downloadmimetype";
050:
051: /**
052: * Describe <code>isAccessible</code> method here.
053: * Called by the {@link ForeignContextServlet} to check if the {@link DirectOutputState} is
054: * accessible.
055: *
056: * @param crm a <code>ContextResourceManager</code> value
057: * @param props a <code>Properties</code> object giving the properties that are attached to the current page
058: * name.
059: * @param preq <code>PfixServletRequest</code> holds the request data.
060: * @return a <code>boolean</code> value
061: * @exception Exception if an error occurs
062: */
063: public synchronized boolean isAccessible(
064: ContextResourceManager crm, Properties props,
065: PfixServletRequest preq) throws Exception {
066: String filename = props.getProperty(PROP_FILENAME);
067: if (filename == null || filename.equals("")) {
068: throw new XMLException("*** Need property " + PROP_FILENAME
069: + " ***");
070: }
071: String mimetype = props.getProperty(PROP_MIMETYPE);
072: if (mimetype == null || mimetype.equals("")) {
073: throw new XMLException("*** Need property " + PROP_MIMETYPE
074: + " ***");
075: }
076:
077: FileResource file = ResourceUtil
078: .getFileResourceFromDocroot(filename);
079:
080: if (file.exists() && file.canRead()) {
081: return true;
082: } else {
083: return false;
084: }
085: }
086:
087: /**
088: * The <code>handleRequest</code> method will simply write the given file (known from the Properties object)
089: * to the OutputStream of the HttpServletResponse. It will set the ContentType according to the property
090: * pagerequest.PAGENAME.downloadmimetype
091: *
092: *
093: * @param crm a <code>ContextResourceManager</code> value
094: * @param props a <code>Properties</code> object giving the properties that are attached to the current page
095: * name.
096: * @param preq <code>PfixServletRequest</code> holds the request data.
097: * @param res <code>HttpServletResponse</code> of the current request as given by the ServletContainer.
098: * @exception Exception if an error occurs
099: */
100: public synchronized void handleRequest(ContextResourceManager crm,
101: Properties props, PfixServletRequest preq,
102: HttpServletResponse res) throws Exception {
103: String filename = props.getProperty(PROP_FILENAME);
104: String mimetype = props.getProperty(PROP_MIMETYPE);
105: FileResource file = ResourceUtil
106: .getFileResourceFromDocroot(filename);
107:
108: res.setContentType(mimetype);
109: InputStream fin = file.getInputStream();
110: OutputStream out = res.getOutputStream();
111: byte[] buff = new byte[4096];
112: int num = 0;
113: while ((num = fin.read(buff)) != -1) {
114: out.write(buff, 0, num);
115: }
116: }
117: }
|