/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.sys.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.kuali.kfs.sys.KFSConstants;
public class KfsWebUtils {
/**
* Zipoutput files that are not of type text/plain or text/html.
*
* @param response
* @param contentType
* @param outputStreamMap<filename, outputStream>
* @param zipFileName
* @throws IOException
*/
public static void saveMimeZipOutputStreamAsFile(HttpServletResponse response, String contentType, Map<String, ByteArrayOutputStream> outputStreamMap, String zipFileName) throws IOException {
// set response
response.setContentType(contentType);
response.setHeader(KFSConstants.HttpHeaderResponse.CONTENT_DIPOSITION, KFSConstants.HttpHeaderResponse.ATTACHMENT_CONTENT_TYPE + "; " + KFSConstants.HttpHeaderResponse.FILENAME + "=" + zipFileName);
response.setHeader(KFSConstants.HttpHeaderResponse.EXPIRES, KFSConstants.ZERO);
response.setHeader(KFSConstants.HttpHeaderResponse.CACHE_CONTROL, KFSConstants.HttpHeaderResponse.CACHE_CONTROL_REVALIDATE_PRE_POST_CHECK_ZERO);
response.setHeader(KFSConstants.HttpHeaderResponse.PRAGMA, KFSConstants.HttpHeaderResponse.PUBLIC);
// write to zipoutput
ZipOutputStream zout = new ZipOutputStream(response.getOutputStream());
int totalSize = 0;
Iterator<String> fileNames = outputStreamMap.keySet().iterator();
while (fileNames.hasNext()) {
String fileName = fileNames.next();
ByteArrayOutputStream pdfStream = outputStreamMap.get(fileName);
totalSize += pdfStream.size();
zout.putNextEntry(new ZipEntry(fileName));
zout.write(pdfStream.toByteArray());
zout.closeEntry();
}
response.setContentLength(totalSize);
zout.flush();
zout.close();
}
/**
* COPIED from KNS org.kuali.rice.kns.util.WebUtils so we can handle inline streams (for popups)
* as well as attachments. Ideally we wouldn't need to duplicate Rice functionality in KFS, maybe
* KRAD will help us here and make this method obsolete.
*
* A file that is not of type text/plain or text/html can be output through
* the response using this method.
*
* @param response
* @param contentType
* @param byteArrayOutputStream
* @param fileName
* @param useJavascript
* @throws IOException
*/
public static void saveMimeOutputStreamAsFile(HttpServletResponse response, String contentType,
ByteArrayOutputStream byteArrayOutputStream, String fileName, boolean useJavascript) throws IOException {
// If there are quotes in the name, we should replace them to avoid issues.
// The filename will be wrapped with quotes below when it is set in the header
String updateFileName;
if(fileName.contains("\"")) {
updateFileName = fileName.replaceAll("\"", "");
} else {
updateFileName = fileName;
}
String type = KFSConstants.HttpHeaderResponse.ATTACHMENT_CONTENT_TYPE;
if (useJavascript) {
type = KFSConstants.HttpHeaderResponse.INLINE_CONTENT_TYPE;
}
// set response
response.setContentType(contentType);
response.setHeader(KFSConstants.HttpHeaderResponse.CONTENT_DIPOSITION, type + "; " + KFSConstants.HttpHeaderResponse.FILENAME + "=\"" + updateFileName + "\"");
response.setHeader(KFSConstants.HttpHeaderResponse.EXPIRES, KFSConstants.ZERO);
response.setHeader(KFSConstants.HttpHeaderResponse.CACHE_CONTROL, KFSConstants.HttpHeaderResponse.CACHE_CONTROL_REVALIDATE_PRE_POST_CHECK_ZERO);
response.setHeader(KFSConstants.HttpHeaderResponse.PRAGMA, KFSConstants.HttpHeaderResponse.PUBLIC);
response.setContentLength(byteArrayOutputStream.size());
// write to output
OutputStream outputStream = response.getOutputStream();
byteArrayOutputStream.writeTo(response.getOutputStream());
outputStream.flush();
outputStream.close();
}
}